站点图标 AI技术聚合

《深度学习入门-基于Python的理论与实现》第六章带读 — 训练方法介绍

  • 开篇介绍:《深度学习入门-基于Python的理论与实现》书籍介绍[0]
  • 第一章:《深度学习入门-基于Python的理论与实现》第一章带读[0]
  • 第二章:《深度学习入门-基于Python的理论与实现》第二章带读 – 感知机[0]
  • 第三章:深度学习入门-基于Python的理论与实现》第三章带读 – 神经网络[0]
  • 第四章:《深度学习入门-基于Python的理论与实现》第四章带读 – 神经网络的学习[0]
  • 第五章:《深度学习入门-基于Python的理论与实现》第五章带读 – 误差反向传播[0]

《深度学习入门–基于Python的理论与实现》在第六章中介绍了神经网络训练过程中的多个重要技巧,涉及寻找最优权重参数的最优化方法、权重参数的初始值、超参数的设定、正则化等。为了方便阅读,本章的带读分成了多篇文章。作为第一篇,本文将主要介绍权重参数的更新技巧。

6.1 权重参数的更新

训练神经网络的目的是找到使损失函数的值尽可能小的参数。寻找最优参数的过程称为最优化(optimization)。因为参数空间非常复杂,所以无法通过数学式一下子求出最小值。在前几章中,我们曾将参数的梯度(导数)作为寻找最优参数的线索。下面将介绍SGD、Monmentum、AdaGrad和Adam四种常见的最优化方法。

a. SGD

使用参数的梯度,沿着梯度方向更新参数,重复该步骤多次,从而逐渐靠近最优参数,这个过程称为随机梯度下降法(stochastic gradient descent),简称SGD。

数学表达如下:

这里把需要更新的权重参数记为 W,η 表示学习率,实际上会取 0.01 或 0.001 这些事先决定好的值。式子中的← 表示用右边的值更新左边的值。

  • 缺点 SGD虽然简单且容易实现,但是在解决某些问题时可能没有效率。在具体说明缺点之前,我们先来思考求函数:f(x, y) = 1/20 * x^2 + y^2的最小值问题。注意此处的x平方较于y平方前面除以20,即x轴方向的梯度比y轴方向的要平缓很多。

如果用图表示梯度的话,y轴方向的坡度大,x轴方向的坡度小。如图6-2所示,虽然函数的最小值在(x, y) = (0, 0),但是图中的梯度在很多地方并没有指向(0, 0)。

当我们尝试对上面函数应用SGD,从(x, y) = (-7.0, 2.0)处开始搜索,结果如图6-3所示。图中SGD呈“之”字形移动,影响收敛速度。SGD的缺点就在于,如果函数的形状非均向(anisotropic),比如呈延伸状,搜索的路径就会非常低效。其根本原因是梯度的方向没有指向最小值的方向。

b. Momentum

Momentum是“动量”的意思,和物理相关。用数学式表达如下:

这里新出现的变量v,对应物理上的速度。式(6.3)表示物体在梯度方向上受力,在力的作用下速度增加,类似于小球在地面上滚动。式(6.3)中的αv,在物体不受任何力时,承担使物体逐渐减速的任务(α设定小于1大于0的值),对应物理上的摩擦力或空气阻力。用MoMentum解决式(6.2)的问题,如图6-5所示,x 轴方向上一直受同一方向的力,y轴方向上,像小球在碗中滚动一样,从高处滚动底处再到高处,交互地受到正反两个方向的力,所以y轴方向上的速度不稳定。和SGD相比,减弱了“之”字形的变动程度。

c. AdaGrad

在神经网络的训练中,过小的学习率会导致训练时间长,过大的学习率会导致网络不能收敛、在最优值附近徘徊。实际上,一开始“多” 学,然后逐渐“少”学的方法,在神经网络的学习中经常被使用。AdaGrad会为参数的每个元素适当调整学习率,同时进行训练。用数学式表达如下:

这里出现的新变量h,保存了以前的所有梯度值的平方和。在更新W时学习率η除以h的开根号,意味着参数的元素中变动较大的元素的学习率将变小(抑制震荡)。如果无止境地迭代,W的更新量就会变为0,完全不更新。为了改善这个问题,可以使用RMSProp 方法,感兴趣的同学可以自行查阅相关知识,这里不做介绍。

