神经网络训练参数优化分步流程
核心概念 神经网络训练参数优化分步流程,涵盖学习率调度、权重初始化、正则化、批归一化等策略。
1. 前置基础
- 模型:一堆待学习参数(权重W、偏置b),全部初始随机小数;
- 输入:一批训练样本(图片/文本token)+ 真实标签;
- 目标:调整所有参数,让模型预测值和真实标签差距最小;
- 两大核心过程:前向传播算预测、反向传播算梯度、优化器更新参数。
完整一轮迭代(一个batch)标准5步
2. 步骤1:前向传播 Forward —— 算出预测结果,缓存中间数据
- 把一批数据输入模型;
- 数据逐层计算:嵌入/线性层→激活函数/多头注意力→输出层;
- 得到每个样本的预测值 \hat y;
- 框架自动保存每一层的中间计算结果(必须存,反向求导要用);
- 根据预测和真实标签,计算损失Loss(交叉熵/MSE)。 这一步不动参数,只算结果和误差。
3. 步骤2:反向传播 Backward —— 自动算出全部参数的梯度向量
- 从损失Loss开始,依靠链式法则反向逐层求导;
- 对每一个参数,算出梯度 g=\frac{\partial L}{\partial w};
- 所有梯度组合成一个多维梯度向量 \nabla L,存在参数
.grad里;
- 梯度分量正:增大该参数会让损失变大;
- 梯度分量负:增大该参数会让损失变小;
- 梯度向量整体指向「损失上升最快的方向」。 这一步只算梯度,还没修改任何参数。
4. 步骤3:优化器更新参数 Optimizer.step()
核心公式:w = w - \eta \cdot g
- 学习率 \eta 控制每一步走多远;
- 对每一个参数,单独用自身梯度分量更新:
- 梯度g>0:参数减小;
- 梯度g<0:参数增大;
- 本质:整体沿着负梯度向量平移所有权重,向损失更低的位置移动;
- Adam/SGD等优化器会额外处理:动量、自适应学习率、权重衰减等,但核心逻辑不变。
5. 步骤4:清空梯度 Optimizer.zero_grad()
- 本轮梯度已经用完,必须清空所有参数的
.grad; - 不清空的话,下一轮反向传播梯度会累加,步长爆炸、训练失控。
6. 步骤5:循环,直到收敛
- 读取下一个batch数据,重复1~4;
- 收敛判断标准:
- 连续多轮损失几乎不再下降;
- 梯度向量所有分量无限接近0向量(原点);
- 终止训练,保存最终权重。
极简直观小例子(2个参数,方便脑补)
参数 w_1,w_2,学习率 \eta=0.01
- 前向算出损失;
- 反向得到梯度向量 g=(4, -2);
- 更新:
w_1 = w_1 - 0.01 \times 4
w_2 = w_2 - 0.01 \times (-2) - 梯度清零,读取下一批数据重复;
- 多次迭代后梯度慢慢变成 (0.02,-0.01),接近原点,训练停止。
补充3个关键补充理解
- 参数更新是整体同步更新
不会先改完w1再重新算梯度改w2;所有参数用同一轮算出的梯度一次性全部调整。 - 梯度只是“方向路标”,不是优化目标
我们不直接修改梯度,只修改权重;权重移动后,下一轮会生成全新的梯度向量。 - 为什么不能只更新梯度最大的分量?
梯度向量是全局最优下降方向,丢掉任意维度都会偏离最优路线,收敛变慢。神经网络参数互相耦合,所有维度都需要同步微调。
关联文档