美文网首页
改进神经网络学习的方法

改进神经网络学习的方法

作者: 阿阿阿阿毛 | 来源:发表于2017-07-11 00:32 被阅读0次

1. 交叉熵代价函数

采用MSE作为代价函数存在一个问题,那么就是当人工神经元在其犯错比较大的情况下学习很有难度。这里的学习缓慢,实际上指的是这些偏导数很小。那么我们看一下sigmoid的图像:

当神经元的输出接近1的时候,曲线变的相当平,所以导数就很小。这就是学习缓慢的原因所在。

如何解决这个问题呢?研究表明,我们可以通过使用交叉熵代价函数来替换二次代价函数。

将交叉熵看作是代价函数有两个原因。(1) 它是非负的。因为求和中的所有独立的项都是负数的,因为对数函数的定义域为(0,1),并且求和前面有一个负号。(2) 如果对于所有的训练输入x,神经元实际的输出接近目标值,那么交叉熵将接近0。

综上所述,交叉熵是非负的,在神经元达到很好的正确率的时候会接近0。

我们可以计算出关于权重和偏置的偏导数:

和二次代价函数的求偏导数结果相比,我们可以发现,sigmoid'(Z)被消掉了,那就意味着,我们不再需要关心它是不是变得很小。所以当使用二次代价函数的时候,神经元在接近正确输出前犯了明显的错误的时候,学习变得更加缓慢;而使用交叉熵,在神经元犯明显错误时学习得更加快。

那么什么时候用交叉熵代替二次代价函数呢?实际上,如果在输出神经元是S型神经元时交叉熵一般都是更好的选择。为什么?考虑下我们初识化网络的权重和偏置时候,通常采用某种随机方法。可能会发生这样的情况,这些初始选择会对某些训练输入误差相当明显。如果我们使用二次代价函数,那么就会导致学习速率的下降。

2. 柔性最大值(softmax)

大多数情况下我们会使用交叉熵来解决学习缓慢的问题。但是,我们也可以用柔性最大值神经元层来解决这个问题。

在对数似然代价函数进行偏置和权重的求偏导:

正如前面的分析相类似,这些表达式确保我们不会遇到学习缓慢的问题。事实上,可以把一个具有对数似然代价的柔性最大值输出层看作与一个具有交叉熵代价的s型输出层类似。但是有了这样的相似性,我们到底应该使用一个交叉熵代价的s型输出层还是使用一个具有对数似然代价的柔性最大值输出层呢?实际上,在很多应用场合中,这两种方式的效果都不错。或者用另外一个视角我们可以解释为,柔性最大值加上对数似然的组合更加适用于哪些需要将输出激活值解释为概率的场景。

3. 过拟合

当训练集的准确率和测试机的准确率有较大差距时,那么就是过拟合。因为我们的网络实际上在学习训练集的特例,而不是能够一般的进行识别。我们的网络几乎都是在单纯记忆训练集合,而没有对数字本质进行理解进而泛化到测试数据集上。

3.1 早停法(early-stopping)

我们跟踪测试数据集的准确率随训练变化的情况。当我们看到测试集的准确率不再提升,那么我们就停止训练。

3.2 增加训练样本(data augmentation)

一般来说,最好的降低过度拟合的方法之一就是增加训练样本的量。有了足够的训练数据,就算是一个规模非常大的网络也不大容易过度拟合。不幸的是,训练数据是很难得到或者很昂贵的资源,所以这是一种不太切合实际的选择。

在得不到全新的更多的训练样本的条件下,我们可以采取人为扩展训练数据(data augmentation)。比如对图片进行旋转,弹性扭曲,增加噪声等,来获取额外的数据集。

3.3 规范化

还有一种方法能够减轻过度拟合,那就是降低网络的规模。然而, 大的网络拥有一种比小网络更强的潜力,所以这里存在一种应用冗余性的选项。幸运的是,即使我们只有一个固定的网络和固定的训练集,我们还有办法能够缓解过度拟合,那就是规范化

