端侧 AI · 15 天工程路线
目录首页 English
DAY 09

Transformer 架构

先看清整座模型,再深入其中的 Attention 数据流

建议阅读:约 20 分钟

学习目标

理解 Transformer 如何把 embedding、位置机制、Attention、FFN、残差连接和归一化组织为 encoder、decoder 与 decoder-only 架构,并能从模型配置还原一次从 token 到 logits 的完整前向路径。

本章关键词

关键词解释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,却选择不同信息流来解决理解、生成与长上下文问题。

2017

Transformer 建立无循环的 encoder–decoder 骨架

原始论文用多头 Attention、逐位置 FFN、残差、LayerNorm 与位置编码组成可堆叠 block,使序列位置在训练时可以高度并行。

Transformer 原始论文 ↗
2018

GPT 验证 decoder 预训练后迁移的路线

生成式预训练把多层 Transformer decoder 用于通用语言建模,再通过任务微调迁移,奠定 decoder-only 路线的重要起点。

GPT 原始论文 ↗
2018

BERT 强化双向 encoder 预训练

BERT 通过 masked language modeling 使用双向上下文,展示 encoder-only Transformer 可以形成可迁移的语言理解表示。

BERT 原始论文 ↗
2019

Transformer-XL 延伸跨片段依赖

循环使用片段级隐藏状态并引入相对位置编码,让架构在固定训练片段之外保留更长历史,同时明确状态复用的边界。

Transformer-XL 原始论文 ↗
2020

GPT-3 展示大规模 decoder-only 的上下文学习

GPT-3 扩大自回归 Transformer,并用提示中的描述和示例完成任务,使 decoder-only、规模化和 in-context learning 成为主线。

GPT-3 原始论文 ↗
2021

Switch Transformer 探索稀疏专家扩展 FFN

稀疏路由让每个 token 只激活部分专家 FFN,以条件计算扩大参数容量,也把路由、负载均衡和通信带入架构成本。

Switch Transformer 原始论文 ↗
今天为什么仍然重要: 端侧部署首先要从 config 和计算图识别模型属于哪种 Transformer、每个 block 有哪些子层、位置与输出头采用什么契约;随后才能分别优化 Attention、FFN、KV 和 backend。
借熟悉的系统建立直觉

类比图解

先看 SoC 总框图,再打开互连模块

输入编号先经过接口和地址标记,随后穿过多块重复计算 tile。每块 tile 既有负责跨端口交换信息的互连,也有本地非线性处理、旁路与电平校准。最终输出单元把内部状态映射成词表分数。只研究互连会漏掉大部分权重、执行顺序和兼容契约。

输入接口与地址 Token embedding 与位置机制
片上互连 Attention 子层的跨位置通信
本地计算 tile 逐位置 FFN / MLP
输出编码器 Final norm、输出头与 logits

类比的边界: 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 保留为一个待展开的子层,以便下一章专门研究其内部计算。

步骤 1 / 6

接收 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))

动手实验

选择一个开源 decoder-only 模型,阅读其 config 与结构打印结果,记录 vocab size、hidden size、层数、attention heads、KV heads、FFN intermediate size、位置机制和是否共享输入输出 embedding。画出一个 block 的张量形状,并用参数量近似式分别估算 embedding、Attention 和 FFN 的占比;最后用短序列确认输出 logits 的 shape。
实验记录与导出

工程陷阱

避免误判: 把 Transformer 等同于 Attention,或看到“可并行”就认为层之间和生成步骤之间都能任意并行。完整架构还包括 embedding、位置、FFN、残差、归一化和输出头;并行性必须说明发生在 batch、序列位置、head、张量还是层流水线上。

核心测试

完成 3 道单选题后提交;提交前不会显示答案。

1. 在 Transformer block 中,FFN 的主要职责是什么?
2. decoder-only LLM 最典型的可见性约束是什么?
3. 哪项最准确地描述 Transformer 的训练并行与生成顺序?

一起把本章讲清楚

在 GitHub 上讨论本章

登录 GitHub 后提问、补充实测或分享你的实现;评论会保存在本课程的 GitHub Discussions 中。

评论区需要 JavaScript;也可以直接打开 GitHub 讨论区: 打开 GitHub 讨论区 ↗

延伸阅读

启下:下一章如何使用本章能力

下一章在 Day 10 单独深入 Attention:从对齐思想、Q/K/V 与 causal mask 走到多头计算、二次复杂度和 I/O-aware 实现。

下一天: Day 10 · Attention 机制