Xavier——Understanding the difficulty of training deep feedforward neural networks
1. 摘要
本文尝试解释为什么在深度的神经网络中随机初始化会让梯度下降表现很差,并且在此基础上来帮助设计更好的算法。
作者发现 sigmoid 函数不适合深度网络,在这种情况下,随机初始化参数会让较深的隐藏层陷入到饱和区域。
作者提出了一个新的参数初始化方法,称之为 Xavier 初始化,来帮助深度网络更快地收敛。
2. 激活函数的作用以及训练过程中的饱和现象
2.1. 三种激活函数
\[Tanh(x)=\frac{1-e^{-x}}{1+e^{-x}}\]
\[Sigmoid(x)=\frac{1}{1+e^{-x}}\]
\[Softsign(x)=\frac{x}{1+|x|}\]
2.2. Sigmoid 函数
通过观察训练过程中每一个隐藏层激活值的均值和方差,我们可以发现第 4 层的激活值很快就进入到了饱和区域,非常接近于 0。由于 Sigmoid 函数在接近于 0 的时候梯度很小,这样的话反向传播过程就会学习得很慢,虽然最终网络会慢慢离开饱和区域,但往往学到的解也不是最优的。
2.3. Tanh 函数和 Softsign 函数
由于 Tanh 函数和 Softsign 函数接近于 0 的时候梯度近似线性,所以它们不会遇到像 Sigmoid 上面的情况。但是,采用 Tanh 作为激活函数时,从第一层到第四层的激活值却也会在训练过程中依次进入饱和区域。而采用 Softsign 的话,所有层都逐渐进入饱和区域,但这个过程会更慢一点。
在训练完成后,我们可以发现以 Tanh 作为激活函数,最终每层的激活值大多落在饱和区域和 0 附近;以 Softsign 作为激活函数,最终每层的激活值大多落在 (-0.6, -0.8) 和 (0.6, 0.8) 区间。
3. 梯度以及它们的传播
3.1. 损失函数
作者发现采用似然损失比用二次的均方误差要好,因为采用似然损失不容易陷入到平缓区域,不会让训练过程变得很慢。如下图所示,可以看到采用二次损失的损失函数有很多平缓区域。
3.2. Xavier 初始化
针对一个对称的激活函数,并且其在原点处的导数为 1,那么我们有:
根据以上定义,可以得到:
假设初始时我们位于线性区域,权重之间互相独立,并且输入的特征具有一样的方差 \(Var[x]\),第 \(i\) 层具有 \(n_i\) 个神经元,那么有:
可参考 Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification 对比进行分析。
在前向过程中,为了保持信息,让每一层都具有一样的方差,即:
那么我们可以得到:
同样,考虑梯度的反向传播,我们可以得到:
为了保证每一层梯度的方差一致,也即:
我们有:
若同时考虑到前向传播的反向传播的约束,我们想要:
对此,我们用下面的方法来初始化参数
其中,\(U\) 代表均匀分布,其方差为
\[\frac{(b-a)^2}{12} = \frac{2}{n_j+n_{j+1}}\]
正好符合我们的预期。
可以看到,在前向传播过程中,旧的初始化方法,越靠后的层激活值越容易陷入到 0 区域,而采用新的初始化方法后,每一层的激活值分布基本相同。
在反向传播过程中,旧的初始化方法,越靠前的层梯度值越容易陷入到 0 区域,而采用新的初始化方法后,每一层的梯度分布基本相同。
5. 实验结果
获取更多精彩,请关注「seniusen」!
Xavier——Understanding the difficulty of training deep feedforward neural networks的更多相关文章
- [Xavier] Understanding the difficulty of training deep feedforward neural networks
目录 概 主要内容 Glorot X, Bengio Y. Understanding the difficulty of training deep feedforward neural netwo ...
- Understanding the difficulty of training deep feedforward neural networks
本文作者为:Xavier Glorot与Yoshua Bengio. 本文干了点什么呢? 第一步:探索了不同的激活函数对网络的影响(包括:sigmoid函数,双曲正切函数和softsign y = x ...
- Deep learning_CNN_Review:A Survey of the Recent Architectures of Deep Convolutional Neural Networks——2019
CNN综述文章 的翻译 [2019 CVPR] A Survey of the Recent Architectures of Deep Convolutional Neural Networks 翻 ...
- Understanding the Effective Receptive Field in Deep Convolutional Neural Networks
Understanding the Effective Receptive Field in Deep Convolutional Neural Networks 理解深度卷积神经网络中的有效感受野 ...
- AlexNet论文翻译-ImageNet Classification with Deep Convolutional Neural Networks
ImageNet Classification with Deep Convolutional Neural Networks 深度卷积神经网络的ImageNet分类 Alex Krizhevsky ...
- Image Scaling using Deep Convolutional Neural Networks
Image Scaling using Deep Convolutional Neural Networks This past summer I interned at Flipboard in P ...
- (转) Ensemble Methods for Deep Learning Neural Networks to Reduce Variance and Improve Performance
Ensemble Methods for Deep Learning Neural Networks to Reduce Variance and Improve Performance 2018-1 ...
- 中文版 ImageNet Classification with Deep Convolutional Neural Networks
ImageNet Classification with Deep Convolutional Neural Networks 摘要 我们训练了一个大型深度卷积神经网络来将ImageNet LSVRC ...
- 深度学习的集成方法——Ensemble Methods for Deep Learning Neural Networks
本文主要参考Ensemble Methods for Deep Learning Neural Networks一文. 1. 前言 神经网络具有很高的方差,不易复现出结果,而且模型的结果对初始化参数异 ...
随机推荐
- 7、Android---网络技术
玩手机不能上网是单机的时代 而且现在的流量也出了无限使用 几乎网络离不开人们的日常生活 7.1.WebView的用法 遇到一些特殊的请求 在程序中展示一些网页 加载和显示网页都是浏览器的任务 在不打开 ...
- Python自动化之__unicode__
def __unicode__(self): return u'%s %s' % (self.first_name, self.last_name) 如果定义了__unicode__()方法但是没有定 ...
- 【转】matplotlib制图——图例legend
转自:https://www.cnblogs.com/alimin1987/p/8047833.html import matplotlib.pyplot as pltimport numpy as ...
- oracle ORA-01722:无效数字 记录
今天在对12万条记录的表进行左联接时,有时可以查询出数据,有时会报无效数字,反复检查,发现问题. 例如sql: SELECT * FROM USER U LEFT JOIN USER_ROLE UR ...
- selenium测试报告(含通过率统计图和失败截图)
前言: 介绍的是含饼状统计图及失败截图的测试报告文件. 原文地址:https://testerhome.com/topics/9984 此版本增加了如下功能 测试报告完全汉化,包括错误日志的中文处理 ...
- Threadpool python3
from concurrent.futures import ThreadPoolExecutor,ALL_COMPLETED,wait,as_completedimport time def add ...
- gulp插件 run-sequence(同步执行任务)
功能描述 gulp默认使用最大并发数执行任务,也就是说所有的任务几乎都是同时执行,而不会等待其它任务.但很多时候,任务是需要有先后次序的,比如要先清理目标目录,然后再执行打包. run-sequenc ...
- 通过ReentrantLock简单了解下并发包中的锁
ReentrantLock在进行实例化时,可以通过构造函数的参数选择是否使用公平锁FairSync或者非公平锁NonfairSync,两者的区别比较简单,如果是公平锁则新来的线程会先检测同步队列中是否 ...
- [iOS]拾遗补阙
一.AFNetworking POST纯字符串 修改位置AFURLRequestSerialization 修改前 NSString * AFQueryStringFromParameters(NSD ...
- Oracle透明网关访问MySQL数据库
针对oracle数据库不同实例之间的数据访问,我们可以直接通过dblink访问,如果oracle数据库想访问mysql/sqlserver等数据库的数据,我们可以通过配置oracle透明网关实现异构数 ...