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多 ...
随机推荐
- kubernetes系列(八) - 控制器的资源清单定义
1. ReplicaSet 1.1 ReplicaSet资源清单 1.2 selector 2. Deployment 2.1 Deployment资源清单 2.2 其他相关操作 2.2.1 应用ya ...
- AICA第6期-学习笔记汇总
AICA第6期-学习笔记汇总 AICA第六期|预科班课程 1.<跨上AI的战车> 2.<产业中NLP任务的技术选型与落地> 3.<计算机视觉产业落地挑战与应对> 4 ...
- 开源搜索引擎Lucene、Solr、Sphinx等优劣势比较
以下重点介绍最常用的开源搜素引擎: 1.Lucene 2.Solr 3.Elasticsearch 4.Sphinx 5.各自的特点和优劣势选型比较 开源搜索引擎分类 主要分为两类:Java开发和C+ ...
- python 控制流程
条件语句 if语法 if True: print("hello") print("world!") 输出: helloworld! 举例: "&quo ...
- paddle安装中 libssl-1_1-x64.dll 的版本问题
paddle安装过程中出现的一些问题: 在学习tensorflow过程中,了解到paddlepaddle,本着技多不压身的原则也了解了一下,但是在安装的时候碰到了一些问题.特地记录一下. 一.&quo ...
- el-table关于选择行的三个常用事件
变量声明 data(){ return{ selectList: [], } } 事件绑定 <el-table @select-all="selectAllChange" @ ...
- [记录点滴]OpenResty 支持http v2的问题
[记录点滴]OpenResty 支持http v2的问题 0x00 摘要 记录一次OpenResty支持http v2的问题排查. 0x01 问题 错误现象:无法上传图片,后台log是http v2 ...
- P1081 [NOIP 2012 提高组] 开车旅行 题解
传送门 前言 爆肝到半夜,中间假了一次,最终调过了两个样例,交上去过了. 题解 思路 首先进行预处理. 用一种你喜欢的数据结构维护每个城市的海拔,容易求出从每个城市出发,小 \(A\) 和小 \(B\ ...
- DeepSeek普照的阳光下,继续RAG还是Distillation?
什么是RAG RAG概述 RAG,全称为Retrieval-Augmented Generation(检索增强生成),是一种结合了信息检索和文本生成的人工智能技术.简单来说,RAG通过从大量文档或数据 ...
- 丢掉WebView,使用JS+Rust开发跨端桌面应用-Deft
简介 随着Web技术的发展,越来越多的跨端应用选择了WebView作为基础解决方案.诚然WebView让跨端应用开发变得简单了很多,极大的提高了开发效率,但是,WebView也存在着一些广为诟病的缺点 ...