322 Chapter 9. 人工神经网络和神经语言建模 肖桐 朱靖波
• 异步更新(Asynchronous Update)是指每个计算设备可以随时更新参数。不同
设备可以随时读取参数的最新值,然后根据当前参数值和分配的训练样本,各
自执行反向传播过程并独立更新参数。由于设备间不需要相互等待,这种方法
并行度高。但是不同设备读取参数的时间可能不同,会造成不同设备上的参数
不同步,导致这种方法不十分稳定,有可能无法达到较好的训练结果。
图9.34对比了同步更新和异步更新的区别,在这个例子中,使用 4 台设备对一个
两层神经网络中的参数进行更新,其中使用了一个参数服务器(Parameter Server)来
保存最新的参数,不同设备(图中的 G1、G2、G3)可以通过同步或者异步的方式访
问参数服务器。图中的 θ
θ
θ
o
和 θ
θ
θ
h
分别代表输出层和隐藏层的全部参数,操作 Push(·)
表示设备向参数服务器传送梯度,操作 Fetch(·) 表示参数服务器向设备传送更新后的
参数。
此外,在使用多个设备进行并行训练的时候,由于设备间带宽的限制,大量的
数据传输会有较高的延时。对于复杂神经网络来说,设备间参数和梯度传递的时间
消耗也会成为一个不得不考虑的因素。有时候,设备间数据传输的时间甚至比模型
计算的时间都长,大大降低了并行度
[420]
。对于这种问题,可以考虑对数据进行压缩
或者减少传输的次数来缓解问题。
9.4.4 梯度消失、梯度爆炸和稳定性训练
深度学习中随着神经网络层数的增加,导数可能会出现指数级的下降或者指数
级的增加,这种现象分别称为梯度消失(Gradient Vanishing)和梯度爆炸(Gradient
Explosion)。出现这两种现象的本质原因是反向传播过程中链式法则导致梯度矩阵
的多次相乘。这类问题很容易导致训练的不稳定。
1. 易于优化的激活函数
网络训练过程中,如果每层网络的梯度都小于 1,各层梯度的偏导数会与后面层
传递而来的梯度相乘得到本层的梯度,并向前一层传递。该过程循环进行,最后导
致梯度指数级地减小,这就产生了梯度消失现象。这种情况会导致神经网络层数较
浅的部分梯度接近 0。一般来说,产生很小梯度的原因是使用了类似于 Sigmoid 这样
的激活函数,当输入的值过大或者过小的时候这类函数曲线会趋于直线,梯度近似
为零。针对这个问题,主要的解决办法是使用更加易于优化的激活函数,比如,使用
ReLU 代替 Sigmoid 和 Tanh 作为激活函数。
2. 梯度裁剪
网络训练过程中,如果参数的初始值过大,而且每层网络的梯度都大于 1,反向
传播过程中,各层梯度的偏导数都会比较大,会导致梯度指数级地增长直至超出浮
点数表示的范围,这就产生了梯度爆炸现象。如果发生这种情况,模型中离输入近
的部分比离输入远的部分参数更新得更快,使网络变得非常不稳定。在极端情况下,