深度学习中的激活函数:原理与应用详解
深度学习中的激活函数:原理与应用详解
激活函数是深度学习中的关键组件,它为神经网络引入非线性因素,使得模型能够处理复杂的非线性关系。本文将详细介绍几种常用的激活函数,包括Sigmoid、Tanh、ReLU及其变种,帮助读者理解它们的原理和应用场景。
1 概述
激活函数(Activation Function)在深度学习中起着至关重要的作用,它能为神经网络引入非线性因素,使得神经网络可以拟合各种复杂的非线性关系。常用的激活函数有 sigmoid、tanh、relu等。
2 激活函数的作用
引入非线性:在神经网络中,如果没有激活函数,无论有多少层神经元,整个网络都等价于一个线性变换模型,而线性模型的表达能力有限,无法处理像图像识别、语音识别等复杂任务中存在的高度非线性关系。激活函数通过对神经元的输出进行非线性变换,使得神经网络能够逼近任意复杂的函数,大大增强了网络的表达能力。
决定神经元是否激活:神经元接收输入的加权和,激活函数根据这个加权和的值来确定神经元是否被 “激活” 以及激活的程度,从而控制信息在网络中的流动与传递。
3 常见的激活函数
3.1 Sigmoid 函数
函数图像呈现出 S 形,输出值范围在 (0,1) 之间。例如,当x = 0 x=0x=0时,σ ( 0 ) = 1 2 \sigma(0) = \frac{1}{2}σ(0)=21 ;当x xx趋于正无穷时,σ ( x ) \sigma(x)σ(x)趋近于1;当x xx趋于负无穷时,σ ( x ) \sigma(x)σ(x)趋近于0。其数学表达式为
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}}σ(x)=1+e−x1
导数公式:
σ ′ ( x ) = e − x ( 1 + e − x ) 2 = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x) = \frac{e^{-x}}{(1 + e^{-x})^2} = \sigma(x)(1 - \sigma(x))σ′(x)=(1+e−x)2e−x =σ(x)(1−σ(x))
它能将输入值映射到一个概率区间,常被用于二分类问题的输出层,把神经元的输出解释为属于某一类别的概率。但它存在一些缺点,比如容易出现梯度消失问题(当x xx取值绝对值较大时,导数趋近于0,导致反向传播时梯度更新缓慢甚至停止),并且输出不是以0为中心的,这可能会影响网络训练的效率。
而Softmax 在处理多分类问题时经常被用到。
3.2 Tanh 函数(双曲正切函数)
图像同样是 S 形,但输出值范围在 (-1,1) 之间,它是 Sigmoid 函数的一种变形。Tanh 函数的数学表达式如下:
t a n h ( x ) = e x − e − x e x + e − x tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}tanh(x)=ex+e−xex−e−x
或者等价地:
tanh ( x ) = 2 ⋅ σ ( 2 x ) − 1 \tanh(x) = 2 \cdot \sigma(2x) - 1tanh(x)=2⋅σ(2x)−1
导数公式:
tanh ′ ( x ) = 1 − tanh 2 ( x ) \tanh'(x) =1-\tanh^2(x)tanh′(x)=1−tanh2(x)
相比 Sigmoid 函数,它的输出是以 0 为中心的,这在一定程度上有助于缓解梯度更新时的一些问题,使训练过程可能更稳定一些。不过,它依然存在梯度消失的问题,常用于一些对输出值范围有相应要求且需要以 0 为中心的场景,比如在循环神经网络(RNN)的某些隐藏层中会被使用。
3.3 ReLU 函数(修正线性单元)
当输入x xx大于等于 0 时,输出就是x xx本身;当x xx小于 0 时,输出为 0 。图像看起来是一个在x xx轴负半轴为 0 ,正半轴为一条直线的折线形状。其表达式为:
R e L U ( x ) = m a x ( 0 , x ) 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≤0
ReLU 函数的计算非常简单,大大加快了网络的训练速度,并且在一定程度上缓解了梯度消失问题(只要输入大于 0 ,导数恒为 1 )。不过它也有缺点,比如当输入小于 0 时,神经元处于 “死亡” 状态(永远不会被激活,导致相应权重无法更新)。目前,它是深度学习中应用非常广泛的激活函数,在很多卷积神经网络(CNN)的隐藏层等位置常常被使用。
3.4 Leaky ReLU 函数
图像与 ReLU 类似,但在x xx轴负半轴不是完全为 0 ,而是有一个斜率为α \alphaα的直线段。α \alphaα是一个很小的常数(通常取值在(通常在0 < α < 1 0<α<10<α<1) ,常用的值在 0.01 左右)。其数学公式为:
L e a k y R e L U ( x ) = { x , if x ≥ 0 α x , if x < 0 Leaky ReLU(x) = \begin{cases} x, & \text{if } x \geq 0 \ \alpha x, & \text{if } x < 0 \end{cases}LeakyReLU(x)={x,αx, if x≥0if x<0
导数公式:
Leaky ReLU ′ ( x ) = { 1 , if x > 0 α , if x ≤ 0 \text{Leaky ReLU}'(x) = \begin{cases} 1, & \text{if } x > 0 \ \alpha, & \text{if } x \leq 0 \end{cases}Leaky ReLU′(x)={1,α, if x>0if x≤0
它是为了克服 ReLU 函数中神经元 “死亡” 的问题而提出的,使得在x xx小于 0 时也能有一定的梯度进行反向传播,权重可以继续更新,在一些对网络鲁棒性要求较高的场景中会被选用。
3.4 ELU 函数(指数线性单元)
在x xx小于 0 时呈现出指数增长的曲线形状,在x xx大于等于 0 时为直线。其中α \alphaα是一个常数(常取值在 1 左右)。其数学公式如下:
ELU ( x ) = { x , if x > 0 α ( exp ( x ) − 1 ) , if x ≤ 0 \text{ELU}(x) = \begin{cases} x, & \text{if } x > 0 \ \alpha(\exp(x) - 1), & \text{if } x \leq 0 \end{cases}ELU(x)={x,α(exp(x)−1), if x>0if x≤0
导数公式:
ELU ′ ( x ) = { 1 , if x > 0 α exp ( x ) , if x ≤ 0 \text{ELU}'(x) = \begin{cases} 1, & \text{if } x > 0 \ \alpha \exp(x), & \text{if } x \leq 0 \end{cases}ELU′(x)={1,αexp(x), if x>0if x≤0
它结合了 ReLU 函数的优点,同时解决了 ReLU 中神经元 “死亡” 以及输出均值不为 0 等部分问题,在训练过程中能使网络收敛得更快、更稳定,常用于一些图像分类、自然语言处理等任务的网络结构中。