简介
1、梯度下降
- 引入:目标函数 J ( θ ) J(\theta) J(θ)不一定可以直接求解,线性回归是个特例
- 方向:梯度的反方向,梯度指向值增加的方向
2、面对的主要困难
- 梯度的计算:样本流量巨大时,计算耗时又费力(每个 x i x_i xi都有一个 J x i ( θ ) {J_{x_i}}(\theta) Jxi(θ))
- 学习率的选择
- 过小:算法收敛太慢
- 过大:算法不收敛
3、分类
- 批量梯度下降法(GD):原始的梯度下降法,使用全部样本
- 优点:容易得到最优解
- 缺点:收敛太慢
- 随机梯度下降法(SGD):每次只使用一个样本
- 优点:减少了相似样本的冗余计算,收敛速度加快
- 缺点:不一定每次都朝着收敛方向,不稳定
- 小批量随机梯度下降法(Mini Batch SGD):使用小批量样本
- 优点:比单样本稳定,且可利用矩阵计算
4、普通的小批量SGD(以下简称为SGD)的困难:
- 主要困难:学习率的选择问题
- 预定的学习率衰减法很难对当前的数据自适应
- 对不同参数无法采取不同的学习率
- 其他困难:
- 局部梯度下降的方向不一定是函数整体的下降方向
- 容易困在鞍点附近
SGD的优化算法
1、为什么不使用牛顿法?
- 牛顿法需要二阶求导,对高维特征计算量巨大
- 对小批量数据,牛顿法二阶导数的估计容易引进噪声
- 对非凸函数,容易受到鞍点甚至是最大值的吸引
2、动量法(Momentum)——适用于隧道型曲面(一个方向很陡,其他方向比较平坦)
- 普通的SGD:由于垂直于函数主体方向有更大的梯度,因此隧道两侧振荡频繁
- 动量法:
v t = γ v t − 1 + η ∇ θ J ( θ ) θ t = θ t − 1 − v t \ v_t=\gamma {v_{t-1}}+\eta {\nabla _\theta }J(\theta)\\ \ \theta_t={\theta_{t-1}}-v_t vt=γvt−1+η∇θJ(θ) θt=θt−1−vt- 动量项( γ v t − 1 \gamma {v_{t-1}} γvt−1):在梯度一致的时候累积;在梯度变化频繁的时候相互抵消
- 削减隧道两侧无谓的振荡
- γ \gamma γ一般取0.9左右
3、Nesterov Accelerated Gradient(NAG):动量法的改进
- 改进问题:动量法在极小值处下降速度不减少,可能在极小值处上升
- 改进方法:利用主体下降方向提供下一步的位置,并在预判位置计算梯度
v t = γ v t − 1 + η ∇ θ J ( θ − γ v t − 1 ) θ t = θ t − 1 − v t \ v_t=\gamma {v_{t-1}}+\eta {\nabla _\theta }J(\theta-\gamma {v_{t-1}})\\ \ \theta_t={\theta_{t-1}}-v_t vt=γvt−1+η∇θJ(θ−γvt−1) θt=θt−1−vt - 作用:显著提升了RNN的表现
4、Adagrad——适用于稀疏的数据
- 特点:可自动调节学习率(lr)
- 随训练步数增加,lr自动衰减
- 更新频繁的参数,较小的lr
- 更新不频繁的参数,较大的lr
- 实现:对每个参数的历史更新进行叠加,并用作下一次更新
- 第t步i参数的梯度: g t , i = ∇ θ J ( θ