从 Seq2Seq 到 Transformer:深度学习注意力机制与编码-解码框架综述
摘要
本文首先介绍了序列到序列(Seq2Seq)模型的概念与演进过程,包括其在处理变长输入和输出序列方面的优势与局限。随后重点阐述了注意力机制(Attention)的提出背景、核心思想与重要特性,并结合自注意力(Self-Attention)、交叉注意力(Cross-Attention)等不同形式,剖析了它们在解决长时依赖与信息丢失问题中的关键作用。接着,本文详细展示了基于 Transformer 的编码器-解码器(Encoder-Decoder)结构,包括多头注意力、多层前馈网络、残差连接和掩码技术在解码过程中的应用。最后,通过一个小型中英翻译任务的示例,从数据预处理、模型构建、训练到推理做了完整代码实践演示,为理解和动手实现 Transformer 在自然语言处理中的核心原理与流程提供了参考。
TASK1:序列到序列(Seq2Seq)模型概述
1.1 什么是Seq2Seq模型
Sequence to Sequence 序列变为序列
1.2 Seq2Seq 的由来
原来用Mask解决Padding问题
但是对于长度事先并不知道的问题,使用seq2seq解决
1.3 Seq2Seq 模型的评价
1.3.1 优势:
Seq2Seq主要有四个优势。
首先是,Seq2Seq是端到端学习,从原始数据可以直接到输出数据,不需要中间进行特征提取或工程化步骤。
例如,我有一个机器翻译的任务,想将“我想喝水。”翻译为“I want to drink water.”。传统方法的“特征工程”思路是,首先进行文本预处理:对句子进行分词、去除停用词、做词形还原、构造词典等。然后进行特征提取:需要人工或基于规则提取句子中的关键词、词频、文本统计特征等,甚至需要对上下文进行复杂的标注或编码。其次使用机器学习模型:将提取好的特征输入传统机器学习模型(如 SVM、逻辑回归等),尝试输出目标句子的相应翻译片段,然后再做组合或拼接。最后进行后处理:对模型输出的碎片化翻译结果进行人工后处理或整合,才能形成相对通顺的翻译句子。
而Seq2Seq 的“端到端”思路就简单很多,例如使用Encoder(编码器):将原始中文句子(“我想喝水。”)的词或字序列直接输入模型的 Encoder。常见做法是先将每个词/字映射成向量(嵌入向量),再通过 RNN、LSTM、GRU 或 Transformer 等神经网络来编码句子,得到一个语义向量表示(hidden states)。然后使用Decoder(解码器):Decoder 根据 Encoder 的输出语义向量,逐步生成目标句子的每个单词 “I”、 “want”、 “to”、 “drink”、 “water”、“.”。其中实现了完全自动化:在训练阶段,整个过程从中文句子的原始字符/词序列到英文句子的输出序列都是一个统一的模型,这个模型会自动学习到最适合翻译的特征表示。我们无需人为地额外设计、挑选或拼接特征。
为什么说是 “端到端”?首先,Seq2Seq无需特征工程:模型会在训练过程中通过误差反向传播自主学习如何将输入序列映射到输出序列,并把所有中间特征的提取都放到神经网络内部来完成。其次,Seq2Seq训练简洁:只需准备对应的中文→英文的配对数据,即可让模型自动优化参数,以得到最优的翻译效果。最后,Seq2Seq部署便利:训练完成后,只需一个模型文件,直接输入一句中文就能得到翻译结果,无需复杂的中间处理步骤。
通过这个简单例子可以看出,Seq2Seq 的核心优势在于它是一种 端到端 的学习方式:从原始数据(如中文句子)出发,直接学习到目标数据(如英文翻译),不再需要像传统方法那样在手工设计的特征工程上投入大量精力。
第二个优势,显而易见,Seq2Seq处理可变长度序列,模型具备处理输入和输出序列的能力,能够适应不同长度的序列数据。
第三个优势,是Seq2Seq的信息压缩与表示。编码器通过编码过程将输入序列压缩为一个固定维度的上下文向量,该向量作为输入序列的抽象表示,解码器基于此上下文向量进行解码操作以生成目标输出序列。
最后,第四个优势是Seq2Seq有良好的可扩展性,能够与卷积神经网络(CNNs)、循环神经网络(RNNs)等神经网络架构无缝集成,以应对更加复杂的数据处理任务和场景。
1.3.2 缺点
人有悲欢离合,Seq2Seq有阴晴圆缺
首先是上下文向量信息压缩问题,输入序列的全部信息需要被编码成一个固定维度的上下文向量,这导致了信息压缩和信息损失的问题,尤其是细粒度细节的丢失
其次是短期记忆限制,由于循环神经网络(RNN)的固有特性,Seq2Seq模型在处理长序列时存在短期记忆限制,难以有效捕获和传递长期依赖性。这限制了模型在处理具有长距离时间步依赖的序列时的性能
最后是训练与实战的差距,专业术语是暴露偏差(Exposure Bias),在Seq2Seq模型的训练过程中,经常采用“teacher forcing”策略,这就像是考试时老师不断给你提示答案。但是,在实际使用模型时,它需要自己猜测下一步该做什么,这就可能导致模型在实际应用时表现不如训练时那么出色,因为它可能会过分依赖那些训练时的“提示”,而忽略了如何独立解决问题。这种训练和实际应用之间的差异,我们称之为“Exposure Bias”。
2. Encoder-Decoder模型
2.1 “Seq2Seq”和“Encoder-Decoder”的关系
Seq2Seq(Sequence-to-Sequence)模型的主要目的是实现输入序列到输出序列的映射
Seq2Seq 使用的具体方法:通常基于 Encoder-Decoder 架构。这一方法旨在通过编码器将输入序列压缩为固定长度的潜在表示(向量),并通过解码器生成目标输出序列。
2.2 Encoder-Decoder 的工作流程
2.2.1 编码器(Encoder)
编码器是一个循环神经网络(RNN),由多个循环单元(如 LSTM 或 GRU)堆叠而成。
每个单元通过依次处理输入序列中的一个元素,生成一个上下文向量。
这个上下文向量汇总了输入序列的全部信息,它通过在单元间传递当前元素的信息,逐步构建对整个序列的理解。
工作流程:
-
词序列转换,输入文本(例如一个句子)通过一个嵌入层(embedding layer)进行转换成词嵌入。
-
序列处理:随后,这些经过嵌入的向量序列被送入一个基于循环神经网络(RNN)的结构中,该结构可能由普通的RNN单元、长短期记忆网络(LSTM)单元或门控循环单元(GRU)组成。RNN的递归性质允许它处理时序数据,从而捕捉输入序列中的顺序信息和上下文关系。在每个时间步,RNN单元不仅处理当前词汇的向量,还结合了来自前一个时间步的隐藏状态信息。
-
生成上下文向量,经过一系列时间步的计算,RNN的最后一个隐藏层输出被用作整个输入序列的表示,这个输出被称为上下文向量。其是一个固定长度的向量,它通过汇总和压缩整个序列的信息,有效地编码了输入文本的整体语义内容。这个向量随后将作为Decoder端的重要输入,用于生成目标序列。
2.2.2 解码器(Decoder)
解码器是一个基于递归神经网络(RNN)的模型组件,它的任务是接收编码器生成的上下文向量,并逐步生成目标序列,就像学生根据老师给的笔记复述故事一样。
在这个过程中,解码器的“头脑”(隐藏状态:权重和偏置)需要初始化,通常根据激活函数,分为Xavier初始化(适用于Sigmoid或Tanh激活函数)和He初始化(通常用于ReLU激活函数),通常用编码器生成的上下文向量作为起点。
解码器生成目标序列的过程可以看作一个接力,每一步都依赖之前的结果和来自编码器的信息。
它先以编码器生成的上下文向量作为起点,同时用一个特定的开始符号SOS(Start-of-Sequence, )来启动生成序列的过程。
在运行时,解码器每一步的输入是前一步的输出,而在训练时可以直接用目标序列的下一部分来指导。
上下文向量帮助解码器总结和理解源序列的信息,特别是在注意力机制中,它会动态调整焦点,确保解码器能根据当前需要更准确地关注源序列的不同部分,从而生成更符合上下文的输出。
2.2.3 Seq2Seq模型的训练过程
扮演一名老师,教一个学生(解码器)如何根据一本故事书(源序列)来复述故事。
1. 准备数据
- 数据预处理:首先,你需要把故事书的内容翻译成学生能理解的词汇表(分词),并为每个词汇分配一个编号,同时在故事的开始和结束加上特殊的标记(编码),告诉学生何时开始和结束复述。
- 批量处理:然后,你把这些故事分成几个小部分,每次给学生讲一个小故事,这样他们可以同时学习多个故事。
2. 初始化模型参数
- 解码器RNN:学生的大脑就像一个初始状态,需要学习如何理解和复述故事。
- 输出层:学生的嘴巴就像一个输出层,需要学习如何将大脑中的故事转换成语言表达出来。
3. 编码器处理
- 运行编码器
- 你先给学生讲一遍故事,让他们理解故事的情节和要点,这些信息被总结成一个简短的笔记。
4. 解码器训练过程
- 初始化隐藏状态
- 学生开始复述前,先看看你给他们的笔记。
- 时间步迭代:
- 输入
- 学生首先根据你给的开头标记开始复述,然后根据他们自己的记忆或者你给的提示来继续。
- 解码器RNN
- 学生的大脑根据当前的输入和之前的记忆来决定下一步该说什么。
- 输出层
- 学生尝试用语言表达出他们大脑中的故事。
- 损失计算
- 你评估学生复述的故事和你讲的故事之间的差异,通常是通过比较他们说的词汇和你期望的词汇。
- 输入
5. 反向传播和参数更新
- 计算梯度
- 学生根据你的反馈来调整他们的记忆和学习方法。
- 参数更新
- 学生通过不断的练习来改进他们的复述技巧。
6. 循环训练
- 多个epoch
- 学生需要反复练习,多次复述不同的故事,直到他们能够熟练地复述任何故事。
7.评估和调优:
- 验证集评估
- 定期让学生在新的故事(验证集)上测试他们的复述能力。
- 超参数调优
- 根据学生的表现,调整教学的方法,比如改变练习的难度或频率(学习率、批次大小)。
通过这个过程,学生(解码器)学会了如何根据你提供的笔记(上下文向量)来复述故事(生成目标序列)。在实际训练中,教师强制(Teacher Forcing)等技巧可以帮助学生更快地学习,而梯度裁剪(Gradient Clipping)等技术可以防止他们在学习过程中过度自信或偏离正确的路径。
2.2.4 小故事讲解
一个人根据记忆来复述一个故事,一边回忆一边讲述,直到故事讲完。解码器(Decoder)每次都是根据它之前说的词和那个总结的笔记(上下文向量)来决定接下来该说什么。
2.3 Encoder-Decoder 的应用
机器翻译、对话机器人、诗词生成、代码补全、文章摘要(文本 – 文本)
语音识别(音频 – 文本)
图像描述生成(图片 – 文本)
2.4 Encoder-Decoder 的缺陷
只有一个固定长度的“上下文向量 ”来传递信息
当输入信息太长时,会丢失掉一些信息
3. Attention 的提出与影响
3.1 Attention的发展历程
时间 | 发展 | 描述 |
---|---|---|
早期 | 循环神经网络(RNNs)长短期记忆网络(LSTMs) | RNNs能够处理变长的序列数据,但由于梯度消失和梯度爆炸问题,它们在长序列上的表现并不理想。 LSTMs是对RNNs的改进,通过引入门控机制来解决长序列学习中的梯度消失问题。 |
2014年 | Seq2Seq模型的提出 | Seq2Seq模型由一个编码器和一个解码器组成,两者都是基于LSTM。该模型在机器翻译任务上取得了显著的成功。历史地位: - 首次引入了编码器-解码器框架;- 端到端的学习成为可能;- 中间产生了上下文向量,把编码过程和解码过程进行了解耦。 |
2015年 | 注意力机制的引入 | 在Seq2Seq模型的基础上,Bahdanau等人提出了带注意力机制的Seq2Seq模型。 |
2017年 | 自注意力与Transformer模型 | Transformer模型完全基于自注意力机制,摒弃了传统的循环网络结构,在处理长距离依赖方面表现卓越。 |
2018年 | 多头注意力与BERT | Transformer模型进一步发展为多头注意力机制,并在BERT模型中得到应用,BERT在多项NLP任务上取得了突破性的成果。 |
3.2 Attention的N种类型
从计算区域、所用信息、使用模型、权值计算方式和模型结构方面对Attention的形式进行归类,如下表所示:
计算区域 | 所用信息 | 使用模型 | 权值计算方式 | 模型结构 |
---|---|---|---|---|
1. Soft Attention(Global Attention) | 1.General Attention | 1. CNN + Attention | 1.点乘算法 | 1. One-Head Attention |
2. Local Attention | 2. Self Attention | 2. RNN + Attention | 2. 矩阵相乘 | 2. Mutil-layer Attention |
3. Hard Attention | 3. LSTM + Attention | 3.Cos相似度 | 3.Mutil-head Attention | |
4. pure-Attention | 4. 串联方式 | |||
5. 多层感知 |
3.2 Attention 解决信息丢失问题
Attention 模型的特点是 Encoder 不再将整个输入序列编码为固定长度的“向量C” ,
而是编码成一个向量(Context vector)的序列(“C1”、“C2”、“C3”),解决“信息过长,信息丢失”的问题。
3.3 Attention 的核心工作
Attention 的核心工作就是“关注重点”。在特定场景下,解决特定问题。
- 信息:整个画面
- 有效信息:画面中心位置
- 无效信息:画面的边边角角、底色、花纹等等
Attention is all you need!
3.4 Attention 的3大优点
- 参数少:模型复杂度跟 CNN、RNN 相比,复杂度更小,参数也更少。所以对算力的要求也就更小。
- 速度快:Attention 解决了 RNN 不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。
- 效果好:在 Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。
4. 将每个词汇映射到一个高维空间中的稠密向量
词嵌入是通过将词汇映射到一个高维稠密向量空间中来表示其语义信息的方式,
这些向量的位置反映了词汇之间的语义相似性,
例如“猫”和“狗”的向量在空间中更接近,而与“爱”或“跑”距离较远,
这种表示能够用向量的距离或角度来度量词汇关系,
从而有效捕捉其语义复杂性,
并在实际应用中通过更高维度的表示来提升精度。
例如:
“猫” = [0.3, 0.4, 0.25]
“狗” = [0.35, 0.45, 0.3]
“爱” = [0.8, 0.8, 0.8]
“跑” = [0.1, 0.2, 0.6]
在这个例子中,每个词汇被表示为一个三维向量。
这些向量在多维空间中的位置是根据词汇的语义相似性来确定的。
在实际应用中,词嵌入通常是在一个更高的维度空间中进行的,比如50维、100维、甚至更高,这样可以更准确地捕捉词汇的复杂语义关系。
这种稠密向量的表示方式使得词汇之间的关系可以通过向量之间的距离或角度来度量。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] #matplotlib字体显示
from mpl_toolkits.mplot3d import Axes3D
# 定义词汇及其对应的三维向量
words = ["猫", "狗", "爱", "跑"]
vectors = [[0.3, 0.4, 0.25], [0.35, 0.45, 0.3], [0.8, 0.8, 0.8], [0.1, 0.2, 0.6]]
# 将嵌套列表转换为numpy数组
vectors = np.array(vectors)
# 创建3D图形
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
# 为每个词汇及其向量绘图
scatter = ax.scatter(vectors[:, 0], vectors[:, 1], vectors[:, 2],
c=['blue', 'green', 'red', 'purple'], s=100)
# 为每个点添加标签
for i, word in enumerate(words):
ax.text(vectors[i, 0], vectors[i, 1], vectors[i, 2], word, size=15, zorder=1)
# 设置图形属性
ax.set_xlabel('X 轴', fontsize=14)
ax.set_ylabel('Y 轴', fontsize=14)
ax.set_zlabel('Z 轴', fontsize=14)
# 移除坐标轴的数字标签
ax.set_xticklabels([])
ax.set_yticklabels([])
ax.set_zticklabels([])
# 设置背景颜色和网格线
ax.set_facecolor('white')
ax.grid(True)
# 显示图形
plt.show()
参考链接
【1】 Datawhale fun-transformer 学习教程 https://www.datawhale.cn/learn/content/87/3069
【2】Vision Transformer (ViT) https://huggingface.co/docs/transformers/model_doc/vit
【3】Attention用于NLP的一些小结:https://zhuanlan.zhihu.com/p/35739040
【4】遍地开花的 Attention,你真的懂吗?:https://zhuanlan.zhihu.com/p/77307258
【5】深入理解Transformer技术原理 https://tech.dewu.com/article?id=109
【6】B站李沐老师关于深度学习讲解:https://space.bilibili.com/1567748478
TASK2:ATTENTION IS ALL YOU NEED
1. 注意力机制(Attention Mechanism)
1.1 如何在深度学习中引入注意力机制
1.摘要
注意力机制(Attention Mechanism) 是**自然语言处理(NLP)中的一项关键创新,最初用于提升神经机器翻译(NMT)的效果,优化编码器-解码器(Encoder-Decoder)**架构的表现。该机制最早提出于经典论文 《Attention Is All You Need》,奠定了基于 Transformer 的模型基础。
2. 传统的编码器-解码器模型问题
传统的编码器-解码器(Encoder-Decoder)模型在处理长句子时存在长时依赖(Long-term dependency)问题,即在处理长序列时容易遗忘早期信息。
在这些模型中,编码器会将整个句子压缩成一个上下文向量(context vector),但如果这个摘要信息不足,就会影响翻译质量。
3. 注意力机制
注意力机制的核心思想是:不使用单一的上下文向量,而是为输入序列的不同部分分配不同的重要性(权重),使得解码器在生成翻译时能够动态地获取更加相关的信息。
1.2 注意力机制的工作原理
在 Transformer 等模型中,注意力机制的作用是提取重要信息,具体步骤包括:
- 分解输入信息
- 识别关键部分
- 依据重要性对信息进行排序
- 聚焦关键元素,形成总结性表示
这一过程使得模型能够从大规模语言数据中学习,并有效地将知识迁移到不同的上下文环境中。
1.3 全局注意力(Global Attention) vs. 局部注意力(Local Attention)
- 全局注意力(Global Attention) 认为所有输入信息都同等重要,因此计算复杂度较高,处理大规模数据时计算成本较大。
- 局部注意力(Local Attention) 仅关注输入的相关子集,减少计算开销。
局部注意力的实现方式包括:
- 设定一个注意力窗口,仅计算窗口内的上下文向量
- 基于位置信息计算上下文权重
- 通过进阶位置模型定义二维注意力窗口,优化计算效率
局部注意力的优势在于计算效率更高,可在全局注意力与局部注意力之间取得平衡。
2. Transformer
2.1 Transformer 模型
编码器-解码器架构(Encoder-Decoder Architecture)
Transformer 是一种基于编码器-解码器(Encoder-Decoder)的架构,其中:
- 编码器(Encoder) 负责处理输入序列
- 解码器(Decoder) 负责生成输出序列
每一层的编码器和解码器都包含:
- 自注意力机制(Self-Attention Mechanism)
- 前馈神经网络(Feedforward Network, FFN)
这种架构能够充分理解输入序列,并生成具有丰富上下文的输出。
位置编码(Positional Encoding)
由于 Transformer 无法直接理解序列的顺序,因此需要通过 位置编码(Positional Encoding) 来引入位置信息。
位置编码的作用:
- 结合词嵌入(Word Embedding)与位置信息,使模型能够区分序列中的不同元素
- 通过捕捉语言的时序动态,确保模型准确理解文本内容
多头注意力(Multi-Head Attention)
Transformer 的核心特性之一是 多头注意力(Multi-Head Attention),它允许模型同时关注输入序列的多个部分。
具体原理:
- 将查询(Query)、键(Key) 和 值(Value) 向量拆分为多个注意力头
- 不同注意力头捕获不同的上下文信息
- 综合多个注意力结果,提高模型处理复杂语言结构的能力
前馈神经网络(Feedforward Network, FFN)
在 Transformer 的每一层中,都会使用 前馈神经网络(FFN) 进行处理,作用类似于人脑中的并行信息处理:
- 通过线性变换和非线性激活函数,提取复杂的特征关系
- 增强模型对语义结构的理解能力
Transformer 的工作流程
- 输入序列 经过 词嵌入(Embedding)
- 编码器(Encoder) 处理嵌入后的输入
- 解码器(Decoder) 结合编码器的输出和先前的解码结果
- Softmax 层 计算下一个单词的概率分布
Transformer 的编码器-解码器结构 使其在 机器翻译、文本生成和其他 NLP 任务 中表现优异,能够高效地并行处理数据,并捕捉长距离依赖关系。
2.2 Transformer 的工作原理
自注意力机制(Self-Attention Mechanism) 在 Transformer 中起到了核心作用,它帮助模型识别句子内部的单词之间的关系。
例如,考虑以下两个句子:
- “The cat drank the milk because it was hungry.” (其中 “it” 指代 “cat”)
- “The cat drank the milk because it was sweet.” (其中 “it” 指代 “milk”)
当 Transformer 处理单词 “it” 时,自注意力机制会:
- 分析周围单词的上下文,确定 “it” 的具体指代
- 为 “cat” 和 “milk” 分配不同的注意力权重,使得 “it” 在不同句子中正确关联到相应的词汇
通过 多个注意力分数(Multiple Attention Scores),Transformer 能够捕捉细微的语义差异,从而提升机器翻译、文本生成和 NLP 任务的准确性。
2.3 Transformer 对 Seq2Seq 模型的影响
Transformer 通过 自注意力机制(Self-Attention Mechanism) 取代了传统的 RNN:
- 允许所有元素并行处理
- 在计算时同时考虑整个序列
- 通过 位置向量(Position Vector) 维护序列顺序
- 训练效率更高
2.4 迁移学习(Transfer Learning)
迁移学习的关键:
- 采用 预训练模型权重
- 通过特定任务的数据 “微调(Fine-tuning)” 模型参数
- 适配不同任务,提高泛化能力
3. Transformer vs. CNN vs. RNN
假设输入序列的长度为 n,每个元素的维度为 d,输出序列的长度同样为 n,维度为 d。可以对比 Transformer、CNN 和 RNN 在以下三个方面的表现:
特性 | Transformer | CNN | RNN |
---|---|---|---|
计算复杂度 | O(n²·d) | O(k·n·d²) | O(n·d²) |
并行性 | 高 | 高 | 低 |
最长学习距离 | O(1) | O(log(n)) | O(n) |
4. 输入嵌入(Input Embeddings)
4.1 词嵌入(Word Embeddings)
在 PyTorch 中,nn.Embedding
层用于实现词嵌入,通常有两种方法:
- 使用预训练嵌入并冻结(Frozen)
- 随机初始化并进行训练
可训练的嵌入在训练过程中不断优化,而冻结的嵌入保持不变。
4.2 位置编码(Positional Embeddings)
由于 Transformer 不具备序列顺序感知能力,因此需要通过 位置编码(Positional Encoding) 来补充位置信息。
Transformer 论文提出了一种基于固定公式的编码方式,确保模型能够学习相对位置信息,从而更好地理解文本结构。
参考链接
[1] TASK2 Transform Datawhale https://www.datawhale.cn/learn/content/87/3075
[2]《Attention Is All You Need》https://arxiv.org/abs/1706.03762
以下内容概括了 Transformer 模型中 Encoder 的核心结构与工作原理,重点介绍了编码器的输入、核心计算过程(多头自注意力与前馈网络)、残差及归一化操作,以及多头注意力(包括自注意力与交叉注意力)的具体机制与差异。
TASK3:编码器 Encoder
1. Encoder 结构
1.1 Encoder 工作流程
-
输入阶段
- 初始输入:将词嵌入(Input Embedding)和位置编码(Position Embedding)相加后得到输入序列。
- 后续 Encoder 输入:若有多层 Encoder,则后面的 Encoder 会接收前一个 Encoder 的输出作为输入。
-
核心处理阶段
- 多头自注意力层(Multi-Head Self-Attention)
- 通过多头自注意力机制,分别计算序列内部不同位置之间的依赖关系。
- 具体地,对于每个“头”,将输入序列分别映射为 Query、Key、Value,计算注意力权重,并对 Value 做加权求和,输出各头结果后再拼接并线性变换。
- 前馈层(Feedforward layer)
- 在得到自注意力层输出后,通过一系列全连接网络(常见为两层线性层 + 非线性激活)对特征进一步变换和提取。
- 多头自注意力层(Multi-Head Self-Attention)
-
残差与归一化阶段
- 残差连接(Residual Connection)
- 自注意力层及前馈层的输入与输出相加,以缓解梯度消失或爆炸,提升训练稳定性。
- 层归一化(LayerNorm)
- 对每一层的神经元输入归一化,可加速收敛并提高模型的泛化能力。
- 残差连接(Residual Connection)
1.2 Encoder 组成
- Multi-Head Attention(多头注意力)
- Residual Connection(残差连接)
- Normalisation(层归一化)
- Position-wise Feed-Forward Networks(逐位置前馈网络)
通过堆叠多个相同的 Encoder Layer(每层都包含多头自注意力与前馈网络),实现对输入序列的深层次特征编码。
2. 多头自注意力 (Multi-Head Self-Attention)
2.1 缩放点积注意力 (Scaled Dot-Product Attention)
-
将输入序列映射得到 Query(Q)、Key(K)、Value(V)。
-
计算公式:
-
Q = linear_q(x)
-
K = linear_k(x)
-
V = linear_v(x)
-
其中 d_k为 Key/Query 的向量维度。
-
缩放因子 用于避免向量点乘过大导致 softmax 进入饱和区间。
2.2 多头注意力机制 (Multi-Head Attention)
- 将 Q、K、V 分成多个“头”,在较低维空间并行计算注意力后再拼接,能让模型从不同子空间学习多种关系。
- 优点:捕捉多种上下文信息、增强模型表达能力、提升并行计算效率。
2.3 自注意力机制 (Self Attention)
- Q、K、V 都来自同一个序列,模型可同时考虑序列中所有元素之间的相互依赖。
- 优点:并行处理、长距离依赖捕捉、参数利用效率高。
- 缺点:计算量随序列长度增大,无法显式捕捉位置信息(需显式加位置编码)。
- Add & Norm:自注意力或前馈层输出后与输入相加(残差连接),并做层归一化,稳定训练并防止梯度消失。
2.4 前馈全连接网络 (Position-wise Feed-Forward Networks)
- 典型结构:两层全连接(升维→非线性激活→降维)。
- 在每个位置上独立进行计算,用于进一步提取高层次特征,提升模型表达能力。
2.5 Multi-Head Attention vs Multi-Head Self-Attention
- 核心机制相同:都基于多头注意力;均对 Q、K、V 做线性变换,并计算注意力分数。
- 差异:
- Self-Attention:Q、K、V 都来自同一序列,用于建模序列内部依赖。
- Cross-Attention:Q 来自一个序列,K、V 来自另一个序列,用于跨序列/跨模态的交互。
3. Cross Attention
3.1 简述
- 交叉注意力(Cross Attention)让一个序列(Query)“关注”另一个序列(Key、Value),从而在两个不同序列或不同模态间建立联系。
- 序列维度应一致,以便进行点积操作。
3.2 交叉注意力的操作
- 查询序列:决定输出序列的长度。
- 键、值序列:提供信息来源,用于匹配与加权求和。
4. Cross Attention 与 Self Attention 的主要区别
-
输入来源
- Self Attention:Q、K、V 同源,关注自身内部依赖。
- Cross Attention:Q、K、V 分别来自不同序列,让一个序列与另一个序列互动。
-
信息交互对象
- Self Attention:序列内部元素两两关联。
- Cross Attention:一个序列的每个元素与另一个序列所有元素关联。
-
应用场景
- Self Attention:单序列的编码理解,如句子内部词的关联。
- Cross Attention:多序列或多模态的交互,如机器翻译中的 Encoder 与 Decoder 之间的信息融合、图文匹配等。
参考链接
- 博客:多头注意力、外部注意力等
- GitHub: xmu-xiaoma666/External-Attention-pytorch
- 交叉注意力机制 Cross Attention
- 论文解读——交叉注意力融合2024经典论文
- 归一化
- CrossViT 论文
总结而言,Encoder 的关键在于“多头自注意力 + 前馈网络 + 残差连接和归一化”的组合结构,能在并行计算中高效捕捉序列内部特征。多头注意力又可细分为自注意力和交叉注意力,分别适用于序列内部和跨序列/模态的信息交互,为 Transformer 模型在自然语言处理、计算机视觉等领域的成功提供了重要支撑。
TASK4 解码器(Decoder)及相关技术
1. 解码器(Decoder)概述
解码器是Transformer架构中的重要组成部分,主要负责生成目标序列。在此过程中,它通过多头注意力机制和前馈神经网络处理输入,并结合编码器的信息来生成符合上下文的输出。
1.1 解码流程
- 输出嵌入的右向偏移:
- 在训练阶段,解码器内的每个符号都能获取之前生成符号的上下文信息。
- 位置编码的整合:
- 结合位置编码以保留序列顺序信息。
- 带掩码的多头自注意力机制: