深度学习初始化整理

深度学习初始化内容整理

笔者最近遇到在配准任务中初始化会极大影响训练结果的现象,本文目的旨在调研一些博客,文章,书籍中关于初始化的知识并思考记录,一些遗留问题欢迎评论讨论,共同学习~

参考资料:
网络权重初始化方法总结(上):梯度消失、梯度爆炸与不良的初始化
Pytorch神经网络初始化kaiming分布
Weight Initialization in Neural Networks: A Journey From the Basics to Kaiming
Initializing neural networks
Initializing Weights for the Convolutional and Fully Connected Layers
Weight Initialization for Deep Learning Neural Networks
Weight initialization for CNNs: A Deep Dive into He Initialization
Xavier Glorot《Understanding the difficulty of training deep feedforward neural networks》
Kaiming He《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》

初始化方法

在Xavier Initialization和Kaiming Initialization提出之前,常用的初始化方法为均匀分布和正态分布,通常使用[-1, 1]的均匀分布或者方差较小的正态分布,ex.0.01。全0初始化或者常数初始化本质上存在缺陷,所以不常用:其中全0初始化将导致梯度无法回传,所以网络无法进行学习,而常数初始化则使得网络对于每个参数的学习趋向于“对称”(每个可学习参数的梯度几乎相同),但是这样就无法很好的拟合任意函数,而只有参数的“不对称”才能使得网络对于任意函数进行拟合,所以常数初始化并不常用。本文以下主要讨论Xavier和Kaiming Initialization的原理推导以及在Tensorflow和Pytorch框架中的实现。

Xavier Initialization

事实证明,太小或者太大的初始化会带来梯度消失或者梯度爆炸的问题,因为多层conv后通过链式法则计算梯度,梯度和每一层的权重系数以及激活函数的偏导,参考网络权重初始化方法总结(上):梯度消失、梯度爆炸与不良的初始化,所以如果所有权重系数初始化为>1则会带来梯度爆炸,<1会带来梯度消失,所以适合的初始化对于训练非常重要,不单单影响performance甚至影响能否收敛。
2010年,Xavier Glorot在文章《Understanding the difficulty of training deep feedforward neural networks》中提出了Xavier Initialization,主要思想是满足下面两个条件,则可以解决梯度消失和爆炸的问题:Initializing neural networks
1、经过激活函数的输出均值为0
2、经过激活函数的输出方差与输出应该保持相等

相关推导参考Initializing neural networks,最终结论:
对于线性激活函数(sigmoid和tanh的一阶Talor展开是线性的),可以通过Xavier Initialization满足上述条件,其中Xavier Initialization有两种形式,均匀分布和正态分布,原文章中使用的是均匀分布的Xavier Initialization并给出了Normalized Xavier Initialization的形式。具体公式参考Pytorch神经网络初始化kaiming分布,上述博客中的Xavier Uniform Initialization形式是Normalized Xavier Initialization。

Kaiming Initialization

针对ReLu/Leaky ReLu/PReLu等非线性激活函数,Xavier Initialization并不能保证上述两个要求,所以2015年 Kaiming He在文章《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》中提出了Kaiming Initialization。公式推导参考Initializing Weights for the Convolutional and Fully Connected LayersWeight initialization for CNNs: A Deep Dive into He Initialization。其中在Initializing Weights for the Convolutional and Fully Connected Layers中解释下面内容的时候
在这里插入图片描述
画的图如下
在这里插入图片描述
这里容易让人产生误解:把W当成图像,把x当成filter,但是参考原文章后,其实上述图画的不好,x还是代表图像,W还是代表权重,但是x的大小是kkc的原因是,在做卷积的时候,会拿出图像中kkc大小的block去做卷积,所以这里画图应该是不恰当的。卷完后是d*1大小的向量,d代表output_channel,1就代表卷积后这个像素的值,实现了从 c input_channel到 d output channel的转换,维度信息上图画的没什么问题。具体公式参考Pytorch神经网络初始化kaiming分布

Tensorflow

在tf.keras.initializers中实现了Xavier Initialization,但是没有考虑gain参数,严格来说Xavier Initialization在使用线性激活函数的时候不需要gain,但是换别的激活函数的时候,可以参考Pytorch框架中的gain(Pytorch神经网络初始化kaiming分布),但是关于这一点笔者并不确定,而且在Pytorch中使用tanh,给出的gain是 5 3 \frac{5}{3} 35,尽管tanh在数值较小的时候接近线性函数。
在这里插入图片描述
在tf.keras.initializers中也实现了Kaiming Initialization
在这里插入图片描述
但是都没有考虑Leaky ReLu或者PReLu函数中负数部分斜率的参数,都当作了ReLu处理。

Pytorch

Pytorch框架相比于Tensorflow实现初始化更为精细一些,但是有一点很奇怪的是,在使用Kaiming Initialization的时候,默认的Leaky ReLu或者PReLu函数中负数部分斜率的参数是 5 \sqrt{5} 5 ,关于这一点有博客提到是Pytorch框架自身用这个参数效果会好,但是具体原因笔者不太清楚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值