异度部落格

学习是一种生活态度。

0%

Transformer 101

Transformer 模型概述

Transformer 是一种在自然语言处理(NLP)任务中广泛使用的深度学习架构。它由 Google 于 2017 年在Attention Is All You Need 论文中提出,旨在解决序列到序列(seq2seq)任务中的长期依赖问题,同时提高了处理效率。如今,Transformer 不仅在 NLP 领域得到了广泛应用,还被迁移到计算机视觉(CV)领域,成为如 GPT、Llama 等大语言模型的基础。

简单来说,如果把 Transformer 模型看作一个黑盒,比如在机器翻译应用中,输入是一个字符串,输出也是一个字符串。

c7bdf3a07679877c3f3d1aa525a96ce6.png

Transformer 模型结构

Transformer 由多个编码器(Encoder)和解码器(Decoder)层堆叠而成。

dabfe2b6722a705b631358237cb89ed3.png

编码器结构(Encoder)

编码器由多个相同的层构成,每一层包含自注意力机制和前馈神经网络。这些层之间的权重并不共享。

fd214e6266322b0f63c70a6b30c8dc10.png

在 NLP 中,模型首先将输入的单词转化为向量表示,这个过程称为 Embedding。每个单词被转化为一个固定维度(如 512 维)的向量。随后,向量会经过多个编码器层处理,每一层的输入是上一层的输出。

7b2fc29f0a943b57560a2d223b6ab2fb.png

自注意力机制(Self-Attention)

自注意力机制让模型在处理某个单词时,可以参考输入句子中的其他单词。比如在句子“The animal didn't cross the street because it was too tired”中,模型需要判断 "it" 指的是“animal”而不是“street”。自注意力机制帮助模型理解句子中各个单词之间的关系。

f77176719fbaa7ca762e63d078eb92d0.png

Self-Attention 的计算过程

  1. 计算 Query、Key、Value 向量:对每个输入向量,分别通过不同的权重矩阵计算 Query(Q)、Key(K)和 Value(V)。 c953d80bbec745bf7e750acf82efac3e.png
  2. 计算每个单词与句子中其他单词的相似度,即通过点积得到每个单词对其他单词的 score。 5b2d6239543187dc850a98668ab23478.png
  3. 缩放 score:为了稳定梯度,将 score 除以向量维度的平方根。 9df948f201fa629bc5134d1e2ceee269.png
  4. Softmax 归一化:将缩放后的 score 转化为概率分布。 51d74dd37ee960302975b8241a78cadd.png
  5. 加权求和:将 Softmax 结果与 V 向量相乘,得到 Attention 输出。 33cec7906ac56ece0fa905fb71c9e644.png

实际计算中,这些操作通过矩阵运算并行处理,使得计算更高效: ac525e5d884f11b47cb1970aa7f3cb74.png 7549a203905f3b92eb850d8d53734c7a.png

多头注意力机制(Multi-Head Attention)

Transformer 提出了多头注意力机制来增强模型的表现。多头注意力允许模型从不同的角度处理同一句话的信息。通过多个注意力头(如 8 个),模型可以并行计算多个注意力矩阵,捕捉到更多的上下文信息。

5f692a28d6f9d3505ccb8d75ac27a803.png

最后,多个注意力头的输出会拼接起来,通过一个线性层压缩为单个矩阵,便于后续处理。 9a89004ed0f8523e612b35e8d8c24ec8.png

位置编码(Positional Encoding)

由于自注意力机制本身没有考虑到单词的顺序,Transformer 引入了位置编码,为每个词嵌入向量添加位置信息。位置编码可以帮助模型理解词语之间的相对顺序。

cda64e0fb8f0e248b1f41be65b8c81fe.png

残差连接(The Residuals)

每个编码器子层(如自注意力和前馈神经网络)都包含一个残差连接,也就是将输入绕过子层,与输出相加。这一机制帮助防止梯度消失问题,并通过层归一化(Layer Normalization)提高模型的数值稳定性。

6820659f6fbb8941ebfb90a9f6e3de16.png

解码器结构(Decoder)

解码器结构与编码器类似,由多层堆叠而成。解码器有一个独特的“编码器-解码器注意力”层,帮助解码器根据编码器的输出,参考输入序列,生成合理的输出。

f457bd6dec5913355eb082912f657885.gif

解码器在生成每个单词时,只能参考之前生成的单词,未来单词的信息会被遮蔽。这通过“遮盖机制”实现,确保模型不会看到将来要生成的单词。

解码器最终通过线性层和 Softmax 将输出转换为概率,选出最可能的词汇。

6edbf11c9f26995f53b575f2f1b838ae.png

最后,我们再来看下论文中所绘制的 Transformer 整体模型架构。 b33db265c29eb4a55656384b9a382cb8.png

模型算力需求

训练 Transformer 模型的算力需求可以用以下公式估算:

1
C ≈ τT = 6PD
  • C 是总计算量,单位为 FLOPs。
  • P 是模型参数数量。
  • D 是数据集的大小(tokens 数量)。
  • τ 是硬件的总计算能力(如 GPU 数量和 FLOPs)。
  • T 是训练时间(秒)。

这些公式来源于 OpenAI’s scaling lawsDeepMind’s scaling laws

模型显存需求

模型权重

Transformer 模型大多使用混合精度训练(fp16 + fp32 或 bf16 + fp32),这可以有效减少显存占用。

每个参数所需内存如下:

  • int8:1 字节/参数
  • fp16bf16:2 字节/参数
  • fp32:4 字节/参数

通常还会有约 20% 的额外开销。

推理显存估算

推理时所需内存大约为:

1
Total Memory(Inference) ≈ 1.2 × Model Memory

训练显存估算

训练过程中所需的显存主要由以下部分组成:

  • 模型内存:fp32 模型需要 4 字节/参数,fp16 模型需要 2 字节/参数。
  • 优化器内存:AdamW 优化器通常需要 12 字节/参数,而使用像 bitsandbytes 的 8 位优化器可以将内存降至 6 字节/参数。
  • 梯度内存:fp32 梯度需要 4 字节/参数,fp16 梯度则为 2 字节/参数。
  • 激活内存:激活重计算可以减少内存开销,公式如下:

4734b6cfa9f179a7c3fb1634310bf077.png

总的来说,训练所需显存为:

1
Total Memory(Training) = Model Memory + Optimizer Memory + Gradient Memory + Activation Memory

参考资料