How Transformer LLMs Work
语言模型发展历史
Non-transformer-models -> Encoder-Only -> Decoder-Only -> Encoder-Decoder Models

典型的语言模型任务
- 从非结构化文本出发
- 经过语言 AI 模型处理
- 完成三类任务
- 文本生成
- Embeddings
- 分类任务
文本的 Embeddings 表示
Bag-of-Words
- 输入文本用空格来进行分割,得到一个单词数组
- 这个过程叫 Tokenization
- 单词数组称为 Tokens
- 所有 Unique 的 Tokens 集合称为 Vocalbulary
- Bag-of-Words:统计单词的频次,得到输入文本的树枝表示(Numeric Representation)
- Vocalbulary:[that, is, a, cute, dog, my, cat]
- Input1 向量表示: [1, 1, 1, 1, 1, 0, 0]
- Input2 向量表示: [0, 1, 0, 1, 0, 1, 1]
Vector Embeddings

- Bag-of-Words:不考虑文本的语义和上下文
- Word2Vec:通过 Neural Network 把单词的含义表示在 Vector Embeddings 中
- Neural Network 神经网络:
- 输入层、隐藏层、输出层
- 层与层之间有不同的连接权重 Weights
通过输入数据来训练 Neural Network,Word2Vec 学习到两个单词作为「邻居」同时出现的概率。

得到一个单词(比如 cats)的 Embeddings 数值表示,含义相近的单词距离较近。


输入单词、文本、文章经过 Tokenization 和 Word2Vec 得到对应的 Embeddings 表示。注意 Tokenizer 并不总是按照空格分割,比如 vocalization tokenization 后是 vocal + ##ization,这个原因是字典的规模是固定的。



Tokenizer Python 代码示例:
1 | from transformers import AutoTokenizer |
Python 代码输出:
1 | Vocab length: 28996 |
基于 Attention 的 Context Encoding/Decoding

- Word2Vec:是一个单词的静态 Embeddings
- RNN(Recurrent Neural Netowks):循环神经网络
- Encoder RNN:用来编码语言
- Decoder RNN:用来生成语言
- 左边的例子:英语 -> 荷兰语
自回归模型:利用变量过去的值来预测未来值的建模方法,核心思想是“用历史预测未来”。
在上面英语到荷兰语的翻译的案例中,每一个迭代过程会生成一个 Token,在下一个迭代会把历史升成的 Tokens 作为输入再去生成下一个 Token。


Context Embedding:单个 Embeding 难以表示长序列输入文本
Attention:模型聚焦在部分输入文本上,在特定的 Context 下调节 Embedings 权重
把 Attention 机制应用到 Decoder 阶段,我们可以用每个原始单词的 Embedding 作为输入,所有输入单词的 Embeddings 都传递给 Decoder。使用整个序列的 Embeddings 的方式会比单个 Context Embedding 获得更好的生成效果

Transformer 机制
Transformer 机制是在 「Attention is All you Need」论文中首先提出,仅仅基于 Attention 而不依赖 RNN 模型,这种机制通过在训练阶段的并行获得比 RNN 显著更高的计算效率,
- Transformer 包含多个 Encoder/Decoder
- Encoder 阶段用输入文本的 Attention 来更新序列的 Embeddings(Self-Attention),增加更多的上下文信息,通过前馈神经网络来获得输入序列的 Embedding
- Decoder 阶段采用类似 Encoder 阶段的 Attention 机制更新 Embeddings(Masked self-attention),不同之处在于会忽略 Attention 矩阵右上角的值,更新后的 Embeddings 会强化输入 Token 排在前面,这样在生成文本时进行信息剪枝


这种基于 Encoder-Decoder 的 Transformer 架构适用于语言翻译场景,在 2018 年提出的 Bert(Bi-directional Encoder Representations from Transformers)。Bert 是 Encoder-Only 架构,同样基于 Self-Attention 机制,用于生成输入文本的 Contextualized Embeddings,Bert 会额外用一个 「CLS Token」(或者叫 Classification Token)针对不同的语言任务类型进行 Fine Tune。

Bert 模型使用 Masked Language Modeling 机制来训练。首先从输入文本序列中随机 Mask 部分单词,使用模型来预估这些 Masked 的单词,通过解构 Masked 单词的过程来训练模型,整个过程包含两个步骤:
- 在大量数据上应用 Masked Language Modeling,这个过程称为 Pre-Training 预训练
- 针对不同的场景去 Fine-Tune 模型,包括 Classification、NER、Paraphrase Identification 等

生成式模型(Generative Models)机制有所不同,输入文本序列随机初始化一组 Embeddings,通过 Decoder-Only Transformer 来生成下一个单词。最早的实现称为 GPT-1(Generative Pre-Trained transformer),GPT 没有使用 Encoder。语言模型当前最常见的就是 GPT 代表的生成式模型和 BERT 代表的表征模型。

