大模型中的激活函数

文章目录
Sigmoid
Tanh
ReLU
Leaky ReLU
PReLU
ELU
SoftPlus
Maxout
Mish
Swish
GELU
GLU
ReGLU
SwiGLU
GEGLU
资源

激活函数是神经网络中的非线性函数,为了增强网络的表示能力和学习能力,激活函数有以下几点性质:
连续且可导(允许少数点上不可导)的非线性函数。可导的激活函数可以直接利用数值优化的方法来学习网络参数。
激活函数及其导函数要尽可能的简单,有利于提高网络计算效率。
激活函数的导函数的值域要在一个合适的区间内(不能太大也不能太小),否则会影响训练的效率和稳定性。
Sigmoid
Sigmoid函数(也被称为Logistic函数)的表达式如下:
σ ( x ) = exp ⁡ ( x ) exp ⁡ ( x ) + exp ⁡ ( 0 ) = 1 1 + e x p ( − x ) \sigma(x)=\frac{\exp (x)}{\exp (x)+\exp (0)} = \frac {1}{1+exp(-x)}
σ(x)= 
exp(x)+exp(0)
exp(x)

 = 
1+exp(−x)
1

 

其导数为
d d x σ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \frac{d}{d x} \sigma(x)=\sigma(x)(1-\sigma(x))
dx
d

 σ(x)=σ(x)(1−σ(x))

其图像如下图,是一个S型曲线,所以Sigmoid函数可以看做一个“挤压”函数,把一个实数域的输入“挤压”到(0,1)。当输入值在0附近时,Sigmoid函数近似为线性函数;当输入值靠近两端时,对输入进行抑制;输入越小,越接近于0;输入越大,越接近于1。

from matplotlib import pyplot as plt
import numpy as np
import torch
from torch import nn

x = np.linspace(-6, 6, 600)
m0 = nn.Sigmoid()
output0 = m0(torch.Tensor(x))
plt.plot(x, output0, label='Sigmod')
plt.title("Sigmoid Activation Function")
plt.xlabel("x")
plt.ylabel("Activation")
plt.grid()
plt.legend()
plt.show()

Sigmoid激活函数的缺点:

倾向于梯度消失
函数输出不是以0为中心,会使其后一层的神经元的输入发生偏置偏移(Bias Shift),进而使得梯度下降的收敛速度变慢,也就是会降低权重更新的效率
公式中包括指数运算,计算机运行较慢
Tanh
Tanh 函数也是一种S型函数,其定义为
t a n h ( x ) = exp ⁡ ( x ) − exp ⁡ ( − x ) exp ⁡ ( x ) + exp ⁡ ( − x ) tanh(x)=\frac{\exp (x) - \exp (-x)}{\exp (x)+\exp (-x)}
tanh(x)= 
exp(x)+exp(−x)
exp(x)−exp(−x)

 

Tanh函数可以看做放大并平移的Sigmoid函数,其值域为(-1,1),并且Tanh与Sigmoid函数关系如下式:
t a n h ( x ) = 2 σ ( 2 x ) − 1 tanh(x) = 2 \sigma(2x) -1
tanh(x)=2σ(2x)−1

Tanh函数如下图所示,它的输入是零中心化的了。


x = np.linspace(-6, 6, 600)
m0 = nn.Sigmoid()
output0 = m0(torch.Tensor(x))
plt.plot(x, output0, label='Sigmod')
m0_1 = nn.Tanh()
output0_1 = m0_1(torch.Tensor(x))
plt.plot(x, output0_1, label='Tanh')

