激活函数
前言
在深度学习中,激活函数是神经网络中的一个关键组件,起着引入非线性因素的作用,从而增加神经网络的表达能力和拟合复杂函数的能力。在神经网络中,每个神经元接收来自上一层神经元的输入,并对这些输入进行加权求和,然后将结果输入到激活函数中。激活函数对加权求和的结果进行变换,输出给下一层神经元。通过激活函数,神经网络可以学习和表示数据中的非线性关系,使得其在处理图像、语音、自然语言等复杂任务时表现出色。本文将详细介绍激活函数的定义、作用及其种类,并通过具体例子和代码实现展示每种激活函数的性质和导数。
作用
-
引入非线性:激活函数引入了非线性因素,使得神经网络可以学习和表示非线性关系。如果没有激活函数,多层神经网络就变成了单一的线性变换,无法拟合复杂的数据分布和模式。
-
实现分段线性变换:一些激活函数(如ReLU)可以实现分段线性变换,使得神经网络能够学习到不同区间内的不同线性关系,提高了网络的灵活性和表达能力。
-
去除数据的线性相关性:激活函数可以打破输入数据的线性相关性,使得神经网络可以学习到更复杂的特征和模式,提高了网络的泛化能力。
-
限制输出范围:某些激活函数(如Sigmoid和Tanh)可以将神经元的输出限制在一个特定的范围内(如0到1或-1到1),有助于控制神经元输出的幅度。
总的来说,激活函数在神经网络中扮演着非常重要的角色,通过引入非线性,增强了网络的表达能力,使得神经网络可以更好地拟合复杂的数据分布和模式。
激活函数种类
目前深度学习中常用的激活函数有以下几种:
1. ReLU (Rectified Linear Unit)
ReLU函数将所有负值都设为零,保持正值不变。优点是计算简单且有效,但可能导致神经元输出稀疏性,且在负值区域不具备梯度。
- 公式
ReLU ( x ) = max ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x) - 激活函数图像
- 导数公式
ReLU ′ ( x ) = { 1 , if x > 0 0 , if x ≤ 0 \text{ReLU}'(x) = \begin{cases} 1, & \text{if } x > 0 \\ 0, & \text{if } x \leq 0 \end{cases} ReLU′(x)={ 1,0,if x>0if x≤0ReLU 函数在不同区间上的导数是不一样的。 - 求导后的图像
- 特点
计算简单且有效,但可能导致神经元输出稀疏性,且在负值区域不具备梯度。 - Python 代码实现图像
import numpy as np import matplotlib.pyplot as plt # 定义输入范围 x = np.linspace(-10, 10, 400) # 计算 ReLU 激活函数值 y = np.maximum(0, x) # 绘制 ReLU 激活函数图像 plt.plot(x, y, label="ReLU") plt.title("ReLU Activation Function") plt.xlabel("x") plt.ylabel("ReLU(x)") plt.legend() plt.grid(True) plt.show() # 计算 ReLU 激活函数的导数值 y_prime = np.where(x > 0, 1, 0) # 绘制 ReLU 激活函数导数图像 plt.plot(x, y_prime, label="ReLU Derivative") plt.title("Derivative of ReLU Activation Function") plt.xlabel("x") plt.ylabel("ReLU'(x)") plt.legend() plt.grid(True) plt.show()
2. Leaky ReLU
为了解决ReLU在负值区域没有梯度的问题,Leaky ReLU引入了一个小的斜率(通常很小,如0.01)以保证负值区域也有梯度。
- 公式
f ( x ) = { x , if x > 0 a x , otherwise f(x) = \begin{cases} x, & \text{if } x > 0 \\ ax, & \text{otherwise} \end{cases} f(x)={ x,ax,if x>0otherwise
其中 a 是一个小的正数(例如 0.01),用于控制负值区域的斜率。 - 激活函数图像
- 求导公式
f ′ ( x ) = { 1 if x ≥ 0 α if x < 0 f'(x) = \begin{cases} 1 & \text{if } x \geq 0 \\ \alpha & \text{if } x < 0 \end{cases} f′(x)={ 1αif x≥0if x<0 - 求导后的图像
- Python 代码实现图像
import matplotlib.pyplot as plt import numpy as np def leaky_relu(x, alpha=0.01): return np.where(x >= 0, x, alpha * x) x = np.linspace(-10, 10, 400) y = leaky_relu(x) plt.plot(x, y, label="Leaky ReLU") plt.title("Leaky ReLU Activation Function") plt.xlabel("x") plt.ylabel("f(x)") plt.legend(