前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何正确初始化神经网络的权重参数

如何正确初始化神经网络的权重参数

作者头像
用户1621951
发布于 2020-02-28 04:20:29
发布于 2020-02-28 04:20:29
3.4K0
举报
文章被收录于专栏:数据魔术师数据魔术师

近几年,随着深度学习的大火,越来越多的人选择去入门、学习、钻研这一领域,正确初始化神经网络的参数对神经网络的最终性能有着决定性作用。如果参数设置过大,会出现梯度爆炸的现象,导致网络训练过程发散;而如果参数设置过小,会出现梯度消失的现象,导致收敛极其缓慢。本文是作者拜读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)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据魔术师 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​[DeeplearningAI 笔记]第二章 1.10-1.12 梯度消失,梯度爆炸,权重初始化
,因此对于一个深层神经网络来说,y 的值将爆炸式增长.相反的,如果权重是 0.5,有
演化计算与人工智能
2020/08/14
4500
​[DeeplearningAI 笔记]第二章 1.10-1.12 梯度消失,梯度爆炸,权重初始化
初始化神经网络权重的方法总结
在本文中,评估了权值初始化的许多方法和当前的最佳实践 零初始化 将权值初始化为零是不行的。那我为什么在这里提到它呢?要理解权值初始化的需要,我们需要理解为什么将权值初始化为零是无效的。 让我们考虑
deephub
2020/11/09
1.2K0
初始化神经网络权重的方法总结
吴恩达团队:神经网络如何正确初始化?
初始化对训练深度神经网络的收敛性有重要影响。简单的初始化方案可以加速训练,但是它们需要小心避免常见的陷阱。
AI科技大本营
2019/05/17
1.1K0
吴恩达深度学习课最新补充教程:交互式demo助你轻松理解神经网络初始化
这篇教程共包括四部分:有效初始化的重要性、梯度爆炸或消失问题、什么是恰当的初始化,以及 Xavier 初始化的数学证明。
机器之心
2019/05/27
5580
吴恩达深度学习课最新补充教程:交互式demo助你轻松理解神经网络初始化
深度学习相关概念:2.权重初始化
  权重初始化(weight initialization)又称参数初始化,在深度学习模型训练过程的本质是对weight(即参数 W)进行更新,但是在最开始训练的时候是无法更新的,这需要每个参数有相应的初始值。在进行权重初始化后,神经网络就可以对权重参数w不停地迭代更新,以达到较好的性能。