生成式模型在计算中存在 Context Length 约束,即模型处理 Token 的长度,GPT-1 的最大 Context Length 是 512,意味着模型在给定时间内仅能处理 512 Tokens,这里包含了 Output 中生成且后续追加到 Input 的 Tokens。

生成式模型随着参数规模的增加,逐步显现出 LLM(Large Language Model)的强大。参数规模从 GPT-1 的 117Millon -> GPT-3 的 175 Billion,随着参数规模增加模型能力逐步增强,

2022 年随着 ChatGPT 发布,生成式模型开始快速增长,包括各种开源的生成式模型,模型应用也开始爆发。

Transformer LLM 架构剖析
Transformer LLMs 可以基于 Prompt 来生成输出文本,文本生成每个迭代会输出一个 Token。Transformer LLM 架构主要包含三个部分:
- Tokenizer:输入文本到 Token & Embedding 表示,使用一个固定 size 的 vocalbulary 把输入拆解成多个 chunk。假设 vocalbulary 的 size 是 5w,那么对于每个输入 token 会通过 5w 维的向量来表示

- Transformer Blocks:Transformer 机制相比过往的 RNN 更为强大的其中一个核心在于并行,不同 token 的处理能高效并行;其次是首字 token generation 之后,新生成的 token 会 append 到输入 token 中,前面的 token 都可以利用上一轮 Cache 的计算来加速,这个 Cache 称为 KV Caching。

- LM Head:从 vocalbulary 中预测出不同 token 的输出概率分布,使用不同的 decoding strategy 选择出最终的 ouput token
- Greedy decoding:选择 token 概率最大,
temperature=0
- Top-P:从 Top-P 中选择,增加一些随机性,
temperature>0
,好处是输出文本更符合人的表达方式
- Greedy decoding:选择 token 概率最大,

Transformer Blocks
Transformer Blocks 链式处理流程,每个 Block 包含 Self-Attention 和 Feed Forward Neural Network 两部分:
Self-Attention:Attention 帮助模型去关注 Context 上下文,主要包含 Relevance Scoring 和 Combining Information 两部分,包含投影矩阵:Query、Key、Value 矩阵
- Relevance Scoring:Query Vector 和当前处理的 Token 相关,Keys Vector 和之前的 Tokens 相关,两者矩阵相乘得到不同单词的 Relevance Scores,所有 Scores 想加为 100%
- Combining Information:Values Vector 和每个 Token 相关,Relevance Scores 和 Values Vector 相乘得到加权 Values 矩阵,加权 Values 矩阵进行累加,得到 Attention 处理后的 Embedding
- Relevance Scoring:Query Vector 和当前处理的 Token 相关,Keys Vector 和之前的 Tokens 相关,两者矩阵相乘得到不同单词的 Relevance Scores,所有 Scores 想加为 100%
Feed Forward Neural Network:用 Neural Network 来预估输入序列的下一个单词,可以理解成基于训练数据把文本序列关系编码到模型参数中

Transformer Python 代码示例:
1 | from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline |
输出文本:
1 | Email to Sarah: |
基于 Prompt 生成单个单词:
1 | prompt = "The capital of France is" |
输出文本:
1 | Paris |
Transformer 演进

从 2017 年提出来的 Transformer Decoder,过去几年主要的演进:
- Rotary Embeddings(RoPE):对于训练数据的处理,「多文档 + Padding 补齐」相比「单文档 + Padding 补齐」处理效率更高,对于前者在 Attention 计算过程中需要使用 Rotary Embeddings,用于在 Self-Attention 的 Relevance Scoring 阶段去补充不同 Document 的位置信息。

- Mixture of Experts(MoE):在 FFNN 阶段使用多个子模型来提升 LLM 的效果(用 Sparse Model 来替代 Dense Model),在每一个 Layer 会把 Input Route 到一个或者多个 Experts 进行处理。Router 本身也是一个轻量级的 FFNN,用于计算不同 Experts 的概率,选择概率最高或者增加一些随机性(Top-N)。
- 优势:推理阶段的显存要求更低、推理性能更高、模型架构灵活性高
- 不足:模型加载阶段显存要求更高,更高的 overfitting 风险、训练阶段带来更大的挑战


MoE 模型的参数量可能会更大,意味着加载模型需要更大的显存,但因为在推理过程中仅仅部分 Experts 会被激活,推理效率和效果往往会更高。以 Mixtral 8x7B 模型为例:
- Embeddings/Attention/Router/LM Head 等参数是共享的,Experts 参数量共 45B(单个 Expert 参数 5.6B),加载模型总计需要 Load 46.7B 模型参数
- 推理阶段 Router 会选择两个 Expert 进行处理,Experts 参数量共 11.2B,推理阶段总计计算 12.8B 模型参数,大大减少推理的计算量
