当前位置: 首页 > news >正文

How LLMs Actually Work(翻译)

写在前面

现代主流大语言模型(LLM)几乎都是把同一种结构——Transformer block——一层一层堆起来的。所以只要把一个 Transformer 内部的几个零件理解透,就能看懂绝大部分主流 LLM 的论文和 model card。

模型与模型之间的区别,主要在于三件事:

  1. 用什么数据训练;
  2. 模型规模与超参(层数、宽度、注意力头数等);
  3. 后训练阶段做了什么(SFT、RLHF、DPO……)。

下面按 9 个主题,把 LLM 的"内部机器"从输入到输出走一遍。


1. Tokenization:把文字变成整数

模型并不直接读文字,它读的是整数 ID。把字符串切成整数序列的过程叫tokenization(分词 / 切分 token)

  • Token ID:词表里每一项对应一个整数。模型只认这个整数,不认字符本身。
  • Vocabulary(词表):分词器固定的"小积木清单"。现代 LLM 词表通常在几万到几十万条之间。

token 通常不是完整单词,而是子词(subword)片段:

  • tokenization可能会切成["token", "ization"]
  • running可能会切成["run", "ning"]

为什么用子词?

  • 整词词表太大、对新词不泛化;
  • 字符级太小,模型连最简单的拼写规律都得从头学;
  • 子词介于两者之间:常见片段直接是一个 token,罕见词由小片段拼出来。

经典坑:问 LLM "strawberry 里有几个 r",早期模型常答错。不是模型不会数数,而是它根本看不到字母——它看到的是几个 token ID,"strawberry" 也许只是 1~2 个 token,里面的字母被打包了。

不同家族用不同分词器:GPT 系列用BPE(Byte Pair Encoding)的变体,LLaMA 系常用SentencePiece。算力消耗、多语种覆盖会受影响,但本质都是:文字进,整数出。


2. Embeddings:让整数有了"意思"

1024这样一个 token ID 本身没有任何含义,它只是一个行号。让它有意义的,是一张巨大的查找表——embedding matrix(词嵌入矩阵)

  • 每一行对应词表里的一个 token;
  • 每一行是一个长向量,长度等于模型的隐藏维度(hidden size)。
  • 7B 量级的模型常见隐藏维度是 4096,更大的模型用更宽的向量。

Vector(向量):就是一串数字。Transformer 内部一切运算都是向量与矩阵的乘法。

模型拿到 token ID 后,会去 embedding 表里查出对应的那一行,后面的所有计算都用这个向量进行。

有趣的性质:训练完成后,语义相似的 token 在向量空间里也接近

  • "king" 和 "queen" 的向量距离很近;
  • "Paris" 和 "France" 的向量距离也很近;
  • 著名的近似等式:king − man + woman ≈ queen

这种几何结构没人手写过,是模型为了把"下一个 token 预测"做好,自己把它学出来的。

⚠️ 注意:到这一步,每个 token 已经变成向量了,但向量本身不带"位置信息"。"dog"无论排在第 1 个还是第 5 个,查表得到的是同一个向量。这就需要下一步的位置编码来补上。


3. Positional Encoding:告诉模型"谁先谁后"

纯粹的 self-attention天生不区分顺序,需要额外注入"位置信号",否则模型分不清是 "dog bites man" 还是 "man bites dog"。

3.1 经典做法:正弦余弦位置编码(Vaswani et al., 2017)

给每个位置一组固定的数字(不同频率的 sin/cos 组合),直接加到token 的 embedding 上。位置 1 加一个模式,位置 5 加另一个模式。

优点:可以外推到训练时没见过的更长序列。

但随着模型变大,加性方案有两个问题:

  1. embedding 既要装"语义"又要装"位置",容量受限;
  2. 学习版的绝对位置编码在长上下文上外推不稳——训练只见过 2048 长度,到 5000 时就不行了。

3.2 现代主流:RoPE(Rotary Position Embeddings)

Su et al. 2021 提出,目前 LLaMA、Mistral、Gemma、Qwen 等几乎所有开源模型都用它。

直觉:不再"加"位置向量,而是按位置旋转Query 和 Key 向量。

  • 位置 1 的 token 转一个小角度;
  • 位置 100 的 token 转一个大角度;
  • 注意力打分时,真正起作用的是两个 token 旋转角度的——也就是它们的相对距离

优点:

  • 天然编码相对位置(更贴合 attention 的需求);
  • 长上下文外推更平滑;
  • 不引入新参数。

3.3 "Lost in the Middle" 现象

Liu et al. 2023 报告:即使位置编码足够好,LLM 在长 prompt 中对开头和结尾的信息利用得更好,对中间的反而会"忘"。这也是"重要内容放开头/结尾"这条 prompt 工程经验的科学依据——模型并不是均匀使用你的 prompt 的每一部分


4. Attention:token 之间互相"看"

Attention(注意力)是 Transformer 名字的来源,也是它最核心的机制。每一层 Transformer 里,attention 做一件事:让每个 token 看一眼它被允许看到的其他 token,决定哪些对自己接下来的表示更重要

为此,每个 token 同时扮演三个角色,被映射成三个新向量:

角色含义
Query (Q)我想从别的 token 那里找什么?
Key (K)我能给别的 token 提供什么"标签"用来匹配?
Value (V)一旦匹配上,我会传出去什么内容?

Q、K、V 是同一个 token 经过三个不同的、可学习的线性变换得到的。

