《深度学习入门》第6章 与学习相关的技巧

一、参数的更新

SGD及变种
1、普通SGD update
SGD(Stochastic Gradient Descent)就是最常见的随机梯度下降。
向着参数的梯度的负方向改变(梯度方向是增加的方向)。
图片说明

这里的x可以是权值w也可以是偏置b。

2、Momentum update
相比于普通SGD,这种方法在深度网络中收敛更好。
受到物理中的启发:例子的力与势能梯度有相对关系。例子感受到的力,正是损失函数的负梯度。F=ma,负梯度正比于粒的加速度。与普通SGD不同,梯度直接作用于位置,这里用物理的角度来看,梯度直接影响速度,速度再影响位置。

3、Nestrevo Momentum update
与Momentum稍稍有点不同。对于凸函数具有较强的理论收敛保证,实际中效果比Mnmentum稍好。
当前参数向量在点x处,从Momentum更新中看v,忽略第二项v变成muv。做一个提前量用x_ahead=x+muv代替x。

每个参数适应学习率方法
前面的方法对每个参数学习了是固定的,调整学习率是一个耗时的过程。可以使用对每个参数都适应的学习率。
1、Adagrad
对于大的梯度,会使他的有效学习率减小;对于小的梯度会使他的有效学习率增大。这种方法的一个缺点是,在深度学习中,单调的学习率通常证明太激进,会使学习停止过早。

2、RMSprop
RMSprop是一种有效,但目前还未公开发布的自适应学习率方法。RMSprop改进Adagrad方法,减小他的激进,使用单调减小学习率。特别的,它使用了梯度平方移动平均值。根据梯度尺度来调整学习率是一个有利均衡的效果,但与Adagrad不同,更新不是单调小。

3、Adam
Adam是一种最近提出的方法,有点像RMSprop结合momentum。

二、权重的初始值

1、小随机数初始化。
权重初始值要非常接近0又不能等于0。解决方法就是将权重初始化为很小的数值,以此来打破对称性。其思路是:如果神经元刚开始的时候是随机且不相等的,那么它们将计算出不同的更新,并将自身变成整个网络的不同部分。小随机数权重初始化的实现方法是:W = 0.01 * np.random.randn(D,H)。其中randn函数是基于零均值和标准差的一个高斯分布(译者注:国内教程一般习惯称均值参数为期望\mu)来生成随机数的。根据这个式子,每个神经元的权重向量都被初始化为一个随机向量,而这些随机向量又服从一个多变量高斯分布,这样在输入空间中,所有的神经元的指向是随机的。也可以使用均匀分布生成的随机数,但是从实践结果来看,对于算法的结果影响极小。

2、使用1/sqrt(n)校准方差。
上面做法存在一个问题,随着输入数据量的增长,随机初始化的神经元的输出数据的分布中的方差也在增大。我们可以除以输入数据量的平方根来调整其数值范围,这样神经元输出的方差就归一化到1了。也就是说,建议将神经元的权重向量初始化为:w = np.random.randn(n) / sqrt(n)。其中n是输入数据的数量。这样就保证了网络中所有神经元起始时有近似同样的输出分布。实践经验证明,这样做可以提高收敛的速度。

3、稀疏初始化(Sparse initialization)。
另一个处理非标定方差的方法是将所有权重矩阵设为0,但是为了打破对称性,每个神经元都同下一层固定数目的神经元随机连接(其权重数值由一个小的高斯分布生成)。一个比较典型的连接数目是10个。

4、偏置(biases)的初始化。
通常将偏置初始化为0,这是因为随机小数值权重矩阵已经打破了对称性。对于ReLU非线性激活函数,有研究人员喜欢使用如0.01这样的小数值常量作为所有偏置的初始值,这是因为他们认为这样做能让所有的ReLU单元一开始就激活,这样就能保存并传播一些梯度。然而,这样做是不是总是能提高算法性能并不清楚(有时候实验结果反而显示性能更差),所以通常还是使用0来初始化偏置参数。

三、Batch Normalization

Batch Normalization就是在神经网络的训练过程中对每层的输入数据进行预处理。
图片说明
Batch Normalization的优点

(1)可以使用更高的学习率,BN有快速收敛的特性。在没有加Batch Normalization的网络中我们要慢慢的调整学习率时,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适。现在,我们在网络中加入Batch Normalization时,可以采用初始化很大的学习率,然后学习率衰减速度也很大,因此这个算法收敛很快。

(2)模型中BN可以代替dropout或者使用较低的dropout。dropout是经常用来防止过拟合的方法,但是模型中加入BN减少dropout,可以大大提高模型训练速度,提高网络泛化性能。

(3)减少L2权重衰减系数。用了Batch Normalization后,可以把L2权重衰减系数降低,论文中降低为原来的5倍。

(4)取消Loacl Response Normalization层。(局部响应归一化是Alexnet网络用到的方法),因为BN本身就是一个归一化网络层。

