聊聊transformer模型中的FFN层

概述

在transformer模型中,Encoder与Decoder部分都有一个前馈网络层(Feed-Forward Network   FFN);一般由两个有ReLU激活函数的全连接层(Full Connection FC层)组成。第一个全连接层将输入映射到一个更高的维度,而第二个全连接层则将这个更高维度的表示映射回原始的维度。这一过程可以被看作是对输入表示进行“扩展”和“压缩”。

一般在具体模型的源码中的实现对应为MLP;比如ChatGLM3中,其实现为class MLP(torch.nn.Module);在Llama2中,其实现为class LlamaMLP(nn.Module)

在模型实现中,将MLP对应到transformer理论模型中的FFN。

ChatGLM3

ChatGLM中MLP的实现与transformer模型中FFN的理论模型一致。其结构如下:

(mlp): MLP (
  (dense_h_to_4h): Linear(in_features=4096, out_features=16384, bias=True)
  (dense_4h_to_h): Linear(in_features=16384, out_features=4096, bias=True)
  (activation_func): swiglu(x)
)

标准MLP Block表示如下:

out = down_proj(actn_fn(up_proj(input)))

up_proj层的大小计算为4096 * 16384;而中间通过激活函数引入非线性变换;对于down_proj层的大小计算为16384 * 4096。

LlamaMLP2

Llama2中对于MLP的实现与大多数模型中MLP的不同。其结构如下:

(mlp): LlamaMLP(
          (gate_proj): Linear(in_features=5120, out_features=13824, bias=False)
          (up_proj): Linear(in_features=5120, out_features=13824, bias=False)
          (down_proj): Linear(in_features=13824, out_features=5120, bias=False)
          (act_fn): SiLUActivation()
        )

Llama2采用了独特的MLP Block结构,将其与上述标准MLP Block区分开。

在Llama-2的情况下,MLP块包括三个基本层:up_proj, down_proj和gate_proj,它们结合在一起创建了一个独特的结构:

out = down_proj( act_fn(gate_proj(input)) x up_proj(input) ).

up_proj层的大小计算为5120 x 13824,得到70,778,880个参数。类似地,down_proj层的尺寸为13824 x 5120,而gated_proj层的尺寸为5120 x 13824。

总结

Transformer模型中的前馈网络层(Feed-Forward Network, FFN)是为了引入非线性特性,使得模型能够处理更复杂的特征。FFN由两层全连接层组成,第一层将输入数据的维度扩大为原来的倍数(一般是4),第二层再将数据压缩回原来的维度。

扩大数据维度到原先倍数的原因主要有以下几点:

  1. 增加模型的容量:扩大维度可以增加模型的参数量,从而增强模型的表达能力,使其能够捕捉到更加复杂的特征和模式。
  2. 非线性变换:通过ReLU(或其它非线性激活函数)进行非线性变换,可以使模型捕捉到输入数据中非线性的关系,这有助于模型学习到更复杂的函数。
  3. 残差连接:在Transformer中,FFN与输入数据通过残差连接相结合。如果FFN的输出维度与输入维度不一致,那么就需要通过一个线性层将它们对齐,以便进行残差连接。扩大维度后再压缩回原维度,可以在引入非线性变换的同时,保持残差连接的维度一致性。

压缩回原先维度的好处包括:

  1. 维度一致性:经过FFN处理后的数据需要与输入数据的维度一致,以便于进行残差连接。
  2. 信息聚焦:通过压缩维度,模型可以对扩大维度后学习到的特征进行选择和聚焦,只保留最重要的信息,这有助于提高模型的泛化能力。
  3. 减少计算量:在经过非线性变换和特征学习后,压缩维度可以减少后续层的计算量,提高模型的计算效率。

总的来说,扩大维度再压缩回来,是为了在引入非线性变换的同时,保持残差连接的维度一致性,并提高模型的表达能力和泛化能力。


原文始发于微信公众号(阿郎小哥的随笔驿站):聊聊transformer模型中的FFN层

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/244169.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!