CS231n学习笔记目录(2016年Andrej Karpathy主讲课程)
- Lecture1:Introduction(介绍)
- Lecture2:Image Classification Pipeline(数据驱动的图像分类方式) (上)
- Lecture2:Image Classification Pipeline(数据驱动的图像分类方式) (下)
- Lecture3:Loss functions and Optimization(线性分类器损失函数与最优化)
- Lecture4:Backpropagation and Neural Networks(反向传播与神经网络)
- Lecture5:Training Neural Networks(神经网络训练细节) Part 1
- Lecture6:Training Neural Networks(神经网络训练细节) Part 2
- Lecture7:Convolutional Neural Networks(卷积神经网络)
Parameter Updates
SGD
随机梯度下降是一种较为简单的优化算法,首先通过反向传播得到梯度,然后用梯度乘以学习率:
随机梯度下降算法是根据梯度的方向进行更新的,如果有一个损失函数表面(损失值集成的平面),有一个方向的长度远远大于其他方向,所以损失函数(偏导数)在该水平方向上就比较浅显(shallow),而在垂直方向上就比较陡峭(steep),我们要根据合成的方向去进行参数更新,以达到损失的最小值,也就是说,损失函数在水平方向更新的很慢,在垂直方向上更新的较快:
上述图中仅展示了二维数据的情况,但在实际中,我们的神经网络可能包含成百上千个参数,它会沿着很多的方向运动,并需要根据不同方向的梯度值进行更新,因此SGD的表现效果并不好。
另外,SGD容易陷入局部最小值(鞍点),因为在这种点上的梯度为0,就会一直卡在该点,不会继续变动。
Momentum
Momentum算法不是直接进行梯度更新,而是增加变量m,将其定义为速度,因此增量值变成m,m的更新如下,其中μ是一个超参数,通常取值为0.9。
关于m的更新可以用物理方面来理解,在球以滚动的方式接近笑脸时,梯度可以视为一种动力,相当于加速度,而μ倍的m可以看作一种摩擦力,每一次运动都会有轻微的减速,球在损失函数表面滚动,随着时间的推移逐渐放慢速度,即使出现在鞍点的位置,梯度变为0,但球依然有速度,就能继续变化。
Nesterov Momentum
在Momentum中,我们使用之前的速度和此时的梯度进行更新。
我们考虑梯度方向(红色向量)和速度方向(绿色向量),根据两者的向量和(蓝色向量)进行更新,而Nesterov Momentum在没有计算梯度(红色向量)的情况下建立之前的速度方向(绿色向量),然后计算现在的梯度,最后计算向量和。
AdaGrad
它是由凸优化理论发展而来的,它和一些基本的随机梯度下降的算法形式是一样的:
其中η为学习率,ε为一个很小的数(如1e-7),来保证分母不为零。其中nt是一个联合矢量,由梯度的平方构成:
每个参数自适应学习速率方法的原因是因为参数空间的每一维都有自己的学习速率,会根据梯度规模的大小动态的变化。当垂直方向有较大梯度时,就会衰减学习速率,使得垂直方向更新的步长越来越小,水平方向上的梯度较小,所以相对垂直方向,更新速度更快,相当于针对不同梯度方向的补偿措施。
在长时间训练的过程中,AdaGrad算法中会不断地给分母添加正数,因此学习率就会逐渐衰减到0,最后完全停止学习。
RMSprop
由于AdaGrad算法的性质,长时间训练后学习率会逐渐衰减到0,但神经网络中需要算法有持续的活力来不断更新数据,而不是衰退到停止。因此Geoff Hinton对AdaGrad做了小小的改变,不再是对每一维度计算平方和,而是变成一个泄露的变量,引入衰减率这个超参数,通常设置为0.99,计算:
依然保存了在不同方向上对梯度的补偿效果,但不会发生更新停止的现象。
Adam
是将Momentum和RMSprop结合的一种算法,利用梯度的一阶矩估计和二阶矩估计动态调整参数的学习率:
从另一角度理解,通过小批量抽样处理,在向前传播的过程中会得到很多随机值噪声,相比于在每一步都计算各自的梯度值,利用前面几个梯度的衰减和能够稳定梯度的方向。
上述公式中用到了偏执矫正,引入时间步长t,事实上这是一种针对m、n初始化为0的补偿措施,所以刚开始数据可能不正确,因此在开始的几次迭代中把m和n放大,这只会在最初的几次迭代中有所作用。
Evaluation: Model Ensembles
如果对训练集中大量独立的模型进行训练,而不仅仅对单一的模型,然后在测试的时候计算出平均的结果,效果就能得到2%的提升。这个过程必须处理所有不同的独立的模型,每个模型都要进行向前计算向后传播,因此会使得训练时间变长。
在使用集成模型时有一些小技巧,例如,训练神经网络时设置一些检查点,在每个检查点都去验证模型在验证集上的表现。
Regularization(dropout)
dropout的意思是在神经网络训练的向前传播过程中,要随机的把一些神经元设置为0,也就是加入一个以50%概率输出0或者1的过滤器,乘以隐藏层的激活函数,使得激活函数中的一些神经元失活,在反向传播时与之相同。
Advantages
防止过拟合。因为如果只用一半网络的话,神经网络的表达能力就小了很多,减少了在训练中涉及到的变量数,从而减少过拟合的概率。
Interpretation
如果我们想要用神经网络来计算猫的分数,我们要使用所有的神经元,dropout达到的目的就是强制某些特征对图片的表示是冗余的,而这个冗余的存在表示我们不能控制哪些神经元会失活,所以如果想要分类更加准确,就需要让猫的分数依赖于更多的特征,而不是完全依赖某一个特征,因为每一个特征都有可能被失活。
另一种对dropout的解释为,dropout可以视为训练一个由很多小模型组合而成的大模型,每个子网络都是原来大网络中的一个,但原网络和子网络之间并不能很好地分享参数。如果在向前传播时随机挑选了一些神经元让它们失活,在反向传播时,我们也要经过这些失活的神经元,而只有那些在向前传播过程中没有失活的神经元的梯度才会被更新,因为神经元一旦失活,输出就固定为0,就不会有梯度经过,它对上一层神经元的权值也不会更新。所以在这个过程中其实只是训练了一个在某次取样中原网络的一部分。
但我们希望在测试的时候消除这种随机性,假设在如下的测试中,有两个输入和一个输出,我们可以通过多次采样来进行逼近,所以dropout的掩码集合有四个(00,01,10,11),然后对这四种情况取平均:
最后计算出的是1/2倍的w1x+w2y,因此这个神经元更新的期望值实际上是测试环节中的一半,这是因为我们在dropout中用到的失活概率为50%。所以在测试环节的前向传播中,所有的神经元都要乘以0.5,如果不这么做的话,最后得到的输出相对于训练环节的输出期望值要大很多,输出分布也会改变,因为网络中的有些神经元在训练时从来没有见过这么大的值,因此,如果要补偿这种偏差,就一定要把这个输出期望降下来。由于测试的时候使用了网络中的所有神经元,就只能通过降低激活函数的输出值来改变输出期望。
Gradient Checking
梯度检验是为了检测我们的神经网络反向传播是不是正确的,通过导数的公式来求梯度:
但通常我们没有办法让x趋近于0,因此我们一般使用:
其中ε是一个很小的数,通常设为1e-7,然后通过比较计算的梯度与反向传播计算的梯度之间的欧氏距离:
其中threshold为阈值,通常设为1e-7,若距离小于该阈值,则认为神经网络的实现是正确的。
(纯学习分享,如有侵权,联系删文)