Pytorch学习之旅(9)——线性层权值初始化

编程入门 行业动态 更新时间:2024-10-27 02:24:36

Pytorch学习<a href=https://www.elefans.com/category/jswz/34/1770100.html style=之旅(9)——线性层权值初始化"/>

Pytorch学习之旅(9)——线性层权值初始化

一、为什么要讨论权值的初始化问题?

       神经网络一般包含多级全线性层,随着层数的增加,为了保持网络的稳定,对梯度提出了要求:不能出现梯度消失或者爆炸。
       先来看一个三级全连接层网络:

       此处乱入一个数学知识:

       当某一层的输入和权值都满足 mean=0、std=1的标准正态分布时,有:        输出的方差 D=N(输入神经元的个数)

      而方差反映了参数的离散程度,如果后一层方差为前一层方差的N倍,在多层神经网络进行反向求导的时候,就会出现梯度爆炸的情形。

二、如何解决初始化问题

如图三所示,令输入的方差和输出的方差相等,即
{ D ( o u t ) = ∑ i = 0 n − 1 D ( i n ) ∗ D ( w ) D ( o u t ) = D ( i n ) \left\{ \begin{array}{l} D(out) = \sum_{i=0}^{n-1}D(in)*D(w) \\ D(out)=D(in) \end{array} \right. {D(out)=∑i=0n−1​D(in)∗D(w)D(out)=D(in)​
即有:
D ( w ) = 1 n D(w)=\frac{1}{n} D(w)=n1​
权值的方差为:输入神经元个数的倒数。
使用pytorch的正态分布函数初始化数据:

# m.weight.data:网络层m的权重值
# self.neural_num:输入神经元的个数
nn.init.normal_(m.weight.data, mean=0, std=np.sqrt(1/self.neural_num))

三、如果添加激活函数。。。

pytorch提供的十种初始化方法:

       1、Xavier 均匀分布
       2、Xavier正态分布
       3、Kaiming均匀分布
       4、Kaiming正态分布
       5、均匀分布
       6、正态分布
       7、常数分布
       8、正交矩阵初始化
       9、单位矩阵初始化
     10、稀疏矩阵初始化

它们各自对应着不同激活函数,详情请点击:初始化方案

更多推荐

Pytorch学习之旅(9)——线性层权值初始化

本文发布于:2024-03-10 12:27:31,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1727975.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:之旅   初始化   线性   Pytorch   层权值

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!