读文献-1

本文最后更新于 2026年10月19日 晚上

论文名称:Attention Is All You Need

阅读日期:2026.10.17-18

所属方向与编号:通用基础论文-01

来源:[1706.03762] Attention Is All You Need

  1. 这篇论文要解决什么问题?

  论文针对 RNN/LSTM/GRU 编码器-解码器架构“隐状态必须逐步计算、无法并行”的固有瓶颈,以及此前注意力总是依附于 RNN 的局面,提出了完全基于注意力(不含循环与卷积)的 Transformer:在 WMT14 翻译上以远低于竞争模型的训练成本刷新 BLEU SOTA,并在句法分析上验证了架构的通用性,同时展望了向多模态的扩展。

  1. 输入和输出分别是什么?

输入:源语言符号序列 $(x_1,…,x_n)$(经 BPE/word-piece 编码的 token 序列)
输出:目标语言符号序列 $(y_1,…,y_m)$,解码器以自回归方式逐个生成,每步消耗之前已生成的符号(输出整体右移一位)

  1. 整体流程是什么?各模块分别做什么?

  ①,输入矩阵 X ,X为原句通过BPE进行分切 + 位置编码。本文位置编码采用正弦和余弦函数(本文使用了正弦版本),通过该函数可以让模型通过该方法更容易学习(因为不包含了卷积和递归,必须注入一些关于序列中标记的相对或绝对位置的信息)。

  ②,编码器 将 X 映射为 Z 。

编码器由N=6个的相同层(2个自层)堆叠组成,第一个是多头自注意力机制(Attention),二是一个简单、位置感知的全连接前馈网络(FFN)。

注意:每个子层后面跟了一个 残差链接,每个子层的输出是 LayerNorm( x + Sublayer(x)) ,其中 Sublayer(x) 是子层本身实现的函数。这6层可以同时并行计算。

  ③,训练阶段: 解码器输入 Y (正确答案左边加上 < BOS >,然后处理方式和 X一样,进入解码器),

除了和编码器一样的2个子层,又新增了一个Masked 多头自注意力机制 的子层,——> 每个位置只能看到自己及其之前的,他是第一层。第二层,上一层的输出Q和编码器的输出 Z (相当于解码器的 记忆库 K,V),输入本层多头自注意力机制,然后进入第三层 FFN

最后,输出: Linear + softmax

推理阶段的解码器,输入 < BOS >,然后进行 <BOS> ──→ y₁ → 喂回 → y₂ → 喂回 → ... → <EOS>

Q、K、V 不是凭空来的,而是由输入 X 分别乘以三个可学习的权重矩阵 $W^Q$、$W^K$、$W^V$ 得到的


关于注意力函数:

  缩放点积注意力:输入由维度 $d_k$ 的查询和键,值为 $d_v$ 组成,,将每个点积除以 $\sqrt{d_k}$ , 之后进行 softmax 处理,乘以 V 之后输出一个矩阵($m \times d_v$),它落在被关注向量张成的空间区域附近, 方向主要偏向注意力权重大的那些 V 向量

  多头注意力机制:将查询、键、和值线性投影h 次,分别映射到$d_q , d_k , d_v$ 维,分别对他们并行执行注意力函数,生成 $d_v$ 维

关于遮罩层:

  在训练时,遮罩层在注意力函数中表现为:当第 $k$ 个位置被看到时,其他 $k+i$ 的位置不允许看到(即设置为 $-\infty$),如下矩阵

1
2
3
4
5
6
7
8
           K 的位置(被看的)
1 2 3 4
Q 1 [ 0, -∞, -∞, -∞ ]
的 2 [ 0, 0, -∞, -∞ ]
位 3 [ 0, 0, 0, -∞ ]
置 4 [ 0, 0, 0, 0 ]
↑ 左下三角(含对角线)= 0,允许看
↑ 右上三角 = −∞,禁止看

  在推理时,遮罩层仍然存在,他并不是防止看到未来,因为根本没有未来可看,如下原因:

  • 代码统一,同时加上并不影响整个模型
  • 在批处理时,作为填充,因为虽然每一个单条序列是串行的,但是批处理中的每个序列不可能严格一致前进,因此会造成矩阵的不规范,使用masked的同时可以填充一致

