这篇论文主要是从参数初始化和激活函数的角度,通过实验中观察网络在训练迭代时每层的 activations 和 gradients,来探究训练深层模型困难的原因,并提出了一种新的参数初始化方式来加快模型训练时的收敛。
Effect of Activation Functions and Saturation During Training
sigmoid 激活函数在之前已经被证明会减慢学习的速度,如果再采用随机初始化参数(这里的随机是服从均匀分布 U [ − 1 n , 1 n ] U\left[-\frac{1}{\sqrt{n}}, \frac{1}{\sqrt{n}}\right] U[−n1,n1])的方式,它会使得深层网络的训练效果很差(优化的很差)并且泛化能力很差(在测试集上的表现也很差)。下图是观察采用 sigmoid 激活函数的模型训练过程中,其每一层神经元的 activation value 的均值和标准差。
上图可以看到一个很神奇的现象,最后一层的神经元瞬间饱和了,并且这个饱和的状态持续了很久;当第一层的神经元开始趋向饱和了,最后一层才逐渐脱离饱和的状态。作者猜测这种现象就是由于 random initialization + sigmoid function 搭配使用导致的,如果采用 pre-training 的方式初始化参数就不会出现这种现象。
作者给出的解释基于一个假设 “the transformation that the lower layers of the randomly initialized network computes initially is not useful to the classification task”,那么softmax层 s o f t m a x ( b + W h ) \mathrm{softmax}(b+Wh) softmax(b+Wh) , 较之隐层的激活值 h h h,更依赖于 b b b。这也就使得前面训练时会迫使 W h Wh Wh 为 0,而这可以通过迫使 h h h 为 0 来实现(这也就解释了为什么一开始最后一层的神经元就立马饱和了)。在采用 tanh 或者 softsign 激活函数时,隐层的激活值为 0,其反向传播的梯度是不为 0 的,而采用了 sigmoid 激活函数时,隐层的激活值为 0,也就意味着神经元饱和了(实则死亡)。这会导致梯度难以反向传播,lower layers 的参数就难以更新去学习到有用的特征。
虽然在随着训练迭代,最后一层的神经元开始脱离饱和的状态,lower layers 也开始学习有用的特征,但这个过程非常缓慢,并且最后优化的效果很差,模型的泛化能力也很差。那既然上面的问题是由随机初始化和激活函数搭配使用引起的,那是不是可以考虑另外的激活函数或者初始化方式。文中是提到softsign 能较好的避免上述问题;那么从初始化方式上考虑呢,激活函数该搭配怎么样的初始化方式?设计出来的初始化方式应该符合怎么样的条件才是好的?
Studying Gradients and their Propagation
这里有个说法,就是训练过程中,为了保持网络信息流动,网络中逐层的 activation values 和反向传播梯度的方差都应该尽可能的相等(在一个量级上),用公式表示就是:
∀ ( i , i ′ ) , V a r [ z i ] = V a r [ z i ′ ] ∀ ( i , i ′ ) , V a r [ ∂ C o s t ∂ s i ] = V a r [ ∂ C o s t ∂ s i ′ ] \forall (i,i'), Var[z^i] = Var[z^{i'}] \\ \forall (i,i'), Var[\frac{\partial Cost}{\partial s^i}] = Var[\frac{\partial Cost}{\partial s^{i'}}] ∀(i,i′),Var[zi]=Var[zi′]∀(i,i′),Var[∂si∂Cost