大模型数学速成(19):DPO 与 RLHF 目标函数速览
第 12 篇 的交叉熵让模型学会「接龙」;但高似然 ≠ 有用、无害、听话。AI 安全与对齐 从产品侧讲过故事,本篇补 目标函数长什么样——RLHF 与 DPO 的速览版。 这是「大模型数学速成」续篇的收官篇。 续篇第 19 篇(收官)。建议先读第 12 篇 CE,并可选读对齐科普。 一、为什么 CE 不够?预训练 / SFT 的主损失仍是 next-token 交叉熵: \[\mathcal{L}_{\mathrm{CE}} = -\log \pi_\theta(y^\star \mid x)\] 问题在于:许多 不该鼓励 的回答(有害、谄媚胡说、泄露)在语料里仍可能有不低的似然;许多 该鼓励 的回答(拒答、澄清、谨慎)未必是最大似然路径。 对齐阶段换问题: 给定同一提示 $x$,人(或 AI)更偏好回答 $y_w$ 还是 $y_l$?如何把「偏好」写进可优化的损失? 二、RLHF 三步鸟瞰RLHF(Reinforcement Learning from Human Feedback) 经典流水线: 阶段 在做什么 1. SFT 指令数据上继续 ...
大模型数学速成(18):MoE——稀疏 FFN 与路由
第 06 篇 的 FFN 对每个 token 做同一套「升维 → 非线性 → 降维」。模型想更大时,若继续把 FFN 做厚,参数量和每 token 算力一起涨。MoE(Mixture of Experts,混合专家) 换思路:总参数可以很多,但每个 token 只激活少数专家。 这是「大模型数学速成」续篇第 18 篇。建议先读第 06 篇 FFN。下一篇(收官)讲 DPO / RLHF 目标函数。 一、稠密 FFN 的成本标准 Transformer 块里,FFN 往往占参数大头。稠密(dense)含义是: 每个 token 都完整跑同一套 FFN 权重。 于是: 放大方式 参数 每 token FLOPs 加宽 / 加深稠密 FFN ↑ ↑(同步) MoE 稀疏 FFN ↑(多专家) 主要随 激活的专家数 涨 MoE 追求的是:参数规模与单次前向算力部分解耦。 二、专家与门控把原来的一个 FFN 换成 $N$ 个结构相同的 专家 $E_1,\ldots,E_N$,再加一个 路由器(router / gate)。 对 ...
大模型数学速成(17):Flash Attention——不物化注意力矩阵
第 05 篇 的公式是 (\mathrm{softmax}(QK^\top/\sqrt{d}),V)。第 11 篇 又看到长序列下 (T\times T) 的代价。Flash Attention 不改这个数学定义,却尽量不把整张分数矩阵 $S$ 写进高带宽显存——用分块在更快的片上存储里完成 Softmax 归约。 本篇只建立 IO 与分块直觉,不写 CUDA kernel。 这是「大模型数学速成」续篇第 17 篇。建议先读第 05、11 篇。下一篇讲 MoE。 一、标准 Attention 的痛点单头、序列长 $T$、头维 $d$: \[S = \frac{QK^\top}{\sqrt{d}} \in \mathbb{R}^{T\times T}, \quad P = \mathrm{softmax}(S),\quad O = PV\] 对象 规模 问题 $S$ 或 $P$ $O(T^2)$ 显存随长度平方涨 读写 $S$ 多次经过 HBM(大而慢的显存) 带宽墙,往往比算力先爆 长上下文时,很多实现的瓶颈不是「乘加次数」,而是 反复搬运那...
大模型数学速成(16):LoRA——低秩适配在算什么
全参数微调要更新整网权重,贵且易伤通用能力。AI 系列的 Fine-tuning vs RAG 从产品视角对比过两条路;本篇补 LoRA(Low-Rank Adaptation)在算什么——冻住巨大的 $W$,只训练两个瘦矩阵 $A,B$。 这是「大模型数学速成」续篇第 16 篇。建议先读 第 02 篇矩阵乘 与 第 15 篇量化。下一篇讲 Flash Attention。 一、全参微调为什么贵?一层线性变换(第 02 篇): \[\mathbf{h}' = W \mathbf{x}\] 若 $W \in \mathbb{R}^{d \times d}$(示意方阵),可训练参数量是 $d^2$。$d=4096$ 时单层已约 $1.7\times 10^7$ 个参数;模型有几十上百层、还有多组投影——微调 = 存优化器状态 + 梯度 + 可能的全精度副本,显存与存储都爆炸。 更麻烦的是:在小领域数据上拧全体权重,容易 灾难性遗忘——通用能力掉点。 二、低秩假设:更新往往「很扁」微调时我们真正需要的,常常不是一张全新的满秩 $W$,而是一个增量: \[W' = W_...
大模型数学速成(15):量化——从 FP16 到 INT4 的尺度
第 10 篇 GQA 和 第 11 篇 KV Cache 从结构上省显存;推理时还有一条更「硬」的路——用更少比特存同一个数。这就是 量化(Quantization)。 本篇只讲数学直觉:实数如何落在整数网格上、scale / zero-point 是什么、粒度与误差从哪来。不写安装教程,公开格式名(如 GGUF)仅作索引。 这是「大模型数学速成」续篇第 15 篇。建议先读第 10–11 篇(显存动机)与 第 02 篇矩阵乘。下一篇讲 LoRA。 一、为什么要量化?大模型的权重与激活本质上是大量浮点数。推理时瓶颈经常是: 压力 含义 显存 / 内存容量 装不下整模,或 Concurrent 请求装不下 KV 带宽 算力够,但读权重/读 Cache 太慢(「算得动、搬不动」) 若把 FP16(2 字节)换成 INT4(0.5 字节),同样参数量体积约变为 1/4——在误差可接受时,这是极高杠杆。 本篇范围:以权重量化为主,兼提 KV Cache 量化;训练中的量化感知训练(QAT)只点名、不展开。 二、均匀量化:尺...
大模型数学速成(14):采样——Temperature、top-k 与 top-p
第 12 篇 给出词表上的 logits;第 13 篇 保证每一步只基于合法前缀。推理的最后一跳是:从概率分布里选出下一个 token——永远 $\arg\max$ 会又稳又无聊,完全乱抽又会胡言乱语。 本篇讲清三条最常用旋钮:Temperature、top-k、top-p(nucleus),并用 4 词小例子手算对照。 这是「大模型数学速成」续篇第 14 篇。建议先读第 12、13 篇。下一篇讲 量化(FP16 → INT4)。 一、贪心 vs 采样设 Softmax 后概率为 $\mathbf{p}$(第 05、第 12 篇)。 策略 做法 典型观感 贪心(greedy) $i^\star = \arg\max_i p_i$ 稳、重复、模板腔 纯采样 按 $\mathbf{p}$ 多项式抽样 多样,但易抽到长尾怪词 截断 + 温度后再采 本篇重点 生产里最常见 解码循环(接第 13 篇 Decode)每步都是: \[\text{logits } \mathbf{z} \;\xrightarrow{\text{改分布}}\; \mathbf{p}...
大模型数学速成(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...