(1) L1规范化

对代价函数进行求偏导:

(2) L2规范化(权重衰减)

L2规范化的想法是增加一个额外的项到代价函数上,这个项叫做规范化项。

为了直观的感受规范化对于过拟合的影响,我们计算一个规范化神经网络的偏导数:

L1规范化和L2规范化的比较

在L1规范化中,权重通过一个常量向0进行缩小。在L2规范化中,权重通过一个和w成比例的量进行缩小。所以当一个特定的权重绝对值|w|很大时,L1规范化的权重缩小远比L2规范化要笑得很多。相反,当一个特定的权重绝对值|w|很小时,L1规范化的权重缩小得要比L2规范化大得多。最终结果是L1规范化倾向于聚集网络的权重在相对少量的高重要度连接上,而其他权重就会被驱使向0。

直觉地看,规范化的效果是让网络倾向于学习小的权重,其他的东西都一样。大的权重只有能够给代价函数第一项足够的提升时候才能被允许。换言之,规范化可以当作一种寻找小的权重和最小化原始代价函数之间的折中。这两部分之间相对的重要性就要由lambda决定。lambda越小,就偏向于最小化原始代价函数,反之,倾向于小的权重。

为什么正则化能够减轻过拟合

正则项是为了降低模型的复杂度,从而避免模型区过分拟合训练数据,包括噪声与异常点(outliers)。从另一个角度上来讲,正则化即是假设模型参数服从先验概率,即为模型参数添加先验,只是不同的正则化方式的先验分布是不一样的。这样就规定了参数的分布,使得模型的复杂度降低(试想一下,限定条件多了,是不是模型的复杂度降低了呢),这样模型对于噪声与异常点的抗干扰性的能力增强,从而提高模型的泛化能力。还有个解释便是,从贝叶斯学派来看:加了先验,在数据少的时候,先验知识可以防止过拟合;从频率学派来看:正则项限定了参数的取值,从而提高了模型的稳定性,而稳定性强的模型不会过拟合,即控制模型空间。

另外一个角度,过拟合从直观上理解便是,在对训练数据进行拟合时,需要照顾到每个点,从而使得拟合函数波动性非常大,即方差大。在某些小区间里,函数值的变化性很剧烈,意味着函数在某些小区间里的导数值的绝对值非常大,由于自变量的值在给定的训练数据集中的一定的,因此只有系数足够大,才能保证导数的绝对值足够大。

另外一个解释,规则化项的引入,在训练(最小化cost)的过程中,当某一维的特征所对应的权重过大时,而此时模型的预测和真实数据之间距离很小,通过规则化项就可以使整体的cost取较大的值,从而,在训练的过程中避免了去选择那些某一维(或几维)特征的权重过大的情况,即过分依赖某一维(或几维)的特征。假设神经网络大多数是有很小的权重,这极有可能出现在规范化的网络中。更小的权重意味着网络的行为不会因为我们随便改变了一个输入而改变太大。这让规范化网络学习局部噪声的影响更加困难。将它看作一个让单个的输入不会影响网络输出太多的方式。相对的,规范化网络学习去对整个训练集中经常出现的证据进行反应。对比看,大权重的网络可能因为输入的微小变化而产生比较大的行为改变。所以一个无规范化的网络可能使用大的权重来学习包含训练集中的大量信息的复杂模型。

3.4 弃权

弃权是一种相当激进的技术。和规范化不同,弃权技术并不依赖于代价函数的修改。而是,在弃权中,我们改变了网络本身。

