深度学习之与学习相关的技巧(篇二权重的初始值)

#深度学习

        在神经网络的学习中,权重的初始值特别重要。实际上,设定什么样的权重初始值,经常关系到神经网络的学习能否成功。

        1.1可以将权重初始值设为0吗

        如果想要减小权重的值,一开始就将初始值设为较小的值才是正途。实际上,在这之前的权重初始值都是像0.01 * np.random.randn(10, 100)这样,使用由高斯分布生成的值乘以0.01后得到的值(标准差为0.01的高斯分布)。

        在神经网络中,将权重初始化为0通常不是一个好的做法。这是因为如果网络中的所有权重都是0,那么在正向传播过程中,每一层的输出都将相同,这意味着无论输入如何,每一层的激活都会是相同的。这种情况会导致网络无法学习,因为梯度下降算法依赖于权重和偏置的调整来优化模型,如果权重都是0,那么梯度也是0,模型无法进行训练。所以必须随机生成初始值。

        1.2隐藏层的激活值的分布

在训练神经网络时,隐藏层的激活值分布对于网络的性能和稳定性非常重要。理想情况下,我们希望隐藏层的激活值能够有一个合适的分布,这样可以更好地利用非线性激活函数的性质,避免梯度消失或梯度爆炸问题,并促进网络的学习能力。

在实践中,隐藏层激活值的分布可能会受到多种因素的影响,包括:

  1. 权重初始化:不同的权重初始化策略会导致不同的激活值分布。例如,使用Xavier或He初始化可以使得激活值在训练初期保持在一个较为合理的范围内。

  2. 激活函数:不同的激活函数会导致不同的激活值分布。例如,ReLU激活函数会导致激活值中存在大量的0值,而Sigmoid或Tanh激活函数则会产生更多的正负值。

  3. 网络深度:随着网络深度的增加,激活值的分布可能会变得更加稀疏(如使用ReLU激活函数时)或者更加集中在激活函数的某个线性区域(如Sigmoid或Tanh函数的两端)。

  4. 批量大小和learning rate:这些超参数也会影响激活值的分布,尤其是在使用梯度下降类算法进行训练时。

  5. 正则化技术:如Batch Normalization可以在训练过程中对激活值进行标准化,从而保持其分布在一个较为稳定的范围内。

  6. 输入数据的分布:输入数据的特征范围和分布也会影响隐藏层激活值的分布。

        这里假设神经网络有5层,每层有100个神经元。然后,用高斯分布随机生成1000个数据作为输入数据,并把它们传给5层神经网络。激活函数使用sigmoid函数,各层的激活值的结果保存在activations变量中。这个代码段中需要注意的是权重的尺度。虽然这次我们使用的是标准差为1的高斯分布,但实验的目的是通过改变这个尺度(标准差),观察激活值的分布如何变化。现在,我们将保存在activations中的各层数据画成直方图。

       图1- 使用标准差为1的高斯分布作为权重初始值时的各层激活值的分布

        随着输出不断地靠近0(或者靠近1),它的导数的值逐渐接近0。因此,偏向0和1的数据分布会造成反向传播中梯度的值不断变小,最后消失。这个问题称为梯度消失(gradient vanishing)。层次加深的深度学习中,梯度消失的问题可能会更加严重。    

        使用Xavier Glorot等人的论文[9]中推荐的权重初始值(俗称“Xavier初始值”)。Xavier的论文中,为了使各层的激活值呈现出具有相同广度的分布,推导了合适的权重尺度。推导出的结论是,如果前一层的节点数为n,则初始值使用标准差为 \frac{1}{\sqrt{n}} 的分布(图2)。

        

       Xavier初始值:与前一层有n个节点连接时,初始值使用标准差为\frac{1}{\sqrt{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的理论与实现》

  • 28
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值