文章目录

SWiGLU是大模型常用的激活函数,是2020年谷歌提出的激活函数,它结合了SWISH和GLU两者的特点。

在这里插入图片描述

SWiGLU是大模型常用的激活函数

GLU

GLU(Gated Linear Units,门控线性单元)引入了两个不同的线性层,其中一个首先经过sigmoid函数,其结果将和另一个线性层的输出进行逐元素相乘作为最终的输出:
G L U ( x , W , V , b , c ) = σ ( x W + b ) ⨂ ( x V + c ) (1) GLU(x,W,V,b,c)=\sigma(xW+b)\bigotimes(xV+c) \tag{1} GLU(x,W,V,b,c)=σ(xW+b)(xV+c)(1)
这里W,V以及b,c分别是这两个线形层的参数, σ ( x W + b ) \sigma(xW+b) σ(xW+b)作为门控,控制 ( x V + c ) (xV+c) (xV+c)的输出。
通过修改激活函数得到的变体通常能够带来更好的性能表现。

Swish

公式为:
S w i s h β ( x ) = x σ ( β x ) (2) Swish_{\beta}(x)=x\sigma(\beta x)\tag{2} Swishβ(x)=xσ(βx)(2)
其中σ(x)是Sigmoid函数;β是一个可学习的参数。
β趋近于0时,Swish函数趋近于线性函数 y = x 2 y = x^2 y=x2
β趋近于无穷大时,Swish函数趋近于ReLU函数;
β取值为1时,Swish函数是光滑且非单调的,等价于SiLU激活函数

SwiGLU

将公式(1)中的激活函数改为Swish就变成了SwiGLU激活函数:
S w i G L U ( x , W , V ) = S w i s h β ( x W ) ⨂ ( x V ) (3) SwiGLU(x,W,V)=Swish_{\beta}(xW)\bigotimes(xV)\tag{3} SwiGLU(x,W,V)=Swishβ(xW)(xV)(3)
使用SwiGLU激活函数的FNN代码如下:
F N N S W i G L U ( x , W 1 , V , W 2 ) = ( S w i s h 1 ( x W 1 ) ⨂ ( x V ) ) W 2 FNN_{SWiGLU(x,W_1,V, W_2)} = (Swish_1(xW_1)\bigotimes(xV))W2 FNNSWiGLU(x,W1,V,W2)=(Swish1(xW1)(xV))W2

import torch
from torch import nn
import torch.nn.functional as F

class FeedForward(nn.Module):
    def __init__(self, dim: int, hidden_dim: int, multiple_of: int, dropout: float):
        super().__init__()
        hidden_dim = multiple_of * ((2 * hidden_dim // 3 + multiple_of - 1) // multiple_of)
        self.w1 = nn.Linear(dim, hidden_dim)
        self.w2 = nn.Linear(hidden_dim, dim)
        self.w3 = nn.Linear(dim, hidden_dim)
        self.dropout = nn.Dropout(dropout)

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        return self.dropout(self.w2(F.silu(self.w1(x)) * self.w3(x)))

为什么SwiGLU好呢?原文这么说

We offer no explanation as to why these architectures seem to work; we  attribute their success, as all else, to divine benevolence.
(我们没有解释为什么这些架构似乎有效;我们将他们的成功归功于上帝的仁慈。)

参考其他资料1强行解释一下:
1、Swish对于负值的响应相对较小克服了 ReLU 某些神经元上输出始终为零的缺点

2、GLU 的门控特性,这意味着它可以根据输入的情况决定哪些信息应该通过、哪些信息应该被过滤。这种机制可以使网络更有效地学习到有用的表示,有助于提高模型的泛化能力。在大语言模型中,这对于处理长序列、长距离依赖的文本特别有用。

3、SwiGLU 中的参数 W1,W2,W3,b1,b2,b3W1,W2,W3,b1,b2,b3 可以通过训练学习,使得模型可以根据不同任务和数据集动态调整这些参数,增强了模型的灵活性和适应性。

4、计算效率相比某些较复杂的激活函数(如 GELU)更高,同时仍能保持较好的性能。这对于大规模语言模型的训练和推理是很重要的考量因素。

选择 SwiGLU 作为大语言模型的激活函数,主要是因为它综合了非线性能力、门控特性、梯度稳定性和可学习参数等方面的优势。在处理语言模型中复杂的语义关系、长依赖问题、以及保持训练稳定性和计算效率方面,SwiGLU 表现出色,因此被广泛采用。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