模型训练的目的是找到一组 w 和 b ,使得网络的输出拟合目标输出
定义一个代价函数,例如均方误差,
训练目的转化为最小化代价函数,使用梯度下降算法来解决最小化问题
梯度下降算法工作的方式就是重复的计算梯度,然后沿着相反的方向移动
假设最小化函数 C(v),v=v1,v2
这个函数的图像如下所示:
当我们在 v1 和 v2 方向上分别将球体移动一个很小的量,即 △v1 △v2 时,C 的变化 △C 如下:
我们要寻找一种选择 △v1 和 △v2 的方法,使得 △C 为负,我们令 v 沿着梯度下降的方向,即
其中,第一个项为学习速率,第二项为梯度
可以得到 ,即 ,v 沿着梯度下降的方向移动
,△C 会变小
梯度下降算法可以视为在 C 下降最快的方向上做微小变化的方法
神经网路中,就是利用梯度下降算法去寻找能使代价函数最小的权重和偏置
梯度更新规则如下:
训练中,需要为每一个输入单独计算梯度值,这样会花费大量时间,提出 随机梯度下降方法,可以加速学习
随机梯度下降
随机选取小量的 m 个训练数据输入,把他们称为一个小批量数据(mini-batch),假设样本数量足够大,小批量样本的梯度大河和整个的梯度相等
可以仅仅通过随机选取小批量数据的梯度来估计整体的梯度
小批量数据的更新公式
梯度消失
一个简单的神经网络,每一层都只有一个单一的神经元,如下图:
现在计算第一个隐藏神经元的偏置梯度,其表达式如下:
S型函数的导数如下:
最大的值小于 1/4 ,所以项越多,梯度下降越快
使用 relu 可以避免
梯度激增
如果w 设置的太大,而且梯度元素大约等 1/4 左右,连续乘后获得的梯度可能就很大了,控制weight的大小,使用 clip gradient 方法,超过一定值的梯度,将其缩小。
不稳定的梯度问题
根本的原因并不是消失的梯度问题或者激增的梯度问题,而是在前面层上的梯度是来自后面层上的项的乘积,层次多的时候,就获得了本质上的不稳定场景
梯度优化算法
随机梯度下降的方法选择合适的学习率比较困难,对所有的参数更新采用形同的 learning rate ,对于稀疏的数据或者特征,有时不经常出现的特征希望更新快一点,对于常出现的特征更新慢一点,这时候 SGD 就不太能满足要求了
SGD容易收敛到局部最优,在某些情况下,可能会被困在鞍点
梯度下降只有在原问题是凸函数的情况下,才能保证以任意精度取得最优解,非凸情况下,当有多个极大值或者极小值,需要对梯度下降进行优化,比如动量,NAG , Adagrad , RMSprop等,可以减少陷入极大极小值的可能性
1.Momentum:
模拟物理学中动量的概念,更新的时候,一定程度上保留之前更新的方向,同时,利用当前 batch 的梯度微调最终的更新方向,可以在一定程度上增加稳定性,从而学习更快,同时具有摆脱局部最优的能力
对于一般的SGD,其表达式为,x沿负梯度反向下降,而带 momentum 项的 SGD ,其表达形式为:
,β是动量因子
- 下降初期,使用上一次的参数更新,下降方向一致,乘上较大的 β,可以很好的加速
- 下降中后期,在局部值来回震荡的时候,梯度趋近于 0 ,β使得更新幅度增大,跳出陷阱
- 梯度方向改变的时候,β可以减少更新,总而言之,momentum 可以在相关方向加速 SGD,抑制震荡,从而加快收敛
2.Adagrad
设置全局学习率后,每次通过,全局学习率逐参数的除以历史梯度平方和的平方根,使得每个参数的学习率不同,起到的效果是在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应的学习下降的幅度较小),并且能够使陡峭的方向变得平缓,从而加快训练,适合处理稀疏梯度
但是比较依赖于人工设置一个全局学习率,中后期,分母上的梯度平方的累加会越来越大, 使得 gradient 趋近于零 ,使得训练提前结束
3.RMSprop
和 Adagrad 唯一的不同就是增加了一个衰减系数来控制历史信息获取的多少
Adagrad 的历史梯度: RMSprop 的历史梯度:
4.Adam
随机梯度下降保持单一的学习率更新所有的权重,学习率在学习过程中并不会改变,而 Adam 通过计算梯度的一阶矩估计和二阶矩估计为不同的参数设置自适应的学习率,对内存需求较小,适用于大多数非凸优化
Adam算法为两种随机梯度下降扩展的优点集合:
(1)适应性梯度(Adagrad)为每一个参数保留一个学习率以提升在稀疏梯度上的性能
(2)均方根传播(RMSprop)基于权重梯度最近量级的均值为每一个参数适应性的保留学习率,在非稳态和在线问题上有很优秀的性能
参数:
- alpha::学习率
- beta1:一阶矩估计的指数衰减率
- beta2:二阶矩估计的指数衰减率,该超参数在稀疏梯度中应该设置接近于 1 的数
- epsilon:该参数是一个非常小的值,是为了防止在实现中出现除以零