通常我们会通过在网络中前向传播x,然后进行反向传播来确定对梯度的贡献。使用弃权技术,这个过程就改了。我们会从随机地删除网络中的一部分的隐藏神经元开始,同时让输入层和输出层的神经元保持不变。我们前向传播输入x,通过修改后的网络,然后反向传播结果,同样通过这个修改后的网络。在一个小批量数据小批量的若干样本上进行这些步骤后,我们对有关的权重和偏置进行更新。然后重复这个过程,首先重置弃权的神经元,然后选择一个新的随机的隐藏神经元的子集进行删除,估计对一个不同的小批量数据的梯度,然后更新权重和偏置。

通过不断地重复,我们的网络会学到一个权重和偏置的集合。当然,这些权重和偏置也是在一半的隐藏神经元被弃权的情形下学到的。当我们实际运行整个网络时,是指两倍的隐藏神经元将会被激活。为了补偿这个,我们将从隐藏神经元网络出去的权重减半。

弃权为什么会减少过拟合的影响?

这个弃权过程看起来怪怪的,像是临时安排的。为什么我们能指望这种方式规范化呢?想象一下,我们训练几个不同的神经网络,都使用同一个训练数据。当然,网络可能从同一初始状态开始的,但是最终的结果也会有一些差异。出现这些情况,我们可以使用一些平均或者投票的方式来决定接受哪个输出。例如,我们训练了五个网络,其中三个把一个数字分类成3,那么它很可能就会是3。这种平均的方式通常是强大的方式来减轻过拟合。原因在于不同的网络可能回以不同的方式过度拟合,平均法可能帮助我们消除那样的过度拟合。

那么这个和弃权什么关系呢?启发地看,当我们弃权掉不同的神经元集合时,有点像我们在训练不同的神经网络。所以,弃权过程就如同大量不同网络的效果的平均那样。不同的网络会以不同的方式过度拟合了,所以,弃权过的网络的效果会减轻过度拟合。

4. 权重初始化

创建了神经网络后,我们需要进行权重和偏置的初始化。我们可以采取独立高斯随机变量来选择权重和偏置,其被归一化为均值为0,标准差为1。但是,还有没其他一些更好的方式来设置初始的权重和偏置呢?结果表明,归一化的高斯分布不是最好的。为什么?

所以又回到了学习速率缓慢的问题。但是前面的情况是输出神经元在错误的值上饱和导致学习的下降。我们之前通过代价函数的选择解决了前面的问题。不幸的是,尽管那种方式在输出神经元上有效,但是对于隐藏神经元的饱和缺一点作用都没有。

5. 如何选择神经网络的超参数

(1) 学习速率

首先,我们可以选择在训练数据上的代价立即开始下降或者非震荡或者增加时作为学习速率的阈值的估计。这个估计并不需要太过精确。你可以估计这个值的量级。如果代价在训练的前面若干回合开始下降,你就可以逐步地尝试更大的学习速率,知道你找到一个学习速率的值在开始若干回合,代价就开始震荡或者增加。相反,如果在一开始选择的那个学习速率,代价就开始震荡或者增加,那么你就可尝试更小的学习速率。

我们一直都将学习速率设置为常量。但是,通常可以采取可变的学习速率更加有效。在学习的前期,权重可能会非常糟糕。所以最好是选择一个较大的学习速率让权重变化得更快。越往后,我们可以降低学习速率,这样能做出更加精良的调整。

(2) 小批量数据大小

选择最好的小批量数据大小也是一种折衷。太小了,你不会用上很好的矩阵库的快速计算。太大,你是不能够足够频繁地更新权重的。你所需要的是选择一个折衷的值,可以最大化学习的速率。

6. 梯度下降的优化方法

随机梯度下降(SGD)最大的缺点在于每次更新可能并不会按照正确的方向进行,因此可以带来优化波动(扰动)。

不过从另一个方面来看,随机梯度下降所带来的波动有个好处就是,对于类似盆地区域(即很多局部极小值点)那么这个波动的特点可能会使得优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样便可能对于非凸函数,最终收敛于一个较好的局部极值点,甚至全局极值点。

