这篇论文主要是从参数初始化和激活函数的角度,通过实验中观察网络在训练迭代时每层的 activations 和 gradients,来探究训练深层模型困难的原因,并提出了一种新的参数初始化方式来加快模型训练时的收敛。
Effect of Activation Functions and Saturation During Training
sigmoid 激活函数在之前已经被证明会减慢学习的速度,如果再采用随机初始化参数(这里的随机是服从均匀分布 U[?1n,1n]U\left[-\frac{1}{\sqrt{n}}, \frac{1}{\sqrt{n}}\right]U[?n?1?,n?1?])的方式,它会使得深层网络的训练效果很差(优化的很差)并且泛化能力很差(在测试集上的表现也很差)。下图是观察采用 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层 softmax(b+Wh)\mathrm{softmax}(b+Wh)softmax(b+Wh) , 较之隐层的激活值 hhh,更依赖于 bbb。这也就使得前面训练时会迫使 WhWhWh 为 0,而这可以通过迫使 hhh 为 0 来实现(这也就解释了为什么一开始最后一层的神经元就立马饱和了)。在采用 tanh 或者 softsign 激活函数时,隐层的激活值为 0,其反向传播的梯度是不为 0 的,而采用了 sigmoid 激活函数时,隐层的激活值为 0,也就意味着神经元饱和了(实则死亡)。这会导致梯度难以反向传播,lower layers 的参数就难以更新去学习到有用的特征。
虽然在随着训练迭代,最后一层的神经元开始脱离饱和的状态,lower layers 也开始学习有用的特征,但这个过程非常缓慢,并且最后优化的效果很差,模型的泛化能力也很差。那既然上面的问题是由随机初始化和激活函数搭配使用引起的,那是不是可以考虑另外的激活函数或者初始化方式。文中是提到softsign 能较好的避免上述问题;那么从初始化方式上考虑呢,激活函数该搭配怎么样的初始化方式?设计出来的初始化方式应该符合怎么样的条件才是好的?
Studying Gradients and their Propagation
这里有个说法,就是训练过程中,为了保持网络信息流动,网络中逐层的 activation values 和反向传播梯度的方差都应该尽可能的相等(在一个量级上),用公式表示就是:
?(i,i′),Var[zi]=Var[zi′]?(i,i′),Var[?Cost?si]=Var[?Cost?si′]\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?]=Var[?si′?Cost?]
既然有了"标准",那就可以来看看怎样的初始化能符合这个"标准"。可以先看看每一层 activation values 的方差,具体推导可见 [1] [2]:
Var[zi]=Var[x]∏i′=0i?1ni′Var[Wi′]Var[z^i] = Var[x] \prod_{i'=0}^{i-1}{n_{i'}Var[W^{i'}]} Var[zi]=Var[x]i′=0∏i?1?ni′?Var[Wi′]
其中 Var[Wi′]Var[W^{i'}]Var[Wi′] 是 layer i′i'i′ 所有权值的方差。考虑网络有 ddd 层,那么看看每一层反向传播梯度的方差,具体推导也见 [1] [2]:
Var[?Cost?si]=Var[?Cost?sd]∏i′=1dni′+1Var[Wi′],Var[?Cost?wi]=∏i′=0i?1ni′Var[Wi′]∏i′=1d?1ni′+1Var[Wi′]×Var[x]Var[?Cost?sd]Var[\frac{\partial Cost}{\partial s^i}] = Var[\frac{\partial Cost}{\partial s^d}] \prod_{i' = 1}^d{n_{i'+1}Var[W^{i'}]}, \\ Var[\frac{\partial Cost}{\partial w^i}] = \prod_{i' = 0}^{i-1} n_{i'} Var[W^{i'}] \prod_{i'=1}^{d-1}{n_{i'+1}Var[W^{i'}]} \times Var[x]Var[\frac{\partial Cost}{\partial s^d}] Var[?si?Cost?]=Var[?sd?Cost?]i′=1∏d?ni′+1?Var[Wi′],Var[?wi?Cost?]=i′=0∏i?1?ni′?Var[Wi′]i′=1∏d?1?ni′+1?Var[Wi′]×Var[x]Var[?sd?Cost?]
需要注意的是,其中 Var[x]Var[x]Var[x] 是常数,那么要符合上面"标准",则需满足下面两个条件:
?i,niVar[Wi]=1?i,ni+1Var[Wi]=1\forall i, n_iVar[W^i] = 1 \\ \forall i, n_{i+1} Var[W^i] = 1 ?i,ni?Var[Wi]=1?i,ni+1?Var[Wi]=1
可以将上面两个条件合并得到:
?i,Var[Wi]=2ni+ni+1\forall i, Var[W^i] = \frac{2}{n_i + n_{i+1}} ?i,Var[Wi]=ni?+ni+1?2?
即可以设计一种新的初始化方式,即论文中提到的 normalized initialization:
W?U[?6nj+nj+1,6nj+nj+1]W \sim U\left[ -\frac{\sqrt{6}}{\sqrt{n_j+n_{j+1}}}, \frac{\sqrt{6}}{\sqrt{n_j+n_{j+1}}} \right] W?U[?nj?+nj+1??6??,nj?+nj+1??6??]
值得注意的是,如果每一层的 width 相等,并且每一层采用同样的初始化方式,可以得到一个有趣的性质:
?i,Var[?Cost?si]=[nVar[W]]d?iVar[x]?i,Var[?Cost?wi]=[nVar[W]]dVar[x]Var[?Cost?sd]\forall i, Var[\frac{\partial Cost}{\partial s^i}] = \left[ nVar[W]\right]^{d-i}Var[x] \\ \forall i, Var[\frac{\partial Cost}{\partial w^i}] = \left[ nVar[W]\right]^dVar[x] Var\left[\frac{\partial Cost}{\partial s^d}\right] ?i,Var[?si?Cost?]=[nVar[W]]d?iVar[x]?i,Var[?wi?Cost?]=[nVar[W]]dVar[x]Var[?sd?Cost?]
可以看到权值梯度的方差对于每一层来说是相等的,而反向传播梯度的方差在深层网络中仍可能会消失或者爆炸。下面的实验结果也可以看到,在不采用 normalized initialization 的情况下,初始的反向传播梯度的方差每一层是不一样,而权值的方差在两种情况下,每一层近乎相等的。另外可以看到,在采用了 normalized initialization 后反向传播的方差每一层就近乎相等了。
总结
这篇主要是实验分析为主,可以得到几个比较重要的结论:
- sigmoid 和 tanh 激活函数搭配常规随机初始化方式,会使得模型收敛效果较差;
- softsign 激活函数较之上面两个激活函数会使得模型更鲁棒,因为 softsign 的非线性更缓和;
- tanh 搭配 normalized initialization 较优;
- 保持层与层之间激活值和梯度的良好流动非常有用。
参考文献
[1] 深度学习——Xavier初始化方法, https://blog.csdn.net/shuzfan/article/details/51338178
[2] 《Understanding the difficulty of training deep feedforward neural networks》笔记, https://blog.csdn.net/kangroger/article/details/61414426
[3] 《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》阅读笔记与实现, https://blog.csdn.net/happynear/article/details/45440811
[4] He, Kaiming, et al. “Delving deep into rectifiers: Surpassing human-level performance on imagenet classification.” Proceedings of the IEEE international conference on computer vision. 2015.