现在,让我们试着使用 AdaGrad 解决式(6.2)的最优化问题,结果如图 6-6 所示。

由于 y 轴方向上的梯度较大,因此刚开始变动较大,但是后面会根据这个较大的变动按比例进行调整,减小更新的步伐。因此,y 轴方向上的更新程度被减弱,“之”字形的变动程度有所衰减。

d. Adam

Adam方法的基本思路更像是融合Momentum和AdaGrad二者的优点,此外还进行了超参数的“偏置校正”,详细内容建议参考原作者论文,这里受制于篇幅不做过多说明。

使用 Adam 解决式(6.2)的最优化问题,结果如图 6-7 所示:

相比于Momentum,这里的学习率适当调整,呈现的振幅有所减轻。

论文中Adam设置了3个超参数,学习率、momentum系数β_1和二次momentum系数β_2。标准的设定值是 β_1 为 0.9,β_2 为0.999,适用于大多数情况。

6.2 权重参数的初始值

权重的初始值在神经网络的训练中非常重要,直接关系到模型训练的成功与否。本文将介绍权重初始值的推荐值,供大家参考。

a. 为什么要初始化权重

权重初始化的目的是防止层激活函数的输出损失梯度在神经网络的前向传播过程中爆炸或消失。无论哪种情况,损失梯度太大或太小都无法有效地反向传播,即使反向传播是可能的,神经网络也需要更长的时间才能收敛。

b. 初始值可以设为0吗

在神经网络训练中,为了提高模型的泛化能力,我们采用一个技巧是权值衰减(weightdecay),即以减小权重参数的值为目的进行学习的方法。那为什么不直接将权重初始值设为0呢?

以上图3层神经网络为例,输入层2个节点值不同,当权重初始值为0,乘积加和后中间层3个节点的输入值相同,激活函数处理后中间层的3个节点值相同(不一定为0),中间层的3个节点相当于只有一个节点在起作用。反向传播更新权重参数时,中间层3个节点的梯度改变一样,那么他们的更新参数过程一样,更新后每一层的所有参数都是相同的。由于参数相同以及输出值都一样,不同的节点根本无法学习到不同的特征,这样就失去了网络学习特征的意义了。严格地说,初始值设成一样的值的时候都会出现这种问题,所以必须随机生成初始值。

c. 隐藏层的激活值分布

这里的激活值是指激活函数的输出数据。我们通过一个简单实验来观察权重初始值是如何影响隐藏层的激活值的分布的。向一个5层神经网络(激活函数使用sigmoid函数)传入随机生成的输入数据,用直方图绘制各层激活值的数据分布。

· 使用标准差为1的高斯分布作为权重初始值时的各层激活值的分布如下图:

从上图可知,各层的激活值呈偏向0和1的分布。这里使用的sigmoid函数是S型函数,随着输出不断地靠近0(或者靠近1),它的导数的值逐渐接近0。因此,偏向0和1的数据分布会造成反向传播中梯度的值不断变小,最后梯度消失。

· 使用标准差为0.01的高斯分布作为权重初始值时的各层激活值的分布如下图:

这次呈集中在0.5附近分布,虽然不再出现梯度消失问题,但是激活值分布有所偏向,说明在表现力上会有很大问题。为什么这么说呢?因为如果有多个神经元都输出几乎相同的值,那它们就没有存在的意义了。比如,如果100个神经元都输出几乎相同的值,那么也可以由1个神经元来表达基本相同的事情。因此,激活值在分布上有所偏向会出现“表现力受限”的问题。

· 使用Xavier初始值作为权重初始值时的各层激活值的分布如下图:

Xavier初始值的特点是:与前一层有n个节点连接时,初始值使用标准差为(1/n)的开根号的分布。使用Xavier初始值后的结果如上图所示。从这个结果可知,越是后面的层,图像变得越歪斜(tanh函数作为激活函数的时候能改善),但是呈现了比之前更有广度的分布。因为各层间传递的数据有适当的广度,所以sigmoid函数的表现力不受限制,有望进行高效的学习。

d. ReLU的权重初始值

