问题与目标

损失衡量当前参数的错误,梯度给出局部增长方向,参数沿其反方向更新。
数学的作用是解释模型算什么、为什么能优化,而不是在编码前补完全部高等数学。本篇用 NumPy 把点积、均值方差、损失和梯度连成一个最小训练过程。
完成标准:能解释线性预测、均方误差和梯度下降每一步的输入输出,并通过损失下降验证实现。
核心概念
向量点积 x·w 把多项特征按权重合成一个值;矩阵让多条样本同时计算。均值描述中心,方差描述离散。概率必须在 0 到 1 之间,条件概率表示已知条件下事件发生的可能性。
损失函数把预测误差变成可优化的标量。导数描述单变量变化率,梯度由各参数偏导数组成,指向损失增长最快方向;梯度下降沿反方向更新参数。
标量、向量和矩阵
标量是一个数,向量是一组特征,矩阵是一批样本。若 X 形状为 (样本数, 特征数),权重 w 为 (特征数,),则 X @ w 输出每条样本的线性得分。
import numpy as np
X = np.array([[2.0, 5.0], [4.0, 1.0], [3.0, 3.0]])
w = np.array([0.6, -0.2])
b = 1.0
print(X.shape, w.shape)
print(X @ w + b)
print("dot:", np.dot(X[0], w))
点积同时包含对应元素相乘与求和,可解释为加权特征组合。神经网络中的线性层仍建立在这类矩阵计算上。
均值、方差与条件概率
均值容易被极端值影响,中位数更稳健;方差使用平方偏差描述离散程度,标准差恢复原单位。标准化 (x-均值)/标准差 让特征处于可比较尺度。
条件概率 P(A|B) 表示已知 B 时 A 的概率。贝叶斯公式把先验、似然和证据组合为后验。朴素贝叶斯进一步假设给定类别后特征条件独立,这是建模假设,不是现实事实。
损失与评价指标不是一回事
训练需要便于优化的损失,业务评价选择能表达错误代价的指标。逻辑回归训练使用对数损失,但最终可能按召回率或 F1 选择方案。训练损失下降不保证业务指标同步改善。
数值梯度检查
def loss(weight: float) -> float:
return (weight * 3 - 7) ** 2
weight = 1.5
epsilon = 1e-5
numeric = (loss(weight + epsilon) - loss(weight - epsilon)) / (2 * epsilon)
analytic = 2 * (weight * 3 - 7) * 3
print(round(numeric, 6), round(analytic, 6))
两者应非常接近。epsilon 太大近似不准,太小会受浮点误差影响。
可运行实现
import numpy as np
x = np.array([1.0, 2.0, 3.0, 4.0])
y = np.array([3.0, 5.0, 7.0, 9.0])
weight = 0.0
bias = 0.0
learning_rate = 0.05
for step in range(200):
prediction = weight * x + bias
error = prediction - y
loss = np.mean(error ** 2)
weight_gradient = 2 * np.mean(error * x)
bias_gradient = 2 * np.mean(error)
weight -= learning_rate * weight_gradient
bias -= learning_rate * bias_gradient
if step in (0, 50, 199):
print(step, round(loss, 6))
print(round(weight, 3), round(bias, 3))
print("x=5 prediction:", round(weight * 5 + bias, 3))
输入满足近似关系 y=2x+1,输出显示损失持续下降,参数接近 2 和 1。学习率过大会震荡或发散,过小则收敛很慢。
把学习率分别改为 0.001 和 0.5,比较 200 步损失:前者下降慢,后者可能发散。这个实验比只记“学习率很重要”更容易建立直觉。
用形状检查梯度推导
批量线性回归中,X 形状为 (n, d),w 为 (d,),y 为 (n,)。于是:
| 量 | 表达式 | 形状 |
|---|---|---|
| 预测 | X @ w + b | (n,) |
| 误差 | prediction - y | (n,) |
| 权重梯度 | 2 / n * X.T @ error | (d,) |
| 偏置梯度 | 2 * error.mean() | 标量 |
如果权重梯度不能与 w 对应,更新就不可能正确。这种“先查形状”的方式比盲目调整转置更可靠。
对数为什么常出现在分类损失中
多个独立样本的似然需要相乘,概率很小时容易数值下溢。取对数后乘法变成加法,同时不改变最优参数的位置。二分类交叉熵可以看作负对数似然:真实为 1 时惩罚 -log(p),真实为 0 时惩罚 -log(1-p)。对极其自信的错误预测,损失会很大。
probabilities = np.array([0.9, 0.6, 0.1])
positive_losses = -np.log(probabilities)
print(np.round(positive_losses, 3))
这三个样本都假定真实标签为 1。预测 0.1 得到的惩罚远高于 0.9,这解释了概率质量为什么会影响训练。
进一步验证
- 把一维线性回归改写成两个特征的矩阵形式,并在每个关键变量后标注形状。
- 用数值梯度检查权重和偏置两类解析梯度。
- 画出三种学习率下的损失变化,区分收敛慢、稳定收敛和发散。
常见问题与排查
- 只背公式不看形状:先写出向量、矩阵和结果的
shape。 - 损失变成
nan:检查学习率、异常值、溢出和缺失数据。 - 把相关性当因果:统计共同变化不能单独证明因果机制。
- 认为梯度下降一定找到全局最优:取决于损失形状和优化条件。
小结
够用数学围绕计算链展开:特征与参数产生预测,预测与标签产生损失,梯度推动参数更新。代码输出能验证公式是否按预期工作。
许可协议:CC BY-NC 4.0
更新于 1 小时前
觉得文章有帮助?点个赞吧!
0 条评论


