0_3-激活函数的反向传播-ReLU、LeakyReLU、PReLU、ELU、SELU

numpy实现神经网络系列

工程地址:https://github.com/yizt/numpy_neuron_network

基础知识

0_1-全连接层、损失函数的反向传播

0_2_1-卷积层的反向传播-单通道、无padding、步长1

0_2_2-卷积层的反向传播-多通道、无padding、步长1

0_2_3-卷积层的反向传播-多通道、无padding、步长不为1

0_2_4-卷积层的反向传播-多通道、有padding、步长不为1

0_2_5-池化层的反向传播-MaxPooling、AveragePooling、GlobalAveragePooling、GlobalMaxPooling

0_3-激活函数的反向传播-ReLU、LeakyReLU、PReLU、ELU、SELU

0_4-优化方法-SGD、AdaGrad、RMSProp、Adadelta、Adam

DNN练习

1_1_1-全连接神经网络做线性回归

1_1_2-全连接神经网络做mnist手写数字识别

CNN练习

2_1-numpy卷积层实现

2_2-numpy池化层实现

2_3-numpy-cnn-mnist手写数字识别

本文目录

本文介绍常见的激活函数的前向过程及反向传播过程

依赖知识

a) 熟悉全连接层、损失函数的反向传播

b) 熟悉ReLU、LeakyReLU、PReLU、ELU、SELU

ReLU

​ 整流线性单元Rectified Linear Unit

前向过程

ReLU(z)={z0z>0z<=0(1) (1) R e L U ( z ) = { z z > 0 0 z <= 0

后向过程

a) 我们将激活函数也看做一层, 设第 l l 层输出为zl, 经过激活函数后的输出为 zl+1 z l + 1

b) 记损失函数L关于第 l l 层的输出zl 的偏导为 δl=Lzl δ l = ∂ L ∂ z l

​ 则损失函数L关于关于第l层的偏导如下:

