从 Token 到蒸馏:一步步理解大模型如何工作

作者:杨杨杨大侠日期:2026/9/4

本文面向刚开始了解大模型的读者,以本机运行的 Qwen2.5 0.5B 为例,解释 Token、参数、Transformer、训练、蒸馏和量化之间的关系。

先用一句话概括大模型:

大模型使用训练得到的参数,根据已有 Token,反复预测下一个 Token。

1. 一个模型里有什么

模型不只是一个权重文件。完整运行通常需要三部分:

  • 结构配置:规定模型有多少层、每层多宽。
  • Tokenizer 和词表:负责文字与 Token ID 之间的转换。
  • 参数:训练得到的大量数字,包括权重矩阵、偏置和归一化参数。

本机 Ollama 中的 Qwen2.5 0.5B 显示:

项目数值
参数数量494,032,768
Transformer 层数24
每个 Token 的主向量宽度896
Attention 查询头数14
KV 头数2
FFN 中间宽度4,864
Token 词表大小151,936
最大上下文长度32,768 Token
Ollama 模型文件397 MB,Q4_K_M 量化

这些数字描述的是已经下载到本机的具体模型版本,不代表所有大模型都使用相同结构。

2. Token 是什么

模型不能直接处理文字。Tokenizer 会先把文字切成 Token,再将它们转换成整数 ID。

例如在这个 Qwen 的词表中:

1我喜欢吃
2   
3[109366, 99405]
4   
5109366 = “我喜欢”
699405  = “吃”
7

因此,一个 Token 不一定对应一个汉字,也可能是:

  • 一个字;
  • 一个词;
  • 多个字;
  • 标点;
  • 英文片段;
  • 特殊控制标记。

词表只规定 Token ID ↔ 文字片段 的关系。它不是文章数据库,也没有保存所有可能的句子。

3. 一个新 Token 是怎么生成的

输入变成 Token ID 后,模型先查询 Embedding 权重,把每个 ID 转换成一个 896 维向量。向量经过 24 个 Transformer 层后,再由输出层为整个词表打分。

这里的“打分”不是再调用另一个模型,而是当前模型中的一次矩阵计算:

1最终的896维向量
2        ×
3输出权重矩阵
4        
5151936个原始分数,也叫Logits
6

每个 Token 得到一个分数。分数经过转换后成为概率,再根据生成参数选择一个 Token。

1苹果:45%
2辣:  35%
3饭:  15%
4其他: 5%
5

如果使用确定性选择,通常取分数最高的 Token;如果使用随机采样,也可能选择概率稍低的 Token。

模型先生成 Token ID,再把 Token 解码成文字显示给用户。新 Token 同时会追加到上下文,参与下一次预测。

4. 24 个 Transformer 层在做什么

模型的层数和宽度由工程师在训练前确定。这个 Qwen 有 24 个结构相同、参数不同的 Transformer 层:

1Token向量
2  
3第0层  第1层  ……  第23层
4  
5LM Head
6

每一层主要包含两部分:

  • Attention:从上下文中的其他 Token 获取信息。
  • FFN:筛选、组合并加工当前 Token 的信息。

4.1 Attention:决定当前要参考谁

整个上下文都可以进入模型,但当前计算不会同等关注所有 Token。Attention 会为历史 Token 临时计算不同的权重。

例如,在处理“苹果”时,某个 Attention 头可能产生:

1我:    5%
2喜欢: 15%
3吃:   30%
4苹果: 50%
5

这些 Attention 权重只服务于当前输入、当前层和当前 Attention 头。它们不是训练后固定保存的模型参数。

因此需要区分:

  • 模型参数权重:训练得到,推理时通常保持固定。
  • Attention 权重:每次运行时根据上下文动态计算。

4.2 FFN:加工当前 Token

这个 Qwen 的 FFN 会把每个 Token 从 896 维临时扩展到 4,864 维,完成筛选和组合后再压回 896 维。

