『NLP学习笔记』Transformer技术详细介绍
这篇关于Transformer技术的介绍全面覆盖了该模型的核心概念及其工作原理。以下是总结的关键点:
概述
Transformer是一种基于自注意力机制的深度学习模型,在自然语言处理任务中表现出色。其核心思想是通过多头并行机制增强模型对复杂语义信息的理解能力。
输入处理
输入数据首先经过词嵌入层转换为向量表示,并与位置编码结合以获取序列的位置信息。这种结合使得模型能够识别句子中的上下文关系。
编码器结构
编码器由三个主要模块组成:
- 输入处理:嵌入层和位置编码层。
- 前馈神经网络:包含两层全连接层和ReLU激活函数。
- 残差与Layer Normalization:用于加速训练并防止梯度消失问题。
解码器结构
解码器同样由三个模块构成:- 自注意力机制:利用多头注意力捕捉当前输出序列与之前输入序列之间的关系。
- 前馈神经网络:与编码器相同。
- 残差与Layer Normalization:维持稳定的训练过程。
多头注意力机制
Transformer采用多头分割策略来提高模型表达能力。每个头关注不同的语义特征,并通过拼接输出形成最终结果。
掩膜多头注意力(Masked Multi-Head Attention)
在解码过程中引入掩膜操作以避免未来信息的影响,在机器翻译等任务中确保生成内容的真实性和一致性。
参考资源
文章提供了丰富的参考资料链接,涵盖论文原文、教学视频以及个人见解等资源,帮助读者进一步深入理解相关技术细节。
这篇文章不仅介绍了Transformer的基本架构及其数学基础,还通过图表生动地解释了各组件的工作流程及相互作用方式,使读者能够清晰理解其核心思想和技术细节。
| Transformer技术详细介绍! |
|---|
文章目录
-
一. 整体结构图
-
二. 输入部分
-
- 2.1. 词向量
- 2.2. 位置编码
-
三. 注意力机制
-
- 3.1. 注意力机制的本质
- 3.2. 举例说明
- 3.3. Transformer中的注意力
-
四. 残差和layerNormal
-
- 4.1. Layer Normalization
第五节 神经网络前馈结构
* 6.3. 交互层
- 七. 参考
-
- 7.1. OneFlow-从头理解与编码LLM的自注意力机制
一. 整体结构图
- TRM在做一个什么事情?

- 细化

- 再细化

- 原论文图:

- 单个Encoder可以分为如下3个部分 :

二. 输入部分
- 首先说输入部分 : 1. Embedding;2. 位置嵌入。 两者相加,如下图所示

2.1. 词向量
- 例如 :下面的4个英文单词,经过Word2Vec分别得到的词向量长度是4。

例如:输入为 我爱你......12个字。我们将每个字符编码为一个 512 维向量(与原论文一致) 。在构建过程中,可以选择使用 Word2Vec 算法或者随机初始化的方式(当数据规模极大时两者区别微乎其微)。通常情况下建议优先考虑 Word2Vec 算法。因此生成的所有词向量均具有 512 维特征。

2.2. 位置编码
可以参考以下大佬文章:https://wmathor.com/index.php/archives/1541/
我心目中的最优选择则是Bilibili平台上苏剑林的大佬关于Transformer位置编码的经典解析[视频] https://www.bilibili.com/video/BV1vA411V71k/?spm_id_from=333.999.0.0&vd_source=e411fd1208fd1c992b01c3111d6c04dc
在另一篇精彩文章中深入探讨了这一技术:https://www.spaces.ac.cn/archives/8231

相较于RNN与CNN等模型而言,在Transformer架构中引入位置编码是不可或缺的一环。原因在于仅凭注意力机制本身无法有效捕获输入序列的信息特性(即无法区分不同位置上的Token),这使得研究人员倍感头疼。
从RNN的角度探讨为何需要位置编码时,默认已经是大家已知的事实:RNN通过共享一组固定的参数(包括输入参数W、隐层参数V、输出参数等)来处理不同时间步的信息传递过程。这种机制下,在展开的时间序列结构中(例如输入为"我爱你"),RNN能够按照自然语言处理的习惯依次处理每个词(先处理"我"再处理"爱")。
Transformer相较于传统架构最显著的优势在于其独特的多头注意力机制设计——在这一架构下可以并行计算所有单词的位置关系(即一句话中的所有单词可以同时被分解并加以关注),这种特性使得模型运行速度大幅提升。然而这种优势背后也暗含着一个局限性:由于多头注意力机制本身的特性限制,在利用这一机制进行文本理解时就不可避免地忽略了词之间的顺序信息(或者说时间先后关系)。
因此,在这种情况下我们不得不认识到:相比起传统的递归结构或卷积操作,在Transformer架构中我们缺乏了一种关键的信息——即明确指示词序关系的关键信息。