(5)BN本质上解决了反向传播过程中梯度消失的问题。BN算法对Sigmoid激活函数的提升非常明显,解决了困扰学术界十几年的sigmoid过饱和造成梯度消失的问题。在深度神经网络中,靠近输入的网络层在梯度下降的时候,得到梯度值太小,导致深层神经网络只有靠近输出层的那几层网络在学习。因为数据使用BN后,归一化的数据仅使用了sigmoid线性的部分。

(6)可以把训练数据彻底打乱。防止了每批训练的时候,某一个样本经常被挑选到。论文中指出这个操作可以提高1%的精度。

四、正则化

避免过拟合的方法之一是增加训练数据数量。那么,还有没有别的方法能让我们避免过拟合呢?一种可能的方法是减小网络的规模。然而,我们并不情愿减小规模,因为大型网络比小型网络有更大的潜力。
幸好,哪怕使用固定的网络和固定的训练数据,我们还有别的方法来避免过拟合。这就是所谓的正则化(regularization)技术。
1、在这一节我将描述一种最常用的正则化技术——权重衰减(weight decay)或叫 L2 正则(L2 regularization)。L2 正则的思想是,在代价函数中加入一个额外的正则化项。这是正则化之后的交叉熵:
图片说明

第一项是常规的交叉熵表达式。但我们加入了第二项,也就是网络中所有权值的平方和。它由参数 λ/2n 进行调整,其中 λ>0 被称为正则化参数(regularization parameter), n 是我们训练集的大小。我稍后会讨论应该如何选择 λ 。另外请注意正则化项不包括偏置。

2、Dropout
图片说明
Dropout很好理解,通过在神经网络迭代过程中随机关闭一些神经元达到防止过拟合的目的。
Regularization:
图片说明

Regularization的数学解释如上面的公式所示,在cost函数的后面增加一个惩罚项!如果一个权重太大,将导致代价过大,因此在后向传播后,就会对该权重进行惩罚,使其保持一个较小的值。

五、超参数的验证

在深度神经网络中,超参数的调整是一项必备技能,通过观察在训练过程中的监测指标如损失loss和准确率来判断当前模型处于什么样的训练状态,及时调整超参数以更科学地训练模型能够提高资源利用率。在本研究中使用了以下超参数,下面将分别介绍并总结了不同超参数的调整规则。

(1)学习率
学习率(learning rate或作lr)是指在优化算法中更新网络权重的幅度大小。学习率可以是恒定的、逐渐降低的,基于动量的或者是自适应的。不同的优化算法决定不同的学习率。当学习率过大则可能导致模型不收敛,损失loss不断上下震荡;学习率过小则导致模型收敛速度偏慢,需要更长的时间训练。通常 lr 取值为[0.01,0.001,0.0001]

(2)批次大小 batch_size
批次大小是每一次训练神经网络送入模型的样本数,在卷积神经网络中,大批次通常可使网络更快收敛,但由于内存资源的限制,批次过大可能会导致内存不够用或程序内核崩溃。bath_size通常取值为[16,32,64,128]

(3)优化器optimizer
目前Adam是快速收敛且常被使用的优化器。随机梯度下降(SGD)虽然收敛偏慢,但是加入动量Momentum可加快收敛,同时带动量的随机梯度下降算法有更好的最优解,即模型收敛后会有更高的准确性。通常若追求速度则用Adam更多。

(4)迭代次数
迭代次数是指整个训练集输入到神经网络进行训练的次数,当测试错误率和训练错误率相差较小时,可认为当前迭代次数合适;当测试错误率先变小后变大时则说明迭代次数过大了,需要减小迭代次数,否则容易出现过拟合。

(5)激活函数
在神经网络中,激活函数不是真的去激活什么,而是用激活函数给神经网络加入一些非线性因素,使得网络可以更好地解决较为复杂的问题。比如有些问题是线性可分的,而现实场景中更多问题不是线性可分的,若不使用激活函数则难以拟合非线性问题,测试时会有低准确率。所以激活函数主要是非线性的,如 sigmoid、tanh、relusigmoid、tanh、relu。sigmoidsigmoid 函数通常用于二分类,但要防止梯度消失,故适合浅层神经网络且需要配备较小的初始化权重,tanhtanh函数具有中心对称性,适合于有对称性的二分类。在深度学习中,relurelu是使用最多的激活函数,简单又避免了梯度消失。

六、小结

本章中参数的更新方法 ,除了SGD之外,还有Momentum、AdamGrad、Adam等方法。权重的初始值的赋值方法对进行正确的学习非常重要。作为权重的初始值,Xavier初始值、He初始值等比较有效。通过使用Batch Normalization,可以加速学习,并且对初始值变得健壮。抑制过拟合的正则化技术有权值衰减,Dropout等。逐渐缩小“好值”存在的范围是搜索超参数的一个有效方法。

#深度学习#
全部评论

相关推荐

点赞 10 评论
分享
牛客网
牛客企业服务