Transformer的理解
Transformer 的一些基本介绍
Transformer模型完全基于注意力机制,没有任何卷积层或循环神经网络层。尽管Transformer最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语言、视觉、语音和强化学习领域。
Transformer作为编码器-解码器架构的一个实例,其整体架构图如下展示。正如所见到的,Transformer是由编码器和解码器组成的。比,Transformer的编码器和解码器是基于自注意力的模块叠加而成的,源(输入)序列和目标(输出)序列的嵌入embedding)表示将加上位置编码(positional encoding),再分别输入到编码器和解码器中。
从宏观角度来看,Transformer的编码器是由多个相同的层叠加而成的,每个层都有两个子层(子层表示为sublayer)。第一个子层是多头自注意力(multi‐head self‐attention)汇聚;第二个子层是基于位置的前馈网络(positionwise feed‐forward network)。具体来说,在计算编码器的自注意力时,查询、键和值都来自前一个编码器层的输出。每个子层都采用了残差连接(residual connection)。在残差连接的加法计算之后,紧接着应用层规范化(layer normalization)。因此,输入序列对应的每个位置,Transformer编码器都将注意力机制输出一个d维表示向量。Transformer解码器也是由多个相同的层叠加而成的,并且层中使用了残差连接和层规范化。除了编码器中 描述的两个子层之外,解码器还在这两个子层之间插入了第三个子层,称为编码器-解码器注意力(encoder‐ decoder attention)层。在编码器-解码器注意力中,查询来自前一个解码器层的输出,而键和值来自整个编码器的输出。在解码器自注意力中,查询、键和值都来自上一个解码器层的输出。但是,解码器中的每个位置只能考虑该位置之前的所有位置。这种掩蔽(masked)注意力保留了自回归(auto‐regressive)属性,确保预测仅依赖于已生成的输出词元。
以一个基于 Transformer 模型的机器翻译的例子来理解 Transformer:
加入我们要翻译 我爱学习
,对应的的翻译应该为 I Love to Learn
.对于我们人类来说,这个字符都能够看得懂,但是对于计算机来说他们就看不懂了,这个时候就需要进行数据的一个转换(一般来说数据的转换基础的有两个,一个是对于出现的词进行 ID 编码,可以这样理解 我:1,爱:2,学:3,习:4
,这样能够很好的表示顺序关系 我爱学习,那不就是 1234 嘛
,但是对于对应关系的话可能就欠缺了 爱学 2+3 是 5 ,但是我习是 1+4 也是 5 但是他们不一样啊
。一个是独热编码,例如 我 0001,爱 0010, 学 0100 习 1000
,可以很好的表示对应关系 爱学 0110,我习 1001
但是顺序关系就没有了,而嵌入就是一种能够很好表示这两种关系的方法具体另说),对应图中来说就是图中的 Embeddings (嵌入)的过程,转换成计算机能够识别的向量数据,转换成了嵌入数据能够让计算机识别还是不够的,因为我们这是一个有关序列的过程,所以还要进行位置的编码(Position Encoding),把位置的相关信息引入到模型中去。Transformer 包括两个主要的过程,一个是编码器,一个是解码器。编码器的组成的话是由 N 个基础的 Layer 组成,这个基础的层的输入是上一个基础 Layer 的输出,经过归一化,然后再经过多头自注意力层,进行输出然后进行归一化然后在交给一个前馈神经网络。然后我们所拥有的输入 我爱学习
经过编码器以后就会得到一个输出。接下来我们讲解码器,解码器也是一个由多个基础的层连接而成,基础的层组成是这样的:对于原始输出 I Love to Learn
进行 Embedding,然后进行位置编码,作为最最最初始的输入,然后进行多头自注意力机制,这里要特别注意 mask,为什么要有 mask 呢,因为我们自注意力机制能够观察到全局的信息,但是,进行序列输出的时候只需要关注已经输出的,也就是 mask 要掩盖住后面的注意力
,然后以自注意力机制作为下一个多头交叉注意力机制的 Q,以编码器的输出作为 K、V,最后再经过一个前馈神经网络。对于解码器的一个过程就是:首先有一个开始符 <Start>
然后翻译 I
然后再次进行解码 Love
-> to
-> Learn
最后呢就是一个结束符 <end>
终止了。
那么其中的损失怎么计算的呢?通过最终的输出和最开始对于原始输出的位置编码结果进行一个比较计算 Loss 以调整注意力期间的偏置,达到最优效果。
在Transformer模型中,前馈神经网络(Feed-Forward Neural Network, FFN)是每个编码器和解码器层中的核心组件之一,其作用主要是对自注意力机制(Self-Attention)的输出进行非线性变换和特征增强。具体来说,它的功能可以总结为以下几点:
1. 引入非线性能力
- 自注意力机制本质上是线性操作(加权求和),即使有多头注意力,其输出仍是输入的线性组合。FFN通过激活函数(如ReLU、GELU等)引入了非线性变换,使模型能够学习更复杂的特征表示。
- 公式示例(以原始论文为例):
FFN ( x ) = max ( 0 , x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2 FFN(x)=max(0,xW1+b1)W2+b2
其中 W 1 , W 2 W_1, W_2 W1,W2 是可学习参数,激活函数为ReLU。
2. 独立处理每个位置的特征
- FFN作用于序列中的每个位置(token)独立且相同(即“逐点”操作),与自注意力机制不同(后者会混合全局信息)。这种设计使得模型既能通过注意力捕获全局依赖,又能通过FFN对每个位置的局部特征进行细化。
- 注意:FFN不会跨位置交互,但通过堆叠多层,高层FFN可以间接融合其他位置的信息(因输入来自前一层的注意力输出)。
3. 特征空间变换与维度调整
- FFN通常会将输入投影到更高维度(例如,原始Transformer中输入维度是512,中间层扩展到2048),再投影回原始维度。这种“扩展-压缩”结构有助于增强模型的表达能力。
- 维度变化:
输入 ∈ R d model → 隐藏层 ∈ R d ff → 输出 ∈ R d model \text{输入} \in \mathbb{R}^{d_{\text{model}}} \to \text{隐藏层} \in \mathbb{R}^{d_{\text{ff}}} \to \text{输出} \in \mathbb{R}^{d_{\text{model}}} 输入∈Rdmodel→隐藏层∈Rdff→输出∈Rdmodel
(例如 d model = 512 d_{\text{model}}=512 dmodel=512, d ff = 2048 d_{\text{ff}}=2048 dff=2048。)
4. 与注意力机制的互补
- 自注意力机制擅长捕捉全局依赖关系,但可能忽略局部模式或细粒度特征。FFN通过逐位置的非线性变换补充了这一不足,两者协同工作提升了模型的综合能力。
对比与总结
组件 | 主要功能 | 是否跨位置交互 |
---|---|---|
自注意力机制 | 捕获序列内全局依赖关系 | 是 |
前馈神经网络(FFN) | 非线性变换与局部特征增强 | 否(逐点处理) |
实际应用中的变体
- 激活函数:原始Transformer使用ReLU,后续改进如GPT用GELU,Swish等。
- 结构扩展:某些模型(如BERT)可能使用更大的中间维度((d_{\text{ff}})),或添加残差连接和层归一化(Post-LN/Pre-LN)。
总之,FFN是Transformer中不可或缺的“特征加工厂”,负责将注意力机制提取的全局信息转化为更丰富、更具判别性的表示。
参考:https://www.bilibili.com/video/BV1XH4y1T76e/?spm_id_from=333.337.search-card.all.click&vd_source=a7408a867ad5e7b3e8fd7b56252538ab