AiCharm
2023/05/15
8980
深度学习相关概念:2.权重初始化
深度 | 通过方差分析详解最流行的Xavier权重初始化方法
选自Manas Blog 作者:Manas George 机器之心编译 参与:蒋思源 本文假定各位读者了解一些神经网络的基础,包括一些基本的前向与反向传播的表达式。本文很大一部分是进行基础的代数操作,只有少量的基本统计数据。如果读者希望先复习一点神经网络相关的知识,可以阅读以下机器之心曾发过的基础教程。本文尝试用 Glorot 和 Bengio 在他们论文中使用的推导以探讨深度神经网络中的权重初始化问题,并更好地说明为什么他们的方法解决了神经网络面临的训练问题。 最全的DNN概述论文:详解前馈、卷积和循环神
机器之心
2018/05/10
2K0
神经网络使用梯度下降的原因(摘自我写的书)
目前深度神经网络模型的优化方法主要是梯度下降。我们使用梯度下降的方法来进行误差的反向传播,不断地调整模型参数,以降低模型所产生的误差,使模型更好实现从输入到输出的映射。目前因为各种因素,神经网络可以做的层数更深,神经元更多。相较于以前得到了性能上较大的提升。
黄鸿波
2020/04/14
1.9K0
干货|权重初始化如何推导?
今天我们带来的深度学习权重初始化相关的内容,其初始化的原理是?背后的数学原理是啥?可以达到什么效果呢?我们一一来看吧~
灿视学长
2021/07/07
9380
PyTorch: 权值初始化
在搭建好网络模型之后,首先需要对网络模型中的权值进行初始化。权值初始化的作用有很多,通常,一个好的权值初始化将会加快模型的收敛,而比较差的权值初始化将会引发梯度爆炸或者梯度消失。下面将具体解释其中的原因:
timerring
2023/07/20
4360
PyTorch: 权值初始化
深度学习基础知识(一)--- 权重初始化 --- 概念
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
TeeyoHuang
2019/12/02
2.6K0
深度学习基础知识(一)--- 权重初始化 --- 概念
【Pytorch 】笔记六:初始化与 18 种损失函数的源码解析
疫情在家的这段时间,想系统的学习一遍 Pytorch 基础知识,因为我发现虽然直接 Pytorch 实战上手比较快,但是关于一些内部的原理知识其实并不是太懂,这样学习起来感觉很不踏实,对 Pytorch 的使用依然是模模糊糊,跟着人家的代码用 Pytorch 玩神经网络还行,也能读懂,但自己亲手做的时候,直接无从下手,啥也想不起来,我觉得我这种情况就不是对于某个程序练得不熟了,而是对 Pytorch 本身在自己的脑海根本没有形成一个概念框架,不知道它内部运行原理和逻辑,所以自己写的时候没法形成一个代码逻辑,就无从下手。这种情况即使背过人家这个程序,那也只是某个程序而已,不能说会 Pytorch,并且这种背程序的思想本身就很可怕, 所以我还是习惯学习知识先有框架(至少先知道有啥东西)然后再通过实战(各个东西具体咋用)来填充这个框架。而「这个系列的目的就是在脑海中先建一个 Pytorch 的基本框架出来,学习知识,知其然,知其所以然才更有意思 ;)」。
阿泽 Crz
2020/09/04
2.7K0
网络权重初始化方法总结(下):Lecun、Xavier与He Kaiming
书接上回,全0、常数、过大、过小的权重初始化都是不好的,那我们需要什么样的初始化?
李拜六不开鑫
2019/11/22
2.6K0
神经网络中的权值初始化:从最基本的方法到Kaiming方法一路走来的历程
这篇文章通过实验一步一步验证了如何从最基础的初始化方法发展到Kaiming初始化方法,以及这之间的动机。
小草AI
2019/10/16
1.7K0
神经网络中的权值初始化:从最基本的方法到Kaiming方法一路走来的历程
白话Xavier | 神经网络初始化的工程选择
论文的链接在这里:https://machinelearning.wustl.edu/mlpapers/paper_files/AISTATS2010_GlorotB10.pdf
机器学习炼丹术
2020/07/28
9440
网络权重初始化方法总结(上):梯度消失、梯度爆炸与不良的初始化
一个简单的前向传播和反向传播的示意图如下,线性组合和非线性激活交替进行,线性组合层可以为全连接层或卷积层等,图片来自链接,
李拜六不开鑫
2019/11/08
2.1K0
网络权重初始化方法总结(上):梯度消失、梯度爆炸与不良的初始化
神经网络中的初始化,有几种方法?
在进行各种小实验和思维训练时,你会逐步发现为什么在训练深度神经网络时,合适的权重初始化是如此重要。
商业新知
2019/04/19
3.2K0
神经网络中的初始化,有几种方法?
一文详解深度学习参数初始化(weights initializer)策略
前言:深度学习的初始化参数指的是在网络训练之前,对各个节点的权重和偏置进行初始化的过程,很多时候我们以为这个初始化是无关紧要的,不需要什么讲究,但是实际上,一个参数的初始化关系到网络能否训练出好的结果或者是以多快的速度收敛,这都是至关重要的,有时候因为参数初始化的缘故,甚至得不到好的训练结果。本文就来讨论一下参数初始化到底有什么讲究以及常见的参数初始化的一些策略方法。阅读本文需要神经网络相关背景,能够理解误差反向传播算法的实现过程。
小草AI
2019/05/29
13.9K0
深度神经网络总结
深度神经网络(Deep Neural Networks,DNN)可以理解为有很多隐藏层的神经网络,又被称为深度前馈网络(DFN),多层感知机(Multi-Layer perceptron,MLP)。
全栈程序员站长
2022/07/02
1.6K0
深度神经网络总结
神经网络参数初始化
我们先给机器一个架构,如下图的两个隐藏层,还有这些神经元,还有给定激活函数,让机器去找w 的取值!就是找出一组参数使得输出效果好,这就是机器学习的意义。
@小森
2024/05/03
1850
神经网络参数初始化
【深度学习 | 梯度那些事】 梯度爆炸或消失导致的模型收敛困难?挑战与解决方案一览, 确定不来看看?
🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)
计算机魔术师
2023/09/25
1.7K0
推荐阅读
相关推荐
​[DeeplearningAI 笔记]第二章 1.10-1.12 梯度消失,梯度爆炸,权重初始化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文