- 原论文位置编码公式: 如何理解呢?pos单词或者字的位置 2i 代表偶数位,2i+1 代表奇数位。它如果针对512个维度的位置编码(下图)。
\begin{aligned} \text {PE}_{(\text {pos}, 2 i)} &=\sin \left(\frac{\text {pos} }{10000^{2 i / d_{\text {model }}}}\right)\tag{1} \end{aligned}
\begin{aligned} \text {PE}_{(\text {pos}, 2 i+1)} &=\cos \left(\frac{\text {pos} }{10000^{2 i / d_{\text {model }}}}\right)\tag{2} \end{aligned}
- 其中 pos表示某个词在句子序列中的实际位置,也可以理解为某个token ,i 表示词向量的第 i 个维度,d_{model}是位置向量的维度
- 由于 \sin (\alpha+\beta)=\sin \alpha \cos \beta+\cos \alpha \sin \beta 以及 \cos (\alpha+\beta)=\cos \alpha \cos \beta-\sin \alpha \sin \beta,这表明位置 \alpha+\beta 的向量可以表示成位置 \alpha 和位置 \beta 的向量组合,这提供了表达相对位置信息的可能性。但很奇怪的是,现在我们很少能看到直接使用这种形式的绝对位置编码的工作,原因不详。

在获得上述位置编码后, 我们通过将位置编码与词向量或字向量进行叠加来获取最终的输入特征.

- 我想进一步解释为什么位置嵌入会有用 ,通过三角函数的应用我们可以从公式2推导出公式3。观察到公式3中使用第1行作为基准进行计算,在当前情境中pos表示我的位置坐标(例如,在本例中pos表示你的坐标),而k则表示爱的关系(例如,在"我爱你"这句话中k代表爱)。这种线性组合表明位置向量编码中包含了各元素之间的相对关系。需要注意的是,在注意力机制处理过程中这类相对关系会被后续模型处理机制所消除

import numpy as np
import matplotlib.pyplot as plt
np.set_printoptions(formatter={'float': '{: 0.4f}'.format})
def plotPE(numw, dmodel, width=5, height=5):
# dmodel = 512
# numw = 20
pematrix = np.zeros((numw, dmodel))
for pos in range(0, numw): # 20 words
for i in range(0, dmodel): # 512-dimension
if i % 2 == 0:
p = np.sin(pos / np.power(10000.0, i / dmodel))
else:
p = np.cos(pos / np.power(10000.0, (i - 1) / dmodel))
pematrix[pos][i] = p
plt.figure(figsize=(width, height))
print(pematrix)
plt.imshow(pematrix)
# plt.colorbar(label='points')
plt.show()
plotPE(8, 16)
在提供的图中展示了每个行对应的向量位置编码。
第一行即为我们要插入到输入序列的第一个单词的嵌入向量。
每一行由十六个数值组成,在-1至1之间取值。
通过颜色编码处理后发现这些模式清晰可辨。


三. 注意力机制
3.1. 注意力机制的本质

- Transformer 原论文中注意力机制的公式:
\texttt{Attention}(\mathbf Q,\,\mathbf K,\,\mathbf V) = \texttt{softmax}\left(\frac{\mathbf Q\,\mathbf K^T}{\sqrt d_k}\right)\cdot\mathbf V\tag 3
其中 \mathbf Q、\mathbf K 和 \mathbf V 分别代表查询(Query)、键(Key)和值(Value)矩阵,在计算过程中:
- 首先通过点积操作生成相应的相似度分数,
- 这些分数经过归一化处理后形成了概率分布,
- 最终与值矩阵进行线性组合以生成输出。

3.2. 举例说明
在计算过程中,在注意力机制中首先将查询向量(query)与键向量(key)进行点乘运算。具体来说,在这种情况下,并非所有维度上的信息都是等价可比的。因此我们需要引入一种能够有效提取关键特征的方法来进行归一化处理。具体而言,在这个机制中我们采用了一种基于分位数的方法来确定权重系数。

- NLP中的例子: 在此输入中,“Query”为"爱",“我不爱你”则包含四个键值对:key1到key4及其对应的值域分别为Value1至Value4。

