激活函数总结
1 统一数学表达
- Hadamard product或element-wise product
- 多见\(\odot\)或\(\circ\)。在GLU论文中:\(\otimes\) is the element-wise product between matrices.
- ⭐由于在数学上\(\otimes\)表示的是Kronecker product,因此本文采用数学上的标准\(\odot\)来表示逐元素乘。
- \(\sigma\)常用于表示激活函数,也更多用来表示Sigmoid。下文\(\sigma=\mathrm{Sigmoid}\)。
- \(\boldsymbol{x}\)与计算机中的存储方式(行优先)保持一致,即为行向量,与矩阵左乘。
- 尽管数学中常用\(\ln\)来表示\(\log_e\),但在人工智能领域中多用\(\log\)来表示\(\log_e\)。
2 常见激活函数
2.1 ReLU
- \(\mathrm{ReLU}(x)=\max\{0,x\}\)
- 缓解梯度消失,但会导致神经元死亡
Softplus
- ReLU函数的平滑
- \(\mathrm{Softplus}(x)=\log(1+e^x)\)
Leaky ReLU
- \(\mathrm{LReLU}(x)=\max\{\alpha x, x\},0<\alpha<1\),超参数\(\alpha\)一般设置为0.01
- 解决ReLU神经元死亡的问题
Parameterized ReLU
- \(\mathrm{PReLU}(x)=\max\{0,x\}+\alpha\min\{0,x\}\),其中\(\alpha\)是可学习的参数
ELU
- \(\mathrm{ELU}(x)=\left\{\begin{matrix} x, & x>0 \\ e^x-1, & x\leqslant 0 \end{matrix}\right.\)。理论上优于ReLU及其变体,比如更快的训练时间、没有神经元死亡、梯度消失或爆炸
2.2 Tanh
- \(\displaystyle \mathrm{Tanh}(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}\)。
Softsign
- \(\displaystyle\mathrm{Softsign}(x)=\frac{x}{1+|x|}\)。
- 与Tanh相比能更好解决梯度消失问题。
2.3 Sigmoid
- \(\displaystyle \sigma(x)=\frac{1}{1+e^{-x}}\)。
2.4 GELU
- Gaussian Error Linear Unit
- \(\mathrm{GELU}(x)=x\cdot \Phi(x)\),其中\(\Phi(x)\)是标准正态分布的分布函数
- 结合随机正则化Dropout,适合预训练模型BERT
2.5 Swish
- \(\mathrm{Swish}(x)=x\cdot \sigma(\beta x)\)。
- 默认\(\beta=1\),此时为SiLU,Sigmoid Linear Unit。
- PyTorch调用:
nn.SiLU()
。
- PyTorch调用:
2.6 门控系列
-
一般用于大模型的FFN,Feed Forward Network层。先升维,然后再降维。
-
如Transformer结构的FFN:\(\mathrm{FFN}(x)=\max\{0,xW_1+b_1\}W_2+b_2\)。
-
import torch.nn as nn class PositionwiseFFN(nn.Module): def __init__(self, d_model, d_ff): super().__init__() self.linear1 = nn.Linear(d_model, d_ff) self.linear2 = nn.Linear(d_ff, d_model) self.relu = nn.ReLU() def forward(self, x): # x shape: (batch_size, seq_len, d_model) x = self.linear1(x) # 扩展维度至 d_ff 一般是 4 * d_model x = self.relu(x) # 激活函数 x = self.linear2(x) # 压缩回 d_model return x
-
-
以下两种是升维的方式。
GLU
- Gated Linear Unit
- \(\mathrm{GLU}(x)=(xW+b)\odot\sigma(xV+c)\),其中\(W,b,V,c\)都是可学习的参数
✅SwiGLU
- Swish + GLU,大模型常用
- 门控机制动态过滤信息:通过 Swish 激活函数生成门控信号,决定哪些信息应被保留或抑制,增强模型对上下文的理解能力
- ReLU适用于浅层网络,不擅长长序列建模
- GELU的计算成本高
- \(\mathrm{SwiGLU}(x)=\mathrm{Swish}(xW)\odot(xV)\),省略偏置项