从Swish到SwiGLU:激活函数的进化与革命,qwen2.5应用的激活函数 ...

打印 上一主题 下一主题

主题 975|帖子 975|积分 2925

swiGLU和RMSNorm

1.什么是swiGLU

SwiGLU(Swish-Gated Linear Unit)是一种结合了Swish激活函数GLU(Gated Linear Unit)门控机制的激活函数,广泛应用于当代大型语言模型中
1.什么是Swish激活函数

1.1 Swish激活函数

Swish 激活函数是一种平滑的、非单调的激活函数,由 Google Brain 团队在 2017 年提出。它结合了 ReLU 的非线性特性与 Sigmoid 函数的平滑特性,旨在办理 ReLU 在某些环境下的局限性,比方梯度消失和“死亡神经元”题目。
1.2 Swish 激活函数的定义

Swish 的数学表达式为:
                                         Swish                            (                            x                            )                            =                            x                            ⋅                            σ                            (                            β                            x                            )                                  \text{Swish}(x) = x \cdot \sigma(\beta x)                     Swish(x)=x⋅σ(βx)
此中:


  •                                         σ                            (                            x                            )                                  \sigma(x)                     σ(x) 是 Sigmoid 函数,定义为                                         σ                            (                            x                            )                            =                                       1                                           1                                  +                                               e                                                   −                                        x                                                                                \sigma(x) = \frac{1}{1 + e^{-x}}                     σ(x)=1+e−x1​ 。
  •                                         β                                  \beta                     β 是一个可选的缩放参数,通常在实际应用中设置为 1(即                                         β                            =                            1                                  \beta = 1                     β=1 )。
当                                    β                         =                         1                              \beta = 1                  β=1 时,Swish 函数可以简化为:
$$\text{Swish}(x) = x \cdot \sigma(x) $$
1.3Swish 的特性


  • 平滑性

    • Swish 是一个平滑的函数,其导数在任何地方都是一连的。这使得它在优化过程中能够制止 ReLU 的梯度消失题目。
    • 平滑性也有助于模型在练习初期更快地收敛。

  • 非单调性

    • Swish 是一个非单调函数,这意味着它的输出可以随着输入的增加而减少,这为模型提供了更丰富的表达能力。

  • 自门控特性

    • Swish 的输出取决于输入                                                   x                                          x                           x 和 Sigmoid 函数的乘积,这使得它具有自门控的特性。这种特性允许模型动态地选择哪些信息是告急的,哪些可以被忽略。

  • 可学习的参数

    • 在某些变体中,Swish 的缩放参数                                                   β                                          \beta                           β 是可学习的,这使得模型可以根据数据主动调整激活函数的形状。

1.4Swish 的优点


  • 练习稳定性

    • Swish 的平滑性和非单调性使其在练习过程中更加稳定,尤其是在处理复杂数据集时。

  • 性能提升

    • 在许多实验中,使用 Swish 的模型在性能上优于使用 ReLU 或其他激活函数的模型。

  • 实用于深度网络

    • Swish 的特性使其在深度网络中表现良好,尤其是在必要处理长间隔依赖关系的场景中。

1.5Swish 的缺点


  • 盘算复杂度

    • Swish 的盘算复杂度比 ReLU 稍高,由于它必要盘算 Sigmoid 函数。

  • 大概的过拟合

    • 在某些环境下,Swish 的复杂性大概导致模型过拟合,尤其是在数据量较少时。

1.6Swish 的变体


  • SiLU(Sigmoid Linear Unit)

    • SiLU 是 Swish 的一个变体,此中                                                   β                                  =                                  1                                          \beta = 1                           β=1 。它在 PyTorch 中被广泛使用,公式为:
                                                              SiLU                                     (                                     x                                     )                                     =                                     x                                     ⋅                                     σ                                     (                                     x                                     )                                              \text{SiLU}(x) = x \cdot \sigma(x)                              SiLU(x)=x⋅σ(x)

  • Swish-1、Swish-β

    • Swish-1 是原始论文中提出的版本,此中                                                   β                                  =                                  1                                          \beta = 1                           β=1 。
    • Swish-β 是一个更通用的形式,此中                                                  β                                          \beta                           β 是一个可学习的参数。

1.7Swish 的代码实现