“FFN 宽度 4,864”并不是增加了 Token 数量,而是给每个 Token 提供更大的临时加工空间。

例如有 3 个 Token 时:

1[3, 896]
2    FFN扩展
3[3, 4864]
4    FFN压缩
5[3, 896]
6

每经过一层,Token 数量通常不变,变化的是每个 Token 内部的向量。各层关注的模式可能不同,但模型文件不会标记“这一层负责语法”或“那一层负责推理”。这些分工是在训练中自然形成的,而且通常相互重叠。

5. 上下文为什么会越来越大

每生成一个 Token,它都会追加到上下文末尾:

1[我喜欢] [吃]
2        生成
3[我喜欢] [吃] [辣]
4        继续生成
5[我喜欢] [吃] [辣] [的]
6

因此需要满足:

1系统提示词 + 历史对话 + 当前输入 + 已生成内容
2 模型上下文上限
3

这个 Qwen 支持的最大上下文是 32,768 Token。达到上限后,应用需要截断旧内容、压缩历史、切分任务、换用更长上下文模型,或者停止生成。

推理时还会使用 KV Cache 保存历史 Token 在 Attention 中的部分计算结果。这样生成新 Token 时不必重新计算全部历史,但上下文越长,KV Cache 通常也越大。

6. 训练和调用模型有什么区别

模型结构由人设计,参数值由训练学习。

训练开始前,权重通常按照初始化规则填入随机数。模型预测下一个 Token 后,训练程序把预测与目标比较,再通过反向传播调整参数。

1训练数据
2  
3模型预测
4  
5计算误差
6  
7反向传播
8  
9修改参数
10

调用模型,也就是推理时,过程不同:

1输入Token
2  
3使用固定参数计算
4  
5生成新Token
6

推理时发生变化的是:

  • 当前上下文;
  • 每次计算出的 Attention 权重;
  • 中间向量;
  • KV Cache;
  • 输出 Token 分数。

模型的固定参数不会因为一次聊天自动改变。模型看起来“记住了刚才的要求”,通常只是因为相关内容仍在上下文里。

7. 基座模型和蒸馏模型

基座模型先通过大规模预训练获得语言和知识能力。蒸馏通常不会让小模型从随机参数开始,而是让一个已有的小型基座模型继续学习大模型的输出。

蒸馏也是训练,只是多了一个教师模型。

普通训练主要学习真实数据中的目标;蒸馏训练则让学生模仿教师的答案、概率分布或中间特征。

蒸馏过程中:

  • 教师模型负责提供参考,权重保持固定。
  • 学生模型负责学习,权重持续调整。
  • 学生的层数和宽度由工程师提前设计,不是自动从教师模型中缩小出来的。

蒸馏完成后只需运行学生模型,因此部署成本通常更低。但蒸馏过程仍需要运行教师并训练学生,并不是零成本。

8. 量化为什么能缩小模型

参数数量不等于文件大小。文件大小还取决于每个参数使用多少位保存。

1模型文件大小
2 参数数量 × 每个参数的位数 ÷ 8
3+ 量化信息、词表和配置
4

常见表示方式:

类型每个参数的典型位数特点
FP3232 位精度高,占用大
FP1616 位大约节省一半空间
BF1616 位大模型训练常用
Q8约 8 位推理占用更低
Q4约 4 位更适合个人电脑运行

量化会把高精度参数映射为较少的数值等级,并额外保存缩放信息。它不会改变层数和参数数量,但会降低参数的存储精度。

例如,同样是约 4.94 亿参数:

1FP32:理论约1.98GB
2FP16:理论约0.99GB
3Q4: 理论主体约247MB
4

本机 Ollama 下载的 Q4_K_M 文件实际约 397 MB,因为它采用混合精度量化,还需要保存缩放信息、词表和模型元数据。

量化可能让接近的 Token 分数发生轻微变化:

