【NLP理论】——曲则全,谈谈深度学习中的激活函数

本文深入探讨了激活函数在人工神经网络中的重要性,包括其定义、为何使用,以及常见激活函数如sigmoid、tanh、ReLU、Leaky ReLU、ELU和GELU的详细解析。每种函数的表达式、导数、图像和特点都被逐一介绍,帮助读者全面理解激活函数的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什么是激活函数

在这里插入图片描述
如上图所示,激活函数(Activation Function)是在人工神经网络神经元上运行的函数,负责将神经元的输入映射到输出。激活函数为人工神经网络引入非线性因素,可以让人工神经网络模型更好的去学习、理解非常复杂的非线性关系。

2. 为什么要用激活函数

2.1 感知机(Perception)

感知机(Perception)是人工神经网络的前身,在感知机模型中不使用激活函数,是一个线性分类器。

2.1.1 一层感知机

一层感知机网络如下图所示:
在这里插入图片描述
表达式为:
y=w1x1+w2x2+w3x3 y = w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3} y=w1x1+w2x2+w3x3
观察上式可知:一层感知机是一个线性分类器

2.1.2 二层感知机

二层感知机如下图所示:
在这里插入图片描述
y=w2−1(w1−11x1+w1−21x2+w1−31x3)+w2−2(w1−12x1+w1−22x2+w1−32x3)+w2−3(w1−13x1+w1−23x2+w1−33x3) y=w_{2-1}(w_{1-11}x_{1}+w_{1-21}x_{2}+w_{1-31}x_{3})\\+w_{2-2}(w_{1-12}x_{1}+w_{1-22}x_{2}+w_{1-32}x_{3}) \\+w_{2-3}(w_{1-13}x_{1}+w_{1-23}x_{2}+w_{1-33}x_{3}) y=w21(w111x1+w121x2+w131x3)+w22(w112x1+w122x2+w132x3)+w23(w113x1+w123x2+w133x3)
整理如下:
y=(w2−1w1−11+w2−2w1−12+w2−3w1−13)x1+(w2−1w1−21+w2−2w1−22+w2−3w1−23)x2+(w2−1w1−31+w2−2w1−32+w2−3w1−33)x3 y=(w_{2-1}w_{1-11}+w_{2-2}w_{1-12}+w_{2-3}w_{1-13})x_{1}\\+(w_{2-1}w_{1-21}+w_{2-2}w_{1-22}+w_{2-3}w_{1-23})x_{2}\\+(w_{2-1}w_{1-31}+w_{2-2}w_{1-32}+w_{2-3}w_{1-33})x_{3} y=(w21w111+w22w112+w23w113)x1+(w21w121+w22w122+w23w123)x2+(w21w131+w22w132+w23w133)x3

把一层感知机的表达式和二层感知机整理后的式子进行对比发现:感知机的层数并不能改变其是线性分类器的特性。

2.2 线性不可分

线性分类器存在一个问题:不能解决线性不可分的问题。最简单的线性不可分问题如下图所示:使用一条直线把橙色的正方形和绿色的圆形进行分割。
在这里插入图片描述
上图中红色和深绿色的线是两条例子,经试验发现,在二维平面中不存在这样一条直线可以把橙色的正方形和绿色的圆形进行分割。
这就是感知机(线下分类器)面临的问题:不能解决线性不可分问题。

2.3 激活函数的作用

激活函数最重要的作用就是可以给模型带来非线性因素,直白的理解就是把直线“掰弯”
在这里插入图片描述
如上图所示,当感知器加入激活函数后,可以使用曲线把橙色的正方形和绿色的圆形分割开来。

3. 常见的激活函数

3.1 sigmoid

表达式

sigmoid 是常用的非线性激活函数,解析式如下所示:
sigmoid(x)=f(x)=11+e−x sigmoid(x) = f(x) = \frac{1}{1+e^{-x}} sigmoid(x)=f(x)=1+ex1
导函数的表达式如下:
sigmoid′(x)=f′(x)=e−x(1+e−x)2=11+e−x−1(1+e−x)2=f(x)×(1−f(x)) sigmoid'(x)=f'(x) = \frac{e^{-x}}{(1+e^{-x})^2}=\frac{1}{1+e^{-x}}-\frac{1}{(1+e^{-x})^2}=f(x)\times(1-f(x)) sigmoid(x)=f(x)=(1+ex)2ex=1+ex1(1+ex)21=f(x)×(1f(x))

图像

在这里插入图片描述
备注:橙色的线表示原函数,蓝色的线表示导函数。

特点

sigmoid把输入的值转换为0到1之间,特别的:如果是非常大的正数,就转换为1,如果非常小的负数,则转换为0;

缺点

  1. 从上图可以看出,sigmod的导函数的值域为:[0, 0.25],在反向传播(BP)更新参数时很容易出现梯度消失的现象;
  2. 有饱和区域,当输入的x非常大或非常小时,sigmoid激活函数的导函数值为0,即此时的梯度为0,会导致神经元不能更新;
  3. sigmoid的输出都是正数,不是zero centered,这会导致zigzag现象;
  4. sigmoid含有幂运算,在求解时比较耗时。对于规模较大的神经网络,这会时训练时间增长。

3.2 tanh

表达式

tanh的解析式如下所示:
tanh(x)=f(x)=ex−e−xex+e−x tanh(x)=f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=f(x)=ex+exexex
tanh的导函数如下所示:
tanh′(x)=f′(x)=(ex+e−x)2−(ex−e−x)2(ex+e−x)2=1−(ex−e−xex+e−x)=1−f2(x) tanh'(x)=f'(x)=\frac{(e^{x}+e^{-x})^2-(e^{x}-e^{-x})^2}{(e^{x}+e^{-x})^2}=1-(\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}})=1-f^2(x) tanh(x)=f(x)=(ex+ex)2(ex+ex)2(exex)2=1(ex+exexex)=1f2(x)

