近几年,随着深度学习的大火,越来越多的人选择去入门、学习、钻研这一领域,正确初始化神经网络的参数对神经网络的最终性能有着决定性作用。如果参数设置过大,会出现梯度爆炸的现象,导致网络训练过程发散;而如果参数设置过小,会出现梯度消失的现象,导致收敛极其缓慢。本文是作者拜读Xavier Glorot于2016年在ICML上发表的《Understanding the difficulty of training deep feedforward》及Katanforoosh & Kunin的“Initializing neural networks”后的读书笔记。
窝在家里的小编
1
梯度消失和梯度爆炸问题
目前训练神经网络模型一般采用的是反向传播算法,即将输入的数据进行正向传递得到输出,通过现有输出和期望输出的差异计算损失函数,计算损失函数对参数的梯度,并将误差沿着梯度的负方向反向传递,神经网络权值参数的更新值与梯度成比例。反向传播时,需要用到求导的链式法则,而链式法则是一个连乘的形式,当层数越来越深的时候,梯度将以指数形式传播。
梯度消失问题本质上是用反向传播的方式对权值参数进行更新时梯度过小,在一个深度神经网络中,连乘多次梯度呈现指数衰减,导致靠近输入层的权值参数更新缓慢或者更新停止;而梯度爆炸问题本质上用反向传播的方式对权值参数进行更新时候梯度过大,连乘多次后,梯度呈现指数级增长,变得非常大,使得网络权重更新幅度过大,网络结构不稳定。
下面以一个简单的神经网络为例子(假设每一层只有一个神经元)来解释参数大小是导致梯度爆炸和梯度消失的:
为了计算出误差对w1的偏导,我们使用链式规则可以得到:
where and
从这个式子我们可以看到,如果权重参数设置过大,.根据链式相乘可得,前面的网络层比后面的网络层梯度变化更快,更容易发生梯度爆炸的问题。相反,如果权重参数设置过小,,那么根据链式法则可得,靠近输入层的权值参数更新缓慢或者更新停止,除了w过小会造成梯度消失的问题之外,激活函数选择不合适,其导数过小也会造成梯度消失的问题(比如采用Sigmoid作为激活函数,它最大的导数值才0.25)
总之,使用不适当的值去初始化权重将会导致网络训练的发散或者缓慢,那么我们应该如何去初始化呢?论文作者提出了一种Xavier的方法去初始化参数,接下来我们将通过实验对比不同的初始化方法来对神经网络的初始化进行探索。
2
如何找到合适的初始化值
1. 实验设置:
a)激活函数:使用为激活函数,偏置项为0(函数的特点:当时,导数为0)
b)实验数据:已经Normalized的Mnist数据集,数据可以通过导入tensorflow.examples.tutorials.mnist进行获取。
c)网络结构:5层隐藏层的全连接网络,隐藏层的神经元个数分别为500,400,300,200,100个。输入维度为28*28维,输出维度为10维。
2. 实验环境:python3.6.5
3. 初始化方法:
a)将所有的参数初始化为0
b)标准正态分布去初始化参数
c)均匀分布初始化
d) Xavier初始化
4. 实验结果分析:
a)如果将所有的权重都设置为0,则每一层激活函数的输出都是0。
这是因为如果初始化权重全是0,神经元在训练过程中都学习到相同的特征,同一层的神经元是无差异的。本来我们希望不同的结点学习到不同的参数,但是由于参数相同以及输出值都一样,不同的结点根本无法学到不同的特征。
b)用N(0,1)标准正态的方式去初始化参数,每层激活函数的输出集中为-1或者1,这也就意味着激活函数陷入了饱和状态,在这个状态下,激活函数的导数为0。
那么为什么会出现激活函数输出值大部分是1或者-1的情况呢?
假设数据点跟权重参数独立且服从均值为0,方差为1的分布,那么累加后的的方差为,相对于权重的标准正态分布来说,z其实是个方差很大的高斯分布,那么再经过一个tanh函数(大于2或者小于-2输出分别为1或-1)后,其激活函数输出值就大多为-1和1了。而随着层数的增加,z的方差也越来越大,也就出现了每层神经元激活函数的输出值是-1和1的情况。在-1和1这个位置,激活函数对应的导数接近为0,梯度太小,参数更新缓慢或者更新停滞。
c)采用均匀分布的方式去初始化参数,结果随着层数的增加,每层激活函数的输出逐渐往0靠拢。
这是因为如果按照均匀分布的方式,对应的方差为:,而随着层数的增加,每一层的方差相对于上一层来说都是1/3的倍数减少的。因此体现在图形上就是随着层数的增加,方差不断减少,激活函数的输出值渐渐为0,使得参数也难以更新。
其实,由前两种情况我们可以知道,随机初始化的方式会导致z的方差越来越大,最终激活函数的输出在-1和1这两个极端的地方,对应的导数为0;而均匀分布初始化的方式是随着层数的增加激活函数输出的方差越来越小,最终状态是激活函数输出值趋向于0,这样会使得一些神经元失去工作。而为了训练过程中参数能够比较好地去更新,需要一种合理的初始化参数的方式,使得每一层激活函数的输出的方差不变,而这也是Xavier初始化的主要思想。
下图是通过Xavier方式初始化后激活函数输出的分布直方图,Xavier初始化的方式是:
从图中我们可以看到:输出值在很多层之后都保持着良好的分布。
3
Xvier初始化的数学公式和证明
对于Vavier初始化的基本思想是希望激活的平均值为0且激活的方差在每层保持不变。
对于某一特定的层l,它的前向传播是:
我们的目标是希望:
在的线性区域,我们可以假设:,也就意味着,其中
为了简化,我们假设所有的偏置项是0,即,
现在我们单独看第l层的第k个神经元,我们有:
为了方便推导,我们做多一些假设:
1.权重是独立同分布的(均值为0)
2.输入也是独立同分布的(均值为0)
3.权重和输入相互独立
这样我们就可以将和的方差变成每项方差的和:
从Wikipedia上可知,两个独立变量X,Y相乘它们的方差为:
因此,将X替换为,将Y替换为,有:
而当输入和权重均值都为0的时候,就有:
根据第一个假设权重参数服从独立同分布,所以:
根据第二个假设输入参数服从独立同分布,所以:
所以我们可以得到:
同样,也有
所以,最终:
为了保持方差在各层间保持不变,即,所以:
如果反向和正向综合考虑的话:
4
小结
Xavier初始化的方法给我们做深度学习提供了一个很好的参考,但是,Xavier初始化并不是万能的,它其中一个很大的不足就是假设激活值关于0对称,显然,这个假设不适用于ReLU激活函数。当激活函数为ReLU函数时,用Xavier方法作为权重的初始化,它的表现效果并不是很好(见图左),这是因为在ReLU网络中,每一层有一半的神经元被激活,另一半为0(当输入小于0时),所以如果要保持方差不变,只需要将权重方差的大小加倍即可,这就是He初始化。
5
Reference:
[1] Glorot X, Bengio Y. Understanding the difficulty of training deep feedforward neural networks[C]//Proceedings of the thirteenth international conference on artificial intelligence and statistics. 2010: 249-256.
[2] https://www.deeplearning.ai/ai-notes/initialization/
[3] https://en.wikipedia.org/wiki/Variance#Product_of_independent_variables
[4] https://ayearofai.com/rohan-4-the-vanishing-gradient-problem-ec68f76ffb9b#.q3oh3cded
[5] https://andyljones.tumblr.com/post/110998971763/an-explanation-of-xavier-initialization
[6] He K, Zhang X, Ren S, et al. Delving deep into rectifiers: Surpassing human-level performance on imagenet classification[C]//Proceedings of the IEEE international conference on computer vision. 2015: 1026-1034.
[7] http://pelhans.com/2019/04/12/deepdive_tensorflow-note4/
文案 && 代码 付莹
审稿 && 排版 任伟涛
指导老师:朱文斌教授(华南理工大学工商管理学院)
注:公式是可以拖动的,如果手机浏览无法拖动,建议使用电脑浏览哦~
如对文中内容有疑问,欢迎交流。
如有需要,可以联系:
朱文斌教授(i@zhuwb.com)
付莹(华南理工大学工商管理学院研究生一年级,dhlsfy@163.com)
任伟涛(华中科技大学管理学院本科三年级,739504418@qq.com)
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有