计算以下四个key向量:爱我、不爱、爱你;接着应用Softmax函数对结果进行归一化处理;最后将各部分按照权重相乘后再相加得到最终的attention value;其中权重a1到a4分别为0.7、0.1、0.1、0.1等值,并且它们的总和等于1。
这种方法通过点乘等三种相似性方法计算得出的结果作为相似度评估指标。

3.3. Transformer中的注意力
- 比如现在Thinking和Machines两个词,对应的向量是 \boldsymbol x_1 和 \boldsymbol x_2,当然是加上位置编码之后的向量(4维)。如何获取到 \boldsymbol {Q, K, V} 这3个向量,很简单:
- \boldsymbol x_1 乘以一个\boldsymbol W^Q 的矩阵得到 \boldsymbol q_1;\boldsymbol x_1 乘以一个\boldsymbol W^K 的矩阵得到 \boldsymbol k_1;\boldsymbol x_1 以一个\boldsymbol W^V 的矩阵得到 \boldsymbol v_1:
\begin{aligned} \boldsymbol q_1 &=\boldsymbol x_1 \boldsymbol{W}^{Q}, \left(\boldsymbol x_1\in \mathbb{R}^{1 \times E}\times \boldsymbol{W}^{Q} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{Q} \in \mathbb{R}^{ 1 \times H}\right) \\ \boldsymbol k_1 &=\boldsymbol x_1 \boldsymbol{W}^{K}, \left(\boldsymbol x_1\in \mathbb{R}^{1 \times E}\times \boldsymbol{W}^{K} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{K} \in \mathbb{R}^{1 \times H}\right) \\ \boldsymbol v_1 &=\boldsymbol x_1 \boldsymbol{W}^{V}, \left(\boldsymbol x_1\in \mathbb{R}^{1 \times E}\times \boldsymbol{W}^{V} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{V} \in \mathbb{R}^{1 \times H}\right)\tag{4} \end{aligned}
其中每个词的Embedding 的维度为E(也就是这里的4),每个注意力头的输出维度为H(也就是这里的3)。
- 同理:使用的是同一套参数,相应的 \boldsymbol X_2 也是一样,如下:
\begin{aligned} \boldsymbol q_2 &=\boldsymbol x_2 \boldsymbol{W}^{Q}, \left(\boldsymbol x_2 \in \mathbb{R}^{1 \times E}\times \boldsymbol{W}^{Q} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{Q} \in \mathbb{R}^{ 1 \times H}\right) \\ \boldsymbol k_2 &=\boldsymbol x_2 \boldsymbol{W}^{K}, \left(\boldsymbol x_2 \in \mathbb{R}^{1 \times E}\times \boldsymbol{W}^{K} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{K} \in \mathbb{R}^{1 \times H}\right) \\ \boldsymbol v_2 &=\boldsymbol x_2 \boldsymbol{W}^{V}, \left(\boldsymbol x_2 \in \mathbb{R}^{1 \times E}\times \boldsymbol{W}^{V} \in \mathbb{R}^{E \times H} \Rightarrow \boldsymbol{V} \in \mathbb{R}^{1 \times H}\right)\tag{5} \end{aligned}
为实现并行化处理,
通过构造矩阵X(由向量x₁和x₂按行排列组成),其维数为X∈ℝ²ˣᴱ(如图所示中E=4)。其中,
\boldsymbol Q = \boldsymbol X \boldsymbol{W}^{Q},
(其中\boldsymbol X \in \mathbb{R}^{2 \times E}与\boldsymbol{W}^{Q} \in \mathbb{R}^{E \times H}相乘得到\boldsymbol Q \in \mathbb{R}^{2 \times H})\boldsymbol K = \boldsymbol X \boldsymbol{W}^{K},
(其中\boldsymbol X同上定义,则\boldsymbol K =\boldsymbol X\boldsymbol{W}^{K}\in\mathbb{R}^{2\times H})\boldsymbol V =\boldsymbol X\boldsymbol{W}^{V},
(其中\boldsymbol V同样属于ℝ²ˣᴴ空间)如上所示。(见公式6)