1量化前:苹果 8.001,香蕉 7.999
2量化后:苹果 7.98, 香蕉 8.01
3

因此,量化通常能换来更低的内存占用和更方便的部署,但过度量化也可能损失回答质量。参数数量、训练数据和训练质量仍然是决定模型能力的主要因素。

9. 把整个过程串起来

1训练阶段:
2语料  Token  模型预测  计算误差  调整参数
3
4推理阶段:
5文字  Token  24层计算  LM Head打分  新Token  追加到上下文
6
7蒸馏阶段:
8大模型给出参考  小模型模仿  调整小模型参数
9
10量化阶段:
11参数数量不变  降低存储精度  模型文件变小
12

最后只需要记住四句话:

  1. 词表决定模型能够选择哪些 Token。
  2. 参数决定在当前上下文中应该选择哪个 Token。
  3. 训练修改参数,调用模型只使用参数。
  4. 蒸馏训练小模型,量化压缩参数的存储精度。

从 Token 到蒸馏:一步步理解大模型如何工作》 是转载文章,点击查看原文


相关推荐


【AI大模型接入SDK】Deepseek API + Apifox
艾莉丝努力练剑2026/8/27

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 文章目录 1 ~> LLM 接入体系总览1.1 两类主流接入方案1.2 工程定位1.3 技术栈映射 2 ~> 云端 API 接入方式(以 DeepSeek 为例)2.1


只面对一张表:KingbaseES 超表如何简化海量时序数据管理
一只牛博2026/8/19

设备数据最麻烦的地方,不是某一天突然写入一批数据,而是每秒都会有新数据进来。温度、压力、振动、电流、流量等指标不断产生,设备数量增加后,数据量几乎只会单向增长。业务页面通常只问两类问题:某台设备最近一小时的曲线,以及一批设备在某个时间段内的统计结果。数据库管理员面对的却是另一组问题:表拆到什么粒度,索引建在哪些表上,旧数据如何清理,新增设备是否需要发布脚本。 传统时序数据库方案经常把这些事情交给应用层。按月份、按设备或按两者组合拆表,确实能把数据分散开,但路由、建表、补索引和归档也随之进入业务代


C++ 模板深度解析:类型模板、非类型模板、特化与分离编译
在路上慢慢走2026/8/6