由于波动,因此会使得迭代次数(学习次数)增多,即收敛速度变慢。不过最终其会和全量梯度下降算法一样,具有相同的收敛性,即凸函数收敛于全局极值点,非凸损失函数收敛于局部极值点。

选择一个合理的学习速率很难。如果学习速率过小,则会导致收敛速度很慢。如果学习速率过大,那么其会阻碍收敛,即在极值点附近会振荡。

学习速率调整(又称学习速率调度,Learning rate schedules)试图在每次更新过程中,改变学习速率,如退火。一般使用某种事先设定的策略或者在每次迭代中衰减一个较小的阈值。无论哪种调整方法,都需要事先进行固定设置,这边便无法自适应每次学习的数据集特点。

模型所有的参数每次更新都是使用相同的学习速率。如果数据特征是稀疏的或者每个特征有着不同的取值统计特征与空间,那么便不能在每次更新中每个参数使用相同的学习速率,那些很少出现的特征应该使用一个相对较大的学习速率。

对于非凸目标函数,容易陷入那些次优的局部极值点中,如在神经网路中。那么如何避免呢。

(1) SGD

SGD指stochastic gradient descent,即随机梯度下降。是梯度下降的batch版本。对于训练数据集,我们首先将其分成n个batch,每个batch包含m个样本。我们每次更新都利用一个batch的数据,而非整个训练集。

(2) Momentum

SGD方法的一个缺点是,其更新方向完全依赖于当前的batch,因而其更新十分不稳定。解决这一问题的一个简单的做法便是引入momentum。

momentum即动量,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力:

(3) Nesterov accelerated gradient(NAG)

从山顶往下滚的球会盲目地选择斜坡。更好的方式应该是在遇到倾斜向上之前应该减慢速度。NAG这是对传统momentum方法的一项改进,由Ilya Sutskever(2012 unpublished)在Nesterov工作的启发下提出的。

假设动量因子参数γ=0.9,首先计算当前梯度项,如上图小蓝色向量,然后加上动量项,这样便得到了大的跳跃,如上图大蓝色的向量。这便是只包含动量项的更新。而NAG首先来一个大的跳跃(动量项),然后加上一个小的使用了动量计算的当前梯度(上图红色向量)进行修正得到上图绿色的向量。这样可以阻止过快更新来提高响应性。

(4) Adagrad

上面提到的方法对于所有参数都使用了同一个更新速率。但是同一个更新速率不一定适合所有参数。比如有的参数可能已经到了仅需要微调的阶段,但又有些参数由于对应样本少等原因,还需要较大幅度的调动。

Adagrad就是针对这一问题提出的,自适应地为各个参数分配不同学习率的算法。其公式如下:

(5) Adadelta

Adagrad算法存在三个问题:

1. 其学习率是单调递减的,训练后期学习率非常小

2. 其需要手工设置一个全局的初始学习率

3. 更新xt时,左右两边的单位不同一

Adadelta针对上述三个问题提出了比较漂亮的解决方案。

(6) Adam

RMSProp通过引入一个衰减系数,让r每回合都衰减一定比例,类似于Momentum中的做法。

(7) Adam

Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。

7. 人工神经元的模型

(1) sigmoid

(2) tanh

两个函数之间的差异就是tanh神经元的输出的值域是(-1,1)而非(0,1)。这意味着如果你构建基于tanh神经元,你可能需要正则化最终的输出,跟sigmoid网络略微不同。

(3) ReLu

什么时候应该使用ReLU而非其他神经元呢?就是我们知道sigmoid神经元在饱和的时候会停止学习,也就是输出接近0或者1的时候。tanh也有这个问题。对比一下,提高ReLU的带权输入并不会导致其饱和,所以就不存在前面那样的学习速率的下降。另外,当带权输入是负数的时候,梯度就消失了,所以神经元就完全停止了学习。

相关文章

网友评论

      本文标题:改进神经网络学习的方法

      本文链接:https://www.haomeiwen.com/subject/jwnuhxtx.html