《Born》第10章:优化器与损失函数
训练神经网络需要两个核心组件:损失函数告诉模型「错在哪里」,优化器告诉模型「怎么改」。
训练神经网络需要两个核心组件:损失函数告诉模型「错在哪里」,优化器告诉模型「怎么改」。
损失函数
// 交叉熵(分类任务)
lossFn := nn.NewCrossEntropyLoss[float32](backend)
loss := lossFn.Forward(logits, labels)
// 均方误差(回归任务)
mse := nn.NewMSELoss[float32](backend)
loss := mse.Forward(predictions, targets)
交叉熵的数学:
\[L = -Σ y_true · log(softmax(y_pred))\]
优化器
SGD(带动量)
optimizer := optim.NewSGD[float32](0.01, model.Parameters()...)
optimizer.Step() // 执行参数更新
Adam
optimizer := optim.NewAdam[float32](0.001, model.Parameters()...)
AdamW(解耦权重衰减)
optimizer := optim.NewAdamW[float32](0.001, 0.01, model.Parameters()...)
// lr=0.001, weight_decay=0.01
训练循环
for epoch := 0; epoch < numEpochs; epoch++ {
for _, batch := range trainLoader {
// 1. 清零梯度
optimizer.ZeroGrad()
// 2. 前向传播
output := model.Forward(batch.Input)
// 3. 计算损失
loss := lossFn.Forward(output, batch.Label)
// 4. 反向传播
tape.Backward(loss)
// 5. 参数更新
optimizer.Step()
}
}
学习率调度
// 余弦退火
scheduler := optim.NewCosineAnnealingLR(optimizer, maxEpochs)
scheduler.Step()
// 学习率预热
scheduler := optim.NewLinearWarmup(optimizer, warmupSteps, baseLR)
📘 《Born》连载技术书,第 10/22 章。