SGD

上一篇:[[Train]] 下一篇:[[Least Squares Method]]

我们先通过一个详细数值例子来演示一个简单神经网络如何被训练,使用梯度下降法(Gradient Descent)。然后详细讲解 SGDAdam 的区别与工作原理,并附上具体数值例子。


🧠 一、简单神经网络训练全过程(含数值与公式)

我们定义一个最简单的网络:

模型公式: $$ \hat{y} = w \cdot x + b $$

🌟 数据点:

假设我们只有一个训练样本:

初始参数:


第一步:正向传播(Forward Pass)

$$ z = w \cdot x + b = 1.0 \cdot 2 + 0 = 2 $$ $$ \hat{y} = z = 2 $$ $$ L = \frac{1}{2}(\hat{y} - y)^2 = \frac{1}{2}(2 - 4)^2 = \frac{1}{2} \cdot 4 = 2.0 $$


第二步:反向传播(计算梯度)

损失对输出的导数: $$ \frac{\partial L}{\partial \hat{y}} = \hat{y} - y = 2 - 4 = -2 $$

链式法则:


第三步:参数更新(梯度下降)

$$ w := w - \eta \cdot \frac{\partial L}{\partial w} = 1.0 - 0.1 \cdot (-4) = 1.0 + 0.4 = 1.4 $$ $$ b := b - \eta \cdot \frac{\partial L}{\partial b} = 0.0 - 0.1 \cdot (-2) = 0.0 + 0.2 = 0.2 $$


✅ 完成一次迭代后的参数更新:


⚙️ 二、SGD 和 Adam 的详细机制 + 数值例子

✳️ SGD(随机梯度下降)

SGD 只是将梯度下降用于单一样本: $$ \theta := \theta - \eta \cdot \nabla_\theta L(\theta) $$ 例子同上,就是每次都基于一个样本更新,不保留历史信息。


✳️ Adam 优化器(Adaptive Moment Estimation)

Adam 同时使用了:

再进行偏差修正: $$ \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t} $$

更新参数: $$ \theta := \theta - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} $$

🧮 数值例子(基于刚才梯度 $g = -4$,Adam参数设为常用值)

Adam 更新步长更平滑,适应性调整每个参数的学习率。


📊 对比总结

方法记忆历史梯度每步学习率收敛速度稳定性
SGD固定较慢震荡
Adam是(均值+方差)自适应稳定

我们通过一个具体的例子,从损失函数的梯度计算开始,到Adam优化器的参数更新,详细说明其每一步计算过程。我们选用的例子是:最后一层是Softmax,损失函数是交叉熵(cross-entropy),优化器为Adam。


一、前提设定


二、计算 Softmax 输出

先计算 softmax 概率:

$$ \hat{y}i = \frac{e^{z_i}}{\sum{j} e^{z_j}} $$

计算:

$e^{2.0} \approx 7.389$ $e^{1.0} \approx 2.718$ $e^{0.1} \approx 1.105$

归一化:

$$ \hat{y} = \left[ \frac{7.389}{11.212}, \frac{2.718}{11.212}, \frac{1.105}{11.212} \right] \approx [0.659, 0.242, 0.099] $$


三、计算交叉熵损失

$$ L = -\log(0.659) \approx 0.417 $$


四、计算梯度

交叉熵 + softmax 的梯度(对 logits $z$)是: $$ \frac{\partial L}{\partial z_i} = \hat{y}_i - y_i $$

所以:

$$ \frac{\partial L}{\partial z} = [0.659 - 1, 0.242 - 0, 0.099 - 0] = [-0.341, 0.242, 0.099] $$

假设这些梯度是我们要求的参数梯度(例如 softmax 层前的权重某一行的梯度)。


五、Adam 优化器更新过程

Adam 是基于动量法 + RMSProp,它维护两个变量:

超参数设定

我们只看第一个时间步(t = 1):

当前梯度

$$ g = [-0.341, 0.242, 0.099] $$

Step 1: 一阶矩估计(m_t)

$$ m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g $$ $$ m_1 = 0.9 \cdot 0 + 0.1 \cdot g = 0.1 \cdot g = [-0.0341, 0.0242, 0.0099] $$

Step 2: 二阶矩估计(v_t)

$$ v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g^2 $$

计算 $g^2 = [0.116, 0.0586, 0.0098]$(平方逐元素)

$$ v_1 = 0 + 0.001 \cdot g^2 = [0.000116, 0.0000586, 0.0000098] $$

Step 3: 偏差校正

$$ \hat{m}_1 = \frac{m_1}{1 - \beta_1} = \frac{m_1}{0.1} = [-0.341, 0.242, 0.099] $$

$$ \hat{v}_1 = \frac{v_1}{1 - \beta_2} = \frac{v_1}{0.001} = [0.116, 0.0586, 0.0098] $$

Step 4: 参数更新

参数更新公式: $$ \theta_{t+1} = \theta_t - \alpha \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} $$

计算分母的平方根:

注意这些恰好和 $\hat{m}_1$ 的值相等,因此:

$$ \frac{\hat{m}_1}{\sqrt{\hat{v}_1} + \epsilon} \approx [1.0029, 1.0004, 1.0000] $$

那么:

$$ \Delta \theta = -0.01 \cdot [1.0029, 1.0004, 1.0000] \approx [-0.01003, -0.01000, -0.01000] $$


六、Adam中各个参数的作用总结

参数含义作用
$\alpha$学习率控制更新步长
$\beta_1$一阶动量衰减控制历史梯度的“记忆”程度
$\beta_2$二阶动量衰减控制平方梯度的平滑程度
$\epsilon$防止除零确保数值稳定性
$m_t$梯度的一阶滑动平均方向感(惯性)
$v_t$梯度平方的滑动平均缩放因子,防止剧烈振荡
偏差校正修正初始化为0带来的偏差提升早期更新精度

上一篇:[[Train]] 下一篇:[[Least Squares Method]]