当前位置: 首页 > ops >正文

GLU 变种:ReGLU 、 GEGLU 、 SwiGLU

文章目录

    • GLU 变种:ReGLU 、 GEGLU 、 SwiGLU
      • 1. ReGLU(ReLU-GLU)
        • 函数表达式
        • 代码
      • 2. GEGLU(Gaussian Error GLU)
        • 函数表达式
        • 代码
      • 3. SwiGLU(Swish-GLU)
        • 函数表达式
        • 代码
      • 合并代码

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)=(xW+b)⊗ReLU(xV+c)\text{ReGLU}(x) = (xW+b)\,\otimes\,\text{ReLU}(xV+c) ReGLU(x)=(xW+b)ReLU(xV+c)

代码
  • 代码

    import torch 
    from torch import nnclass 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)=(xW+b)⊗GELU(xV+c)\text{GEGLU}(x) = (xW+b)\,\otimes\,\text{GELU}(xV+c) GEGLU(x)=(xW+b)GELU(xV+c)

代码
  • 代码

    import torch 
    from torch import nnclass 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)=(xW+b)⊗Swishβ(xV+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)

    import troch
    from torch import nnclass SwiGLU(nn.Module):def __init__(self, d_in, d_out, beta=1.0):super().__init__()self.beta   = betaself.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)   # Swishup   = self.w_up(x)return self.w_down(gate * up)
    

合并代码

  • torch封装

    import torch
    from torch import nnclass 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)   # β=1else:gate = torch.sigmoid(gate)          # fallback to GLUreturn self.w_down(gate * up)
    

    输出

    torch.Size([8, 64, 512])
    
  • 对比

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

http://www.xdnf.cn/news/15695.html

相关文章:

  • js基本数据类型之字符串类型
  • 你的品牌需要一个AI首席内容官——解构BrandCraft如何解决内容创作的终极痛点
  • CCF编程能力等级认证GESP—C++4级—20250628
  • RSTP技术
  • /字符串/
  • DOM笔记
  • JS获取 CSS 中定义var变量值
  • 比亚迪古德伍德亮相:从技术突破到文化对话
  • UE5多人MOBA+GAS 番外篇:使用ECC(UGameplayEffectExecutionCalculation)制作伤害计算的流程
  • LP-MSPM0G3507学习--03时钟配置
  • 张力场中的领航者:驾驭二元对立的“情境智慧”模型
  • Webpack 项目构建优化详解
  • 深度理解 KVM:Linux 内核系统学习的重要角度
  • mybatisdemo(黑马)
  • linux制作镜像、压缩镜像、烧录的方法
  • 通付盾即将亮相2025世界人工智能大会丨携多智能体协同平台赋能千行百业
  • Deep Multi-scale Convolutional Neural Network for Dynamic Scene Deblurring 论文阅读
  • selenium后续!!
  • 进入当前正在运行的 Docker 容器
  • 【不用break退出循环】2022-1-25
  • 关于一个引力问题的回答,兼谈AI助学作用
  • 推荐算法召回:架构理解
  • 【PTA数据结构 | C语言版】斜堆的合并操作
  • Android 应用保活思路
  • 【C语言】深入理解柔性数组:特点、使用与优势分析
  • 【c++】STL-容器 list 的实现
  • 掌上医院微信小程序平台如何对接医保在线支付?
  • java前端基础--HTMLCSS、JavaScript、Vue、Ajax
  • 网安-API-crAPI
  • 如何下载并安装AIGCPanel