激活函数总结

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()

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)\),省略偏置项