以下是一个基于 PyTorch 的 Swish 激活函数的实现:
  1. import torch
  2. import torch.nn as nn
  3. import torch.nn.functional as F
  4. class Swish(nn.Module):
  5.     def __init__(self, beta=1.0):
  6.         super(Swish, self).__init__()
  7.         self.beta = beta
  8.     def forward(self, x):
  9.         return x * torch.sigmoid(self.beta * x)
  10. # 使用 SiLU(Swish-1)作为激活函数
  11. class SiLU(nn.Module):
  12.     def forward(self, x):
  13.         return x * torch.sigmoid(x)
复制代码
1.18为什么 Swish 被广泛使用?

Swish 的平滑性和非单调性使其在练习深度神经网络时表现精彩,尤其是在处理复杂数据集和长间隔依赖关系时。它在许多当代深度学习模型中被广泛使用,比方 Transformer、BERT 和一些大型语言模型。
通过上述介绍,可以更好地理解 Swish 激活函数的特性及其在深度学习中的告急性。
2.Gated Linear Unit (GLU)

即门控线性单元,是一种引入了门控机制的激活函数,广泛应用于深度学习模型中,尤其是在处理序列数据和自然语言处理任务时表现精彩。
2.1GLU 的定义

GLU 的核心思想是将输入数据通过两个线性变换,此中一个变换的效果通过 Sigmoid 函数举行非线性处理,另一个保持线性,然后两者逐元素相乘。其数学表达式为:
                                         GLU                            (                            x                            )                            =                            σ                            (                                       W                               1                                      x                            +                                       b                               1                                      )                            ⊙                            (                                       W                               2                                      x                            +                                       b                               2                                      )                                  \text{GLU}(x) = \sigma(W_1 x + b_1) \odot (W_2 x + b_2)                     GLU(x)=σ(W1​x+b1​)⊙(W2​x+b2​)
此中:


  •                                         σ                                  \sigma                     σ 是 Sigmoid 函数,用于生成门控信号。
  •                                                    W                               1                                            W_1                     W1​ 和                                                    W                               2                                            W_2                     W2​ 是权重矩阵,                                                   b                               1                                            b_1                     b1​ 和                                                   b                               2                                            b_2                     b2​ 是偏置项。
  •                                         ⊙                                  \odot                     ⊙ 表示逐元素乘法。
2.2GLU 的工作原理


  • 线性变换

    • 输入                                                   x                                          x                           x 经过两个线性变换,分别得到                                                                W                                     1                                              x                                  +                                               b                                     1                                                      W_1 x + b_1                           W1​x+b1​ 和                                                                W                                     2                                              x                                  +                                               b                                     2                                                      W_2 x + b_2                           W2​x+b2​。
    • 第一个变换的效果通过 Sigmoid 函数,生成门控信号;第二个变换的效果保持线性。

  • 门控机制

    • 门控信号                                                   σ                                  (                                               W                                     1                                              x                                  +                                               b                                     1                                              )                                          \sigma(W_1 x + b_1)                           σ(W1​x+b1​) 决定了哪些信息可以通过,哪些必要被抑制。
    • 线性信号                                                                W                                     2                                              x                                  +                                               b                                     2                                                      W_2 x + b_2                           W2​x+b2​ 与门控信号逐元素相乘,从而实现信息的选择性传递。

  • 输出

    • 终极输出是门控信号与线性信号的逐元素乘积,保存了输入数据的告急特征。

2.3GLU 的上风


  • 选择性信息传递

    • 通过门控机制,GLU 能够动态决定哪些特征对模型的推测更有资助,从而进步模型的表达能力。

  • 非线性增强

    • GLU 结合了线性变换和非线性激活,使得模型能够学习复杂的模式。

  • 高效盘算

    • 相比 LSTM 和 GRU 等复杂的门控机制,GLU 的盘算更加高效,同时制止了梯度消失题目。

  • 并行处理能力

    • GLU 可以并行处理序列数据,类似于 Transformer 的机制,但盘算复杂度更低。

2.4GLU 的变体

GLU 的变体通过替换 Sigmoid 激活函数来进一步优化性能,常见的变体包括:

  • ReGLU:使用 ReLU 替代 Sigmoid。
  • GEGLU:使用 GELU 替代 Sigmoid。
  • SwiGLU:使用 Swish 替代 Sigmoid,是 GLU 的一种改进版本。
2.5GLU 的代码实现

