看到一篇文章把反向传播梯度更新解释的很通透,总结了一下:
1. 一个batch内的所有样本输入计算出的损失函数梯度累积,一个batch更新一次梯度。
for batch_idx, (data, target) in enumerate(train_loader):
data = data.view(-1, 28*28)
data, target = data.to(device), target.to(device)
logits = net(data)
loss = criteon(logits, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()
2. 每次梯度更新时,更新所有层的梯度,所用到的方法就是链式求导
3. batch size大小与模型的收敛有关,个人理解就是相当于图像分割算法里的分水岭原理类似,要先找到种子,然后以种子为基地向四周蔓延;
4. 与大批量训练相比,小批量训练可以找到距离初始权重更远的最小值。小批量训练可能会为训练引入足够的噪声,以退出锐化minimizers 的损失池,而是找到可能更远的平坦minimizers 。
5. 使用小批量的训练倾向于收敛到平坦的极小化,该极小化在极小化的小邻域内仅略有变化,而大批量则收敛到尖锐的极小化,这变化很大。平面minimizers 倾向于更好地泛化,因为它们对训练集和测试集之间的变化更加鲁棒 。
6. batch size越大:
- 训练损失减少的越慢。
- 最小验证损失越高。
- 每个时期训练所需的时间越少。
- 收敛到最小验证损失所需的 epoch 越多。