关于注意力的运算方式:

  语义相似度恰好被编码为向量方向的接近程度,而点积正是度量方向接近的几何工具。最后乘 V,是因为 softmax 之前的一切只解决了“该从哪里、各拿多少”的计划问题,而真正的信息只存在 V 里,乘 V 的加权平均把计划兑现为交付。

有个例子:

1
2
你手里先有一张购物清单(矩阵 A),执行采购(乘 V)后变成一袋商品(矩阵 B)
两者都可以列成表格,但"表格里装的东西换了",你不能因为“都是表格”就说采购这一步没意义。

关于并行

  并行算出每个位置的输出和 loss,只是前向计算。训练是用这些 loss 的梯度去调整一套共享参数,让模型学会“在任意位置、根据可见历史预测下一个 token”。训练阶段,完整目标序列已知,解码器输入是右移的真实目标序列,因此所有位置可以一次性输入并并行计算输出和 loss;因果 mask 保证每个位置只能看到历史,不能看到未来。推理阶段没有完整目标序列,位置 $t$ 的输入依赖模型上一步的输出,因此只能从 <bos> 开始串行自回归生成。


项目 训练阶段 推理阶段
源序列编码 一次并行编码 一次并行编码,后续复用
目标序列输入 右移的真实目标序列 已生成的历史 token
解码方式 并行计算所有目标位置 自回归逐步生成
解码器自注意力 mask 因果 mask + padding mask 当前 token 只能看历史;KV Cache 下自然因果
交叉注意力 Q 目标长度 T 当前解码步 / 当前 token
交叉注意力 K/V 编码器输出$H^{enc}$ 同一份 $H^{enc}$ 复用
是否知道未来目标 token 知道,但被因果 mask 禁止看 不知道,不能看
损失 对每个目标位置算交叉熵 不算训练损失,按解码策略选 token
并行性 解码器可并行 解码器串行逐步

名词解释:

  Byte Pair Encoding(BPE):是一种简单的数据压缩算法。他的编码方式能大大减小token list,核心思想:BPE每一步都将最常见的一对相邻数据单位替换为该数据中没有出现过的一个新单位,反复迭代直到满足停止条件。

  SOTA:State of the arts 的缩写,指的是在某一个领域做的Performance最好的model,一般就是指在一些benchmark的数据集上跑分非常高的那些模型。

SOTA model:并不是特指某个具体的模型,而是指在该项研究任务中,目前最好/最先进的模型。
SOTA result:指的是在该项研究任务中,目前最好的模型的结果/性能/表现。

  n-gram:是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。

每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。

该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。

=======>>> 自然语言处理中N-Gram模型介绍 - 知乎

  BLEU(Bilingual Evaluation Understudy): BLEU是一种用于评估机器翻译结果质量的指标。它主要侧重于衡量机器翻译输出与参考翻译之间的相似程度,着重于句子的准确性和精确匹配。BLEU通过计算N-gram(连续N个词)的匹配程度,来评估机器翻译的精确率(Precision)。

  ROUGE(Recall-Oriented Understudy for Gisting Evaluation): ROUGE是一种用于评估文本摘要(或其他自然语言处理任务)质量的指标。与BLEU不同,ROUGE主要关注机器生成的摘要中是否捕捉到了参考摘要的信息,着重于涵盖参考摘要的内容和信息的完整性。ROUGE通过计算N-gram的共现情况,来评估机器生成的摘要的召回率(Recall)。




论文名称:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

阅读日期:2026.10.19

所属方向与编号:通用基础论文-02

与本文最相关的工作的模型:[1911.03584] On the Relationship between Self-Attention and Convolutional Layers

  1. 这篇论文要解决什么问题?

  Transformer 已是 NLP 的标准架构,但在计算机视觉领域始终无法取代 CNN。此前的做法要么把注意力与卷积混合使用,要么用局部注意力、轴向注意力等特殊设计替代卷积,而这些特殊设计难以在现代硬件(TPU/GPU)上高效扩展。