当激活函数使用ReLU时,一般推荐使用ReLU专用的初始值,也就是KaimingHe等人推荐的初始值,也称为“He初始值”。He初始值的特点是:与前一层有n个节点连接时,初始值使用标准差为(2/n)的开根号的分布。

· 使用ReLU为激活函数,三种不同权重初始值时的各层激活值的分布如下图:

权重初始值为标准差是0.01的高斯分布时,各层的激活值非常小,反向传播时权重的梯度也同样很小,训练基本没进展。初始值为Xavier初始值时,随着层的加深,偏向一点点变大。实际上,层加深后,激活值的偏向变大,训练时会出现梯度消失的问题。而当初始值为He初始值时,各层中分布的广度相同。由于即便层加深,数据的广度也能保持不变,因此传向传播时,也会传递合适的值。

6.3 Batch Normalization

在上一篇中我们有提到,注重权重初始值的设定,是为了各层的激活值分布能有适当的广度,从而顺利地进行训练(广度对训练的影响可详看上篇文章)。为了使各层拥有适当的广度,除了注意初始值的设定,我们还能在训练过程中通过Batch Norm“强制性”地调整激活值的分布。

a. 优点

  • 可以使训练快速(提高学习率);
  • 减少对权重初始值的依赖;
  • 抑制过拟合(降低Dropout等的必要性)。

b. 算法

Batch Norm以训练时的mini-batch为单位,进行使数据分布的均值为0、方差为1的正规化。数学式表示如下:

这里对mini-batch的m个输入数据的集合B = {x1, x2, . . . , xm}求均值μB 和 方 差。然后,对输入数据进行均值为0、方差为1(合适的分布)的正规化。式(6.7)中的ε是一个微小值(比如,10e-7等),它是为了防止出现除以0的情况。

6.4 正则化

a. 过拟合

在机器学习的问题中,过拟合是一个常见的问题,即模型只能拟合训练数据,而不能很好地拟合训练数据以外的数据,没有很好的泛化能力。发生原因:模型参数多,表现力强;训练数据很小。

b. 权值衰减

很多过拟合是因为权重参数取值过大才发生,所以权值衰减经常被用来抑制过拟合。换句话说,权值衰减通过模型损失函数添加惩罚项使学到的模型参数值较小,以应对过拟合。通常说的权值衰减指的是L2范数正则化,如果将权重记为W,L2范数的权值衰减就是,然后将1/2 λW^2这个加到损失函数上。这里,λ是控制正则化强度的超参数。λ设置得越大,对大的权重施加的惩罚就越重。1/2是用于将1/2 λW^2的求导结果变成λW的调整用常量。

c. Dropout

当网络的模型很复杂时,只用权值衰减难以应对。这种情况下,我们经常会用Dropout方法。Dropout是指在训练过程中随机选出隐藏层的神经元,然后将其删除。训练时,每传递一次数据,就会随机选择要删除的神经元。测试时,虽然会传递所有的神经元信号,但是对于各个神经元的输出,要乘上训练时的删除比例后再输出。

6.5 超参数的验证

a. 验证数据

训练数据用于参数(权重和偏差)的学习,验证数据用于超参数的性能评估。为了确认泛化能力,最后使用测试数据(理想情况下只使用一次)。拿到一批数据后,在划分之前,先打乱数据顺序,防止数据因为排序而出现偏差。

b. 超参数的最优化

首先设定超参数的范围,从设定的超参数范围中随机采样(比网格搜索效果更好)。用设定范围内的超参数进行训练,用验证数据评估模型精度,同时设置很小的epoch值缩短每次评估的时间。根据模型精度的结果缩小超参数的范围。反复进行上述操作,不断缩小超参数的范围,在缩小到一定程度时,从该范围中选出一个超参数的值。这就是进行超参数的最优化的一种方法。

6.6 总结

以上就是本章介绍的关于神经网络训练中的几个重要技巧,参数的更新方法、权重初始值的赋值方法、Batch Normalization、Dropout等,这些都是机器学习中不可或缺的技术。另外,这里介绍的技巧,在深度学习中也被频繁使用。

书籍下载链接:https://pan.baidu.com/s/1goHhf2GZt0gxxbLXa42CmA
密码: 4vi2[0]

欢迎关注微信公众号【布道NLP】获取更多AI相关知识。

文章出处登录后可见!

已经登录?立即刷新
退出移动版