#深度学习
在神经网络的学习中,权重的初始值特别重要。实际上,设定什么样的权重初始值,经常关系到神经网络的学习能否成功。
1.1可以将权重初始值设为0吗
如果想要减小权重的值,一开始就将初始值设为较小的值才是正途。实际上,在这之前的权重初始值都是像0.01 * np.random.randn(10, 100)这样,使用由高斯分布生成的值乘以0.01后得到的值(标准差为0.01的高斯分布)。
在神经网络中,将权重初始化为0通常不是一个好的做法。这是因为如果网络中的所有权重都是0,那么在正向传播过程中,每一层的输出都将相同,这意味着无论输入如何,每一层的激活都会是相同的。这种情况会导致网络无法学习,因为梯度下降算法依赖于权重和偏置的调整来优化模型,如果权重都是0,那么梯度也是0,模型无法进行训练。所以必须随机生成初始值。
1.2隐藏层的激活值的分布
在训练神经网络时,隐藏层的激活值分布对于网络的性能和稳定性非常重要。理想情况下,我们希望隐藏层的激活值能够有一个合适的分布,这样可以更好地利用非线性激活函数的性质,避免梯度消失或梯度爆炸问题,并促进网络的学习能力。
在实践中,隐藏层激活值的分布可能会受到多种因素的影响,包括:
-
权重初始化:不同的权重初始化策略会导致不同的激活值分布。例如,使用Xavier或He初始化可以使得激活值在训练初期保持在一个较为合理的范围内。
-
激活函数:不同的激活函数会导致不同的激活值分布。例如,ReLU激活函数会导致激活值中存在大量的0值,而Sigmoid或Tanh激活函数则会产生更多的正负值。
-
网络深度:随着网络深度的增加,激活值的分布可能会变得更加稀疏(如使用ReLU激活函数时)或者更加集中在激活函数的某个线性区域(如Sigmoid或Tanh函数的两端)。
-
批量大小和learning rate:这些超参数也会影响激活值的分布,尤其是在使用梯度下降类算法进行训练时。
-
正则化技术:如Batch Normalization可以在训练过程中对激活值进行标准化,从而保持其分布在一个较为稳定的范围内。
-
输入数据的分布:输入数据的特征范围和分布也会影响隐藏层激活值的分布。
这里假设神经网络有5层,每层有100个神经元。然后,用高斯分布随机生成1000个数据作为输入数据,并把它们传给5层神经网络。激活函数使用sigmoid函数,各层的激活值的结果保存在activations变量中。这个代码段中需要注意的是权重的尺度。虽然这次我们使用的是标准差为1的高斯分布,但实验的目的是通过改变这个尺度(标准差),观察激活值的分布如何变化。现在,我们将保存在activations中的各层数据画成直方图。
图1- 使用标准差为1的高斯分布作为权重初始值时的各层激活值的分布
随着输出不断地靠近0(或者靠近1),它的导数的值逐渐接近0。因此,偏向0和1的数据分布会造成反向传播中梯度的值不断变小,最后消失。这个问题称为梯度消失(gradient vanishing)。层次加深的深度学习中,梯度消失的问题可能会更加严重。
使用Xavier Glorot等人的论文[9]中推荐的权重初始值(俗称“Xavier初始值”)。Xavier的论文中,为了使各层的激活值呈现出具有相同广度的分布,推导了合适的权重尺度。推导出的结论是,如果前一层的节点数为n,则初始值使用标准差为 的分布(图2)。
Xavier初始值:与前一层有n个节点连接时,初始值使用标准差为的分布
使用Xavier初始值后的结果如图3所示。
图3 使用Xavier初始值作为权重初始值时的各层激活值的分布
图 3的分布中,后面的层的分布呈稍微歪斜的形状。如果用tanh函数(双曲线函数)代替sigmoid函数,这个稍微歪斜的问题就能得到改善。实际上,使用tanh函数后,会呈漂亮的吊钟型分布。tanh函数和sigmoid函数同是 S型曲线函数,但tanh函数是关于原点(0,0)对称的 S型曲线,而sigmoid函数是关于(x,y)=(0,0.5)对称的S型曲线。众所周知,用作激活函数的函数最好具有关于原点对称的性质。
为了获得最佳的激活值分布,研究人员和网络设计者通常会进行实验,尝试不同的网络结构、权重初始化策略、激活函数和正则化技术。此外,还有一些技术如Layer Normalization、Weight Normalization等,也可以用来调整和改善隐藏层激活值的分布。
1.3ReLu的权重初始值
ReLU(Rectified Linear Unit)激活函数是目前最常用的激活函数之一,特别是在深度学习中。对于使用ReLU激活函数的神经网络,权重的初始值通常推荐使用He初始化(也称为He正常初始化或MSRA初始化)。
He初始化是基于网络的层数和激活函数来调整权重初始化的大小,以保持每一层激活的方差。对于ReLU激活函数,He初始化建议使用如下公式来设置权重:
其中 𝑛n 是前一层的神经元的数量。这个策略确保了在ReLU激活函数的作用下,每一层的激活值的方差保持在一个合理的范围内,有助于防止梯度消失或梯度爆炸的问题。
对于使用ReLU激活函数的神经网络,He初始化通常比Xavier初始化(也称为Glorot初始化)更为合适,因为Xavier初始化是基于激活函数在整个定义域内都有梯度的情况下设计的,而ReLU激活函数在负值部分的梯度为0。因此,He初始化更适合ReLU激活函数的非线性特性。
在实际应用中,权重的初始值也可以通过实验来调整,以找到最适合特定问题的初始化策略。此外,还有一些变体的ReLU激活函数,如Leaky ReLU、Parametric ReLU (PReLU)等,它们在负值部分也有小的梯度,这可能会影响权重初始化的选择。
基于MNIST数据集的权重初始值的比较,如图四:
图4基于MNIST数据集的权重初始值的比较:横轴是学习的迭代次数(iterations),纵轴是损失函数的值(loss)
这个实验中,神经网络有5层,每层有100个神经元,激活函数使用的是ReLU。从图6-15的结果可知,std =0.01时完全无法进行学习。这和刚才观察到的激活值的分布一样,是因为正向传播中传递的值很小(集中在0附近的数据)。因此,逆向传播时求到的梯度也很小,权重几乎不进行更新。相反,当权重初始值为Xavier初始值和He初始值时,学习进行得很顺利。并且,我们发现He初始值时的学习进度更快一些。
综上,在神经网络的学习中,权重初始值非常重要。很多时候权重初始值的设定关系到神经网络的学习能否成功。权重初始值的重要性容易被忽视,而任何事情的开始(初始值)总是关键的,因此在结束本节之际,再次强调一下权重初始值的重要性。
本期分享结束~
参考文献:《深度学习入门:基于Python的理论与实现》