ReLU函数详解及反向传播中的梯度求导

摘要

本文给出 ReLU 函数的定义, 并求解其在反向传播中的梯度

相关

配套代码, 请参考文章 :

Python和PyTorch对比实现ReLU函数及反向传播

系列文章索引 :
https://blog.csdn.net/oBrightLamp/article/details/85067981

正文

1. 定义

ReLU函数, 即线性整流函数(Rectified Linear Unit), 是神经网络结构中常用的非线性激活函数.
其定义如下:
R e L U ( x ) = { 0 , x ⩽ 0 x , x > 0 ReLU(x) = \left\{ \begin{array}{rr} 0, & x \leqslant 0\\ x, & x > 0 \end{array} \right. ReLU(x)={0,x,x0x>0

函数图像 :
在这里插入图片描述

2. 反向传播

ReLU 函数是逐个处理输入值的, 并不需要写成向量的形式.
但为了方便编程实现, 这里将其进行改编成向量的形式.

考虑一个输入向量 x , 经 ReLU 函数变换后得到向量 r, 往前 forward 传播得到误差值 error (标量 e ), 求 e 对 x 的梯度.
x = ( x 1 , x 2 , x 3 , ⋯   , x k )    r = R e L U ( x )    e = f o r w a r d ( r ) x =( x_1,x_2,x_3,\cdots,x_k) \\ \;\\ r = ReLU(x)\\ \;\\ e=forward(r) x=(x1,x2,x3,,xk)r=ReLU(x)e=forward(r)

求解过程 :
d r i d x i = { 0 , x i ⩽ 0 1 , x i > 0    m = ( ∂ r 1 ∂ x 1 , ∂ r 2 ∂ x 2 , ∂ r 3 ∂ x 3 , ⋯   , ∂ r k ∂ x k )    ∇ e ( r ) = ( ∂ e ∂ r 1 , ∂ e ∂ r 2 , ∂ e ∂ r 3 , ⋯   , ∂ e ∂ r k )    ∂ e ∂ x i = ∂ e ∂ r i ∂ r i ∂ x i    ∇ e ( x ) = ( ∂ e ∂ x 1 , ∂ e ∂ x 2 , ∂ e ∂ x 3 , ⋯   , ∂ e ∂ x k ) = ∇ e ( r ) ⊙ m    \frac{d r_i}{d x_i} = \left\{ \begin{array}{rr} 0, & x_i \leqslant 0\\ 1 , & x_i > 0 \end{array} \right.\\ \;\\ m = (\frac{\partial r_1}{\partial x_1},\frac{\partial r_2}{\partial x_2},\frac{\partial r_3}{\partial x_3}, \cdots ,\frac{\partial r_k}{\partial x_k}) \\ \;\\ \nabla e_{(r)} = (\frac{\partial e}{\partial r_1},\frac{\partial e}{\partial r_2},\frac{\partial e}{\partial r_3}, \cdots ,\frac{\partial e}{\partial r_k}) \\ \;\\ \frac{\partial e}{\partial x_i} = \frac{\partial e}{\partial r_i}\frac{\partial r_i}{\partial x_i} \\ \;\\ \nabla e_{(x)} = (\frac{\partial e}{\partial x_1},\frac{\partial e}{\partial x_2},\frac{\partial e}{\partial x_3}, \cdots ,\frac{\partial e}{\partial x_k}) =\nabla e_{(r)} \odot m \;\\ dxidri={0,1,xi0xi>0m=(x1r1,x2r2,x3r3,,xkrk)e(r)=(r1e,r2e,r3e,,rke)xie=riexirie(x)=(x1e,x2e,x3e,,xke)=e(r)m

向量 ∇ e ( r ) \nabla e_{(r)} e(r) 由上游负责计算, 是已知的, x 确定时 m 也是已知的, ⊙ \odot 表示元素积, 即同位元素相乘.

3. ReLU 函数的作用

为了理解 ReLU 函数的作用, 我们引入一种在电子电路中广泛应用的电子元器件 :
在这里插入图片描述
二极管 (英语:Diode),电子元件当中, 一种具有两个电极的装置, 只允许电流由单一方向流过, 用于整流电路,可以把交流电变换成脉动的直流电, 即整流二极管 (rectifier diode).
在这里插入图片描述
上图左边是整流二极管的特性曲线, 右边是整流二极管在电路图中的表示符号.
左边 △ U \triangle U U部分是击穿电压, 很容易烧毁二极管, 不是整流二极管的正常工作范围.
可以看到, 正常工作范围的特性曲线和 ReLU 函数的图像非常相似.
在这里插入图片描述
上图是常见的整流电路, 利用电流只能在二极管中单向传播的特性, 通过四只二极管组合, 就可以很方便将来自 T 的交流电转换为 R L R_L RL使用的直流电.
使用 Python 模拟整流电路 :

import numpy as np
import matplotlib.pyplot as plt


def relu(signal):
    return np.maximum(0, signal)


def relu_reverse(signal):
    return -np.minimum(0, signal)


x = np.linspace(-10, 10, 2000)
y = np.sin(x)

plt.axhline(color="black")
plt.axvline(color="black")
plt.plot(x, y)
plt.show()

y = relu(y) + relu_reverse(y)

plt.axhline(color="black")
plt.axvline(color="black")
plt.plot(x, y)
plt.show()

整流前 :
在这里插入图片描述
整流后 :
在这里插入图片描述
可以看到, 经过整流后, 所有的反向信号都调整为正向信号了.

4. ReLU + 线性组合

在常见的神经网络结构中, ReLU 经常和线性变换一起使用.

a i = a i x i + b i    y = ∑ k = 1 k R e L U ( a i ) a_i = a_ix_i + b_i\\ \;\\ y = \sum_{k = 1}^{k} ReLU(a_i) ai=aixi+biy=k=1kReLU(ai)

import numpy as np
import matplotlib.pyplot as plt


def relu(signal):
    return np.maximum(0, signal)


x = np.linspace(-10, 10, 2000)

b1 = 0.00 * np.pi
b2 = 0.25 * np.pi
b3 = 0.50 * np.pi
b4 = 0.75 * np.pi
b5 = 1.00 * np.pi
b6 = 1.25 * np.pi
b7 = 1.50 * np.pi
b8 = 1.75 * np.pi

y1 = np.sin(x + b1)
y2 = np.sin(x + b2)
y3 = np.sin(x + b3)
y4 = np.sin(x + b4)
y5 = np.sin(x + b5)
y6 = np.sin(x + b6)
y7 = np.sin(x + b7)
y8 = np.sin(x + b8)

y = relu(y1) + relu(y2) + relu(y3) + relu(y4)
y += relu(y5) + relu(y6) + relu(y7) + relu(y8)

plt.plot(x, y)
plt.axhline(color="black")
plt.axvline(color="black")
plt.show()

在这里插入图片描述
只需要有限的几个 ReLU 进行组合, 就可以将交流信号调整到不错的直流信号.

ReLU 函数虽然很简单, 但和其他函数组合后却有神奇的非线性拟合能力.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值