plt.title("Sigmoid and Tanh Activation Functions")
plt.xlabel("x")
plt.ylabel("Activation")
plt.grid()
plt.legend()
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ReLU
ReLU(Rectified Linear unit)是最常见的激活函数,其公式为:
R e L U ( x ) = { x    x ≥ 0 0    x < 0 = m a x ( 0 , x ) \begin {aligned} ReLU(x) &=
{x  x≥00  x<0
{

 
 


0
0
 
 

<
0
\\ &= max(0, x) \end {aligned}
ReLU(x)

  
={ 
x  x≥0
0  x<0

 
=max(0,x)

 

ReLU函数示意及后面会介绍的几种变种如下图所示:

x = np.linspace(-6, 6, 600)
m0 = nn.ReLU()
output0 = m0(torch.Tensor(x))
plt.plot(x, output0, label='RELU')
m1 = nn.LeakyReLU()
output1 = m1(torch.Tensor(x))
plt.plot(x, output1, label='LeakyRELU', color='red', linestyle='--')
m2 = nn.ELU()
output2 = m2(torch.Tensor(x))
plt.plot(x, output2, label='ELU', linestyle='dotted')
m3 = nn.Softplus()
output3 = m3(torch.Tensor(x))
plt.plot(x, output3, label='Softplus', linestyle='-.')

plt.title("ReLu and It's Varies Activation Functions")
plt.xlabel("x")
plt.ylabel("Activation")
plt.grid()
plt.legend()
plt.show()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ReLU函数的优点是:1. 采用ReLU的神经元只需要进行加、乘和比较的操作,计算上更加高效。2. ReLU函数被认为具有生物学合理性,比如单侧抑制、宽兴奋边界。在生物神经网络中,同时处于兴奋状态的神经元非常稀疏,比如人脑中在同一时刻大概只有 1% ∼ 4% 的神经元处于活跃状态。Sigmoid 型激活函数会导致一个非稀疏的神经网络,而 ReLU 却具有很好的稀疏性,大约 50% 的神经元会处于激活状态.3. 相对于sigmoid函数的两端饱和,ReLU函数为左饱和函数,且在x>0时的导数为1,所以相比之下一定程度上缓解了梯度消失问题&#

<think>嗯,用户想了解大模型中使用的激活函数类型、特点和应用。我需要先回顾一下激活函数的基本知识,然后结合大模型的具体情况来整理信息。 首先,激活函数在神经网络中的作用是引入非线性,增强模型的表达能力。常见的激活函数比如Sigmoid、Tanh、ReLU等,这些在传统深度学习中已经广泛使用。但大模型,比如Transformer架构的模型,可能使用不同的激活函数或者改进版本,比如GELU或者Swish。需要确认这些激活函数的具体形式和在模型中的位置。 接下来,特点方面,大模型可能更关注计算效率和梯度传播的问题。例如,ReLU虽然简单,但存在Dead ReLU问题,而GELU可能更适合处理这种情况,尤其是在自然语言处理任务中。此外,大模型的参数量大,训练时间长,激活函数的选择会影响训练稳定性和收敛速度,因此需要分析不同激活函数在这方面的表现。 应用场景方面,用户提到的引用里提到,二分类用Sigmoid,多分类用Softmax,而大模型可能更多使用Softmax在输出层,比如Transformer的自注意力机制中的Softmax。同时,中间层可能使用GELU或其他激活函数。需要结合具体的模型架构,比如BERT、GPT系列使用的激活函数是什么。 另外,用户提供的引用3提到,大模型激活函数选择基于ReLU家族,但可能有一些改进,比如Swish或者GELU。需要确认这些激活函数的具体应用案例,比如GPT是否使用GELU,而Transformer中的FFN层是否使用ReLU或其他变体。 可能还需要比较不同激活函数大模型中的效果,比如训练稳定性、处理梯度消失或爆炸的能力,以及计算开销。例如,GELU相比ReLU在理论上更平滑,可能更适合深层网络。同时,Swish作为自动搜索得到的激活函数,是否有在大模型中应用的优势。 还需要考虑参数化激活函数,如PReLU,是否在大模型中被采用,比如在卷积神经网络中的成功应用是否迁移到了Transformer结构中。不过大模型Transformer可能更多使用固定形式的激活函数,如GELU,以减少参数数量。 最后,应用场景部分需要具体说明不同激活函数适用的任务类型,比如生成任务、分类任务,或者自监督学习中的使用情况。例如,BERT在预训练时使用的激活函数,以及在下游任务微调时的调整。 需要确保回答覆盖类型、特点、应用三个部分,并且结合引用中的信息,比如引用3提到的ReLU家族作为起手式,以及针对不同任务选择不同输出层激活函数。同时,引用2中关于激活函数的作用,如解决梯度问题,也需要在特点部分提到。 现在需要组织这些信息,结构清晰,分点说明,同时生成相关问题,可能涉及激活函数的选择依据、优化方法、与传统模型的区别等。</think>### 大模型中的激活函数:类型、特点与应用 #### 一、激活函数的核心作用 激活函数是神经网络中引入非线性表达能力的关键组件,其核心价值包括: 1. **非线性建模**:使神经网络能够拟合复杂函数(如自然语言、图像中的非线性关系)[^2] 2. **梯度控制**:通过函数导数特性缓解梯度消失/爆炸问题 3. **特征空间变换**:对输入信号进行非线性映射,增强模型表达能力[^1] #### 二、大模型常用激活函数类型 1. **ReLU家族** - 基础ReLU:$f(x) = \max(0, x)$ - GELU(高斯误差线性单元): $$f(x) = x \cdot \Phi(x) \quad (\Phi(x)为高斯累积分布函数)$$ 特点:在Transformer架构中广泛应用(如BERT、GPT系列),提供更平滑的梯度传播 - Swish:$f(x) = x \cdot \sigma(\beta x) \quad (\beta为可学习参数)$ 特点:自动搜索发现的激活函数,在深层网络表现优异 2. **位置敏感型函数** - Softmax(输出层专用): $$f(x_i) = \frac{e^{x_i}}{\sum_{j=1}^K e^{x_j}}$$ 应用于注意力机制和多分类任务输出层[^3] - Sigmoid:$f(x) = \frac{1}{1+e^{-x}}$ 适用于二分类输出层或门控机制(如LSTM) #### 三、大模型激活函数的特殊设计 1. **计算效率优先**:选择计算复杂度低的函数(如ReLU系),因大模型参数量常达千亿级别 2. **梯度稳定性设计**: - 使用GELU替代ReLU缓解"Dead Neuron"问题 - 采用LayerNorm+激活函数的组合提升训练稳定性 3. **参数化改进**: - GLU(门控线性单元):$f(x) = x \otimes \sigma(Wx + b)$ 特点:通过门控机制实现自适应特征选择,见于PaLM等模型 #### 四、典型应用场景 | 激活函数 | 适用场景 | 代表模型 | |------------|----------------------------|-----------------| | GELU | Transformer前馈子层 | BERT、GPT-3 | | Swish | 自动搜索优化的深度网络 | EfficientNet | | GLU | 稀疏化特征提取 | PaLM、Switch Transformer | | Softmax | 注意力权重计算/分类输出层 | 所有Transformer架构 | #### 五、选择策略建议 1. **中间层默认选择**:优先尝试GELU或Swish,因其在深层网络的梯度表现更稳定 2. **输出层按任务选择**: - 二分类:Sigmoid - 多分类:Softmax - 回归任务:线性激活 3. **参数效率考量**:对于超大规模模型,优先使用无参数激活函数降低计算开销 $$ \text{激活函数效果评估公式}:\eta = \frac{\partial \mathcal{L}}{\partial x} \cdot f'(x) $$ 该式反映了梯度传播效率与激活函数导数的直接关联,解释了GELU等平滑函数在深层网络的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强化学习曾小健

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值