δl=Lzl+1zl+1zl=δl+1ReLU(zl)zl=δl+1{10zl>0zl<=0={δl+10zl>0zl<=0(1)(2)(3)(2) (1) δ l = ∂ L ∂ z l + 1 ∂ z l + 1 ∂ z l (2) = δ l + 1 ∂ R e L U ( z l ) ∂ z l (3) = δ l + 1 { 1 z l > 0 0 z l <= 0 (2) = { δ l + 1 z l > 0 0 z l <= 0

LeakyReLU

​ ReLU在取值小于零部分没有梯度,LeakyReLU在取值小于0部分给一个很小的梯度

前向过程

LeakyReLU(z)={zαzz>0z<=0,α=0.1(3) (3) L e a k y R e L U ( z ) = { z z > 0 α z z <= 0 , α = 0.1

后向过程

同Relu可知损失函数L关于关于第l层的偏导为:

δl={δl+1αδl+1zl>0zl<=0,α=0.1(4) (4) δ l = { δ l + 1 z l > 0 α δ l + 1 z l <= 0 , α = 0.1

PReLU

​ 参数化ReLU,形式同LeakyRelu,不过 α α 不是固定的常量而是根据数据学习到的。

论文地址:https://arxiv.org/pdf/1502.01852.pdf

前向过程

PReLU(z)={zαzz>0z<=0,αz(5) (5) P R e L U ( z ) = { z z > 0 α z z <= 0 , α 是 与 z 相 同 形 状 的 变 量

后向过程

a) 同LeakyRelu可知损失函数L关于关于第l层的偏导为:

δl={δl+1αδl+1zl>0zl<=0,α(6) (6) δ l = { δ l + 1 z l > 0 α δ l + 1 z l <= 0 , α 是 需 要 学 习 的 参 数

b) 损失函数L关于关于参数 α α 的偏导为:

Lα=Lzl+1zl+1α=δl+1PReLU(zl)α=δl+1{0zlzl>0zl<=0={0δl+1zlzl>0zl<=0(4)(5)(6)(7) (4) ∂ L ∂ α = ∂ L ∂ z l + 1 ∂ z l + 1 ∂ α (5) = δ l + 1 ∂ P R e L U ( z l ) ∂ α (6) = δ l + 1 { 0 z l > 0 z l z l <= 0 (7) = { 0 z l > 0 δ l + 1 z l z l <= 0

ELU

​ 指数化ReLU,在取值小于0的部分使用指数

论文地址: https://arxiv.org/pdf/1511.07289.pdf

前向过程

ELU(z)={zα(exp(z)1)z>0z<=0,α=0.1(8) (8) E L U ( z ) = { z z > 0 α ( exp ⁡ ( z ) − 1 ) z <= 0 , α = 0.1

后向过程

同LeakyRelu可知损失函数L关于关于第l层的偏导为:

δl={δl+1αδl+1exp(zl)zl>0zl<=0(9) (9) δ l = { δ l + 1 z l > 0 α δ l + 1 exp ⁡ ( z l ) z l <= 0

SELU

​ 缩放指数型线性单元, 就是对ELU加上一个缩放因子 λ λ

论文地址: https://arxiv.org/pdf/1706.02515.pdf

前向过程

RELU(z)=λ{zα(exp(z)1)z>0z<=0(10) (10) R E L U ( z ) = λ { z z > 0 α ( exp ⁡ ( z ) − 1 ) z <= 0

​ 其中 λ1.0507,α1.673 λ ≈ 1.0507 , α ≈ 1.673 (论文中有大段证明)

后向过程

同ELU可知损失函数L关于关于第l层的偏导为:

δl=λ{δl+1αδl+1exp(zl)zl>0zl<=0(11) (11) δ l = λ { δ l + 1 z l > 0 α δ l + 1 exp ⁡ ( z l ) z l <= 0

### Leaky ReLU 激活函数的定义 Leaky ReLU 是一种改进版的 ReLU (Rectified Linear Unit) 激活函数,旨在解决传统 ReLU 函数在负输入区域始终输出零而导致神经元死亡的问题。对于传统的 ReLU 函数,在输入小于零的情况下,梯度会完全消失,从而阻碍模型的学习过程。而 Leaky ReLU 则通过引入一个小的正斜率 \( \alpha \),使得即使在负输入区间也能保持一定的梯度流动。 具体而言,Leaky ReLU 的数学表达形式可以写为: \[ f(x) = \begin{cases} x, & \text{if } x \geq 0 \\ \alpha x, & \text{if } x < 0 \end{cases} \] 其中,\( \alpha \) 是一个超参数,通常取较小正值(如 0.01),用于控制负区间的线性比例[^1]。 --- ### Leaky ReLU 在 PyTorch 中的使用方法 在深度学习框架 PyTorch 中,可以通过 `torch.nn` 模块中的 `LeakyReLU` 类轻松实现该激活函数。以下是常见的用法示例: #### 创建 Leaky ReLU 实例并指定斜率 ```python import torch import torch.nn as nn # 定义 Leaky ReLU ,设置 alpha=0.01 leaky_relu_layer = nn.LeakyReLU(negative_slope=0.01) # 输入张量 input_tensor = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0]) # 计算输出 output_tensor = leaky_relu_layer(input_tensor) print(output_tensor) ``` 运行以上代码后,将会得到如下输出: ``` tensor([-0.0200, -0.0100, 0.0000, 1.0000, 2.0000]) ``` 在这个例子中,当输入值为负数时,它们被乘以设定的小于 1 的系数 \( \alpha \)[^2]。 --- ### 可视化 Leaky ReLU 曲线 为了更直观地理解 Leaky ReLU 的行为模式,可以用编程工具绘制其曲线图。以下是一个基于 R 语言的例子: ```r library(ggplot2) # 自定义 Leaky ReLU 函数 leaky_relu <- function(x, alpha = 0.01){ ifelse(x >= 0, x, alpha * x) } # 生成数据点 x_values <- seq(-5, 5, by = 0.1) y_values <- leaky_relu(x_values) # 绘制图形 data_frame <- data.frame(x = x_values, y = y_values) ggplot(data_frame, aes(x=x, y=y)) + geom_line(color="blue") + labs(title="Leaky ReLU Function", x="Input Value (x)", y="Output Value (f(x))") ``` 这段脚本首先定义了一个自适应版本的 Leaky ReLU 函数,并利用 ggplot2 库将其绘制成一条分段直线图表[^3]。 --- ### 总结 Leaky ReLU 提供了一种有效的方法来缓解标准 ReLU 存在的死区问题,同时保留了简单高效的特性。无论是理论分析还是实际应用面,它都是一种值得推荐的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值