GLU 变种:ReGLU 、 GEGLU 、 SwiGLU

文章目录

GLU 变种:ReGLU 、 GEGLU 、 SwiGLU

  1. 在 GLU 的基础上,陆续提出了若干"激活 + GLU "的混合门控单元。它们共享同一套"双线形投影 + 逐元素门控"范式,差别仅在于把 GLU 中的 Sigmoid 门控替换为其他非线性函数,从而在参数量几乎不变的前提下带来不同的归纳偏差与性能收益。

  2. 参考论文:GLU Variants Improve Transformer

    https://arxiv.org/pdf/2002.05202


1. ReGLU(ReLU-GLU)

  • 核心思想:把 Sigmoid 换成 ReLU,让门控也具备稀疏性,计算更便宜,且保留 GLU 的残差特性。
函数表达式

ReGLU ( x ) = ( x W + b )   ⊗   ReLU ( x V + c ) \text{ReGLU}(x) = (xW+b)\,\otimes\,\text{ReLU}(xV+c) ReGLU(x)=(xW+b)⊗ReLU(xV+c)

代码
  • 代码

    python 复制代码
    import torch 
    from torch import nn
    
    
    class ReGLU(nn.Module):
        def __init__(self, d_in, d_out):
            super().__init__()
            self.w_gate = nn.Linear(d_in, d_out, bias=False)
            self.w_up   = nn.Linear(d_in, d_out, bias=False)
            self.w_down = nn.Linear(d_out, d_in, bias=False)
    
        def forward(self, x):
            gate = F.relu(self.w_gate(x))
            up   = self.w_up(x)
            return self.w_down(gate * up)

2. GEGLU(Gaussian Error GLU)

  • 核心思想:用 GELU 取代 Sigmoid,兼顾稀疏与平滑,兼顾 ReLU 的低计算与 Swish 的高表达。
函数表达式

GEGLU ( x ) = ( x W + b )   ⊗   GELU ( x V + c ) \text{GEGLU}(x) = (xW+b)\,\otimes\,\text{GELU}(xV+c) GEGLU(x)=(xW+b)⊗GELU(xV+c)

代码
  • 代码

    python 复制代码
    import torch 
    from torch import nn
    
    class GEGLU(nn.Module):
        def __init__(self, d_in, d_out):
            super().__init__()
            self.w_gate = nn.Linear(d_in, d_out, bias=False)
            self.w_up   = nn.Linear(d_in, d_out, bias=False)
            self.w_down = nn.Linear(d_out, d_in, bias=False)
    
        def forward(self, x):
            gate = F.gelu(self.w_gate(x))
            up   = self.w_up(x)
            return self.w_down(gate * up)

3. SwiGLU(Swish-GLU)

  • 核心思想:将 Swish 引入门控;Swish 本身具备 可学习/常数 β,在深层网络中表现优于 ReLU/GELU。
函数表达式

SwiGLU ( x ) = ( x W + b )   ⊗   Swish β ( x V + c ) Swish β ( z ) = z ⋅ σ ( β z ) \text{SwiGLU}(x) = (xW+b)\,\otimes\,\text{Swish}\beta(xV+c) \\ \text{Swish}\beta(z)=z\cdot\sigma(\beta z) SwiGLU(x)=(xW+b)⊗Swishβ(xV+c)Swishβ(z)=z⋅σ(βz)

代码
  • 固定swish函数中的参数 β = 1 \beta = 1 β=1 (SiLU)

    python 复制代码
    import troch
    from torch import nn
    
    class SwiGLU(nn.Module):
        def __init__(self, d_in, d_out, beta=1.0):
            super().__init__()
            self.beta   = beta
            self.w_gate = nn.Linear(d_in, d_out, bias=False)
            self.w_up   = nn.Linear(d_in, d_out, bias=False)
            self.w_down = nn.Linear(d_out, d_in, bias=False)
    
        def forward(self, x):
            gate = self.w_gate(x)
            gate = gate * torch.sigmoid(self.beta * gate)   # Swish
            up   = self.w_up(x)
            return self.w_down(gate * up)

合并代码

  • torch封装

    python 复制代码
    import torch
    from torch import nn
    
    class GLUVariants(nn.Module):
        def __init__(self, d_in, d_out, variant="geglu"):
            super().__init__()
            self.variant = variant.lower()
            self.w_gate = nn.Linear(d_in, d_out, bias=False)
            self.w_up   = nn.Linear(d_in, d_out, bias=False)
            self.w_down = nn.Linear(d_out, d_in, bias=False)
    
        def forward(self, x):
            gate = self.w_gate(x)
            up   = self.w_up(x)
            if self.variant == "reglu":
                gate = F.relu(gate)
            elif self.variant == "geglu":
                gate = F.gelu(gate)
            elif self.variant == "swiglu":
                gate = gate * torch.sigmoid(gate)   # β=1
            else:
                gate = torch.sigmoid(gate)          # fallback to GLU
            return self.w_down(gate * up)

    输出

    python 复制代码
    torch.Size([8, 64, 512])
  • 对比

    特性 GLU ReGLU GEGLU SwiGLU
    门控激活 Sigmoid ReLU GELU Swish
    稀疏门控 部分 平滑稀疏
    计算量
    梯度平滑性 最好
    实际效果(大模型) 基线 接近 GLU 略优于 GLU 最佳
    是否需额外参数 可选 β

相关推荐
美酒没故事°1 天前
Open WebUI安装指南。搭建自己的自托管 AI 平台
人工智能·windows·ai
云烟成雨TD1 天前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
简简单单做算法1 天前
基于GA遗传优化的Transformer-LSTM网络模型的时间序列预测算法matlab性能仿真
深度学习·matlab·lstm·transformer·时间序列预测·ga遗传优化·电池剩余寿命预测
AI攻城狮1 天前
用 Obsidian CLI + LLM 构建本地 RAG:让你的笔记真正「活」起来
人工智能·云原生·aigc
鸿乃江边鸟1 天前
Nanobot 从onboard启动命令来看个人助理Agent的实现
人工智能·ai
lpfasd1231 天前
基于Cloudflare生态的应用部署与开发全解
人工智能·agent·cloudflare
俞凡1 天前
DevOps 2.0:智能体如何接管故障修复和基础设施维护
人工智能
comedate1 天前
[OpenClaw] GLM 5 关于电影 - 人工智能 - 的思考
人工智能·电影评价
财迅通Ai1 天前
6000万吨产能承压 卫星化学迎来战略窗口期
大数据·人工智能·物联网·卫星化学
liliangcsdn1 天前
Agent Memory智能体记忆系统的示例分析
数据库·人工智能·全文检索