深度模型中的优化
1、学习与纯优化有什么不同
2、神经网络优化中的挑战
3、基本算法
4、自适应学习率算法
5 、优化策略与元算法
学习与纯优化差别
1、机器学习算法的目标是降低泛化误差,即J∗(θ)=E(x,y)→pdataL(f(x;η),y)J∗(θ)=E(x,y)→pdataL(f(x;η),y),但事实上pdata我们不知道,我们只知道训练集,因此机器学习问题转化为最优化训练集上的期望损失,即利用训练集上的分布来代替p^p^(x,y)来替代真实的p(x,y)p(x,y),即最小化经验风险J(θ)=E(x,y)→p^dataL(f(x;η),y)=1m∑mi=1L(f(xi;η),yi)J(θ)=E(x,y)→p^dataL(f(x;η),y)=1m∑i=1mL(f(xi;η),yi)
2、现代优化方法是基于梯度下降的,有些经验损失函数,比如0-1损失,没有有效的导数,因此,我们通常会优化代理损失函数(surrogate loss function),比如交叉熵损失函数。
3、机器学习算法中的优化算法在计算参数的每一次更新时通常仅使用代价函数中一部分项来估计代价函数的期望值,在整个数据集的每个样本上的损失来评估模型,代价非常大,实践中,可以从数据集中随机采样少量的样本,然后计算这些样本的平均值。
(1)n个样本均值的标准差为σ/n−−√σ/n,基于100个样本和10000个样本,后者需要的计算量是前者的100倍,但是却只降低了10倍的标准差。因此,小批量算法会收敛的更快。
(2)一个原因是训练集中大量样本都对梯度做出相似的贡献
小批量的大小由以下因素决定:
(1)、更大的批量会更精确梯度计算,但是回报是现行的
(2)、极小批量难以充分利用多核架构,更小批量处理不会减少计算时间
(3)、所有样本参与训练,对内存要求过高,硬件不支持
(4)、通常采用2的幂数来作为批量大小可以获得更少的运行时间,一般选32-256
(5)、小批量算法在学习过程中加入了噪声,因此,会有一定的正则化效果。
小批量要求随机抽取,因此常常需要打乱样本顺序
神经网络优化中的挑战
传统机器学习会小心设计目标函数和约束,以确保优化问题是凸的,但训练神经网络时,一定会遇到非凸情况。
1、局部极小点
2、高原、鞍点和平坦区域:由于神经网络参数维度非常高,局部极小点出现的机会非常小,鞍点则更常见,鞍点附近的梯度非常小,但实验中梯度下降似乎可以逃离鞍点。除了鞍点和极小点,也可能存在高原、平坦区域,此时梯度和Hessian矩阵都是零,这是所有优化问题的主要问题。
3、梯度爆炸:训练非常深的神经网络或循环神经网络时,会出现像悬崖一样的斜率较大的区域,这是由于几个较大的权重相乘 导致的,遇到斜率较大的悬崖结构是,梯度更新会很大程度改变参数值,我们可以采用启发式的梯度截断 来避免,传统梯度下降至说明无限小区域内的最佳方向,但没有说明最佳步长,当梯度下降提议更新很大一步时,梯度截断会干涉以减小步长,循环神经网络中非常常见。
4、长期依赖 :当计算图变得极深时,由于变深的结构使得模型丧失了学习到先前信息的能力,让优化变得及其困难,因为循环神经网络要在很长时间序列的各个时刻重复应用相同操作来构建非常深的计算图,并且模型参数共享,问题会更严重。例如,假设某个计算图中包含一条反复与矩阵W相乘的路径,经过t步后,相当于乘以WtWt,假设W可分解为 W=Vdiag(λ)V−1W=Vdiag(λ)V−1,则Wt=Vdiag(λt)V−1Wt=Vdiag(λt)V−1,当t比较大时,λiλi大于1,会发生梯度爆炸(exploding gradient) ,λiλi小于1,则会出现梯度消失(vanishing gradient) 。梯度消失会使得我们难以知道朝那个方向移动能改进代价函数,而梯度爆炸会使得学习不稳定。xTWtxTWt随着t的增加,最终会丢失点x中的有效信息(稳定状态只与W有关)
前馈神经网络中即使非常深的网络,也能很大程度上有效避免梯度消失于梯度爆炸的问题。
基本算法
随机梯度下降 (SGD):基本训练方法,超参数:学习率
动量 (momentum):动量算法主要有两个作用:
1、解决随机梯度下降算法梯度的高方差问题,使摆动不至于太剧烈:增加动量项,可以近似认为增加了梯度的采样的样本数(最近时间的梯度会有比较大的权重),根据σ/n−−√σ/n可知,方差减小
2、加大了步长,提高了收敛速度:每一次梯度都包含正确的梯度方向和方差引起的摆动,增加动量,相当于将之前多个梯度叠加,增加了共同方向(期望梯度方向),因此,相等与增大了步长。
具体操作如下:
on iteration t:
compute dW,db on the current mini-batch
vdw=βvdw+(1−β)dWtvdw=βvdw+(1−β)dWt
vdb=βv