SwishGLU 是一种激活函数,结合了 Swish 和 GLU(Gated Linear Unit)的特性。它通过引入门控机制来增强模型的表现,尤其是在处理复杂特征时。Swish 本身是一个平滑的激活函数,具有更好的性能,而 GLU 则利用门控结构来控制信息的流动。
SwishGLU 的实现可以分为几个步骤。首先,我们需要了解 Swish 和 GLU 的定义:
-
Swish 激活函数:
Swish ( x ) = x ⋅ σ ( x ) \text{Swish}(x) = x \cdot \sigma(x) Swish(x)=x⋅σ(x)
其中, σ ( x ) \sigma(x) σ(x) 是 Sigmoid 函数。 -
GLU 激活函数:
GLU ( A , B ) = A ⋅ σ ( B ) \text{GLU}(A, B) = A \cdot \sigma(B) GLU(A,B)=A⋅σ(B)
这里, A A A 和 B B B 是输入的两个不同线性变换的结果。
结合这两个概念,SwishGLU 可以表示为:
SwishGLU
(
x
)
=
Swish
(
A
)
⋅
σ
(
B
)
\text{SwishGLU}(x) = \text{Swish}(A) \cdot \sigma(B)
SwishGLU(x)=Swish(A)⋅σ(B)
其中
A
A
A 和
B
B
B 是通过线性层得到的。
实现步骤
以下是一个简单的 PyTorch 示例:
import torch
import torch.nn as nn
class SwishGLU(nn.Module):
def __init__(self, input_size, output_size):
super(SwishGLU, self).__init__()
self.linear_A = nn.Linear(input_size, output_size)
self.linear_B = nn.Linear(input_size, output_size)
def swish(self, x):
return x * torch.sigmoid(x)
def forward(self, x):
A = self.linear_A(x)
B = self.linear_B(x)
return self.swish(A) * torch.sigmoid(B)
# 示例用法
input_size = 10
output_size = 5
model = SwishGLU(input_size, output_size)
input_tensor = torch.randn(32, input_size) # 假设批量大小为 32
output = model(input_tensor)
ReLU 和 GELU 激活函数本身不包含可训练参数,只是简单地对输入进行转换。而 SwishGLU 包含两个线性层 A A A 和 B B B,这些层的权重矩阵和偏置是可训练的,因此在训练过程中可以优化,从而增强模型的表达能力。