1、梯度下降
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)
如果w = w(x, y, z), x = x(t), y = y(t), z = z(t)
▽w就是梯度向量,简称梯度
将微分值转换为梯度的形式:(迭代参数w时,w1=w0-学习率 * 梯度的反方向)
由以上图发现,梯度红绿下降曲线还是比较难辨别的
(1)Vanilla Gradient descent
迭代式子:
- 对于每个特征xi,都有不同的学习率
- 一开始的是离最小值较远的,可以选择相对较大的学习率,随着迭代次数的增加,选择较小的学习率
(2)Adagrad
迭代式子:
分母为过去所有微分值的均方根值
最终变成以下式子:
Adagrad式子分析:
前面算出的梯度一直为很小,突然求得一个较大的梯度,此时分母也会变大,从而使步长为较小的值,保证了随着迭代次数的增加,步长逐渐减小。
缺点:若迭代次数很大的时候,步长很小,会出现Loss值几乎不变的情况
(3)Stochastic Gradient Descent
- BGD(批量梯度下降):
批量梯度下降是,求出一个维度中所有的数据,取个平均来当做每一次梯度下降的step.这样做虽然准确,但是每次要计算一个维度的所有数据的梯度,花费资源较大.所以才有了随机梯度下降的思想:每次只随机取一个维度中的一条数据求梯度,来当做这个维度梯度下降的step.
- Stochastic Gradient Descent:一个样本更新一次
计算一个样本的Loss就更新一次参数w,能够更快的更新参数
区别:
BGD总是综合所有数据的梯度,取到的下降至一直很平滑,SGD随机抽取一条数据作为参数,步子很不稳定.但是最终都可以到达函数的最优解位置.虽然看起来SGD比BGD的误差要大一些,但是SGD随着迭代次数的增加,误差会越来越小.
(4)迭代技巧:Feature Scaling特征归一化
- 如下图,若参数x1取值较小,而x2取值较大,当x1,x2发生变化的时候,x2预测的y会引起相对x1预测的y出现较大的变化。
- 观察左图:当迭代参数的时候,梯度下降方法只是求出变化最大的方向前进,而不是直接朝着最小值的方向更新,这样会导致走很多弯曲的路线
- 而右图:梯度变化最大的方向就是直接指着最小值的方向更新,加快迭代速度。
(5)Question:梯度更新Loss并不是一定下降
只有学习率为无穷小的时候,才能满足梯度下降,从而使Loss不断减小
(6)梯度下降的限制
梯度更新在微分值为0或者局本最小的时候,便无法再迭代。
(7)Epoch、BatchSize概念
假设您有一个包含200个样本(数据行)的数据集,并且您选择的Batch大小为5和1,000个Epoch。
这意味着数据集将分为40个Batch,每个Batch有5个样本。每批五个样品后,模型权重将更新。
这也意味着一个epoch将涉及40个Batch或40个模型更新。
有1000个Epoch,模型将暴露或传递整个数据集1,000次。在整个培训过程中,总共有40,000Batch。
GPU运算时,用批量梯度下降计算速度会更快(有更多的矩阵运算):