如果我们批量处理 10 个示例,我知道我们可以对每个示例的损失求和,但是在更新每个示例的权重方面,反向传播如何工作?
例如:
- 示例 1 --> 损失 = 2
- 示例 2 --> 损失 = -2
这导致平均损失为 0(E = 0),那么这将如何更新每个权重并收敛?仅仅是通过批次的随机化,我们“希望”迟早会收敛吗?这不是只计算最后一个处理示例的第一组权重的梯度吗?
如果我们批量处理 10 个示例,我知道我们可以对每个示例的损失求和,但是在更新每个示例的权重方面,反向传播如何工作?
例如:
这导致平均损失为 0(E = 0),那么这将如何更新每个权重并收敛?仅仅是通过批次的随机化,我们“希望”迟早会收敛吗?这不是只计算最后一个处理示例的第一组权重的梯度吗?
梯度下降并不完全按照您建议的方式工作,但可能会出现类似的问题。
我们不计算批次的平均损失,我们计算损失函数的平均梯度。梯度是损失相对于权重的导数,在神经网络中,一个权重的梯度取决于该特定示例的输入,它还取决于模型中的许多其他权重。
如果您的模型有 5 个权重并且您的小批量大小为 2,那么您可能会得到:
示例 1. 损失 = 2,
示例 2. 损失 = 3,
计算这个小批量中梯度的平均值,它们是
对几个示例进行平均的好处是梯度的变化较小,因此学习更加一致,并且较少依赖于一个示例的细节。注意第三个权重的平均梯度如何,这个权重不会改变这个权重更新,但是对于选择的下一个使用不同权重计算的示例,它可能是非零的。
根据评论进行编辑:
在我上面的示例中,计算了梯度的平均值。对于小批量大小我们计算损失的地方对于每个示例,我们的目标是获得损失相对于权重的平均梯度.
我在示例中编写它的方式是平均每个渐变,例如:
您在评论中链接到的教程代码使用 Tensorflow 来最小化平均损失。
TensorFlow 旨在最小化
为了最小化这一点,它计算了每个权重的平均损失梯度,并使用梯度下降来更新权重:
可以将微分带入总和中,因此它与我示例中方法的表达式相同。
使用小批量的原因是有大量的训练样本,这样可能的噪声可以通过平均它们的效果来减少,但对于许多数据集来说,它并不是一个完整的批量,可能需要大量的内存。一个重要的事实是,您评估的误差始终是距离在您的预测输出和实际输出之间:这意味着它不能为负数,因此您不能像您所说的那样抵消 2 和 -2 的错误,但它会变成 4 的错误. 然后你评估误差相对于所有权重的梯度,这样你就可以计算出权重的哪些变化会最大程度地减少它。一旦你这样做了,你就会根据你的学习率 alpha 的大小朝那个方向迈出“一步”。(这是基本概念,我不会详细介绍深度神经网络的反向传播)在您的数据集上运行一定数量的 epoch 后,如果您的学习步骤不是太大,您可以期望您的网络收敛让它发散。你仍然可能以局部最小值结束,这可以通过初始化不同的权重、使用不同的优化器并尝试正则化来避免。