Python:Batch 和随机梯度下降 (七十四)

Batch和随机梯度下降

首先,我们看看梯度下降算法在干什么,我们位于珠峰山顶上 需要下山,为了下山,我们按照高度(即误差函数)的梯度负值的方向,走了很多步,每步就叫做 epoch,当我们提到步长次数时,我们指的是 epoch 次数,现在我们看看每个 epoch 中发生的情况,在每个 epoch 中 我们获得输入,即所有的数据 让其完成整个神经网络,然后算出预测,我们计算误差,即与实际标签相差多大,最后 我们反向传播此误差,以便更新神经网络中的权重,这样将会提供更好的界线来预测数据,对所有数据完成这一过程,如果有很多很多的数据点,通常都是这样,那么这些就是很大的矩阵计算过程,我会用到大量的内存,而这仅仅是一个步长,如果有很多步长,可以想象要花费多少时间和运算容量,有没有什么方法可以加速这一过程?

file

有个问题:每次进行一个步长 都需要代入所有数据吗?
如果数据分布很合理,那么一小部分数据就可以很好地告诉我们,梯度是多少,或许不是最准确的梯度估算结果,但是速度很快,因为我们要迭代计算,或许是个好方法,这时候随机梯度下降就派上用场了,随机梯度下降的原理很简单,我们拿出一小部分数据 让它们经历整个神经网络,根据这些点计算误差函数的梯度,然后沿着该方向移动一个步长,现在我们依然要使用所有数据,所以我们的做法是:我们将数据拆分为几个批次,在此示例中 我们有 24 个点,我们将拆分为 4 批 每批 6 个点,拿出第一批次的点并用神经网络处理它们,计算误差和梯度 反向传播以更新权重,这样就得出新的权重,它们将定义出更好的界限区域 从左侧可以看出,现在拿出第二批次的数据 完成相同的流程,得出更好的权重和更好的界限区域,然后对第三批次执行相同的流程,最后对第四批次执行相同的流程 就完成了,注意对于数据,我们执行了 4 个步长,但是对于普通梯度下降,我们仅对所有数据执行了一个步长,当然 所采取的四个步长精确度很低,但在现实中 采取大量稍微不太准确的步长比采取一个很准确的步长要好很多,在稍后学习中,你将有机会应用随机梯度下降 看看它的优势。
file

为者常成,行者常至