一个神经网络是一个遵循连接原则级联构成的函数逼近器(function approximation)。这个function将输入x转化成输出y。以image classification为例,x是图片,y是labels。
对于一个神经网络的训练,是指通过trail-and-error来获得网络中所有参数w的最优值。当网络中所有参数都取得最优值时,该网络针对某个损失函数可以在给定样本集上得到最低loss。
这个训练,也即参数估计,的过程,就是一个目标函数为minimize loss function的优化过程。解优化的工具有很多,针对凸优化和非凸优化又可进行分类。由于神经网络的参数较多以及其强非线性,导致其所构成的优化问题往往非凸(non-convex optmization)。解这种非凸优化的工具就是gradient descent(GD).注意,我们之所以要“估计”参数,即approximate the optimal set of weights,而不是直接求解出这组参数(analytical solution:令loss funciton的导数函数(if convex)=0,求出所有wi),是因为 it is too complex to find the perfect analytical solution of all w with all the samples. Thus we find approximated solutions by an (numerical solution) iterative process-----GD optmization.
GD是一个迭代循环,trail-and-error,试错的过程。对参数的估计和优化也是不积跬步无以至千里,每次update都是微调,积少成多。GD每次循环的操作有两步:1. 计算网络中每个参数对应的梯度;2. 按照该参数负梯度的方向更新每个参数。
- 其中第一步,即参数梯度的计算,用到的计数就是back propagation(BP)。BP就是以loss function为起点,one operation at a time地依据复合函数求导的chian rule,将在起点处计算的gradient慢慢地反推流淌,流入网络的每一个参数处。假设网络中含有10K个参数w,那么在BP时,每一个wi处计算得到的流入的梯度gi只是一个可正可负的实数;而这10K个gi组成的大vector G则是一个10K维的向量。这个向量定义在一个10K维的w(参数)空间。在这个空间中,损失函数L(w)作为BP的梯度起点,会构成一个优化曲面(convex loss function会构成一个只有一个全局最优的碗形曲面,non-convex则会额外含有很多local optimal)。
- 在得到每个参数上的梯度gi后,即得到了梯度矩阵G,我们就进行第二步,参数更新。GD顾名思义,是沿着梯度下降的方向(即负梯度方向)进行每一次参数更新。梯度下降的几何解释就是在Loss function定义在w空间的曲面上,在某一点沿着该点梯度下降的方向微调一次。这个“点”从何而来呢?由于是10K维参数空间中的点。那么一个点就对应一个10K vector,这个vector就是在此次update开始时我们网络所有参数wi的现状,也就此刻我们在空间中所处的位置。因此,10K的梯度vector G就指引了在10K空间中的这个点下降的方向。10K对10K,乐哉。
好,综上,我们了解了BP与GD的关系:GD是一个优化算法,BP是一种梯度计算流程。在神经网络的训练中,BP是GD中的一个步骤。
那么为什么BP适用于在神经网络ANN中计算gradient呢?这是因为ANN的连接属性所构成的acyclic graph很适合与chain rule的实施。
接下来,介绍一下GD的两大热门问题:
1. GD的分类; 2. GD第二步,即参数update的不同策略(即不同优化器)。
1. GD的分类:依据每次BP时,BP起点处(即loss function)计算梯度所依据的样本数量的不同而分类。
GD分为Batch GD(BGD),Stochastic GD(SGD),还有Mini-batch GD(MBGD)。在神经网络通过GD进行训练时还会牵扯到的概念包括:
- epoch(把训练集中所有的样本都遍历一遍算是完成一个epoch,可以理解为训练集上的一轮);
- batch size(一个mini-batch中随机采样多少个样本);
- iteration,itrs(完成一个mini-batch的训练即完成了一个iteration。一个epoch包含多个iteration)。
- Batch GD:用整个训练集中的所有样本各自计算所得的loss求平均,并依据此平均值计算BP gradient的起点来进行一次反传update;一个epoch只是一次update,更新太慢,参数update不够频繁,不符合少量多次的原则。而且计算所得的gradient estiamte的值太过保守,那些少量但是难的sample所产生的大的畸变的gradient,被无情地average掉了,所以hard sample的特殊贡献被抹杀了。然而,这些hard sample才是最应该被着力update的东西(关于此,有专门的focal loss等hard smaple mining技术)。另外,由于所得梯度很平庸无奇,所以在local optiam的脱困能力不佳。
- Stochastic GD:随机选择训练集中的一个样本计算loss,并依据此平均值计算BP的graident起点进行一次反传update;一个epoch会进行N次update,N是训练集大小。把每个sample的个性无限放大。让每个sample可以独立地按照自己的loss结果取更新参数,让网络学会善待自己,但某些时候这也就产生了noisy gradient,因为有些bad sample并不有助于网络训练。这时所得梯度有很强的fluctuation,增强了local optima的脱困能力,但是有可能出现在optima的oscillation。
- Mini-batch GD:随机选择batch size个样本,分别计算loss后取平均,并依据此平均值计算BP的gradient的起点来进行一次反传update;一个epoch进行N/batch size次update。取上述两家之长。
上图中蓝线是BGD优化迭代的过程,红线是SGD。可见BGD更稳健而SGD更躁动。
注意,无论是何种GD,即无论是用整个training set的全部samples,还是用一个batch的sample,还是只用一个sample,GD都是用BP的手段在每次update时获得了一个网络中梯度的estimates(gradient estimates)。这就反映了神经网络训练的概率性。也即,BP,可以理解为一个unbiased/biased gradeint estimator。
2. GD参数更新的不同策略:与GD分类无关,只关于learning rate和θ的计算有关。
GD的参数更新其实就是一条简单的公式:是learning rate,是参数wi在第t+1次BP之后得到的它的gradient
有如下两个思路来对上公式中的进行进化与改进:注意,两个思路的底层核心都是accumulating gradient
(1). accumulating gradient directly for update--->Momentum, Nesterov;
(2). accumulating gradient for adaptive learing rate--->AdaGrad, RMSProp, Adam(adam优化器是1和2的融合)
(1)Accumulating gradient directly for update:所有wi公用同样的learnig rate
重点讲Momentum,Nesterov略。
原始的GD update有几个缺点导致converge比较慢:1。 在优化曲面的谷底时梯度较小,所以每次update幅度(step size)较小导致overall所需的update次数增多;2. 在SGD时,当gradient出现fluctuation时,多次update之间左右摇摆,互相损伤,友军火力。
综上,提出不是每次update仅仅依靠此次BP计算所得的gradient,而是用一个整合了的历史积累gradient进行update:
公式中v(“velocity”)是对自身的一次exponentially decaying moving average of negative gradeints的计算。然后用v值直接update参数。α参数控制accumulating的力度,越大说明积累地越充分。往往α设定为0.9。
如上图,每次momentum的update相当于是积累的gradient的update和本次计算所得gradient的update一次组合,可见绿线所示的组合update比其余两个的模长(step size)都要大,可以理解为加快了参数更新。
具体地,模长的变化为:
当α=0.9时,Momentum的每次update的step size是普通GD的10倍。
(2)Accumulating gradient for adaptive learing rate.
weight即feature:针对不同的feature(即weight)采用不同的(缩小的)learning rate。在CNN中,一个conv filter就是一个学到的feature template,所以一组weight就对应一个feature。DNN中,一个weight就对应一个neuron,即一个feature。当某个weight在某次BP时gradient较大,说明其对应的这个feature在这个或这组sample上产生了较大作用(loss),所以应当有针对性地对这个feature(weight)进行精细优化调整。
weight = feature的理论直观理解如上图。左图中曲面上梯度分布均匀,表明各个weight(即空间的各个基上的分量)相等的重要性,因此在某个等梯度线上任何位置到到optima的距离相等,所以用相等的step size可以同时到达optima;右图,某些weight分量上梯度较大,其他则较小,导致优化曲面不对称。从同一个椭球面的长轴处(该方向weight分量的梯度较小)比短轴处(该处weight分量的梯度较大)到达optima的距离较远,所以需要较大的step size;而短轴处则需要较小的learning rate,因为此处自身的g就大,如果也很大易导致fluctuation。
综上,我们希望g大的weight分量的learning rate 相应减小。这就是adaptive learning rate的实质。具体地,learning rate按照g的平方减小。
AdaGrad:如下公式,r时accumulating factor over g的平方。
AdaGrad比较适合与convex optimization。在non-convex的情况下,AdaGrad对learning的削减过于激烈。
所以,在non-convex的情况下更适合与用RMSProp。
RMSProp:与AdaGrad直接accumulate g平方不同,RMSProp更温和地accumulate an exponentially decaying avergae of g square。
与AdaGrad一样。
Adam = Adaptive + momentum
adam优化器实际上时RMSProp + Momentum with bias correction terms for the first and second moments。
总结所有优化器,其实就是在上做文章。