动手深度学习16- 深度学习的数值稳定性和模型初始化

Posted onemorepoint

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动手深度学习16- 深度学习的数值稳定性和模型初始化相关的知识,希望对你有一定的参考价值。

深度学习的数值稳定性问题以及模型参数的初始化方法。

深度学习有关数值稳定性的典型问题是衰减(vanishing) 和爆照(explosion)

衰减和爆炸

当神经网络层数较多时,模型的数值稳定性变差。假设一个层数为L的多层感知机的第(l层H^{l}的权重参数为W^{l})。为了方便讨论,不考虑偏置阐述,且设所有隐藏层的激活函数为恒等映射(identity mapping) (phi(x) = x) 。给定输入X,多层感知机的第l层的输出(H^{l}= XW^{1}W^{2}....W^{l}。此时如果层数l较大,H^{l})的计算可能会出现衰减和爆炸。

随机初始化模型参数

在神经网络中,通常需要随机初始化模型参数,下面我们来解释一下这样做的原因。

假设输出层只保留一个输出单元(omicron) ,且隐藏藏使用相同的激活函数。如果将每个隐藏单元的参数都初始化为相等的值,那么正在正向传播的时候每个隐藏单元将根据相同的输入计算出相同的值,并将传递至输出层。在反向传播中,每个隐藏单元的参数梯度值相同。因此,这些参数在使用给予梯度的优化算法迭代后值依然相等。之后的迭代也是如此。在这种情况下,无论隐藏单元有多少,隐藏层本质上只有一个隐藏单元在发挥作用。因此,正如前面几节中实验的操作那样,我们通常使将神经网络的模型参数,特别是权重参数,进行随机初始化。

pytorch的默认随机初始化

随机初始化模型参数的方法很多,我们可以使用pytorch的torch.nn.init.normal_()使用模型net的权重参数采用正态分布的随机初始化。不过pytorch中nn.Mudule的模块参数都采用了较为合理的初始化策略,不同的类型的layer具体采用哪一种初始化方法可以参考pytorch的源码,如果感兴趣可以单独查看源码。

Xavier随机初始化

还有一种比较常用的初始化方法叫作Xavier随机初始化,假设某全连接层的输入个数a,输出个数为b,Xavier随机初始化将使该层中权重参数的每个元素都随机采样与均价分布

(U(-sqrt{frac{6}{a+b}},sqrt{frac{6}{a+b}}))
设计考虑到的:
模型参数初始化后,每层输出的方差不该受该层输入个数的影响,且每层梯度的方差也不应该受该层输出层个数的影响

小结
  • 深度学习模型有关数值稳定性的典型的问题是衰减和爆炸。当神经网络的层数较多时,模型的数值稳定性容易变差。
  • 我们通常需要随机初始化神经网络的模型参数,如权重参数。

以上是关于动手深度学习16- 深度学习的数值稳定性和模型初始化的主要内容,如果未能解决你的问题,请参考以下文章

深度学习数值稳定性和模型初始化(numerical-stability-and-init)

机器学习(ML)八之正向传播反向传播和计算图,及数值稳定性和模型初始化

《南溪的目标检测学习笔记》——权重初始化

动手学深度学习17-kaggle竞赛实践小项目房价预测

《动手学深度学习》线性回归的简洁实现(linear-regression-pytorch)

《动手学深度学习》线性回归的简洁实现(linear-regression-pytorch)