大模型数学速成(13):因果掩码与解码循环
第 12 篇 我们把 hidden 变成 logits,再用交叉熵衡量「下一个 token 猜得准不准」。但还有一条硬规则没写进公式:位置 $t$ 不许看见未来的 token——否则训练会作弊、推理也无法自回归。 这一篇把 因果掩码(Causal Mask) 讲清楚,并和 第 11 篇 的 Prefill / Decode、第 12 篇 的并行 CE 收成一张对照表。 这是「大模型数学速成」续篇第 13 篇。建议先读 第 05 篇 Attention、第 11 篇 KV Cache、第 12 篇 交叉熵。下一篇讲 采样(Temperature / top-k / top-p)。 一、为什么需要因果掩码?Self-Attention 默认是双向的:每个 query 可以和所有 key 算分(第 05 篇)。对语言模型来说这会出问题: 场景 若允许看见未来 后果 训练 位置 $t$ 的预测能「偷看」$t{+}1,t{+}2,\ldots$ 的真实词 损失虚低,模型学不到接龙 推理 生成第 $t$ 个词时,后面的词还不存在 根本没有...
现代 C++ 实战(27):协程与 Actor 模型
第 26 篇 的两个练手项目收尾了数据结构;系列最后一篇进入现代 C++ 的两条并发进阶路线:C++20 协程让异步代码像同步一样写,Actor 模型让并发像发消息一样简单。 demo:ref/cpp_demo/projects/learning_guide/(coroutine/ + actor/)。 这是「现代 C++ 实战」系列的第 27 篇(收官)。建议先读 第 12 篇:多线程基础 和 第 14 篇:线程池。 一、协程基础:三个关键字C++20 协程用编译器魔法把异步逻辑写成顺序代码: 关键字 作用 示例 co_yield 产生一个值并挂起 Generator co_await 等待异步操作完成 Task co_return 协程返回 结束协程 123456789Generator<int> counter(int max) { for (int i = 1; i <= max; ++i) { co_yield i; // 产生值,挂起 }}for (...
大模型数学速成(12):输出层、Logits 与交叉熵
第 11 篇 把 Prefill / Decode 与 KV Cache 讲完,第一季在「一层 Transformer 怎么前向」处收官。但生成下一个 token 之前,模型还要做最后一步:把最后一个(或每一个)位置的 hidden 变成词表上的分数,再变成概率。 训练时,我们用 交叉熵(Cross-Entropy) 衡量「猜对下一个 token」有多准——这正是 next-token prediction 的数学核心。本篇是续篇首篇:从 lm_head → logits → Softmax → 损失 一次算明白。 这是「大模型数学速成」续篇第 12 篇(第一季 00–11 已完结)。建议先熟悉 第 05 篇 Softmax 与 Token 科普。下一篇讲 因果掩码与解码循环。 一、最后一层 hidden 还不是「词」经过 $L$ 层 Transformer 后,每个位置有一个特征向量(本系列约定:列 = token,形状大致 [d, S])。对「预测下一个 token」来说,我们通常取当前要预测的那个位置的 hidden 向量 $\mathbf{h}...
现代 C++ 实战(26):LRU 缓存与 JSON 解析器
第 25 篇 给服务加了持久化;本篇是两个经典练手项目:LRU 缓存练数据结构设计,JSON 解析器练递归下降与 std::variant——都是面试高频、又能深入理解 C++ 现代特性。 demo:ref/cpp_demo/projects/learning_guide/(lru_cache/ + json_parser/)。 这是「现代 C++ 实战」系列的第 26 篇。建议先读 第 20 篇:栈、队列与链表(LRU 底层)和 第 24 篇:HTTP 服务与 JSON(nlohmann/json)。 一、LRU 缓存:设计思路LRU(Least Recently Used)——缓存满时淘汰最久未使用的项。要求 get 和 put 均 O(1)。 123456unordered_map<K, iterator> list<pair<K,V>>┌─────────────────┐ ┌──────────────────────┐│ key1 → iter1 ───┼─────────>│ (k...
大模型数学速成(11):KV Cache——推理加速的关键
没有 KV Cache,大模型逐 token 生成会反复重算整段历史的 K、V——复杂度爆炸、延迟不可接受。第 10 篇 讲了用 GQA 压缩 Cache 体积;本篇收官:Prefill / Decode 两阶段、Decode 单步在算什么、显存怎么估,以及多模态里 Cache 怎么共享。 这是「大模型数学速成」系列的第 11 篇(收官)。建议先读 第 10 篇:GQA。 一、O(N²) 重复计算问题生成第 $t$ 个 token 时,Attention 需要当前 Q 与位置 $1 \ldots t$ 的全部 K 做点积(第 05 篇)。 若不缓存 K/V,每步 Decode 都要对整段输入重新做 Q/K/V 投影和 Attention: 步数 每步参与 token 数 naive 总计算量量级 生成 $S$ 个 token $1, 2, \ldots, S$ $O(S^2)$ 重复投影 + Attention 长对话下,算力浪费在「重算旧 token 的 K/V」 上。KV Cache 的核心思想:算过的...
现代 C++ 实战(25):SQLite 数据库实战
第 24 篇 的 HTTP 服务把数据存在内存里,重启即失;SQLite 把数据库装进一个文件——零配置、嵌入式、全球部署量最大的数据库引擎。本篇用 C++ RAII 封装 DatabaseManager,实现学校管理系统的完整 CRUD。 demo:ref/cpp_demo/database/sqlite3/。 这是「现代 C++ 实战」系列的第 25 篇。建议先读 第 24 篇:HTTP 服务与 JSON。 一、为什么选 SQLite? 特点 说明 零配置 无需安装数据库服务,打开文件即用 单文件 整个库在一个 .db 文件中,备份 = 复制文件 嵌入式 以库形式链接进进程,无网络开销 ACID 支持事务,数据一致性有保障 跨平台 iOS/Android/桌面/浏览器(WASM)均内置 12345应用进程 │ ├─ DatabaseManager (C++ 封装) │ └─ libsqlite3.so ──→ school.db (单文件) 适用场景:移动 App 本地存储、桌面工具、原型...
大模型数学速成(10):GQA——分组查询注意力
第 09 篇的 MHA 里,Q、K、V 各有 $h$ 个头——推理时要为每个 token 缓存全部 K/V 头,显存随上下文长度线性暴涨。GQA(Grouped Query Attention,分组查询注意力) 让多路 Q 共享更少的 K/V 头,在效果接近 MHA 的前提下大幅压缩 KV Cache。 这一篇讲清:KV Cache 为何吃显存、GQA 怎么分组共享、以及 MHA / GQA / MQA 对照。 这是「大模型数学速成」系列的第 10 篇。建议先读 第 09 篇:多头注意力。下一篇 KV Cache(系列收官)。 一、KV Cache 显存从哪来?Decode 阶段每生成一个新 token,都要和历史上所有 token 做 Attention(第 05 篇)。历史 token 的 K、V 在 Prefill 时已算过——存下来复用,不必每步重算,这就是 KV Cache。 每层、每个 token 需缓存: \[\text{K 缓存} + \text{V 缓存} \approx 2 \times h_\text{kv} ...
现代 C++ 实战(24):HTTP 服务与 JSON
第 23 篇 收官第三季算法篇;第四季进入工程实战。第一篇从最常见的后端能力入手:用 cpp-httplib 搭 HTTP 服务,用 nlohmann/json 处理 JSON——几十行代码就能跑起一个 REST 接口。 demo:ref/cpp_demo/networking/http_json/。 这是「现代 C++ 实战」系列的第 24 篇,第四季开篇。建议先读 第 01 篇:CMake 与现代构建(FetchContent)和 第 23 篇。 一、HTTP 基础速览1234567客户端 服务端 │ GET /camera HTTP/1.1 │ │ Host: localhost:8080 ────────→ │ 路由匹配 → 处理 → 响应 │ │ │ ← HTTP/1.1 200 OK │ │ Content-Type: image/jpe...
x86 汇编入门(06):文件读写
程序不能只跟终端打交道。配置文件、日志、数据文件——都离不开文件 I/O。这一篇用 06_file_io.asm 完成「写入 → 关闭 → 重新打开 → 读取 → 输出」全流程,也是本系列的收官之作。 这是「x86 汇编入门」系列的第 6 篇,也是最后一篇。前五篇覆盖了输出、输入、算术、循环和函数。这一篇综合运用文件相关系统调用,并回顾整个系列的学习路径。 一、文件相关系统调用 调用号 名称 作用 2 sys_open 打开或创建文件 0 sys_read 从 fd 读取 1 sys_write 向 fd 写入 3 sys_close 关闭 fd sys_open 参数: 寄存器 含义 rdi 文件路径(以 \0 结尾的 C 字符串) rsi 打开标志 flags rdx 权限 mode(创建文件时有效) 返回值 rax 文件描述符;失败时为负数 常用 flags(可位或组合): 标志 值 含义 O_RDONLY 0 只读 O_WRONLY 1 只写 O_CREAT 0x40 不存在则创建...
大模型数学速成(09):多头注意力——多个专家各看各的
第 05 篇我们用的是「一整块」768 维 Q/K/V 做一次 Attention。实际模型里常见 12、16、32 个头(head)——同一层里多组更小的 Attention 并行运行,再拼回去。为什么要拆头?维度怎么变? 这一篇讲清 分头、逐头 Attention、concat 与输出投影 $W_o$ 的全流程。 这是「大模型数学速成」系列的第 9 篇。建议先读 第 05 篇:Attention 与 Softmax、第 07 篇:RoPE。下一篇 GQA。 一、单头 vs 多头:陪审团类比单头 Attention:一个「专家」用 768 维 Q/K/V 同时看所有语义侧面。 多头 Attention(MHA):$h$ 个「陪审员」,每人只拿 $d_\text{head}$ 维(如 64 维),独立做一遍 Attention,最后把 $h$ 份意见 拼接 成完整向量。 12单头:1 人 768 维全包多头:12 人各 64 维,各看各的角度,再合并报告 直觉:不同 head 可学到不同模式——有的关注语法距离,有的关注指代,有的...















