Transformer 的注意力负责让 Token 交换信息,每个位置随后还要单独经过前馈层。经典前馈层先把隐藏向量投影到更宽的空间,经过 ReLU 或 GELU,再投影回来。SwiGLU 在这段计算里增加一条支路,让一组数控制另一组数能通过多少。
我查了提出 SwiGLU 的原始论文及其实验表。它先对同一个输入做两次线性投影,一路经过 Swish 激活,随后与另一路逐元素相乘,最后再投影回模型维度。这里的门没有独立开关,它由输入和训练得到的权重连续调节。
三个矩阵需要缩窄中间层
普通前馈层有两个权重矩阵,SwiGLU 多了一次输入投影,一共有三个矩阵;若仍沿用原来的中间宽度,参数量和计算量都会增加,比较出来的提升便混进了更多参数的作用。
论文专门处理了这件事,实验采用 T5 基础规格,编码器与解码器各 12 层,模型维度为 768。普通前馈层的中间宽度是 3072,GLU 系列统一缩到 2048,也就是原来的三分之二,这样三矩阵版本与两矩阵版本大致保持相同参数量和运算量。
预训练使用 C4 的文本片段补全任务,共跑 524288 步。每批 128 个样本,输入为 512 Token,输出为 114 Token。最终留出集的对数困惑度中,ReLU 为 1.677,SwiGLU 为 1.636,GEGLU 略低一些,为 1.633。门控变体整体优于当时常用的 ReLU 与 GELU。
下游结果也有改善,但没有整齐地每项都赢。SwiGLU 在 GLUE 的平均分为 84.36,ReLU 为 83.80;SuperGLUE 上分别为 74.56 和 72.76。单项任务有涨有跌,论文直接提醒这些结果含有噪声,也没有给出一套经过验证的机制解释。
这篇论文还把 SwiGLU 与普通 Swish 分开比较。普通 Swish 只把 ReLU 换成平滑激活,仍走一条投影路径,最终预训练对数困惑度为 1.683。SwiGLU 的 1.636 来自激活函数与门控乘法一起改变,不能归功于 Swish 这个名字。GEGLU 在同一表里得到 1.633,也提醒人们,论文支持的是一组门控变体,未证明 SwiGLU 永远排第一。
差别就在乘法这里。两路投影会让同一个 Token 同时产生内容和门控信号,逐元素相乘以后,有些维度被压低,有些维度继续通过。这个过程发生在每一层、每一个 Token 上。训练从头适应这种结构,现成 ReLU 模型却不能只改一个配置名就获得论文结果,矩阵形状与已有权重都对不上。
激活函数名称不能代替完整配置
看到模型配置里写着 SwiGLU,只能知道前馈层的大致形状。中间宽度、是否带偏置、Swish 的参数、数值精度和融合内核都会改变参数量与速度。若两款模型的宽度不同,单凭激活函数名称很难把能力差异归到 SwiGLU 上。
自己训练模型时,可以先按相同总参数和训练计算量做 ReLU、GELU 与 SwiGLU 对照。除了验证损失,还要测目标任务和真实吞吐。SwiGLU 的原始证据支持一个有限判断,门控前馈层在当时的 T5 设置中学得更好。它后来被许多大模型采用,也没有把这项对照变成对所有规模和数据都成立的保证。