4.1 匹配过程

  1. 每个 token 的 Query 与所有可见 token 的 Key 做点积(dot product),点积越大表示越"对得上"。
  2. 点积分数除以 √d_k 做缩放(防止 softmax 饱和)。
  3. softmax把分数变成"和为 1 的权重"。
  4. 用这些权重对 Value 做加权求和——就是这个 token 在本层的新表示。

Dot product:衡量两个向量"对齐程度"的最简单方式。
Softmax:把任意一组分数变成像概率一样、加起来等于 1 的权重。

4.2 一个例子

句子:"The cat that I saw yesterday was sleeping."

模型处理was时,要搞清楚"是谁在 sleeping"。was的 Query 与所有可见 token 的 Key 做点积:

  • cat的点积很高(动词需要主语,cat这种主语恰好提供匹配的 Key);
  • yesterday的点积很低;
  • softmax 后,cat拿到大权重,yesterday拿到小权重;
  • was的新向量主要由cat的 Value 决定——这就是"指代"在数学上是怎么实现的。

4.3 Causal Masking(因果遮罩)

GPT 类模型是从左到右生成的,所以位置 5 的 token只能看到位置 1~5,不能看到 6、7、8(那些还没生成出来)。
做法很简单:把"未来"位置的匹配分数设成极小的负数,softmax 之后权重几乎为 0。

4.4 Induction Heads(归纳头)

Anthropic 在 2022 年发现的一类专门化注意力头:会识别 prompt 里A B … A这种模式,遇到第二个A时,回头看上一次A后面跟的是B,于是预测下一个就是B

这是目前已知最清晰的in-context learning(上下文学习)机制之一——为什么你在 prompt 里给几个示例,模型就能照着续写。

4.5 Attention 的代价

完整 attention 中,每个 token 要和所有可见 token 比较,因此 prompt 长度翻倍,计算量大约翻 4 倍(O(n²))。这就是长 prompt 又慢又贵的根因,也是 FlashAttention、稀疏注意力、线性注意力等优化方向的存在意义。


5. Multi-Head Attention:多视角看同一段话

一次 attention 只能给模型一种"谁该关注谁"的判断。但语言里同时存在很多种关系:主谓一致、代词指代、跨句长程引用、局部短语……一种视角不够。

多头注意力:并行跑多次 attention,每次走自己一小块空间,叫一个head(头)

一个常见误解

很多教程说"把 token 向量切成几段,每段一个头"——错的
正确做法是:每个头有自己一套可学习的投影矩阵,把完整的 token 向量投影到自己的小空间里得到 Q、K、V。

例如:模型 hidden=4096,32 个头,每个头的工作空间是 128 维。但这 128 维是从完整 4096 维投影出来的,不是固定的某 128 个分量。所以每个头是同一个 token 的"不同视角",不是它的"碎片"。

http://www.jsqmd.com/news/1087087/

相关文章:

  • B站视频永久保存终极方案:m4s转MP4完整教程
  • 用 Rust 构建 AI 命令行助手——从 API 调用到智能 Agent 的工程实践
  • 2026年Java面试速成指南!
  • Selenium绕过Cloudflare反爬虫:浏览器指纹伪装与行为模拟实战
  • Swish与H-Swish激活函数:从理论平滑到硬件友好的效率跃迁
  • Burp Suite实战:BSPHP未授权访问漏洞检测与POC编写
  • 量子计算高阶算子分裂方法:原理与应用
  • 【毕业设计】基于 B/S 架构的建材租赁业务管理系统的设计与实现 基于 SpringBoot 的建材出租归还管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 百度网盘直链解析工具:如何免费实现10倍下载速度提升
  • 3步解锁QQ音乐完整资源库:MCQTSS_QQMusic终极使用指南
  • Switch游戏安装终极指南:Awoo Installer轻松搞定NSP/NSZ/XCI/XCZ文件
  • TestNG接口自动化测试:全局Header与Cookie管理方案详解
  • 互联网大厂 Java 求职者面试实录:Spring Boot 与微服务场景深度探讨
  • sqlserver2pgsql:企业级数据库迁移的自动化解决方案
  • TV Bro:让智能电视回归大屏浏览本质的遥控器友好型浏览器
  • AI 代币经济学:链上激励模型与智能合约的协同设计
  • ArcMap启动加载界面卡死与闪退的五大排查与修复指南
  • ComfyUI-KJNodes终极指南:快速构建高效AI图像工作流
  • XL-MIMO系统能效优化:5G/6G关键技术解析
  • 3步搞定Windows 11终极精简:让老旧电脑焕发新生的完整指南
  • 边缘计算中的早期退出神经网络原理与优化实践
  • 哥斯拉WebShell流量魔改:加密算法、协议伪装与模板生成避坑指南
  • 如何快速掌握虚幻引擎修改:UE4SS脚本系统终极实战指南
  • YZ03:高版本Excel的自定义菜单
  • 基于SpringBoot+Vue的智慧社区管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • pytest框架面试核心:从Fixture机制到工程化实践全解析
  • 【计算机毕业设计案例】基于 SpringBoot 的养老院床位与入住管理系统的设计与实现 智慧社区养老服务信息化管理系统的设计与实现(程序+文档+讲解+定制)
  • 从零上手FMD 8位MCU:开发环境与外设实战指南
  • 动态二进制翻译性能优化:混合执行架构解析
  • 终极指南:Scroll Reverser如何让macOS多设备滚动体验完美统一