Q:CNN 的归纳偏置(局部性、平移等变性、2D 邻域结构)对图像识别是不是必需的?能否用完全不带这些先验的标准 Transformer 直接做图像分类?

A:可以。只要预训练数据足够大(14M–300M 张图),大规模数据训练可以战胜归纳偏置(large scale training trumps inductive bias)——模型能从数据中自己学出 CNN 里靠结构硬编码的空间规律。

  1. 输入和输出分别是什么?

输入: 一张图像 $x ∈ ℝ^{H×W×C}$(如 224×224×3),经过预处理后变成一个 token 序列,长度为 N+1

  1. 原始图像张量

    一张输入图像表示为三维张量:

    $x∈R^{H×W×C}$

    • H × W:图像分辨率(3 通道 RGB,故 C = 3)
    • C:通道数

    此时它还是 2D 网格结构,Transformer 无法直接处理。

  2. 分切为 patch ,图像到序列的关键转变

  把图像按 P × P 的固定窗口(如 16×16,本文的名字由此而来)切成不重叠的小块,共得到:$ N=\frac{H \times W}{P^2}$个 patch

  然后:将每个 patch 展平成一维向量,得到序列:$x_p∈R^{N×(P^2⋅C)}$

  切分和展平后,patch 的 2D 邻接关系在形式上消失了——每个 patch 只是序列中的一个 token,空间结构信息后续完全靠位置编码和注意力学习

  1. 线性投影,Patch Embedding

  Transformer 内部所有层使用统一的隐向量维度 D,因此需要把每个 $P^2 · C$ 维的展平 patch 映射到 D 维:

$$E∈R^{(P^2⋅C)×D} , x_pE∈R^{N×D}$$

  • E 是可训练的线性投影矩阵,随模型一起学习

  这一步在数学上完全等价于一个 kernel = stride = P = 16、输出通道 = D 的卷积层。这一步的输出称为 patch embeddings,每个 patch 对应一个 D 维 token 向量,地位与 NLP 中的词嵌入(word embedding)完全对等。

  1. 拼接 [class] Token + 加位置编码

  (a). 拼接 [class] Token : 额外引入一个可学习的 D 维向量:$z_0^0 = x_{class}∈R^D$

把它拼接在patch embedding 的最前面,得到序列:

$$z_0=[x_{class} ; x_p^1 E ; x_p^2 E ; ⋯  ; x_p^N E ] ∈ R^{(N+1)×D}$$

  它的作用:提供一个固定的“信息汇聚点”——在自注意力层中它不断从所有 patch 吸收信息,其最终输出 $z_L^0$ 将作为整张图的表征送入分类头。

  (b). 加上位置编码: 因为自注意力是置换不变的,将所有 token 打乱,输出完全不变。例如:不额外处理,模型无法区分“天空 patch 在上、草地 patch 在下”还是反之。解决:加一个与序列等长的可学习位置编码矩阵:

$$E_{pos}∈R^{(N+1)×D} , 最终输入=z_0+E_{pos}$$

  • 每个 token(含 class token)分配一个专属的位置向量,逐元素相加(不是拼接)
  • 采用标准 1D 可学习编码即可。注意 patch 被按行优先(raster order)排成一维序列

输出:

  1. 核心输出(图像表征):[class] token 在最后一层的状态,经 LayerNorm:

    $$y = LN(z_L^0) \in \mathbb{R}^D$$

    即整张图的表征向量(ViT-Base 时 D = 768,由表 1 的 Hidden size 代入)。

  2. 任务输出:y 接分类头 → K 个下游类别的 logits(softmax 后为类别概率)

    • 预训练时分类头 = 单隐层 MLP
    • 微调时整个预测头被替换为单线性层(D×K),且零初始化

1. “y 接分类头”是什么意思?

“接”就是连接、后面跟着的意思。意思是:把向量 y 作为分类头的输入,分类头对它做一次运算,产生最终预测。
用流程画出来:

1
2
y(768维向量)──→ [分类头] ──→ K维预测结果
图像表征 一层网络 类别得分

