Transformer架构速览:从Attention到LLM,模型结构中的计算热点
好,咱们今天聊聊Transformer。说实话,这玩意儿现在是大模型的基石,你跑任何LLM都绕不开它。我最早接触Transformer是在2017年那篇"Attention Is All You Need"刚出来的时候,当时觉得这名字真狂——结果呢?人家确实做到了。
Transformer的核心思想其实很简单:用注意力机制替代循环和卷积。你想想看,RNN得一步步串行处理,GPU的并行能力全浪费了。Transformer直接把整个序列扔进去,让每个词都能"看到"所有其他词。嗯,这就是它快的原因。
1. 整体架构:Encoder-Decoder vs Decoder-Only
原始Transformer分两大部分:Encoder和Decoder。但现在的LLM,比如GPT系列,基本只用Decoder部分。为什么?因为生成任务只需要从左到右一个个预测,Encoder那种双向注意力反而用不上。
我个人习惯把Transformer拆成三个核心模块:
- 注意力层——让信息流动起来
- 前馈网络(FFN)——做特征变换
- 层归一化 + 残差连接——稳定训练
这三个模块堆叠起来,就是大模型的基本骨架。你去看GPT-3、LLaMA,结构上大同小异,就是层数更多、维度更大、数据更多。
计算热点提示:在Transformer里,注意力机制和FFN占了绝大部分计算量。量化时,这两个地方是重点关照对象。
2. 注意力机制:到底在算什么?
注意力机制说白了就是加权求和。每个词都去问其他词:"咱俩关系怎么样?"关系好的,权重就大。
具体公式长这样:
Attention(Q, K, V) = softmax(Q × K^T / √d_k) × V
这里Q、K、V分别代表查询、键、值。Q和K做点积,算出相似度,然后softmax归一化成权重,最后用权重去加权V。
我在项目中遇到过一个问题:当序列长度很长时,Q×K^T这个矩阵会变得巨大。比如序列长度4096,这个矩阵就是4096×4096,显存直接爆炸。所以后来有了FlashAttention,把计算分块处理,避免一次性生成这个大矩阵。
避坑指南:我曾经在量化QKV投影矩阵时,发现精度掉得厉害。后来排查发现,是softmax前的缩放因子√d_k没处理好。量化时一定要注意这个细节,不然注意力分布会失真。
3. 多头注意力:让模型从不同角度"看"
单头注意力只能学到一种关系模式。多头注意力把Q、K、V拆成多份,每份独立计算注意力,最后拼起来。这样模型就能同时捕捉不同位置、不同语义的关系。
比如一个头关注语法关系,另一个头关注语义相似度。你想想看,这不就是"三个臭皮匠,顶个诸葛亮"吗?
计算量上,多头注意力并没有增加太多,因为每个头的维度是原来的1/h(h是头数)。总计算量和单头基本一致,但表达能力强多了。
4. 前馈网络(FFN):真正的"思考"环节
注意力层负责信息交换,FFN负责特征变换。标准FFN是两层线性变换加一个激活函数:
FFN(x) = ReLU(x × W1 + b1) × W2 + b2
第一层把维度放大(通常是4倍),第二层再缩回来。为什么这么做?我个人的理解是:高维空间更容易找到线性可分的特征。就像你把数据映射到更高维,分类边界就清晰了。
FFN的计算量其实比注意力还大。在LLaMA这类模型中,FFN的参数占了总参数的2/3左右。所以量化FFN的权重,收益非常明显。
注意:有些模型用SwiGLU或GeLU替代ReLU,比如LLaMA。这些激活函数计算更复杂,量化时要注意激活值的分布特性。ReLU输出全是非负的,但GeLU有负值,量化范围不一样。
5. 层归一化与残差连接:稳定训练的基石
Transformer层数一深,梯度就容易消失或爆炸。残差连接解决了这个问题:把输入直接加到输出上,梯度就能顺畅地往回传。
层归一化(LayerNorm)则是把每层的输出拉回到均值为0、方差为1的分布。这样不管前面怎么折腾,后面的层都能"看到"稳定的输入。
在量化时,层归一化是个麻烦事。因为它涉及除法和开方,这些操作在低精度下容易出问题。我建议把LayerNorm保留为FP16或FP32,不要量化它。
6. 计算热点总结:量化该盯哪里?
咱们做量化,得知道哪里最"热"。我整理了一张表:
| 模块 | 计算占比 | 量化优先级 | 注意事项 |
|---|---|---|---|
| QKV投影 | ~15% | 高 | 注意缩放因子 |
| 注意力得分计算 | ~10% | 中 | softmax建议保留高精度 |
| FFN第一层 | ~25% | 高 | 激活值范围大,需校准 |
| FFN第二层 | ~25% | 高 | 同上 |
| 层归一化 | ~5% | 低 | 建议保留FP16 |
| Embedding | ~5% | 低 | 词表大时可以考虑量化 |
你看,FFN占了将近一半的计算量。所以很多量化方案,比如GPTQ、AWQ,都优先量化FFN的权重。注意力部分虽然占比小,但精度敏感度高,得小心处理。
7. 从Transformer到LLM:规模化的挑战
现在的LLM,比如GPT-3有1750亿参数,LLaMA-2有700亿。这么大的模型,显存放不下,推理速度也慢。量化就成了刚需。
我记得有一次部署一个130亿参数的模型,FP16版本需要26GB显存,单张A100都跑不起来。后来用INT4量化,显存降到6.5GB,速度还快了3倍。嗯,这就是量化的魅力。
但规模化也带来了新问题:量化误差会随着层数累积。你量化一层可能掉0.1%的精度,量化100层就掉10%了。所以需要一些技巧,比如逐层量化校准、混合精度等。
核心观点:Transformer的结构决定了计算热点在注意力和FFN。量化时,优先处理FFN,谨慎处理注意力,保留层归一化的精度。这是我在多个项目中验证过的经验。
8. 知识体系总览
下面这张图展示了Transformer的核心结构以及计算热点的分布,方便你快速回顾:
这张图把Decoder层的结构和量化策略对应起来了。左边是计算流程,右边是每个模块的量化优先级。你一眼就能看出,FFN是重中之重。
好了,Transformer的核心结构和计算热点就聊到这儿。下一节咱们会深入具体的量化方法,看看怎么把这些理论落地到TensorRT-LLM里。