1. 引言 模板(Template)是 C++ 泛型编程的核心,它允许编写与类型无关的代码,极大地提高了代码的复用性和灵活性。理解模板的完整体系,包括其分类、特化机制以及编译模型,是掌握现代 C++ 高级特性的关键。本文将系统性地介绍模板的两大类别(类型模板与非类型模板)、模板特化(函数模板特化与类模板特化)以及模板分离编译的原理与实践,帮助你构建完整的模板知识框架。 2. 模板的分类 C++ 模板主要分为两大类:类型模板(Type Template)和非类型模板(Non-type Tem


写了三遍 Todo List,我终于搞懂了 React 父子组件到底怎么通信
To_OC2026/7/28

上来就踩了个最经典的坑 我上周写这个 Todo List 的时候,第一版写得特别快,二十分钟就把界面和逻辑堆完了。然后点复选框试了一下 —— 纹丝不动。 控制台没报错,代码看着也没写错,我对着 checked={todo.completed} 这行盯了十分钟,来回改了好几种写法,勾选状态就是不更新。当时我人都懵了,心想难道我学的 React 是假的? 后来随手打印了一下 todo 对象,发现值其实已经变了,但界面就是不刷新。那一刻我突然反应过来:我直接在子组件里改了 props 传过来的对象属性


拼多多笔试真题-多多的审批链(C++/Py/Java /Js/Go)
无限码力2026/7/20

多多的审批链 拼多多技术岗 4月26号笔试 第四题 题目内容 多多的部门中发起审批单有一套审批流程,审批关系可以抽象为一棵以 111 号节点为根的树,共有 nnn 个节点。对于每个 i(2≤i≤n)i(2 \le i \le n)i(2≤i≤n),给定它的直属上级 pip_ipi​,即审批树中存在一条从 pip_ipi​ 到 iii 的边。 对于任意节点 uuu,如果它发起一张审批单,那么审批单只能先提交给它的直属上级,再继续逐级上报到更高层。 现在多多最多可以选择 kkk 个节点作为“关键


图片是 Web 性能监控的重灾区:LCP 和 CLS 到底怎么测、怎么定位到具体那张图
谙忆10242026/7/12

做前端性能这几年,我踩过一个反复出现的坑:本地 Lighthouse 跑出来 95 分,一到线上真实用户那边,投诉页面"卡""跳"的却一堆。后来盯着数据看明白了——问题几乎都出在图片上,而且实验室环境根本复现不出来。 这篇就把"图片相关的 Web 性能怎么测、怎么监控、怎么定位到罪魁祸首那张图"讲清楚。重点是测量和监控这条链路,不是又一篇"图片懒加载十种写法"。 先分清两组概念:实验室数据 vs 真实用户数据 这是很多人一上来就混的地方,先掰开。 实验室数据(Lab):Lighthouse、We


别再只会 if err != nil:Go error 从错误链到工程实战详解
唐青枫2026/7/4

简介 Go 代码里最常见的错误处理大概是这样: result, err := doSomething() if err != nil { return err } 这几行代码不难,真正容易出问题的是后面的选择: 应该新建错误,还是包装原错误? 应该使用 ==,还是 errors.Is? 什么时候需要自定义错误类型? 错误应该在哪一层记录日志? 多个清理操作同时失败,应该返回哪一个错误? 普通错误、panic 和 recover 到底怎么分工? Go 没有把错误处理藏进异常机制,而是把错误当


Java 虚拟线程实战指南:从 Thread API 到 Spring Boot 高并发应用
唐青枫2026/6/26

简介 虚拟线程的英文名是 Virtual Thread,它是 Project Loom 带来的轻量级线程实现。 虚拟线程在 JDK 19、JDK 20 中经历了两轮预览,到了 JDK 21 正式发布。 简单理解: 平台线程:Java 线程长期绑定操作系统线程 虚拟线程:大量 Java 线程由 JVM 调度到少量操作系统线程上 传统 Java 服务经常采用“一请求一线程”的处理方式。 代码很直观,但平台线程数量有限。当大量请求都在等待数据库、HTTP 接口、文件或消息队列时,线程本身会先成为瓶颈


Java Flyway 实战指南:用 SQL 脚本管理数据库版本
唐青枫2026/6/17

简介 Flyway 是一个数据库迁移工具。 它解决的问题和 Liquibase 类似: 数据库结构怎么跟着项目版本一起演进。 不过 Flyway 的风格更简单直接。 它主要通过 SQL 文件管理数据库变更。 比如: V1__create_users_table.sql V2__add_user_email_column.sql V3__create_orders_table.sql V4__insert_init_data.sql 应用启动或命令执行时,Flyway 会检查哪些脚本已经执行过


AI 代理只会在本地打转?我用 MCP 给它接上手脚,3 步接通第一个外部服务
大鹏AI教育2026/6/10

AI 代理只会在本地打转?我用 MCP 给它接上手脚,3 步接通第一个外部服务 先说结论:很多人觉得自己的 AI 代理"不够聪明",其实它不笨,是够不着外面的世界——能读本地文件、能跑命令,却连不上你的数据库、内部接口、第三方服务。我一开始也卡在这儿,把 MCP 跑通后才明白:问题从来不在模型,在它有没有"手脚"。 这篇我把给 OpenClaw 小龙虾(Claude Code 同款)接第一个 MCP 服务的过程讲一遍,连我踩的三个坑和边界判断一起给你。 1. 真问题:AI 写得出脚本,却发不出请

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读