分类头本质上就是一个矩阵乘法(微调时):拿 768 维的 y 乘上一个 768×K 的矩阵 W,得到 K 维输出。就这么多——它是整个模型里最简单的部件。


2. 什么是“图像表征”(image representation)?

表征(representation)= 用一个向量来“代表”整张图。
问题是:分类头只能处理固定长度的向量,而原始图像是 224×224×3 的大张量。所以需要把整张图的信息压缩成一个 768 维向量 y,这个向量里编码了“图里有什么、在哪里”等语义信息。

  • 两张相似的图 → 它们的 y 向量在空间中距离很近
  • 两张不同的图 → y 向量距离远
    可以把 y 理解为这张图的“数字身份证”。它本身还不是一个分类结果,只是“这张图的内容摘要”。class token 经过所有 Transformer 层后承担的正是这个角色——它通过注意力把 196 个 patch 的信息都吸收进了自己。

3. 什么是 logits?

logits = 分类头输出的 K 个原始分数(未归一化)。
具体来说:

1
y(768维) × W(768×K) = logits(K维)

举例:ImageNet 有 1000 类,那么 logits 就是 1000 个数字,比如:

1
2
3
[2.3, -1.7, 0.5, ..., 4.1]
↑ ↑
第0类的分数 第999类的分数
  • 分数越大 → 模型认为图越可能是这一类
  • 上例中第 999 类分数最高(4.1)→ 模型预测它是第 999 类
    为什么叫 logits 而不直接叫概率? 因为这些分数可以是任意实数(负数、大于 1 都行),还没归一化。要变成概率需要再加一步 softmax:
1
2
logits(任意实数) ──softmax──→ 概率(0~1之间,总和=1)
[2.3, -1.7, ...] [0.12, 0.001, ...]

训练时用交叉熵损失直接作用于 logits;推理时取 logits 最大的那个类作为预测结果。


4. 什么是“下游类别数”K?

下游(downstream)= 预训练之后的实际应用任务。这是“预训练 + 微调”范式的术语:

  • 上游/预训练:先在海量数据(如 JFT-300M,18000 类)上训练,学通用视觉知识
  • 下游:之后应用到具体任务上,比如想做一个“猫狗分类器”或“100 种花分类器”
    下游类别数 K = 具体任务有几个类别:
任务K
ImageNet 分类1000
CIFAR-100100
猫狗二分类2
眼底图像病变 5 分类5

  关键设计:预训练时的分类头是针对预训练类别数(如 18000)的,换任务时把整个头扔掉,换一个全新的 D×K 线性层(K 由任务决定),重新微调。这就是为什么论文说分类头“微调时是 D×K”——K 是可插拔的,随任务而变。


5. “输出不是类别吗?”

其实最终输出就是类别,只是中间多了一步。完整链条是:

1
2
3
4
5
y(768维表征)
↓ × W(D×K 分类头)
logits(K个分数)
↓ argmax(取最大值的位置)
类别 ✅

论文里分开说“表征”和“分类头”,是因为预训练+微调范式中:

  1. y(表征)才是预训练真正想学的东西——它是可迁移的通用知识。预训练的目的是得到好的 y;
  2. 分类头只是临时的“读出层”——每换一个任务就换一个新的头。它几乎不含可迁移知识(微调时甚至是零初始化的,从头学)。
    打个比方:

    y 像是学生的综合能力(预训练培养),分类头像是某场具体考试的答题卡(每次考试换一张)。预测出“类别”= 用能力填好答题卡得出答案。论文说“输出是 y + 分类头”,是在描述这套可复用的机制;实际用的时候,最后一步自然会给出类别。
    所以对图像分类任务来说,完整输出链就是:图像 → y 表征 → logits → 类别。论文笔记里分开写“表征”和“logits”,只是为了说明哪部分是可迁移的、哪部分是任务专属的。

  1. 整体流程是什么?各模块分别做什么?

读文献-1
http://one-and-one-fourth.github.io/2026/10/17/研究生/读文献记录/
作者
一又四分之一
发布于
2026年10月17日
更新于
2026年10月19日
许可协议