图像

在这里插入图片描述
备注:橙色的线表示原函数,蓝色的线表示导函数。

特点

  • tanh 把输入的值转换为0到1之间,特别的:如果是非常大的正数,就转换为1,如果非常小的负数,则转换为0;
  • tanh解决了sigmoid不是zero centered的问题。

缺点

  1. 从上图可以看出,sigmod的导函数的值域为:[0, 1],在反向传播(BP)更新参数时仍然会出现梯度消失的现象;
  2. 有饱和区域,当输入的x非常大或非常小时,sigmoid激活函数的导函数值为0,即此时的梯度为0,会导致神经元不能更新;
  3. tanh含有幂运算,在求解时比较耗时。对于规模较大的神经网络,这会时训练时间增长。

3.3 relu

3.3.1 relu

表达式

relu的解析式如下所示:
relu(x)=f(x)=max(0,x) relu(x) =f(x)=max(0,x) relu(x)=f(x)=max(0,x)
relu的导函数解析式如下所示:
relu′(x)=f′(x)={1,x>00,x≤0 relu'(x)=f'(x)= \{{1, x>0 \atop 0, x \leq 0} relu(x)=f(x)={0,x01,x>0

图像

在这里插入图片描述
备注:橙色的线表示原函数,蓝色的线表示导函数。

优点
  1. 在正区间中,解决了梯度消失的问题;
  2. 不含幂运算,计算速度非常快;
  3. 收敛速度远远快于sigmoid和tanh;
存在的问题
  1. relu的输出不是zero-centered
  2. 存在dead relu problem,即:某些神经元在训练过程中会出现永远不会被激活的情况,因为在反向更新时,如果梯度太大,权值更新之后可能会变成负数,在之后的正向传播的时候,输出会一直为0,造成dead relu的问题(备注:此问题可以通过使用小学习率或者使用leaky ReLU等方法改进)。

3.3.2 leaky relu

表达式

leaky_relu的解析式如下所示:
leaky_relu(x)=f(x)=max(ax,x) leaky\_relu(x) =f(x)=max(ax,x) leaky_relu(x)=f(x)=max(ax,x)
leaky_relu的导函数解析式如下所示:
relu′(x)=f′(x)={1,x>0a,x≤0 relu'(x)=f'(x)= \{{1, x>0 \atop a, x \leq 0} relu(x)=f(x)={a,x01,x>0

图像

在这里插入图片描述
备注:橙色的线表示原函数,蓝色的线表示导函数。

特点

leaky relu是为了解决relu的dead relu问题而设计的,将relu的前半段用“ax”(通常a取值为0.01)替换0。这样在理论上就解决了dead relu的问题。
备注:在实践中,并没有证明leaky relu在效果上完全优于relu。

3.3.3 elu

表达式

elu的表达式如下所示:
elu(x)=f(x)={x,x>0a(ex−1),x≤0 elu(x)=f(x)= \{{x,x>0 \atop a(e^{x}-1), x \leq 0} elu(x)=f(x)={a(ex1),x0x,x>0
elu导函数的表达式如下所示:
elu′(x)=f′(x)={1,x>0aex,x≤0 elu'(x)=f'(x)=\{{1, x>0 \atop ae^{x}, x \leq 0} elu(x)=f(x)={aex,x01,x>0

图像

在这里插入图片描述
备注:橙色的线表示原函数,蓝色的线表示导函数。

特点

elu也是为了解决relu的dead relu问题而设计的,elu除了具有relu的优点之外还具有以下优点:

  1. 解决dead relu问题;
  2. 输出的均值接近于0,即满足zero-centered

小缺点

  1. 计算量比relu和leaky relu大;
    备注:在实践中,并没有证明elu在效果上完全优于relu。

3.4 gelu

GELU 全名 Gaussian Error Linerar Unit(高斯误差线性单元),目前已被最领先的模型所使用(比如:BERT、RoBERTa等)。
在神经网络建模的过程中非线性因素是非常重要的,有了非线性因子,模型可以很好的拟合目标函数。此外,为了加强模型的泛化能力还需要加入正则化(如:dorpout)。通常非线性激活正则化是分开的,而模型的输入是由非线性激活与正则两者共同决定的。
GELU是将reludropout进行融合,在非线性激活中融入随机正则的思想,是一种对神经元输入的概率描述。GELU对输入乘以一个0,1组合的mask,其中mask服从于伯努利分布(Φ(x), Φ(x)=P(X<=x),X服从标准正太分布),其值的生成是依概率随机的依赖于输入。

数学表达式:
GELU(x)=xP(X<=x)=xΦ(x) GELU(x)=xP(X<=x)=xΦ(x) GELU(x)=xP(X<=x)=xΦ(x)
其中Φ(x)是正太分布函数,可以采用正太分布N(0, 1),也可以使用带参数的正太分布N(μ,σ),然后通过训练获得μ,σ\mu,\sigmaμ,σ。可以使用tanh函数进行逼近上述函数,表达式如下:
GELU(x)=0.5x(1+tanh[2/π(x+0.044715x3)]) GELU(x)=0.5x(1+tanh[ \sqrt{2/π}(x+0.044715x^3 )]) GELU(x)=0.5x(1+tanh[2/π(x+0.044715x3)])
pytorch的实现源码如下:

class GELU(nn.Module):
    """
    Paper Section 3.4, last paragraph notice that BERT used the GELU instead of RELU
    """
    def forward(self, x):
        return 0.5 * x * (1 + torch.tanh(math.sqrt(2 / math.pi) * (x + 0.044715 * torch.pow(x, 3))))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值