基于此前提下进行如下计算,在输入中每个词与其自身及其它词之间生成关联权重:
\boldsymbol S=\operatorname{softmax}\left(\frac{\boldsymbol Q \boldsymbol K^{\top}}{\sqrt{d_{k}}}\right) \tag{7}
随后进行相似性计算以获得attention值:通过获取\boldsymbol {Q, K, V}这三个矩阵后,在计算\boldsymbol Q与\boldsymbol K之间的相似性时获得score值,并将其数值除以\sqrt{d_{k}}(为什么选择这个值?当将\boldsymbol Q \boldsymbol K^{\top}相乘后所得数值非常庞大,在应用softmax函数进行反向传播时会导致梯度过小的问题容易出现梯度消失的情况;因此选择除以这个值而不选择其它数值是为了维持方差控制在1的状态。这一做法参考了Dasou公众号《NLP从入门到放弃》的具体说明)。

- 因此有 \boldsymbol S \in \boldsymbol R^{2 \times 2},该矩阵表示输入数据中每个词和自身及其他词的关系权重,每一行的得分之和为1。基于该得分即可得到,每个词在当前上下文下的新的向量表示,公式如下:
\boldsymbol Z = \operatorname{Attention}(\boldsymbol Q, \boldsymbol K, \boldsymbol V)=\boldsymbol S \boldsymbol V\tag{8}
- 得到向量 \boldsymbol Z 向量之后,它会被送到Encoder的下一个模块,即前馈神经网络 ,这个全连接有2层,第一层的激活函数是ReLU,第二层是一个线性激活函数,可以表示为:
\mathrm{FFN}=\max \left(0, \boldsymbol {Z} \boldsymbol {W}_{1}+\boldsymbol{b}_{1}\right) \boldsymbol{W}_{2}+\boldsymbol{b}_{2}\tag{9}
论文中两层全连接的中间隐层单元数都为2048


在实际操作中运用矩阵运算确实带来了极大的便利性与效率性!值得注意的是,在实际操作中我们将其称为"多头"机制,在本案例中仅采用了单一参数组\boldsymbol W^Q、\boldsymbol W^K、\boldsymbol W^V来进行运算。这种"多头"机制的本质是运用了多个独立的参数组分别提取查询(Query)、键(Key)与值(Value)信息。如图所示2所示,在这种情况下我们实际上只建立了一个完整的注意力计算过程而不像其他情况那样会有多组独立的参数参与运算。

- 多个头就会有多个输出,最后需要合在一起输出,如下面是2个头。

- 多头注意力机制: 即 h 个自注意力的集成方式(如上图中2个,在图中8个),本研究采用 h=8 进行说明。
- 多头注意力机制的输出过程分为以下三步:
- 首先通过输入数据 \boldsymbol X 到下文所示的8个自注意力层中进行计算操作,
得到8个加权后的特征矩阵 \boldsymbol Z_i \in \boldsymbol R^{2 \times 3}(其中 i \in\{1,2, \ldots, 8\})。

- ② 通过将8个\boldsymbol Z_i按列组合成一个大的特征矩阵\boldsymbol Z_{\text {tmp}}(尺寸为\boldsymbol R^{2 \times 24}),并可查看下方的第二幅图;

- ③ 输入特征矩阵\mathbf{X}经过 单层全连接神经网络 处理后得到最终输出结果\mathbf{Z} = \mathbf{Z}_{\text{tmp}} \mathbf{W}^o。其中\mathbf{Z}_{\text{tmp}}分别为二维矩阵(2×24),而权重矩阵\mathbf{W}^o为24×4维度。

- 具体多头注意力机制全过程如下:

请特别注意:与自注意力机制相似地,在multi-head attention中也采用了短切机制。
四. 残差和layerNormal
首先介绍 残差 和 LayerNormal 的大致工作流程。输入词向量 \boldsymbol x_1 和 \boldsymbol x_2 接受位置编码处理后进行对位相加操作,在经过自注意力层生成输出结果 \boldsymbol z_1 和 \boldsymbol z_2 后(注意:这里应为\boldsymbol z_1 和 \boldsymbol z_2),我们将这两个输出结果整合为矩阵形式\boldsymbol Z。随后将原始输入向量\boldsymbol X直接引入并与其矩阵形式\boldsymbol Z进行按位相加操作作为最终残差连接的结果,并由LayerNormal对其进行标准化处理。

4.1. Layer Normalization
经典面试题:采用Layer Normalization而非Batch Normalization的原因是什么?
在NLP领域中,绝大多数任务基于Transformer架构设计,并非广泛采用Batch Normalization(BN),相反地,Layer Normalization(LN)已成为更为普遍的操作。
简述BN操作在特征处理中的作用。我们知道,在机器学习模型中进行特征缩放(Feature scaling)是为了消除不同特征之间的量纲差异,使得不同尺度的特征能够以更加公平的方式被模型处理,并且这种处理方式有助于加快模型的整体收敛速度。

