前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度学习基础知识(一)--- 权重初始化 --- 概念

深度学习基础知识(一)--- 权重初始化 --- 概念

作者头像
TeeyoHuang
发布2019-12-02 11:38:31
2K0
发布2019-12-02 11:38:31
举报

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/Teeyohuang/article/details/103341346

1、为什么需要权重初始化?

① 为了使神经网络在合理的时间内收敛

② 为了尽量避免在深度神经网络的正向(前向)传播过程中层激活函数的输出梯度出现爆炸或消失。

2、如何进行初始化?

①如果将每个隐藏单元的参数都初始化为0

那么在正向传播时每个隐藏单元将根据相同的输入计算出相同的值,并传递至输出层。在反向传播中,每个隐藏单元的参数梯度值相等。因此,这些参数在使用基于梯度的优化算法迭代后值依然相等。这样所有隐层的单元都是对称的了,很难学到什么有效的信息,之后的迭代也是如此。

所以权重初始化不能将权重参数全部初始化为0,应打破这种对称性

②如果将参数都初始化为0周围极小的值:

也不好,比如如果用sigmoid做激活函数,它在0周围是近似线性的,如果我们的参数都初始化为0附近,那么可能数据经过神经元之后,大部分都落在线性区,那么我激活函数引入非线性的作用将被削减

③如果参数都初始化为较大的值,很显然容易使得输出落入饱和区

所以合理的初始化时比较重要的,一般采用随机的初始化

3、常见的几种初始化方式

①、均匀分布初始化:

将参数初始化为 均匀分布U(a,b) 上的随机值,pytorch的实现方案:

torch.nn.init.uniform_(tensor, a=0, b=1)

②、高斯初始化:

将参数初始化为 高斯分布N(0,1) 上的随机值,pytorch的实现方案:

torch.nn.init.normal_(tensor, mean=0, std=1)

③、常数初始化:

将参数初始化为一个 固定的常数val, pytorch实现方案为:

torch.nn.init.constant_(tensor, val)

上面三种初始化方法其实并不是十分理想的初始化方案,因为如果网络层数过深的话,

依然会导致 梯度爆炸 或者 梯度弥散的情况出现,

一般在使用中,可能就是神经网络 中的某一两层可能会用到上述初始化方案,比如自己写的某几层

并不建议对所有的参数都使用上述初始化方案

4、Xiaver 初始化方案

Xavier初始化的基本思想是,若对于一层网络的输入和输出的方差尽量不变

这样就可以避免输出趋向于0,从而避免梯度弥散情况。

参考资料:

https://prateekvjoshi.com/2016/03/29/understanding-xavier-initialization-in-deep-neural-networks/

http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf

https://zhuanlan.zhihu.com/p/64464584

https://zhuanlan.zhihu.com/p/40175178

pytorch的实现方案①torch.nn.init.xavier_uniform_(tensor, gain=1)

将参数初始化为均匀分布 U(-α, α) 上的随机值,其中 α 取值为:

fan_in 指输入端神经元的个数, fan_out指输出端神经元的个数,它会自己根据网络计算。

gain 是一个增益, 默认为1;

pytorch的实现方案②torch.nn.init.xavier_normal_(tensor, gain=1)

将参数初始化为高斯分布 N(0, std^2) 上的随机值,而std的取值是:

5、Kaiming初始化方案

Kaiming初始化基本思想是,当使用ReLU做为激活函数时,Xavier的效果不好,

原因在于:当ReLU的输入小于0时,其输出为0,影响了输出的分布模式。

也就是激活函数输出均值不为0,我们上面的推导中是有假设E(X)=0的

因此Kaiming He初始化,在Xavier的基础上,假设每层网络有一半的神经元被关闭,于是其分布的方差也会变小。所以提出一个新的假设,那就是前向传播中,如果采用Xiaver,方差会缩小为原来一半,那么为了修正这个缩减,就使得参数初始化的范围比原来扩大一倍

如果理解有误,欢迎指正,提前谢过

pytorch实现方案①

torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

将参数初始化为均匀分布U(-bound, bound)上的随机值,其中 bound 取值为:

α:该层后面一层的激活函数中负的斜率 (0 for ReLU by default)

mode : ‘fan_in’ (default) 或者‘fan_out’.

使用fan_in保持weights的方差在前向传播中不变;

使用fan_out保持weights的方差在反向传播中不变。

pytorch实现方案②

torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

将参数初始化为高斯分布N(0,std^2)上的随机值,而std的取值是:

α:该层后面一层的激活函数中负的斜率 (0 for ReLU by default)

mode : ‘fan_in’ (default) 或者‘fan_out’.

使用fan_in保持weights的方差在前向传播中不变;

使用fan_out保持weights的方差在反向传播中不变。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、为什么需要权重初始化?
  • 2、如何进行初始化?
  • 3、常见的几种初始化方式
    • ①、均匀分布初始化:
      • ②、高斯初始化:
        • ③、常数初始化:
        • 4、Xiaver 初始化方案
        • 5、Kaiming初始化方案
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档