relu神经元死亡的一种角度解释

2024-04-03 22:48

本文主要是介绍relu神经元死亡的一种角度解释,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在阅读 Airbnb 的论文 Applying Deep Learning to Airbnb Search。阅读的过程中,我发现作者在谈及特征归一化的必要性时,有如下表述:

Feeding values that are outside the usual range of features can cause large gradients to back propagate. This can permanently shut of activation functions like ReLU due to vanishing gradients.

翻译成中文:

神经网络接受异于常值范围的输入时,在反向传播过程中会产生大的梯度。这种大的梯度,会因梯度消失而永久关闭诸如 ReLU 的激活函数。

我感到有些疑惑。ReLU 正是为了解决梯度消失问题而设计的。为什么这里会提到「因梯度消失而永久关闭诸如 ReLU 的激活函数」呢?

此篇来讨论这个问题。

ReLU 函数

ReLU 的全称是 Rectified Linear Unit,即:线性整流单元。对于输入 xx,它有输出

 

y=max(0,x).y=max(0,x).

相应地,有导数

 

y′={10x>0,x<0.y′={1x>0,0x<0.

由于 ReLU 在 x>0x>0 时,导数恒为 1。因此在反向传播的过程中,不会因为导数连乘,而使得梯度特别小,以至于参数无法更新。在这个意义上,ReLU 确实避免了梯度消失问题。

异常输入杀死神经元

一个典型的神经元

上图是一个典型的神经元。

现在假设,这个神经元已经经过若干次迭代,其参数 (w⃗ ,b)(w→,b) 已经迭代得趋于稳定。现在,神经元接收到了一个异常的输入 x⃗ x→。比方说,它的某一维特征 xixi 与对应的权重 wiwi 的乘积 wixiwixi 非常大。一般来说,这意味着 xixi 的绝对值非常大。于是,ReLU 的输入就会很大,对应 ReLU 的输出 yy 也就会很大。好了,假设这个 ReLU 神经元期望的输出(ground truth)是 y^y^,这个时候损失就会很大——损失一般是 |y−y^||y−y^| 的增函数,记为 f(|y−y^|)f(|y−y^|)。

于是,在反向传播过程中,传递到 ReLU 的输入时的梯度就是 g=f(|y−y^|)g=f(|y−y^|)。考虑对于偏置 bb 有更新

 

b←b−gη.b←b−gη.

考虑到 gg 是一个很大的正数,于是 bb 可能被更新为一个很小的负数。此后,对于常规输入来说,ReLU 的输入大概率是个负数。这也就是说,ReLU 大概率是关闭的。这时,梯度无法经 ReLU 反向传播至 ReLU 的输入函数。也就是说,这个神经元的参数再也不会更新了。这就是所谓的「神经元死亡」。

如此看来,尽管 ReLU 解决了因激活函数导数的绝对值小于 1,在反向传播连乘的过程中迅速变小消失至 0 的问题,但由于它在输入为负的区段导数恒为零,而使得它对异常值特别敏感。这种异常值可能会使 ReLU 永久关闭,而杀死神经元。

梯度消失?

梯度消失(gradient vanishing)是深度神经网络中的一种现象。导致它的原因有很多。由于激活函数导数连乘导致的梯度消失问题最为出名。因此,在很多人心里(包括我过去也是),梯度消失指得就是这种现象。故而对原文的表述有困惑。这种理解实际上是一种不完全的、很偷懒的做法。因此,对概念的理解要着重深入到实际情况中去,而不能囫囵吞枣。

共勉。

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。

 

转载自:https://liam.page/2018/11/30/vanishing-gradient-of-ReLU-due-to-unusual-input/

这篇关于relu神经元死亡的一种角度解释的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/874178

相关文章

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

嵌入式技术的核心技术有哪些?请详细列举并解释每项技术的主要功能和应用场景。

嵌入式技术的核心技术包括处理器技术、IC技术和设计/验证技术。 1. 处理器技术    通用处理器:这类处理器适用于不同类型的应用,其主要特征是存储程序和通用的数据路径,使其能够处理各种计算任务。例如,在智能家居中,通用处理器可以用于控制和管理家庭设备,如灯光、空调和安全系统。    单用途处理器:这些处理器执行特定程序,如JPEG编解码器,专门用于视频信息的压缩或解压。在数字相机中,单用途

请解释Java Web应用中的前后端分离是什么?它有哪些好处?什么是Java Web中的Servlet过滤器?它有什么作用?

请解释Java Web应用中的前后端分离是什么?它有哪些好处? Java Web应用中的前后端分离 在Java Web应用中,前后端分离是一种开发模式,它将传统Web开发中紧密耦合的前端(用户界面)和后端(服务器端逻辑)代码进行分离,使得它们能够独立开发、测试、部署和维护。在这种模式下,前端通常通过HTTP请求与后端进行数据交换,后端则负责业务逻辑处理、数据库交互以及向前端提供RESTful

OpenStack:Glance共享与上传、Nova操作选项解释、Cinder操作技巧

目录 Glance member task Nova lock shelve rescue Cinder manage local-attach transfer backup-export 总结 原作者:int32bit,参考内容 从2013年开始折腾OpenStack也有好几年的时间了。在使用过程中,我发现有很多很有用的操作,但是却很少被提及。这里我暂不直接

OpenStack实例操作选项解释:启动和停止instance实例

关于启动和停止OpenStack实例 如果你想要启动和停止OpenStack实例时,有四种方法可以考虑。 管理员可以暂停、挂起、搁置、停止OpenStack 的计算实例。但是这些方法之间有什么不同之处? 目录 关于启动和停止OpenStack实例1.暂停和取消暂停实例2.挂起和恢复实例3.搁置(废弃)实例和取消废弃实例4.停止(删除)实例 1.暂停和取消暂停实例

Zuul详细解释

Zuul 是 Netflix 开源的 API 网关,广泛用于微服务架构中。它作为系统的前置网关,主要功能包括路由、负载均衡、限流、安全性管理等。Zuul 最常见的应用场景是作为反向代理,它接收所有来自客户端的请求,并将请求转发给后端的微服务,从而屏蔽了微服务的复杂性。Spring Cloud 集成了 Zuul,使其成为 Spring Cloud 微服务生态系统中的一个重要组件。 为什么使用 Zu

GetWay详细解释

Spring Cloud Gateway 是 Spring Cloud 提供的一款全功能 API 网关,作为微服务架构中的流量管理工具,提供了统一的入口来处理来自客户端的所有请求。它具有以下功能:路由请求、限流、熔断、监控、认证与授权等。 Spring Cloud Gateway 的设计基于 Spring 5.0 和 Spring Boot 2.0,并与 Spring WebFlux 深度集成,

rtklib.h : RTKLIB constants, types and function prototypes 解释

在 RTKLIB 中,rtklib.h 是一个头文件,包含了与 RTKLIB 相关的常量、类型和函数原型。以下是该头文件的一些常见内容和翻译说明: 1. 常量 (Constants) rtklib.h 中定义的常量通常包括: 系统常量: 例如,GPS、GLONASS、GALILEO 等系统的常量定义。 时间常量: 如一年、一天的秒数等。 精度常量: 如距离、速度的精度标准。 2. 类型

一种快速生成CSV的方法

事情是这个样子的 在QQ群在聊把如何100万数据导出成CSV文件?会不会很慢? 俺回了一句“现在的机器性能好,没啥问题”。 然后大家开始谈论机器的配置了。哎,俺的机器配置有点差。 然后俺就进行了一个测试。 测试数据 数据定义         public struct Rec         {             public int v1;             publi