神经网络训练细节系列笔记:
通过学习,我们知道,因为训练神经网络有个过程:
<1>Sample 获得一批数据;
<2>Forward 通过计算图前向传播,获得loss;
<3>Backprop 反向传播计算梯度,这个梯度能告诉我们如何去调整权重,最终能够更好的分类图片;
<4>Update 用计算出的梯度去更新参数
用一段伪码表述上述文字:
while True:
data_batch = dataset.sample_data_batch()
loss = network.forward(data_batch)
dx = network.backward()
x += - learninng_rate * dx
当我们谈论参数更新时,指的是上述伪码的最后一行,这一篇博客我们所要讨论的就是如何把这一行的更新迭代做的高级一点:
x += - learninng_rate * dx
梯度下降算法是深度学习中使用非常广泛的优化算法,也是众多机器学习算法中最常用的优化方法。几乎当前每一个先进的(state-of-the-art)机器学习库或者深度学习库都会包括梯度下降算法的不同变种实现。但是,它们就像一个黑盒优化器,很难得到它们优缺点的实际解释。这篇博客旨在提供梯度下降算法中的不同变种的介绍。
首先介绍梯度下降算法的三种框架,然后介绍它们存在的问题和挑战,接着介绍如何进行改进来解决存在的问题即算法的优化。
一、梯度下降算法三大框架
- 批量梯度下降(Batch gradient descent)
旨在每次使用全量的训练集样本来更新模型参数,即:θ=θ−η⋅∇θJ(θ)
伪码如下:
for i in range(nb_epochs):
params_grad = evaluate_gradient(loss_function,data,params)
params = params - learning_rate * params_grad
nb_epochs是用户输入的最大迭代次数。使用全量的训练集样本计算损失函数loss_function的梯度params_grad,然后使用学习速率learning_rate朝着梯度相反方向去更新模型的每一个参数params。
批量梯度下降每次学习都使用整个训练集,因此其优点在于每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点(凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点,属于凸理论的问题了),但是其缺点在于每次学习时间过长,并且如果训练集很大以至于需要消耗大量的内存,并且全量梯度下降不能进行在线模型参数更新。
- 随机梯度下降(Stochastic gradient descent)
旨在每次从训练集中随机选择一个样本来进行学习,即:θ=θ−η⋅∇θJ(θ;xi;yi)
伪码如下:<