Transformer 架构
先看清整座模型,再深入其中的 Attention 数据流
建议阅读:约 20 分钟
学习目标
本章关键词
| 关键词 | 解释 | ESP32 工程类比 |
|---|---|---|
| Transformer block | 由 Attention、FFN、残差与归一化等子层组成并重复堆叠的序列计算单元。 | 像 SoC 中重复布置的计算 tile,每块都有互连与本地处理路径。 |
| Decoder-only | 只堆叠带因果可见性的 decoder 风格 block,以统一的序列目标生成下一个 token。 | 像只根据已经接收的协议前缀持续推进的状态机。 |
| FFN / MLP | 在每个序列位置独立执行、各位置共享参数的非线性前馈子层。 | 像每个数据包都经过同一套本地字段变换单元。 |
| Residual + Norm | 用短路径保留已有表示,并控制深层堆叠中的数值尺度。 | 像主数据旁路与逐级电平校准共同维持长流水线稳定。 |
承上:回顾与定位
Day 7 建立 LLM 的历史与术语地图,Day 8 固定文本输入 ABI。本章把 Transformer 作为独立的架构概念,先看清从 token、block 到 logits 的整体路径。
历史发展脉络
Transformer 的发展不是 Attention 公式单独扩张的历史,而是架构骨架、预训练目标、位置机制和规模化方法共同演进的过程。不同分支保留了相似 block,却选择不同信息流来解决理解、生成与长上下文问题。
Transformer 建立无循环的 encoder–decoder 骨架
原始论文用多头 Attention、逐位置 FFN、残差、LayerNorm 与位置编码组成可堆叠 block,使序列位置在训练时可以高度并行。
Transformer 原始论文 ↗GPT 验证 decoder 预训练后迁移的路线
生成式预训练把多层 Transformer decoder 用于通用语言建模,再通过任务微调迁移,奠定 decoder-only 路线的重要起点。
GPT 原始论文 ↗BERT 强化双向 encoder 预训练
BERT 通过 masked language modeling 使用双向上下文,展示 encoder-only Transformer 可以形成可迁移的语言理解表示。
BERT 原始论文 ↗GPT-3 展示大规模 decoder-only 的上下文学习
GPT-3 扩大自回归 Transformer,并用提示中的描述和示例完成任务,使 decoder-only、规模化和 in-context learning 成为主线。
GPT-3 原始论文 ↗Switch Transformer 探索稀疏专家扩展 FFN
稀疏路由让每个 token 只激活部分专家 FFN,以条件计算扩大参数容量,也把路由、负载均衡和通信带入架构成本。
Switch Transformer 原始论文 ↗类比图解
先看 SoC 总框图,再打开互连模块
输入编号先经过接口和地址标记,随后穿过多块重复计算 tile。每块 tile 既有负责跨端口交换信息的互连,也有本地非线性处理、旁路与电平校准。最终输出单元把内部状态映射成词表分数。只研究互连会漏掉大部分权重、执行顺序和兼容契约。
类比的边界: Transformer 不是实际 SoC,层也不一定对应独立硬件单元;类比只用于区分模型总架构、重复 block、跨位置通信和本地计算职责。
本章讲解
先把 Transformer 看成架构,而不是一个公式
Transformer 是一套组织序列计算的骨架:token 先进入 embedding 与位置机制,再依次经过多个 block,最后由归一化和输出头产生 logits。每个 block 内部通常包含跨位置交换信息的 Attention、逐位置变换表示的 FFN,以及维持深层信号路径的残差和归一化。先固定这些模块的输入输出与重复关系,下一章再展开 Attention 内部的 Q、K、V,才能避免用一个公式代替整个模型。
Encoder、Decoder 与 decoder-only 服务不同的信息流
Encoder 让每个位置读取完整输入,适合构造上下文相关表示;原始 decoder 既对已生成前缀做 causal self-attention,又通过 cross-attention 读取 encoder 输出;decoder-only 模型则把指令、上下文和答案放进同一条因果序列,统一执行 next-token prediction。三类结构共享 block 思想,却有不同 mask、输入契约和训练目标,不能只凭都叫 Transformer 就假设模型可互换。
Embedding、位置与输出头定义序列的两端
Token id 本身只是离散索引,输入 embedding 把它映射为 hidden vector;位置编码或旋转位置机制再让模型区分顺序和距离。层堆叠输出的 hidden state 经过 final norm 与线性输出头映射回词表 logits,有些模型会让输出权重与输入 embedding 共享。部署时 vocab size、hidden size、位置参数和权重共享方式都会改变文件大小、算子 shape 与兼容性,因此它们属于模型包契约。
FFN 是每个位置上的主要非线性计算路径
Attention 混合不同位置的信息,FFN 则对每个位置独立应用相同参数的扩展、激活和压缩。经典 Transformer 使用两层前馈网络,现代 LLM 常见 gated MLP 等变体;intermediate size 和激活形式会显著影响参数量、内存带宽与 kernel 覆盖。分析模型时应分别统计 Attention 投影与 FFN 权重,而不是把 block 成本全部归因于 Attention。
残差与归一化决定深层网络怎样稳定传递
残差连接为每个子层提供短路径,使深层堆叠仍能保留和修正已有表示;LayerNorm 或 RMSNorm 控制数值尺度。不同模型可能采用 pre-norm、post-norm、并行残差或不同归一化形式,这些差异会改变执行顺序,不能在转换时随意调换。验证一个 backend 时,应在 block 边界保存金向量,先定位是归一化、残差相加还是子层计算发生偏差。
训练并行与生成串行发生在不同维度
训练时完整目标序列已知,causal mask 可以阻止未来信息泄漏,同时让同一层的多个位置批量计算;层与层之间仍按拓扑依赖前进。生成时下一个 token 尚未确定,必须等本轮 logits 经采样得到结果后才能构造新位置。Transformer 缩短了位置间的信息路径并提高训练并行度,却没有消除自回归输出的时间依赖;这正是后续 Attention 与 KV Cache 工程的起点。
动态过程演示
一串 token 如何穿过完整 Transformer
播放器展示模型级路径,刻意把 Attention 保留为一个待展开的子层,以便下一章专门研究其内部计算。
接收 token id · [batch, sequence]
读取 tokenizer 产生的离散编号
词表与模型 embedding 必须匹配
循环 / 返回条件: Attention、残差、归一化与 FFN 按模型定义重复 N 层;自回归生成选出 token 后,再让新增位置重新走过整座层堆叠。
查看静态全景图
token ids → embedding + position → N × Transformer block → final norm → logits
│
Attention → residual → FFN → residual代码或命令示例
x = token_embedding(token_ids) + position(position_ids)
for block in transformer_blocks:
x = block(x, mask=causal_mask)
logits = output_head(final_norm(x))动手实验
实验记录与导出
工程陷阱
核心测试
完成 3 道单选题后提交;提交前不会显示答案。
在 GitHub 上讨论本章
登录 GitHub 后提问、补充实测或分享你的实现;评论会保存在本课程的 GitHub Discussions 中。
评论区需要 JavaScript;也可以直接打开 GitHub 讨论区: 打开 GitHub 讨论区 ↗
延伸阅读
启下:下一章如何使用本章能力
下一章在 Day 10 单独深入 Attention:从对齐思想、Q/K/V 与 causal mask 走到多头计算、二次复杂度和 I/O-aware 实现。