写在前面
仍然是读完Deep Learning之后的笔记和知识梳理,这些内容其实是偏理论层面的,后续的话可以结合代码进行讲解。
DL关注的优化问题:寻找神经网络上的一组参数θ,显著降低代价函数J(θ),J(θ)通常包括整个训练集上性能评估(ER-经验风险)和额外的正则化项(SR-结构风险)。
对于偏应用层面的可以直接看基本算法、参数初始化策略及自适应学习率算法。
思维导图梳理知识体系
自己在看书的时候有个习惯第一遍看的时候画个思维导图,第二遍细看take notes。
1.学习与纯优化的不同
- 纯优化最小化目标函数J(θ)本身,即只关注训练误差。ML or DL通常通过间接作用进行优化,它本身关注的是测试集上的性能度量P(可能不可解),因此通过降低代价函数J(θ)来间接的优化P。可以将这种优化看作是对测试集的估计,加上正则化以后。从这一点来看,学习的优化既关注训练误差又关注泛化误差。
- 经验风险最小化
- ERM——最小化平均训练误差的训练过程
- ERM容易导致过拟合
- 有些损失函数(0-1损失函数)不能使用GD(梯度下降)
- DL很少使用
- 代理损失函数和提前终止
- 损失函数不能被高效地优化(0-1损失函数)
- 代理损失函数作为原目标的代理被优化
- 基于提前终止,收敛条件满足时,优化代理损失函数也停止。此时代理损失函数仍然有较大导数。
- 以0-1损失函数为例,它的代理损失函数——正确类别的负对数似然,而提前终止使用真实潜在的损失函数(验证集上的0-1损失),设计为在过拟合发生之前终止。
批量算法和小批量算法
- 与一般的优化不同,ML优化的目标函数通常可以分解为训练样本上的求和。在进行参数更新时,通常仅使用整个代价函数中的一部分项来估计代价函数的期望。这么做的原因是:
1.在整个训练集计算的代价非常大且回报低于线性
2.训练集存在冗余 - 批量或确定性梯度算法——使用整个训练集的优化算法
- 随机或在线算法——每次只使用单个样本的优化算法
- 小批量或小批量随机方法——随机方法
- DL选取一组样本介于以上两者之间。随机方法的典型示例是SGD。
小批量的大小的决定因素:
- 更大的批量的回报小于线性
- 批量太小难以利用多核架构
- 并行处理时内存消耗和批量大小成正比
- 小批量需要较小的学习率以保持稳定,导致总的运行时间大。
小批量随机抽取——实际中经常采取打乱样本一次,抽取时按序抽取
- 与一般的优化不同,ML优化的目标函数通常可以分解为训练样本上的求和。在进行参数更新时,通常仅使用整个代价函数中的一部分项来估计代价函数的期望。这么做的原因是:
2.神经网络中的挑战
病态
神经网络训练的过程中,优化凸函数时,比较突出的是Hessian矩阵H的病态,体现在SGD会卡在某些情况—此时即使很小的更新步长也会增加代价函数。
牛顿法是解决这一问题的有效工具,但需要对神经网络进行很大的改动。局部极小值—待解决的问题
对于非凸函数,由于模型可辨识性问题,神经网络代价函数可能具有非常多的局部极小值(隐含变量和参·数的不确定导致代价函数不同)。
学者们的猜想—足够大的神经网络,大部分局部极小值都具有很小的代价函数。模型可辨识性
如果一个足够大的训练集可以唯一确定一组模型参数,该模型是可辨认的。反之,带有隐含变量的模型通常不可辨认,通过相互交换隐含变量可能得到等价的模型。导致这一问题的原因有:
1.权重空间对称性(交换神经单元的参数得到等价的模型)
2.代价函数的结构高原、鞍点和其它平坦区域
对于很多高维非凸函数,局部极小值远少于另一类梯度为零的点:鞍点(该点处梯度为零,左右梯度符号相同)。目前的研究并未有明确的定论,实验表明可以逃离鞍点。
但是对于牛顿法,寻找梯度为零的点,可能会跳进鞍点。
类似高原这样的平坦区域,梯度和Hessian矩阵都是零,对于凸优化没有影响。但是对于一般的优化而言,这样的区域可能对应目标函数的较高的值。
悬崖和梯度爆炸
多层神经网络通常存在像悬崖一样的斜率较大的区域,梯度更新时,很可能会跳过这类悬崖结构。应用启发式梯度截断来干涉减小步长。
长期依赖
变深的结构使模型丧失了学习到先前信息的能力。存在梯度消失于爆炸问题(尤其RNN)。
非精确梯度
目标函数难以处理的情况,其梯度也是难以处理。在这种情况下,只能近似梯度。
局部和全局结构之间的弱对应
梯度下降的方向在局部改进很大,但并没有指向代价低的多的遥远区域。此时即使在单点克服了病态条件、悬崖及鞍点等问题,最终效果仍表现不好。
3.基本算法
SGD-随机梯度下降
- 相比梯度下降,SGD可以很大程度的加速,沿着随机挑选的小批量数据的梯度下降方向。可以随机挑选小批量样本的原因:梯度是期望,期望可使用小规模的样本近似估计。此外,还有小批量的优点。
关键参数—学习率(理解为梯度更新的步长)
实践中,随着时间的推移逐渐降低学习率。
动量
动量方法旨在加速学习(针对SGD有时学习过程缓慢),积累了之前梯度指数级衰减的移动平均,继续沿该方向移动。
主要目的是解决两个问题:
1.Hessian矩阵的病态条件
2.随机梯度的方差
Nesterov动量
相比动量方法,它的不同之处在于计算梯度的时候施加了当前速度。
现在一般采用具动量的SGD优化方法。
4.参数初始化策略
目前的初始化策略是简单的、启发式的。完全确认的一个特性是初始化参数需要在不同单元间破坏对称性。
通常情况下,仅随机初始化权重,偏移等参数设置启发式挑选的常数。一般初始化模型的权重为高斯或均匀分布中随机抽取的值。
5.自适应学习率算法
AdaGrad
独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根。适用于凸优化问题,存在的问题是:从训练开始时积累梯度平方会导致有效学习率过早和过量的减小。
RMSProp
修改AdaGrad以在非凸设定下效果更好,改变梯度积累为指数加权的移动平均。可结合Nesterov使用。相比AdaGrad,使用移动平均引入新的超参数ρ,用来控制移动平均的步长。
使用Nesterov动量的RMSProp算法
- Adam
结合RMSProp和动量的变种。
- 动量直接并入了梯度一阶矩(指数加权)的估计。
- Adam包括偏置修正