前言

之前ChatGPT横空出世,顺应潮流从推荐系统转向LLM,于是半知半解的学习了《Attention is all you need》,这么久过去了,总想重新整理下思路,于是写下这篇文章。

解析与理解

为什么

为什么会出现Transformer?在这之前,是RNN循环神经网络,它有两个问题,第一个是健忘,越往后的词,跟最开始的词的信息关系就变得很弱。第二个是慢,没有办法并行计算。
那Transformer的思路就是,每个词自己决定想听哪个词,想关注谁。

模型结构

Encoder

理解输入,将输入序列转化为包含上下文信息的向量表示。
从模型结构里看,由6个block堆叠而成,每一层主要包含两个子层,分别是MHA以及FFN,MHA是让词与词之间交流,理解上下文,FFN是对每个位置的信息进行独立强化。

Decoder

产生输出,根据Encoder的信息和已经生成的单词,预测下一个。
相比较Encoder,多了一个Masked MHA,主要是限制在生成第n个词时,不能看后面的词。

Attention

注意力机制的核心,多个词相互认识,建立连接。

MLP/FFN

传统MLP,内部处理,把信息转换为模型内部的知识表达。

模型计算过程

q是“当下的搜索意图”

它代表了此时此刻这个词,对过去所有信息的“渴求”。以“我爱吃”这个输入为例,当模型在处理“爱”时,q的意思是:“请给我来点能做我宾语的名词!”当模型在处理“吃”时,q的意思是:“请给我来点能被吃的食物!”。

k是“对外展示的标签”

它代表了过去生成的每一个词,挂在自己脑门上、用来响应搜索意图的索引信息。它不包含具体含义,只负责回答“是不是”。以“爱”这个词为例:当后面的q“吃”发出“寻找语境”的信号时,k“爱”举起牌子说:“看这里!我是表达喜好的动词,我能解释你为什么吃!”

v是“内容,是信息实际的载体”

它代表了匹配成功后,真正被q拿走并融合进新语境里的语义干货(实际上经过softmax,并不是0/1的拿走,而是比例)。它是信息的载体。以“爱”这个词为例:一旦q“吃”和k“爱”确认匹配,v“爱”就会被带走。v“爱”的内容是:“强烈正向情感特征向量”。结果:这个特征注入到“吃”里,模型就懂了:接下来的预测不是为了充饥,而是为了享受美味。

核心

自注意力Self Attention

让模型在处理一个词时,同时关注句子中所有其他的词,并根据相关性分配权重。

多头注意力Multi-Head Attention

上面自注意力机制,每个词去关注不同的词,而实际上会有多个Head,关注不同的方面,比如语法结构、情感等。
比如“苹果掉在地上,因为它熟透了”,如果是语法结构的头,会按照主谓关系,让谓语“掉”更关心主语“苹果”,如果是代词的头,会让“它”更关心“苹果”。
当然,在模型训练前没有人为给这些头去定义分配说谁负责什么方向,完全是训练过程中模型自己形成的能力。

位置编码

顾名思义,“我爱你”和“你爱我”,是不一样的意思。

残差连接

残差连接是何恺明在ResNet提出的,Transformer使用了这个技术,每一层输出时,会加上这一层的原始输入,这样可以避免原始信息的丢失。

缩放点积注意力

在计算QK点积时,除以’$\sqrt{d_k}$’,避免高维度下点积值方差太大,导致Softmax趋于饱和后的梯度消失。

模型对比

特性 传统模型 (RNN/LSTM) Transformer
计算方式 串行(必须等上一个词算完) 并行(所有词同时进场计算)
长距离依赖 弱(距离越远,信号越弱,易遗忘) (无论距离多远,一步直达)
信息视野 局部/单向(通常只看前文) 全局(Encoder 可同时看上下文)
训练效率 低(无法充分利用 GPU 并行能力) (完美契合 GPU 矩阵运算)
位置感知 隐式(靠处理顺序体现) 显式(通过位置编码 Positional Encoding)

延伸

Transformer变体

仅Encoder

代表作:Bert

仅Decoder

代表作:GPT系列

MoE

改造了MLP层,标准Transformer,巨大的MLP,不管输入是什么,所有神经元都要参与计算。而MoE,把MLP拆成了多个MLP,称之为专家(Expert),然后引入了一个Router,来决策不同的问题由不同的Expert来处理。
这样模型参数可以巨大,每次推理只激活一部分参数。

几个问题

通过问题,可以更好的理解概念,拓展思路

KVCache与Transformer的关系是什么?

KV Cache是针对Transformer Decode过程的一种工程优化手段,并非模型架构本身的数学定义。

我们经常提到的Prefill-Decode与Transformer的关系是什么?

Transformer是模型的物理结构,而Prefill-Decode是模型在推理阶段的两个不同动作。
由于现在主流是纯Decoder模型,我们以此为例,那模型推理时,Prefill会把Prompt全部喂入,计算KVCache,Decode阶段则逐个词计算,同时也保存新的词的KVCache。

LLM大模型中,模型大小主要由哪些部分决定?

主要由MLP层决定,attention占用较小。

LLM大模型,我们聊到精度的时候,指的是什么?

权重与激活值,有的模型会标注比如DeepSeek-V3.2为例,BF16·F32·F8_E4M3,权重FP8保存,激活值精度BF16,涉及Softmax使用F32。

对于LLM推理系统,可能存在的优化是什么?

模型启动:

  1. 镜像预热/缓存
  2. 模型文件预热/缓存,基于RDMA或者GPU Direct RDMA的模型文件传输加速
  3. 模型文件并行加载
  4. DeepGEMM预编译缓存
  5. 模型量化

模型推理:

  1. 高算力卡:Prefill阶段,提升TTFT
  2. 高带宽卡:Decode阶段,提升TPOT
  3. 模型量化,提升QPS,E2E
  4. kv cache缓存池,提升QPS、E2E、TTFT
  5. 推测解码:通常框架内置支持,提升TPOT

模型可靠性:

  1. 负载均衡
  2. 服务降级

版权声明

本博客所有原创内容,均采用 CC BY-NC-SA 4.0 协议,转载请注明出处。