- BN的核心在于对同一维度的全批样本进行标准化处理。
- 在图中展示了多个样本数据集\boldsymbol X^1, ..., \boldsymbol X^R。其中每个维度代表不同的属性。
- 对于一个批次的数据,在实际应用中我们通常会对每个特征分别进行标准化处理。例如,在NLP任务中会分别对各个单词的位置编码、词嵌入等特征进行归一化。
- 这使得BN在理解数据分布上相对简单。

-
BN的优点:
- 主要在于能够有效解决内部协变量偏移的问题。
- 其次要优点是通过缓解梯度饱和现象(当使用sigmoid激活函数时),从而加速模型的收敛速度。
-
BN的主要缺陷:
-
第一个问题在于当batch_size较小时(即单个批次中的样本数量较少),模型的表现会显得不够理想(因为该批次内样本计算出的均值与方差无法真实反映整个数据集的真实均值与方差)。
-
另一个主要问题是BN在处理RNN时效果不佳。这种现象的原因与其主要原因相似(即批归一化对动态变化的序列数据处理能力不足),不过为了明确起见单独进行了说明。
-
举例说明这种情况:假设有两个批次输入给模型进行训练:
- 第一个批次包含10个样本,在这10个样本中前9个样本的输入句子长度均为5个单词(即它们共享相同的输入序列长度),最后一个样本却有着较长的20词句子。
- 这样在处理过程中,在输入第6到第20个单词时(即每个句子长度超过5词的部分),模型只能依赖最后一个样本的数据来进行归一化操作(因为前9个样本在此位置上没有对应的数据支持)。这种不均衡的数据分布导致了归一化效果变差。

- 为何选择层归一化(Layer-Norm)?以前面所述为例,在最后一个句子中包含20个单词时,其作用体现在对这20个单词进行了标准化处理以计算其均值和方差。
- 层归一化通过将整个样本的所有单词统一进行标准化处理实现了对每个位置特征的有效归一化。
请看这张图:
在同一位置上进行均值和方差计算操作。例如,在"我爱中国共产党"这个短语中,
"我爱中国共产党"这一组词语对应的是一个语义信息,
"AI与语音信息天元点"则是对应的语音信息。
同样地,
在计算过程中,
身高变量会单独计算其标准差,
体重变量也会单独计算其标准差。
观察上图BN层的工作原理时发现,
在计算过程中身高与体重分别计算其各自的标准差。
而LN层则对整个句子中的每个词向量进行统一归一化处理。

五. 前馈神经网络
位于该图最顶端的是前馈神经网络模型。其中,在经过两个连续的全连接层之后,接着经过了一个残差模块与归一化处理。整个过程属于Encoder模块。
- 如果我们可视化向量、layer-norm以及前馈神经网络操作,将如下所示:

在编码器部分和解码器部分都采用了类似的架构设计,在编码器中同样地,在解码器中也是如此基于两层编码器与两层解码器组成的Transformer架构 ,其具体结构如图所示:

特别需要注意的是,在解码器部分中,默认情况下Transformer block相较于编码器多配置了一个Encoder-Decoder Attention组件。具体而言,在Encoder-Decoder Attention模块中,“Query”的向量来源于解码器层的前一层输出结果,“Key”与“Value”的向量则均来源于与编码器相关的输出信息。“Query”的提取过程遵循相同的计算流程(如图10所示)。
六. Decoder
本节主要介绍基于自注意力机制的Transformers及其在机器学习中的应用。

现在我们已经深入学习了编码器部分的相关概念,并对解码器的工作原理有了基本认识。
在解码器端的应用中,请查看以下内容。
编码器从接收并处理输入序列开始。
在解码器端的应用中,请参考上一节提供的图形信息。

流程会持续进行直至遇到特定标记。每个阶段的结果会被传递给后续处理单元。与编码器处理输入的方式相似,在解码阶段也会对输入数据进行位置向量的添加。

- 下面是Decoder部分,重点讲解一下1(掩盖多头注意力机制)和2(交互层,比encoder多了1层)两部分。