以下是一个基于 PyTorch 的 GLU 实现示例:
  1. import torch
  2. import torch.nn as nn
  3. import torch.nn.functional as F
  4. class GLU(nn.Module):
  5.     def __init__(self, input_dim, output_dim):
  6.         super(GLU, self).__init__()
  7.         self.linear1 = nn.Linear(input_dim, output_dim)
  8.         self.linear2 = nn.Linear(input_dim, output_dim)
  9.     def forward(self, x):
  10.         gate = torch.sigmoid(self.linear1(x))  # 门控信号
  11.         linear = self.linear2(x)               # 线性信号
  12.         return gate * linear                   # 逐元素相乘
复制代码
3.SwiGLU(Swish-Gated Linear Unit)

一种结合了 Swish 激活函数GLU(Gated Linear Unit) 特点的激活函数,广泛应用于当代深度学习模型中,尤其是在大型语言模型(如 LLaMA 和 PaLM)中表现精彩。
3.1SwiGLU 的定义

SwiGLU 的数学表达式为:
                                         SwiGLU                            (                            x                            )                            =                            Swish                            (                                       Linear                               1                                      (                            x                            )                            )                            ⊗                                       Linear                               2                                      (                            x                            )                                  \text{SwiGLU}(x) = \text{Swish}(\text{Linear}_1(x)) \otimes \text{Linear}_2(x)                     SwiGLU(x)=Swish(Linear1​(x))⊗Linear2​(x)
此中:


  • Swish 是一个平滑的非线性激活函数,定义为                                         Swish                            (                            x                            )                            =                            x                            ⋅                            σ                            (                            x                            )                                  \text{Swish}(x) = x \cdot \sigma(x)                     Swish(x)=x⋅σ(x),此中                                         σ                            (                            x                            )                                  \sigma(x)                     σ(x) 是 Sigmoid 函数。
  • Linear 表示线性变换,通常由两个独立的全连接层实现。
  • 表示逐元素相乘。
3.2SwiGLU 的工作原理


  • 线性变换

    • 输入                                                   x                                          x                           x 经过两个独立的线性变换:

      •                                                                            Linear                                           1                                                      (                                        x                                        )                                                  \text{Linear}_1(x)                                 Linear1​(x) 的输出通过 Swish 激活函数,生成门控信号。
      •                                                                            Linear                                           2                                                      (                                        x                                        )                                                  \text{Linear}_2(x)                                 Linear2​(x) 的输出保持线性。


  • 门控机制

    • Swish 激活函数的输出作为门控信号,与线性变换的输出逐元素相乘,从而实现信息的选择性传递。

  • 输出

    • 终极输出是门控信号与线性信号的逐元素乘积,保存了输入数据的告急特征。

3.3SwiGLU 的上风


  • 平滑非线性

    • Swish 函数的平滑性使得反向流传的梯度更新更稳定,减轻梯度消失题目。

  • 门控特性

    • GLU 的门控机制允许模型动态调整信息流,增强模型对长序列数据的处理能力。

  • 高效盘算

    • 尽管引入了额外的非线性激活函数,SwiGLU 的盘算开销相对较小,适合大规模模型。

  • 性能提升

    • 在多个基准测试中,SwiGLU 表现精彩,优于 GLU、ReLU 等传统激活函数。

3.4SwiGLU 的应用场景

SwiGLU 广泛应用于以下范畴:


  • 自然语言处理:如语言建模、机器翻译和文本生成。
  • 盘算机视觉:如视觉 Transformer(ViT)等布局。
  • Transformer 架构:如 GPT 系列和 BERT 的改进版本。
3.5SwiGLU 的代码实现

以下是一个基于 PyTorch 的 SwiGLU 实现示例:
  1. import torch
  2. import torch.nn as nn
  3. import torch.nn.functional as F
  4. class SwiGLU(nn.Module):
  5.     def __init__(self, input_dim, hidden_dim):
  6.         super(SwiGLU, self).__init__()
  7.         self.linear1 = nn.Linear(input_dim, hidden_dim)
  8.         self.linear2 = nn.Linear(input_dim, hidden_dim)
  9.         self.swish = nn.SiLU()  # 使用内置的 Swish 激活函数
  10.     def forward(self, x):
  11.         return self.linear1(x) * self.swish(self.linear2(x))
  12. # 示例输入
  13. x = torch.randn(4, 128)  # Batch size 4, input dimension 128
  14. model = SwiGLU(input_dim=128, hidden_dim=256)
  15. output = model(x)
  16. print(output.shape)  # 输出维度为 (4, 256)
复制代码
3.6总结

SwiGLU 通过结合 Swish 的平滑非线性特性和 GLU 的门控机制,提供了一种高效的激活函数,实用于必要复杂非线性转换的任务,如自然语言处理和盘算机视觉。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表