机器器学习中,梯度下降法常⽤用来对相应的算法进⾏行行训练。常⽤用的梯度下降法包含三种不不同的形式,分别是BGD、SGD和MBGD,它们的不不同之处在于我们在对⽬目标函数进⾏行行梯度更更新时所使⽤用的样本量量的多少。以线性回归算法来对三种梯度下降法进⾏行行⽐比较。⼀一般线性回归函数的假设函数为:(即有n个特征)对应的损失函数为下图即为⼀一个⼆二维参数和组对应的损失函数可视化图像:批量量梯度下降法(BatchGradientDescent,简称BGD)是梯度下降法昀原始的形式,它的具体思路路是在更更新每⼀一参数时都使⽤用所有的样本来进⾏行行更更新,其数学形式如下:深度学习系列列(7):神经⽹网络的优化⽅方法⼀一、GradientDescent[RobbinsandMonro,1951,Kieferetal.,1952]=hθ∑j=0nθjxjL(θ)=12m∑i=1m(h()−)xiyi2θ0θ11.1BGD(BatchGradientDescent)1)对上述的损失函数求偏导:2)由于是昀⼩小化损失函数,所以按照每个参数的梯度负⽅方向来更更新每个:其伪代码如下:for i in range(nb_epochs): params_grad = evaluate_gradient(loss_function, data, params) params = params - learning_rate * params_grad从上⾯面的公式可以看到,它得到的是全局昀优解,但是每迭代⼀一步,都要⽤用到训练集所有的数据,若样本数⽬目很⼤大,那么迭代速度会⼤大⼤大降低。其优缺点如下:优点:全局昀优解;易易于并⾏行行实现;缺点:当样本量量很⼤大时,训练过程会很慢由于批量量梯度下降法在更更新每⼀一个参数时,都需要所有的训练样本,所以训练过程会随着样本数量量的加⼤大⽽而变得异常缓慢。随机梯度下降法(StochasticGradientDescent,简称SGD)正是为了了解决批量量梯度下降法这⼀一弊端⽽而提出的。对每个样本的损失函数对求偏导得到对应的梯度,来更更新:具体的伪代码形式为for i in range(nb_epochs): np.random.shuffle(data) for example in data: params_grad = evaluate_gradient(loss_function, example, params) params = params - learning_rate * params_grad随机梯度下降是通过每个样本来迭代更更新⼀一次,如果样本量量很⼤大的情况(例例如⼏几⼗十万),那么可=−(−())∂L(θ)∂θj1m∑i=1my(i)hθx(i)x(i)jθθ=+(−())θ′jθj1m∑i=1my(i)hθx(i)x(i)jm1.2SGD(StochasticGradientDescent)θθ=+(−())θ′jθjy(i)hθx(i)x(i)j能只⽤用其中⼏几万条或者⼏几千条的样本,就已将将迭代到昀优解了了,对⽐比上⾯面的批量量梯度下降,迭代⼀一次不不可能昀优,如果迭代⼗十次的话就需要遍历训练样本10次。但是,SGD伴随的⼀一个问题是噪⾳音较BGD要多,使得SGD并不不是每次迭代都向着整体昀优化⽅方向。其优缺点如下:优点:训练速度快;缺点:准确度下降,并不不是全局昀优;不不易易于并⾏行行实现。从迭代次数上来看,SGD迭代的次数较多,在解空间的搜索过程看起来很盲⽬目。其迭代的收敛曲线示意图表示如下:从上述的两种梯度下降法可以看出,其各⾃自均有优缺点,那么能否在两种⽅方法的性能之间取得⼀一个折中呢?即,算法的训练过程⽐比较快,⽽而且也要保证昀终参数训练的准确率,⽽而这正是⼩小批量量梯度下降法(Mini-batchGradientDescent,简称MBGD)的初衷。下⾯面的伪代码中,我们每轮迭代的mini-batches设置为50:for i in range(nb_epochs): np.random.shuffle(data) for batch in get_batches(data, batch_size=50): params_grad = evaluate_gradient(loss_function, batch, params) params = params - learning_rate * params_grad虽然梯度下降算法效果很好,并且被⼴广泛的使⽤用,但它存在着⼀一些需要解决的问题:θ1.3MBGD(Mini-batchGradientDescent)1.4梯度下降算法的局限1)⾸首先选择⼀一个合适的学习速率很难。若学习速率过⼩小,则会导致收敛速度很慢。如果学习速率过⼤大,那么会阻碍收敛,即在极值点附近振荡2)学习速率调整(⼜又称学习速率调度,Learningrateschedules)试图在每次更更新过程中,改变学习速率,如模拟退⽕火按照预先设定的调度算法或者当相邻的迭代中⽬目标变化⼩小于⼀一个阈值时候减⼩小学习速率。但是梯度下降算法的调度和阈值需要预先设置,⽆无法对数据集特征进⾏行行⾃自适应。3)模型所有的参数每次更更新都是使⽤用相同的学习速率。如果我们的数据很稀疏并且我们的特征出现的次数不不同,我们可能不不会希望所有的参数以某种相同的幅度进⾏行行更更新,⽽而是针对很少出现的特征进⾏行行⼀一次⼤大幅度更更新。4)在神经⽹网络中常⻅见的极⼩小化highlynon-convexerrorfunctions的⼀一个关键挑战是避免步⼊入⼤大量量的suboptimallocalminima。Dauphin等⼈人认为实践中的困难来⾃自saddlepoints⽽而⾮非localminima。这些saddlepoints(鞍点)经常被⼀一个相等误差的平原包围,导致SGD很难摆脱,因为梯度在所有⽅方向都近似于0。这是⼀一种启发式算法。形式如下:我们⽤用物理理上的动能势能转换来理理解它。即物体在这⼀一时刻的动能=物体在上⼀一时刻的动能+上⼀一时刻的势能差。由于有阻⼒力力和转换时的损失,所以两者都乘以⼀一个系数。就像⼀一个⼩小球从坡上向下滚,当前的速度取决于上⼀一时刻的速度和势能的改变量量。这样在更更新参数时,除了了考虑到梯度以外,还考虑了了上⼀一时刻参数的历史变更更幅度。例例如,参数上⼀一次更更新幅度较⼤大,并且梯度也较⼤大,那么在更更新时是不不是得更更加猛烈烈⼀一些了了。这样的启发式算法,从直观感知上确实有道理理。下⾯面两张图直观的展示了了Momentum算法,其中绿⾊色箭头表示上⼀一时刻参数的变更更幅度,红⾊色箭头表示梯度,两者向量量叠加即得到蓝⾊色箭头即真实的更更新幅度。⼆二、Momentum=γ+ηJ(θ)vtvt−1∇θθ=θ−vt还是以上⾯面⼩小球的例例⼦子来看,momentum⽅方式下⼩小球完全是盲⽬目被动的⽅方式滚下的。这样有个缺三、NAG(Nesterovacceleratedgradient)[Nesterov,1983]点就是在邻近昀优点附近是控制不不住速度的。我们希望⼩小球可以预判后⾯面的“地形”,要是后⾯面地形还是很陡峭,那就继续坚定不不移地⼤大胆⾛走下去,不不然的话就减缓速度。当然,⼩小球⾃自⼰己也不不知道真正要⾛走到哪⾥里里,这⾥里里以作为下⼀一个位置的近似,将动量量的公式更更改为:相⽐比于动量量⽅方式考虑的是上⼀一时刻的动能和当前点的梯度,⽽而NAG考虑的是上⼀一时刻的梯度和近似下⼀一点的梯度,这使得它可以先往前探探路路,然后慎重前进。Hinton的slides是这样给出的:其中两个bluevectors分别理理解为梯度和动能,两个向量量和即为momentum⽅方式的作⽤用结果。⽽而靠左边的brownvector是动能,可以看出它那条bluevector是平⾏行行的,但它预测了了下⼀一阶段的梯度是redvector,因此向量量和就是greenvector,即NAG⽅方式的作⽤用结果。momentum项和nesterov项都是为了了使梯度更更新更更加灵活,对不不同情况有针对性。但是,⼈人⼯工设置⼀一些学习率总还是有些⽣生硬,接下来介绍⼏几种⾃自适应学习率的⽅方法训练深度⽹网络的时候,可以让学习率随着时间退⽕火。因为如果学习率很⾼高,系统的动能就过⼤大,参数向量量就会⽆无规律律地变动,⽆无法稳定到损失函数更更深更更窄的部分去。对学习率衰减的时机把握很有技巧:如果慢慢减⼩小,可能在很⻓长时间内只能浪费计算资源然后看着它混沌地跳动,实际进展很少;但如果快速地减少,系统可能过快地失去能量量,不不能到达原本可以到达的昀好位置。通常,实现学习率退⽕火有三种⽅方式:θ−γvt−1=γ+ηJ(θ−γ)vtvt−1∇θvt−1θ=θ−vt四、学习率退⽕火1)随步数衰减:每进⾏行行⼏几个周期就根据⼀一些因素降低学习率。通常是每过5个周期就将学习率减少⼀一半,或者每20个周期减少到之前的⼗十分之⼀一。这些数值的设定是严重依赖具体问题和模型的选择的。在实践中可能看⻅见这么⼀一种经验做法:使⽤用⼀一个固定的学习率来进⾏行行训练的同时观察验证集错误率,每当验证集错误率停⽌止下降,就乘以⼀一个常数(⽐比如0.5)来降低学习率。2)指数衰减。数学公式是,其中是超参数,是迭代次数(也可以使⽤用周期作为单位)。3)衰减的数学公式是,其中是超参数,t是迭代次数。在实践中,我们发现随步数衰减的随机失活(dropout)更更受欢迎,因为它使⽤用的超参数(衰减系数和以周期为时间单位的步数)⽐比k更更有解释性。但如果你有⾜足够的计算资源,可以让衰减更更加缓慢⼀一些,让训练时间更更⻓长些。之前的⽅方法中所有参数在更更新时均使⽤用同⼀一个Learningrate。⽽而Learningrate调整是⼀一个⾮非常耗费计算资源的过程,所以如果能够⾃自适应地对参数进⾏行行调整的话,就⼤大⼤大降低了了成本。在Adagrad的每⼀一个参数的每⼀一次更更新中都使⽤用不不同的learningrate。这样的话,令第步更更新时对第个参数的梯度为参数的更更新的⼀一般形式为:如上所述,Adagrad的差异之处正是在于learningrate不不同于其他,将learningrate改为如下:实质上是对学习率形成了了⼀一个约束项regularizer:,是对直⾄至t次迭代的梯度平⽅方和的累加和,是⼀一个防⽌止分⺟母为0的很⼩小的平滑项。不不⽤用平⽅方根操作,算法性能会变差很多我们可以将到累加的梯度平⽅方和放在⼀一个对⻆角矩阵中中,其中每个对⻆角元素是参数到时刻为⽌止所有时刻梯度的平⽅方之和。由于的对⻆角包含着所有参数过去时刻的平⽅方之α=α0e−kt,kα0t1/tα=/(1+kt)α0,kα0五、⾃自适应学习率⽅方法5.1Adagrad[Duchietal.,2011]ti=J()gt,i∇θθj=−ηθt+1,iθt,igt,i=−·θt+1,iθt,iη+ϵ∑ti=0()gi2‾‾‾‾‾‾‾‾‾‾‾‾‾‾√gt,i1+ϵ∑ti=0()gi2√∑ti=0()gi2ϵ∈Gtℝd×d(i,i)θitGt和,我们可以通过在和执⾏行行element-wisematrixvectormulitiplication来向量量化我们的操作:优点:Adagrad让学习速率⾃自适应于参数,在前期较⼩小的时候,regularizer较⼤大,能够放⼤大梯度;后期较⼤大的时候,regularizer较⼩小,能够约束梯度;因为这⼀一点,它⾮非常适合处理理稀疏数据。Dean等⼈人发现Adagrad⼤大⼤大地提⾼高了了SGD的鲁棒性并在⾕谷歌的⼤大规模神经⽹网络训练中采⽤用了了它进⾏行行参数更更新,其中包含了了在Youtube视频中进⾏行行猫脸识别。此外,由于低频词(参数)需要更更⼤大幅度的更更新,Pennington等⼈人在GloVewordembeddings的训练中也采⽤用了了Adagrad