到目前为止,我们实现的每个模型都需要我们根据一些预先指定的分布来初始化它的参数。直到现在,我们都认为初始化方案是理所当然的,掩盖了如何做出这些选择的细节。您甚至可能觉得这些选择并不是特别重要。相反,初始化方案的选择在神经网络学习中起着重要作用,对于保持数值稳定性至关重要。此外,这些选择可以以有趣的方式与非线性激活函数的选择联系起来。我们选择哪个函数以及我们如何初始化参数可以决定我们的优化算法收敛的速度。这里的错误选择可能会导致我们在训练时遇到梯度爆炸或消失的情况。在这个部分,
No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)
5.4.1. 消失和爆炸梯度
考虑一个深度网络L图层,输入x 和输出o. 每层l由转换定义fl权重参数化 W(l), 隐藏层输出为 h(l)(让h(0)=x),我们的网络可以表示为:
如果所有隐藏层的输出和输入都是向量,我们可以写出梯度为o关于任何一组参数 W(l)如下:
换句话说,这个梯度是L−l矩阵 M(L)⋅…⋅M(l+1)和梯度向量v(l). 因此,当将太多概率相乘时,我们很容易遇到同样的数值下溢问题。在处理概率时,一个常见的技巧是切换到对数空间,即将压力从尾数转移到数值表示的指数。不幸的是,我们上面的问题更严重:最初矩阵 M(l)可能有各种各样的特征值。它们可能很小或很大,它们的产品可能很大或 很小。
不稳定梯度带来的风险超出了数值表示。不可预测的梯度也会威胁到我们优化算法的稳定性。我们可能面临以下参数更新:(i) 过大,破坏了我们的模型( 梯度爆炸问题);或 (ii) 过小(梯度消失问题),由于参数几乎不会在每次更新时移动,因此无法进行学习。