美文网首页
大模型系列:SwiGLU激活函数与GLU门控线性单元原理解析

大模型系列:SwiGLU激活函数与GLU门控线性单元原理解析

作者: xiaogp | 来源:发表于2024-01-04 20:02 被阅读0次

关键词:LLaMATransformerGLUSwiGLU

前言

SwiGLU激活函数在PaLM,LLaMA等大模型中有广泛应用,在大部分测评中相较于Transformer FFN中所使用的ReLU函数都有提升。本篇先介绍LLaMA中SwiGLU的实现形式,再追溯到GLU门控线性单元,以及介绍GLU的变种,Swish激活函数等内容。


内容摘要

  • LLaMA中SwiGLU的实现形式
  • GLU门控线性单元原理简述
  • 通过GLU的变种改进Transformer
  • Swish和SiLU激活函数

LLaMA中SwiGLU的实现形式

SwiGLU本质上是对Transformer的FFN前馈传播层的第一层全连接ReLU进行了替换,在原生的FFN中采用两层全连接,第一层升维,第二层降维回归到输入维度,两层之间使用ReLE激活函数,计算流程图如下(省略LayerNorm模块)

FFN模块计算示意图

SwiGLU也是全连接配合激活函数的形式,不同的是SwiGLU采用两个权重矩阵和输入分别变换,再配合Swish激活函数做哈达马积的操作,因为FFN本身还有第二层全连接,所以带有SwiGLU激活函数的FFN模块一共有三个权重矩阵,用公式表达如下

带有SwiGLU的FFN公式

其中W1,V为SwiGLU模块的两个权重矩阵,W2为原始FFN的第二层全连接权重矩阵,⊗代表哈达玛积逐位相乘,Swish为激活函数,其中β为Swish激活函数的一个参数,一般β=1此时等同于SiLU激活函数,可视化计算流程图如下

带有SwiGLU的FFN示意图

在HuggingFace LLaMA的源码实现中,在Decoder模块LlamaDecoderLayer中的LlamaMLP引入SwiGLU改造了FFN层,实现如下

class LlamaDecoderLayer(nn.Module):
    def __init__(self, config: LlamaConfig):
        ...
        # TODO 门控线性单元
        self.mlp = LlamaMLP(
            hidden_size=self.hidden_size,
            intermediate_size=config.intermediate_size,  # 11008
            hidden_act=config.hidden_act,  # silu
        )

LlamaMLP的实现了SwiGLU逻辑,代码和公式完全对应

class LlamaMLP(nn.Module):
    def __init__(
        self,
        hidden_size: int,  # 4096
        intermediate_size: int,  # 11008
        hidden_act: str,  # silu
    ):
        super().__init__()
        self.gate_proj = nn.Linear(hidden_size, intermediate_size, bias=False)
        self.down_proj = nn.Linear(intermediate_size, hidden_size, bias=False)
        self.up_proj = nn.Linear(hidden_size, intermediate_size, bias=False)
        self.act_fn = ACT2FN[hidden_act]

    def forward(self, x):
        return self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x))

在LLaMA2-7B中,FFN的原始输入维度为4096,一般而言中间层是输入维度的4倍等于16384,由于SwiGLU的原因FFN从2个矩阵变成3个矩阵,为了使得模型的参数量大体保持不变,中间层维度做了缩减,缩减为原来的2/3即10922,进一步为了使得中间层是256的整数倍,有做了取模再还原的操作,最终中间层维度为11008,计算公式如下

SwiGLU中间层维度计算公式

GLU门控线性单元原理简述

SwiGLU是GLU门控线性单元的变种,了解SwiGLU必须从GLU入手,GLU提出于2016年发表的论文《nguage modeling with gated convolutional networks》中,GLU是一种类似LSTM带有门机制的网络结构,同时它类似Transformer一样具有可堆叠性残差连接,它的作用是完成对输入文本的表征,通过门机制控制信息通过的比例,来让模型自适应地选择哪些单词和特征对预测下一个词有帮助,通过堆叠来挖掘高阶语义,通过残差连接来缓解堆叠的梯度消失和爆炸。
堆叠的每一层就是门控GLU门控线性单元,通过Sigmoid激活函数和哈达玛积实现门控机制,公式如下

GLU公式

其中W和V两个卷积操作,当卷积patch size=1时等同于两个全连接层,GLU对输入文本的计算流程示意图如下

GLU示意图

