深度学习笔记【理论篇】一、梯度下降法
2020/3/2大约 2 分钟
疫情在家,无意翻出之前学的深度学习笔记,略微整理,以做巩固。这篇整理的是:梯度下降法的优化发展。
1. 教材和现实的差距
原始梯度下降法(BGD)是几乎所有的教案和网课都默认去介绍的梯度下降法,但是后来在做一些项目的时候,发现几乎很少直接会用BGD。反而最常见的是一种叫Adam的优化器 + mini-batch SGD,这是为啥呢?
还是从公式说起,BGD的公式为:
其中:
- 是 学习率
- 是基于所有训练样本的损失梯度
公式中,反映了BGD的特点:
- 梯度仅与当前时刻相关
- 固定学习率
- 所有训练样本参与计算
从而引出了BGD的缺点:
- 鞍点问题(停止学习)
- 缓坡收敛缓慢,缺少加速
- 陷入局部最优;
- 跳崖现象
- 最优点附近反复震荡
- 所有训练样本参与计算,计算量大
2. 优化发展
从公式中可以看出,可以从这三个方面去做优化:
- 梯度-自适应:Momentum -> Adam
- 学习率-自适应:AdaGrad -> RMSProp -> Adam
- 训练样本-非全量:SGD -> mini-batch SGD
2.1 梯度-自适应
Momentum核心:"惯性",累计过去的梯度。
分为标准动量法和指数加权平均动量法。
解决的问题:
- 解决了鞍点问题;
- 可以缓解局部最优问题;
- 标准动量法,可以加速缓坡计算;
- 避免反复震荡
未解决的问题:
- 跳崖现象;
2.2 学习率-自适应
核心:动态学习率
AdaGrad:
解决的问题:
- 缓解跳崖现象;
- 缓解反复震荡,加速收敛;
未解决的问题:
- 鞍点问题
- 学习率单调下降,可能提前终止学习
- 陷入局部最优;
RMSProp(AdaGrad的升级版)
解决的问题:
- 缓解跳崖现象;
- 缓解反复震荡,加速收敛;
未解决的问题:
- 鞍点问题;
- 陷入局部最优;
2.3 两者结合起来-Adam
优点:
自动调 学习率 + 动量、默认表现好。
缺点:
状态多、泛化未必最优。
2.4 SGD -> mini-batch SGD
batch_size = 1 -> SGD
batch_size = N -> BGD
batch_size = [1, N] -> mini-batch SGD
优点:
- 计算快、内存省
- 一定的噪声有助于逃出局部极小
- 更适合 GPU 并行
缺点:
- 收敛不如 Batch GD 平稳
- 容易在损失的狭窄谷中来回震荡