6.1. 掩盖多头注意力机制
在机器翻译领域中,在解码过程中遵循顺序操作的原则。具体而言,在处理第k个编码器输出时(即当解码第k个特征向量时),我们仅能访问到前一个及之前的所有编码器输出(即第k-1及其之前的解码结果)。该领域的研究者将其命名为遮蔽多头注意力机制(masked multi-head attention)。
- 从代码层面而言,在处理文本时需对当前单词及其后续单词施加mask操作以确保隐私保护。
- 为什么要实施mask?举例来说,请看以下内容:这里S代表输入序列的起始start标记,在真实场景中应呈现完整的人工智能对话如下:"I love you now"。

- \text S 输入后得到 \text I;接着进行 teacher forcing操作(teacher for thing),将 \text I 作为下一个时刻的输入信号;经过多次迭代后,在解码器中通过与编码器通信生成 \text {LOVE};依次类推……这是一个机器翻译的过程。
为什么需要mask?在训练过程中(training stage),当解码器开始预测 "YOU" 的时候(decoding stage),仍然可以看到后续生成词的信息(ground truth)"I love you now" 这些词会对模型的学习产生帮助作用。但在预测阶段(inference stage),即生成阶段时,在解码器中不会知道未来的真实输出信息(output sequence)。如果不对 "you" 和 "now" 进行遮蔽处理(masking),模型在训练过程中会看到这些后续单词的信息;但在实际预测过程中却无法访问这些信息。
因此,在训练阶段我们需要对 "you" 和 "now" 这两个单词的信息进行遮蔽处理(masking),从而确保训练过程与解码器预测阶段的信息流动保持一致。这样一来,在生成阶段中就不会泄露未来的 ground truth 信息给模型参考。

6.2. Decoder Layer动画(对话聊天机器为例)
- Decoder Layer动画


6.2.1. Decoders First Multi-Headed Attention
让我们深入探讨解码过程:
从架构设计的角度来看,
解码器的起始部分与编码器具有高度相似性。
输入数据首先经过嵌入层(embedding layer)进行表示,
并结合位置编码层(positional encoding layer)
获取位置信息。
经过位置编码处理后的位置信息被引入第一个多头注意力机制中,
在此过程中,
该机制负责计算并整合解码器输入序列的相关注意力权重。




- Transformer 完全图解指南:https://mathpretty.com/15534.html
6.3. 交互层
- 观察图形可以看到这是一个典型的多头注意力机制,请问其工作原理是什么?查看下图以了解其具体实现:每个Decoder与所有Encoder的输出进行交互。

通过查看下图理解具体交互操作后可知:当前系统中有两个编码器结构,它们的输出结果分别得到\boldsymbol{K,V}矩阵.值得注意的是,编码器部分所生成的正是\boldsymbol{K,V}矩阵,而解码器则负责产生\boldsymbol{Q}矩阵.在多头注意力机制中必定包含这三个关键矩阵:\boldsymbol{Q}、\boldsymbol{K}和\boldsymbol{V}.这些矩阵在信息整合时会通过特定的方式进行计算和处理以实现最终效果.

简要回顾整个流程后发现,在解码器运行过程中,“\boldsymbol {K, V}矩阵的输出通过虚线进行表示”。具体来说,在第一个解码器执行多头注意力机制时,“与解码器内部的Q向量进行交互”。第二个解码器同样遵循这一模式。

七. 参考
- Illustrated Guide to Transformers
- Illustrated Guide to Transformers(油管视频) :https://www.youtube.com/watch?v=4Bdc55j80l8
- This Post Is All You Need(上卷) :https://zhuanlan.zhihu.com/p/420820453
- Self-Attention and Transformer:https://luweikxy.gitbook.io/machine-learning-notes/self-attention-and-transformer
- dashou博主制作的视频 :https://www.bilibili.com/video/BV1Ey4y1874y?p=6&spm_id_from=pageDriver
- 国外大神制作的精美图分析(英文) :https://jalammar.github.io/illustrated-transformer/
- 国外大神制作的精美图分析(中文) :<>
- 放弃幻想全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较
https://zhuanlan.zhihu.com/p/54743941- Transformer简要介绍:<>
- Transformer论文与PyTorch源码解读:https://www.pianshen.com/article/3013330708/
- 详细解析Transformer:从注意力机制到其应用(Attention Is All You Need):https://zhuanlan.zhihu.com/p/48508221
7.1. OneFlow-从头理解与编码LLM的自注意力机制
*OneFlow-从零开始深入解析LLM的自注意力机制
*深入解析LLM中的自注意力机制及其相关注意类型:Self-Attention、Multi-Head Attention、Cross-Attention和Causal-Attention