相比于LSTM,GLU不需要复杂的门机制,不需要遗忘门,仅有一个输入门,因此计算更加高效,同时作者提出在他的实验中,基于GLU的GCNN门控卷积神经网络和LSTM相比,在相同参数数量和训练环境下,GCNN的预测困惑度更低,表现优于LSTM。


通过GLU的变种改进Transformer

2017年随着Transformer的提出和成功,促进了后续对Transformer结构的改进的研究,比如在2020年发表的论文《GLU Variants Improve Transformer》中,提出使用GLU的变种来改进Transformer的FFN层,作者提出的变种就是将GLU中原始的Sigmoid激活函数替换为其他的激活函数,作者列举了替换为ReLU,GELU和SwiGLU的三种变体,公式如下


GLU变体

本质上就是将Sigmoid激活函数替换为其他激活函数,命名上将激活函数的缩写加在GLU前面作为前缀。进一步作者将这种GLU变体替换FFN中的第一层全连接和激活函数,并且去除了GLU中偏置项bias,以SwiGLU为例,结合FFN它的计算公式为

带有SwiGLU的FFN

由于这种方式使得FFN中的权重矩阵从2变为了3,为了使得模型的参数大体不变,因此中间层的向量维度需要削减为原始维度的三分之二。
在论文的实验模块,作者通过数据证明通过GLU变体改造后的Transformer在大多数NLP任务上都比FFN的评价得分明显更高,其中ReGLU在实验中获得了最高的平均分,其次是SwiGLU。


GLU变体改造的Transformer测评

Swish和SiLU激活函数

Swish激活函数由Google团队在2017年提出,被证明在更深的模型上表现出比ReLU更好的性能,Swish的公式如下


Swish激活函数公式

其中σ为激活函数Sigmoid,β为Swish的一个参数,通常为一个常数或者让模型自适应学习得到。输入x和Sigmoid相乘使得它类似LSTM中的门机制,因此Swish也被成为self-gated激活函数,只需要一个标量输入即可完成门控操作。
当β=0时,Swish退化为一个线性函数,当β趋近于无穷大时,Swish就变成了ReLU,不同β下Swish的图形如下


不同β参数下Swish激活函数图像

Swish函数的曲线是平滑的,并且函数在所有点上都是可微的。这在模型优化过程中很有帮助,被认为是 swish 优于 ReLU 的原因之一。在LLaMA中采用常数β=1,此时Swish也叫SiLU激活函数。
全文完毕。

相关文章

  • About Activation Function All Yo

    激活函数 激活函数的意义:激活函数为层与层之间增加非线性连接,增加模型的复杂性,如果层之间没有非线性,那么即使很深...

  • 激活函数与损失函数

    激活函数 1、作用: 线性模型的表达能力不够,激活函数增加神经网络模型的非线性,提升神经网络模型表达能力(数据往往...

  • 激活函数

    为什么使用激活函数 如果没有激活函数,神经网络就变成了线性模型,输出是输入的线性组合,使用一层与使用多层没有区别。...

  • 4. 深度学习-损失函数

    我们知道神经网络是一种非线性模型,激活函数就是用来映射为非线性的,激活函数是保证神经网络非线性的关键。但是模型的参...

  • TensorFlow学习5:神经网络优化

    神经元模型 f为激活函数。引入非线性激活因素,提高模型的表达力。常见的激活函数有relu,sigmoid,tanh...

  • 非线性激活函数

    1 为什么需要非线性激活函数? 如果使用线性激活函数,那么这个模型的输出不过是你输入特征x的线性组合。神经网络只是...

  • 神经网络 之 线性单元

    本文结构: 什么是线性单元 有什么用 代码实现 1. 什么是线性单元 线性单元和感知器的区别就是在激活函数: 感知...

  • AI常用激活函数分析4,Relu函数与Leaky Relu函数

    ReLu函数 修正线性单元(Rectified linear unit,ReLU)是神经网络中最常用的激活函数。它...

  • 零基础入门数据挖掘-Task4 建模调参

    内容介绍 线性回归模型:线性回归对于特征的要求;处理长尾分布;理解线性回归模型; 模型性能验证:评价函数与目标函数...

  • 七月 PyTorch的入门与实战 百度网盘分享

    第一课 深度学习回顾与PyTorch简介知识点1: 知识点:神经网络模型回顾(线性层,非线性激活函数,SoftMa...

网友评论

      本文标题:大模型系列:SwiGLU激活函数与GLU门控线性单元原理解析

      本文链接:https://www.haomeiwen.com/subject/ulukndtx.html