目录
梯度:梯度是函数对参数的偏微分,这里由于参数比较多,对于每个参数都有一个偏微分,所以梯度是一个向量。
如果损失函数, 此时参数为和,目标是最小化损失函数,即损失值最小的时候和的取值,这里对和做偏微分:
对于训练数据集,每一个数据都可以调整和参数的数值,但最开始需要给他们一个初始值(这涉及到初始化算法,这里暂时不提) 和,那么接下来就可以迭代了:
就是学习率,经过多次迭代,直到损失函数的值达到最小(什么时候最小,这个就涉及到early stopping了)。
BGD
批量梯度下降
GD是对于每个样本都进行参数更新,这个速度太慢了,BGD是对一个批量的数据计算得到下降总均值,然后来更新参数:
SGD
BGD虽然每批次更新一次梯度,但是需要计算批量里的每个样本的梯度值,随机梯度下降就是在一个批次中只更新一次梯度,这个和BGD一致,但是每次只随机抽取批量里的一个样本来计算梯度进行更新。这样计算效率提高很多,当然也有自己的弊端,那就是不够准确,随机选取的数据如果算得的梯度值过大,波动就会很大,那么很容易从一个局部最优直接跳转到另一个局部最优。
Mini-batch GD
那不能保证又快又好,那就只能折中,就是既不是计算批次里所有数据,也不是只随机选取一个,那就从中选取m个,m小于批数量。目前的SGD默认就是Mini-batch GD。
Momentum
动量梯度下降,增加一个参数 (一阶动量)
一阶动量约等于最近个时刻梯度向量和的平均值(说实话,文字我理解了,但是这公式没看懂,表示上一时刻的一阶动量,也是上一时刻的梯度啊,除非公式写错了,应该是这一时刻的梯度才对),值一般取0.9,那就是最近十次梯度的平均值。这是为了避免当前批次更新过于震荡,方向走错,所以采用近10次的平均值。在梯度方向改变时,momentum能够降低参数更新速度,从而减少震荡,在梯度方向相同时,momentum可以加速参数更新, 从而加速收敛。
动量主要解决SGD的两个问题(抄来的原文):
-
随机梯度的方法(引入的噪声)
-
Hessian矩阵病态问题(可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题)。
以上都是使用固定学习率进行梯度下降,学习率大了容易震荡,从一个局部最优跳到另一个局部最优,小了又收敛太慢。所以下面介绍自适应学习率。
Adagrad
二阶动量:是迄今为止所有梯度值的平方和
学习率为:
所以如果某个参数经常更新,那么其梯度就会很多,学习率就比较小,更新幅度小,如果某个参数较少更新,那么学习率就会大,更新幅度大。
细心的小伙伴应该会发现Adagrad还是存在一个很明显的缺点:
-
仍需要手工设置一个全局学习率 , 如果 设置过大的话,会使regularizer过于敏感,对梯度的调节太大
-
中后期,分母上梯度累加的平方和会越来越大,使得参数更新量趋近于0,使得训练提前结束,无法学习
Adadelta
Adagrad调整学习率变化过于激进,公式推导不看了,简单来说只用部分梯度值,且只是求平均(这里赶紧结合了Adagrad和Momentum),并且去掉了,Adadelta有如下特点:
-
训练初中期,加速效果不错,很快
-
训练后期,反复在局部最小值附近抖动
Adam
结合了一阶动量和二阶动量。
没写完,有点累,后面有空在接着写,原文