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


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 表现出色,因此被广泛采用。
更多推荐
所有评论(0)