04 详解”死亡ReLU“问题
本篇文章尝试通过具体的神经网络例子,来深入探讨”死亡ReLU“的问题。
很多资料都会提到神经元”永久性死亡“这种说法,我认为这会对我们的理解产生一定的误解。事实上,神经元的状态一直都是动态的,是受到多个因素的影响的。那么是哪些因素在什么样的条件下会导致”死亡ReLU“问题呢?
首先我们回顾一下ReLU函数的图像:
当输入为负时,ReLU函数输出为零。也就是说当输入神经元的加权和为负时,神经元输出为零。此时,神经元进入”失活“状态。
从ReLU的导数图像可知,在这种状态下,ReLU的导数也为0。
我们用一个简单的多层神经网络举例:
我们用于训练的数据如下,其中每一行为一个sample,共n个samples:
我们分两种情况进行讨论。
情况一
我们把关注点放在第一个中间层的第1个神经元 \(h_1^{(1)}\) ,根据反向传播链式法则,与之相关联的\(w_{11}\) , \(w_{12}\), \(w_{13}\) 的梯度为:
其中 \(h_{1a}^{(1)}\) 表示 \(h_1^{(1)}\) 经过Relu激活函数的输出,\(Relu'(h_1^{(1)})\) 表示Relu函数在 \(h_1^{(1)}\) 处的导数。
此时如果输入神经元的加权和 \(x_{11}w_{11}+x_{12}w_{12}+x_{13}w_{13}\) 小于零,则神经元输出 \(h_{1a}^{(1)}\) 等于0,激活函数导数\(Relu'(h_1^{(1)})\) 等于0,代入上式得到 \(w_{11}\) , \(w_{12}\), \(w_{13}\) 的梯度为0。
而权重的更新公式为:\(w_{11new}=w_{11}-\lambda*\frac{\partial L}{\partial w_{11}}\)
则\(w_{11}\) , \(w_{12}\), \(w_{13}\) 在本次迭代中,没有更新。
请注意,到这里为止,我们不能说神经元”死亡了“,只不过是本次迭代中输出为0,Relu导数为0,导致权重没有更新。(一些网上资料的表述方式会让人产生误解)
如果下一组输入数据 \({x_{21}, x_{22}, x_{23} }\) 进入网络,其加权和大于0,那么神经元的输出大于0,激活函数导数为1, \(w_{11}\) , \(w_{12}\), \(w_{13}\) 是可以得到更新的。
然而如果你十分不幸,当你把数据集里的所有samples都输入网络进行了训练,你所初始化的权重\(w_{11}\) , \(w_{12}\), \(w_{13}\) ,使得他们的加权和都是小于0的, \(w_{11}\) , \(w_{12}\), \(w_{13}\) 都不会得到更新。整个训练过程中,你发现 \(h_1^{(1)}\) 这个神经元都没有输出。此时,我们可以认为该神经元对于本次训练来说是”死亡“的。
也许你重新初始化了一下权重,重新进行训练,它就活过来了。
对于其他中间层的神经元,其原理也是一样的,如果权重设置不当,所有数据集中的samples都使得该神经元的输入为负,那么它相当于是”死亡“的。
情况二
当我们设置的权重更新步长λ太大时,也有可能导致神经元的”失活“。
我们把关注点放在第二个中间层的第1个神经元 \(h_1^{(2)}\) ,与之相关联的\(w_{21}\) , \(w_{22}\)权重更新公式:
\(w_{21new}=w_{21}-\lambda*\frac{\partial L}{\partial w_{21}}\)
\(w_{22new}=w_{22}-\lambda*\frac{\partial L}{\partial w_{22}}\)
许多资料上是这样描述的:”如果λ过大,则\(\lambda*\frac{\partial L}{\partial w_{21}}\)会很大,会使得权重变为负值。然后和输入进行加权又得到负值,导致relu输入负值,进而失活。”
这样的描述假定了权重的梯度是正值,有些简略。我们把\(w_{21}\) , \(w_{22}\)的梯度写出来看一看:
可以看到梯度的正负是与前一层神经元的输出、预测值与实际值大小、后一层与之关联的权重\(w_{31}\)、还有当前神经元激活函数的导数相关联的。
由于前一层神经元也是通过ReLU激活的,那么如果前一层的两个神经元本身就是失活状态, \(h_{1a}^{(1)}\) 和 \(h_{2a}^{(1)}\) 为0,那么\(w_{21}\) , \(w_{22}\)权重不会更新。
如果前一层神经元是激活状态,ReLU函数输出 \(h_{1a}^{(1)}\) 和 \(h_{2a}^{(1)}\) 为正,同时预测值\(\hat{y}\)大于实际值y,同时\(w_{31}\)为正,同时\(w_{21}\) , \(w_{22}\)设置合理, \(h_1^{(2)}\) 这个神经元本身处于激活状态,\(Relu'(h_1^{(2)})\) 为1,那么这种情况下,\(\frac{\partial L}{\partial w_{21}}\), \(\frac{\partial L}{\partial w_{22}}\)为正值。此时,λ过大的话,\(w_{21}\) , \(w_{22}\)会变成负数。在下一次前向传播时,由于前一层无论激活与否都不可能输出负值,因此,与\(w_{21}\) , \(w_{22}\)进行加权,就会导致ReLU的输入为负,神经元失活,\(w_{21}\) , \(w_{22}\)不更新。
这种情况有没有可能在后续的迭代中让神经元重新激活?很遗憾没有,因为前一层也是ReLU函数,其输出不可能是两个负数,从而使他们与\(w_{21}\) , \(w_{22}\)的加权和变为正数。因此\(w_{21}\) , \(w_{22}\)会一直不更新。该神经元相当于”死亡“了。
总结
“死亡ReLU”问题虽然分析起来影响因素较多,看起来十分复杂,但在实际的应用过程中,这种“死亡”并不会对我们的深度神经网络有太大的影响。如果你训练一个神经网络,发现其中有2-4成的神经元都是死亡的,但神经网络依然能够work,这也是正常现象。有一些手段比如Leaky ReLU,ELU等变体能够一定程度上改善“死亡ReLU”问题,但其功效大小在业界也存在一定的争议。更多的情况下,如果你发现大面积“死亡ReLU”问题,重新初始化一下权重矩阵,降低一些优化步长λ,就可以了。
04 详解”死亡ReLU“问题的更多相关文章
- Hadoop详解(04)-Hdfs
Hadoop详解(04)-Hdfs HDFS概述 HDFS产出背景及定义 背景:随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需 ...
- Windows XP硬盘安装Ubuntu 12.04双系统图文详解
Windows XP硬盘安装Ubuntu 12.04双系统图文详解 Ubuntu 12.04 LTS版本于2012年4月26日发布,趁着五一放假,赶紧在自己的Windows XP的电脑上安装下Ubun ...
- iOS回顾笔记(04) -- UIScrollView的基本使用详解
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- ubuntu14.04 server ftp 服务安装配置详解
ubuntu14.04 server ftp 服务安装配置详解 cheungmine 2016-01-27 http://wiki.ubuntu.com.cn/Vsftpd 0 安装好vsftpd服务 ...
- Ubuntu 系统安装详解 19.04最新版本
Ubuntu 19.04版本系统安装详解 1 .镜像的下载 推荐 阿里云镜像下载 2.安装 1.1.新建虚拟机 注意硬件的兼容性问题 当前只有5.x可以用,其他兼容各位可以尝试下,我也都试过,但只有5 ...
- Ubuntu14.04下Mongodb(离线安装方式|非apt-get)安装部署步骤(图文详解)(博主推荐)
不多说,直接上干货! 说在前面的话 首先,查看下你的操作系统的版本. root@zhouls-virtual-machine:~# cat /etc/issue Ubuntu LTS \n \l r ...
- Ubuntu16.04下Neo4j图数据库官网安装部署步骤(图文详解)(博主推荐)
不多说,直接上干货! 说在前面的话 首先,查看下你的操作系统的版本. root@zhouls-virtual-machine:~# cat /etc/issue Ubuntu LTS \n \l r ...
- Ubuntu14.04下Neo4j图数据库官网安装部署步骤(图文详解)(博主推荐)
不多说,直接上干货! 说在前面的话 首先,查看下你的操作系统的版本. root@zhouls-virtual-machine:~# cat /etc/issue Ubuntu 14.04.4 LTS ...
- Ubuntu16.04下Mongodb(离线安装方式|非apt-get)安装部署步骤(图文详解)(博主推荐)
不多说,直接上干货! 说在前面的话 首先,查看下你的操作系统的版本. root@zhouls-virtual-machine:~# cat /etc/issue Ubuntu LTS \n \l r ...
- “全栈2019”Java多线程第七章:等待线程死亡join()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
随机推荐
- 网页开发中使用javascript语言时浏览器操作时弹出错误:Uncaught TypeError: Cannot set property 'onClick' of null。
在Chrome浏览器下,遇到了这个错误提示:Uncaught TypeError: Cannot set property 'onClick' of null. 先贴一下JS的代码: document ...
- Web网页端IM产品RainbowChat-Web的v6.0版已发布
一.关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIM ...
- Solution -「ROI 2018」「LOJ #2850」无进位加法
\(\mathscr{Description}\) Link. 给定 \(\{a_n\}\),每次令某个 \(a_i\leftarrow a_i+1\),最终得到 \(\{b_n\}\),求 ...
- Cesium中3DTiles使用CustomShader着色器渲染
加载模型 新版本cesium加载3DTiles代码如下,后续效果只修改CustomShader内内容 //加载楼栋白膜 let tileset try { tileset = await Cesium ...
- Secure Face Matching Using Fully Homomorphic Encryption-2018:学习
本文学习论文"Secure Face Matching Using Fully Homomorphic Encryption-2018"和"基于全同态加密的人脸特征密文认 ...
- Cobweb Intermediate pg walkthrough
源码泄露 可以直接看到源码存在sql注入 反弹shellpayload http://192.168.167.162/phpinfo%22%20%20union%20select%20'system( ...
- react报错Can't resolve 'react' in 'E:\reactweb\preact\my-app\node_modules\react-dom\cjs'
执行如下: npm install -g react npm install react --save 类似这种依赖项(react,react-dom 等)报错,哪个报错执行哪个即可 执行上述两句就 ...
- Oracle trunc的使用
在生产环境中我们经常会用到只取年月日或者时间处理的场景,大多数人用的都是to_char(string,'yyyy-mm-dd')或者to_date(string,'yyyy-mm-dd')来处理,不说 ...
- split 命令分割超大日志文件
split 命令分割超大日志文件 split -l 1000000 jmeter1432.log part_ 在Windows系统中也可以通过gitbash执行此命令 运行结果:
- 开源接流:一个方法搞定3D地图双屏联动
老大提需求:一份数据,在2D地图上可编辑,在3D地图上显示高度信息,关键是两个地图得支持视图同步,末了还来句"两天时间够了吧?"我饶了饶头,内心各种问候...,代码如何下手,特X的 ...