PPO 与 GRPO:从策略裁剪到组相对优势

前言 监督微调(Supervised Fine-Tuning, SFT)要求训练数据中明确给出“输入应该对应什么输出”。但在数学推理、代码生成和复杂指令遵循任务中,很多问题很难为每个输入准备唯一而完整的标准答案。此时可以让语言模型生成多个候选答案,再根据答案是否正确、是否满足约束或是否具有某种质量来给出奖励(reward),并用强化学习(Reinforcement Learning, RL)调整模型的生成策略。 PPO(Proximal Policy Optimization)是语言模型强化学习中最经典的策略优化方法之一。GRPO(Group Relative Policy Optimization)则是在 PPO 的策略裁剪思想上,进一步利用同一个问题生成的一组答案进行相对比较,从而不再显式训练一个独立的价值模型(critic)。 本文先建立 PPO 的必要数学背景,再重点解释 GRPO 的训练目标、数据流和局限。文章默认读者已经理解概率分布、梯度下降以及 Transformer 的自回归生成过程。神经网络反向传播的基础可以参考本站的正向传播与反向传播,Transformer 的自回归结构可以参考Transformer 详解。 语言模型为什么可以看成策略 强化学习中的策略(policy)是根据当前状态选择动作的概率分布。对于自回归语言模型,可以作如下对应: 强化学习概念 语言模型中的对应物 状态 $s_t$ 输入提示词与已经生成的前缀 动作 $a_t$ 当前时刻生成的 token 策略 $\pi_\theta(a_t \mid s_t)$ 模型对下一个 token 的概率分布 一条轨迹 从提示词开始直到结束 token 的完整回答 回报或奖励 $R$ 对整段回答进行评价得到的分数 给定提示词 $q$,语言模型生成回答 $o=(o_1,\ldots,o_T)$ 的概率可以按照自回归分解: $$\pi_\theta(o\mid q) = \prod_{t=1}^{T} \pi_\theta(o_t\mid q,o_{< t})$$其中 $o_{< t}$ 表示第 $t$ 个 token 之前的生成前缀。取对数后,完整回答的对数概率变成各个 token 对数概率之和: $$\log \pi_\theta(o\mid q) = \sum_{t=1}^{T} \log \pi_\theta(o_t\mid q,o_{< t})$$这两个式子非常重要。奖励通常是对完整回答给出的,但模型参数的更新必须落实到生成回答时经过的每一个 token。因此,PPO 和 GRPO 都需要把序列级奖励转化为 token 级的策略梯度信号。 ...

📅 September 11, 2026 · 🔄 更新于 2026-09-19 · ⏱️ 43 min · 📝 约 6552 字 · 👁️ — 次阅读

ViT 详解:如何把一张图变成一段 token 序列

前言 本站的《Transformer 详解》讲了如何用注意力机制处理文本:把句子切分成 token,让任意两个位置直接交互。本文回答一个相关的问题:同一套机制,能不能用来处理图像? 答案是能,这个架构就是 ViT(Vision Transformer,视觉 Transformer),由 Google 在 2020 年提出。它的核心思路是:把图像切成固定大小的小块(Patch),每块展平成一个向量,再把这些向量按顺序组成序列输入 Transformer。像素是连续矩阵,文本是离散符号,两者结构原本不同;这一步变形把图像转换成了 Transformer 能够处理的序列形式。 ViT 是本站 VLM 专栏的基础:《CLIP 详解》的视觉编码器是 ViT,《LLaVA 详解》复用的也是它。理解了 ViT,就能理解这两篇文章中的图像特征是如何产生的。 阅读前提:已经读过本站《Transformer 详解》(理解自注意力、多头、位置编码),并会写基础的 PyTorch 代码。本文会与 CNN 做对比,但不要求你已经精通 CNN。 为什么视觉需要 Transformer CNN 的归纳偏置 在 ViT 之前,视觉任务的标准做法是 CNN(卷积神经网络)。CNN 有两个内在的设计假设: 局部性(Locality):CNN认为图上相邻的像素一定是有关系的,因此它让一个固定大小的 3*3 卷积核在图片上滑动,每个输出位置只"看"周围的一小片区域。要利用远处的信息,只能逐层堆叠卷积,逐步扩大感受野。 平移等变性(Translation Equivariance):同一个卷积核在整张图上共享权重,物体平移后,对应的特征也随之平移。也就是说,一个物体无论出现在一张图片中的哪一个地方,其特征都是一样的。 这两个假设统称归纳偏置(Inductive Bias),即用先验知识规定模型理解图像的方式。优点是数据效率高,用 ImageNet 规模的数据就能训练出不错的模型;缺点是这些先验限制了模型的表达能力:局部性意味着远距离信息只能通过加深网络来间接获取,而且这些先验并非在所有任务中都成立。 ViT 的选择:去掉归纳偏置 ViT 采取相反的思路:几乎完全去掉 CNN 的归纳偏置,只保留 Transformer 结构。图像被切成 patch 后,任意两个 patch 之间可以直接交互(自注意力),远距离依赖不再是问题;平移等变性也不再由结构保证,需要模型从数据中自行学习。 这种设计的代价是数据需求:归纳偏置越少,需要的数据就越多。ViT 论文的对比实验直接说明了这一点(详见"训练"一节):在 ImageNet(128 万张图)上从头训练时,ViT 的表现与同规模的 ResNet 相当;在更大的数据集(ImageNet-21k、JFT-300M)上预训练后,ViT 超过最强的 CNN 基线,而且数据规模越大,优势越明显。 ...

📅 August 13, 2026 · 🔄 更新于 2026-08-16 · ⏱️ 49 min · 📝 约 7455 字 · 👁️ — 次阅读

从 CLIP 到 LLaVA:一文读懂视觉语言模型(VLM)的演进与核心数学公式

前言 大语言模型(Large Language Model,LLM) 很会处理文字。它能把一段指令拆成 token,按概率逐字生成回复。但把它和一张图片放到一起,它就没了用武之地。给它一张图片的像素数据,它不知道画面上是一只猫还是一栋楼。它只能看文字。(注意:这里的大模型我们指的是早期的文本大模型,这个时候还没有出现 MLLM(多模态大模型),因此先不考虑现在的大模型所具备的图像识别和理解功能。但事实上,我们接下来要介绍的 VLM,概念上是属于 MLLM 的范畴。) 视觉语言模型(Vision-Language Model,VLM) 要补上的正是这一块。它同时理解图像与文本,能做跨模态推理。给它一张照片,它回答照片里有什么;给它一张图纸,它照着图纸说明步骤。这类能力的基础,是把图像和文本两套数据放进同一个表示空间,让模型能比较、能融合、能推理。这个过程的正式名称是模态对齐(Modality Alignment)。 图像和文本的数据结构完全不同。图像是连续的像素矩阵,一个像素是三个通道上的数值,整体是高维连续张量。文本是离散的符号序列,每个词元来自一张有限的词表。一个连续,一个离散,两者天然不在同一个空间里。VLM 的核心工作,就是找到一种方式把两者对齐。 围绕"怎么对齐",VLM 演化出三条技术路线。本文先讲 VLM 的骨架,再逐一拆解三条路线的数学原理,最后把训练流程串起来。 三大核心组件 一个 VLM 通常由三个部分组成。 视觉编码器(Vision Encoder)。负责把图像变成特征向量。以 Vision Transformer(ViT)为代表,先把图像切成固定大小的方块(Patch),每个方块展平并线性映射成嵌入,再送入多层 Transformer,输出一组图像特征。特征里压缩了图像的语义信息,是后续所有对齐操作的基础。 语言模型(LLM / Text Encoder)。负责理解文本语义并生成回复,常见的有 Llama、Qwen 等。在 VLM 中,它是推理与输出的核心。 模态连接器(Adapter / Projector)。这是 VLM 特有的枢纽。视觉编码器输出的特征和词向量不在同一个空间,连接器负责把图像特征映射成语言模型认识的词向量,通常是一个可学习的线性层或小型 Transformer。线性投影层(Linear Projector)和 Q-Former 都属于连接器。 flowchart LR IMG["图像"] --> VE["视觉编码器 ViT"] VE --> PR["模态连接器 Projector"] PR --> LLM["语言模型 LLM"] LLM --> OUT["文本回复"] 流派一:对比学习与模态对齐(CLIP) CLIP(Contrastive Language-Image Pre-training)由 OpenAI 在 2021 年提出。它的思路不要求模型把图像"说出来",只要求模型判断一对图文是否匹配。思想可以概括为,让配对的图像与文本在向量空间里互相靠近,不配对的互相远离。 ...

📅 August 11, 2026 · 🔄 更新于 2026-08-15 · ⏱️ 17 min · 📝 约 2615 字 · 👁️ — 次阅读

LLaVA 详解:视觉指令微调的完整拆解

前言 本文是《从 CLIP 到 LLaVA:一文读懂视觉语言模型(VLM)的演进与核心数学公式》的配套专篇。主篇里讲了三只流派,CLIP 走对比学习对齐,Flamingo 走交叉注意力,LLaVA 走的是生成式视觉指令微调。本文把 LLaVA 这一路从架构到损失函数的每一步完整拆开,包括线性投影的数学、视觉 token 如何进入语言模型、自回归交叉熵损失的推导,以及两阶段训练的具体流程。 阅读前提是了解 CLIP 的对比学习思想,可先看本站《CLIP 详解:对比学习如何让模型同时看懂图与文》。 核心思想 CLIP 学会的是"匹配",给它一张图,它能判断图和文本是否相关,但它不会开口回答。LLaVA(Large Language and Vision Assistant)要的是"对话",给它一张图加一句问题,它能像语言模型那样流利地回答。 实现办法很直接,把图像特征转成语言模型认识的 token,拼进输入序列,剩下的工作全部交给语言模型自回归生成。这条路线的核心假设是,语言模型足够强大,只要把图像信息以它看得懂的形式喂进去,它就能基于图像推理。因此"对齐"这一步被收敛成一个小而关键的组件,一个线性投影层。 整体架构 LLaVA 由三个模块串成一条链。 flowchart LR IMG["图像"] --> VE["视觉编码器 ViT"] VE --> PR["线性投影 W"] PR --> TOK["视觉 token"] TXT["指令文本"] --> LLM["语言模型 LLM"] TOK --> LLM LLM --> OUT["回答"] 视觉编码器。把图像编码成一组 patch 特征,LLaVA 直接复用 CLIP 训练好的 ViT,不重新训练。 线性投影。把视觉特征映射到语言模型的嵌入空间,这是唯一需要从零训练的关键组件。 语言模型。接收"视觉 token + 文本 token"的混合序列,自回归生成回答,通常复用开源的 LLaMA、Qwen 等。 视觉编码器 LLaVA 的视觉编码器直接采用 CLIP 的 ViT,训练时全程冻结。这样做的原因有两点。 ...

📅 August 13, 2026 · 🔄 更新于 2026-08-15 · ⏱️ 20 min · 📝 约 3034 字 · 👁️ — 次阅读

CLIP 详解:对比学习如何让模型同时看懂图与文

前言 本文是《从 CLIP 到 LLaVA:一文读懂视觉语言模型(VLM)的演进与核心数学公式》的配套专篇。主篇里只讲了 CLIP 的核心思想,本文把架构、每个公式的符号、温度参数 $\tau$ 的物理意义和正负样本矩阵完整拆开。 核心思想 CLIP(Contrastive Language-Image Pre-training) 由 OpenAI 在 2021 年提出。它的思路不要求模型把图像"说出来",只要求模型判断一对图文是否匹配。思想可以概括为,让配对的图像与文本在向量空间里互相靠近,不配对的互相远离。训练数据是从互联网抓取的海量图文对,弱标注、规模大,正好适合对比学习。 模型结构 CLIP 由两个编码器组成,训练完成后两者的输出落在同一个向量空间里。 视觉编码器(Vision Encoder) 把图像映射成图像特征向量。 文本编码器(Text Encoder) 把文本映射成文本特征向量。 两个编码器共享一个对比学习的目标,不要求图像特征还原文字,只要求"配对"的两者在空间中靠近。 视觉编码器 CLIP 论文里视觉编码器有两种可选实现。 ViT 实现。图像先切成固定大小的 Patch(如 $32 \times 32$ 像素),每个 Patch 展平成一个一维向量,经线性投影变成 token,加上位置编码后送入多层 Transformer 编码器。图像特征取 [class] token 位置的输出,经一个线性层映射到共享嵌入维度。(关于 ViT 的详细说明我想单独开一个post,由于比较懒这里就先不写了喵) 图 1:ViT 的图像编码器结构。 ResNet 实现。图像经卷积网络逐层提取特征,最后用一个注意力池化(attention pooling)把空间特征汇聚成单一向量,再经线性层映射。 详细说明请见本站《为什么 ResNet 能训练 152 层——残差连接的直觉与数学》。(其实这个是AI写的,我后面再修改~) 两种实现的最终输出都会投影到同一个嵌入维度,和文本特征的维度一致。 文本编码器 文本编码器是一个带因果掩码的 Transformer,结构上接近 GPT。输入句子先切分成 token,每个 token 做嵌入并加上位置编码,逐层编码;最后取句末特殊 token(End-of-Text,EOT)位置的输出作为整个句子的特征。CLIP 的文本编码器最长处理 76 个 token。 ...

📅 August 12, 2026 · ⏱️ 34 min · 📝 约 5139 字 · 👁️ — 次阅读

大模型不是 Agent:智能体究竟是如何运转的?

什么是 Agent 你在 ChatGPT 的网页里打一句话,它回一段话。问天气,它给你天气。让它写首诗,它给你一首诗。到这里为止,你手里的是一个大语言模型(Large Language Model,LLM),一个很会接话的问答机器。 可如果它自己握着键盘鼠标,自己翻仓库里的文件,自己往数据库里写数据,把一个"把项目做完"的任务从头做到尾,情况就变了。人们把这种形态叫做 Agent(智能体)。 Claude Code 的 CLI 界面 2025年2月,一款Agent产品横空出世,它就是Claude Code。上图为它的CLI界面。这个就是一个Agent。 很多人在本地把 Agent 跑通了。模型能回答,能调用一两个工具,看起来挺像回事。可一旦放到真实环境里,让它稳定处理用户一个个请求,问题就全冒出来了。模型偶尔把格式写错,工具偶尔抛异常,流程偶尔卡在一个地方不动。每一样都得有人兜底。 这两个东西之间差了一层外壳。 LLM 只负责一件事,把输入变成输出。它没有手,没有脚,连执行一段代码都做不到,它只能生成文字。Agent 的玩法,是让 LLM 当大脑,外面套一个能真正动手的外围工程系统(Harness)。大模型提供推理能力,Harness 提供除模型权重之外的所有基础设施,把模型那些不可靠的自然语言输出,转成工程上可控的系统行为。分开说就是一句话,Agent 等于一个会想的大脑,加一个会干活的身体。 这篇文章会拆开这层壳,一路往下讲。先看 Harness 由什么组成,再看 Agent 接到任务后怎么运转,接着把工具调用和技能积累这两块讲透。 Harness 基座 Harness 通常分成三个核心层。 Runtime(运行时)。维持模型运转的核心循环,负责提示词的组装、结构化输出的解析,以及异常重试机制。可以把它想成发动机,让模型一圈一圈转下去。 Capabilities(能力层)。赋予 Agent 实际操作环境的能力,包括工具注册表、上下文管理、长期记忆读写。这一层决定 Agent 能摸到什么东西。 Assurance(保障层)。也叫 Eval Harness,它存在于离线开发路径里。批量遍历测试数据集(Goldens),调用 Agent 跑完整任务,收集执行轨迹(Traces),再用评估指标打分,比如准确率、幻觉率、LLM-as-a-judge。没有这一层,Agent 就没法稳定迭代。 flowchart TB M["Model 大模型大脑"] subgraph HARNESS["Harness 基座"] direction TB R["Runtime 运行时组装提示词 · 解析输出 · 异常重试"] C["Capabilities 能力层工具注册表 · 上下文管理 · 长期记忆"] A["Assurance 保障层评测数据集 · 收集轨迹 · 打分"] end M --> R R --> C C --> A 想真正学会这套东西,最实在的办法是落到你自己熟悉的工程栈里。用 Python 做测验或复习系统,就抛开高级封装库,手写一个最简的 Runtime Loop,自己处理模型的 JSON 输出和本地业务逻辑的对接。等你亲手撞过一次 JSON 解析报错和无限重试循环,Harness 的价值就彻底清楚了。 ...

📅 August 8, 2026 · 🔄 更新于 2026-08-09 · ⏱️ 28 min · 📝 约 4300 字 · 👁️ — 次阅读

Transformer 详解:从注意力机制到代码实战

前言 Transformer 是目前深度学习中最重要的一类架构。从 GPT、BERT 这类大语言模型,到 ViT 这类视觉模型,近几年绝大多数突破背后都有它的身影。可以说,理解 Transformer 是读懂当代 AI 的必修课。 本文假设你已经读过本站的《正向传播与反向传播:神经网络到底如何学习》,理解"网络是一串函数复合、训练时误差沿链式法则反向流动"这两条主线。我们会沿用同样的思路拆解 Transformer:信息如何向前流动,梯度如何向后流动。 本文会从"为什么需要 Attention"讲起,逐步推导公式,最后用一个从零手写的迷你 Transformer(PyTorch)把代码落地。涉及 softmax 的数学细节——梯度、数值稳定性、为什么注意力要除以 $\sqrt{d_k}$——会链接到本站 ai-math 专栏的配套文章,避免在这里打断主线。 为什么要 Transformer RNN 的局限 在 Transformer 之前,处理序列(文本、语音等)的主流架构是 RNN(循环神经网络)。RNN 像一条传送带,按顺序逐个处理 token,把之前看到的信息压缩在一个隐藏状态里。这个设计有三个天然的瓶颈: 无法并行:第 $t$ 步的计算依赖第 $t-1$ 步的隐藏状态,只能从左到右依次计算,GPU 的大规模并行能力完全用不上。 长距离依赖困难:信息每传一步都要经过一次变换,距离越远衰减越明显。处理长文本时,开头的词往往"传不到"结尾。 信息瓶颈:所有历史都被压缩进一个固定大小的隐藏向量,容量有限。 Transformer 的思路 Transformer 的做法截然不同:一次看完整条序列。它不再按顺序传递状态,而是让序列中的任意两个位置直接交互。 先解释一个词:token(词元,我实在不喜欢它的官方中译) 是文本被切分后的基本单位,可以是一个词、一个字符或一个子词片段。比如"我吃了一个红苹果"可以切成 6 个 token:我 / 吃 / 了 / 一个 / 红 / 苹果。 flowchart LR subgraph RNN["RNN:信息一站一站传"] direction LR r1["第 1 个"] --> r2["第 2 个"] r2 --> r3["第 3 个"] r3 --> r4["第 4 个"] end subgraph ATTN["Transformer:任意两个直接对话"] direction LR a1["第 1 个"] --- a2["第 2 个"] a1 --- a3["第 3 个"] a1 --- a4["第 4 个"] a2 --- a3 a2 --- a4 a3 --- a4 end 上图为两种架构的token之间的交互示意: 从图论的角度来说,RNN 是一个 有向路径图,包含 $n$ 个节点(代表隐状态 $h_t$)和 $n-1$ 条有向边($h_{t-1} \to h_t$);而 Transformer 是一个 完全图,包含 $n$ 个节点和 $\frac{n(n-1)}{2}$ 条无向边(每两个 token 之间都有一条边)。 ...

📅 August 3, 2026 · 🔄 更新于 2026-08-06 · ⏱️ 48 min · 📝 约 7268 字 · 👁️ — 次阅读

Softmax 与缩放点积的数学:Attention 背后的概率与数值

前言 这篇文章是本站《Transformer 详解:从注意力机制到代码实战》的数学补充。它的定位非常具体:只讲"服务 Attention 的数学",不重复基础线性代数。 我们假设你已经读过本站的《矩阵微积分如何服务反向传播》,理解 Jacobian 与向量-Jacobian 乘积(VJP)这两个概念。在此基础上,本文回答三个问题: softmax 的梯度长什么样,为什么是这个形式? 为什么 softmax 与交叉熵组合在一起,梯度会变得极简且数值稳定? 缩放点积注意力中的 $\sqrt{d_k}$ 究竟从哪里来,为什么非除不可? Softmax 定义与直觉 给定一个实数向量 $z \in \mathbb{R}^n$(常称为 logits,即未归一化的分数),softmax 把它映射成一个概率分布: $$ \text{softmax}(z)_i = \frac{e^{z_i}}{\sum_j e^{z_j}} $$三个值得记住的性质: 输出非负且和为 1:天然是概率分布。 放大差异:指数运算放大了 logits 之间的差距。$z = [1, 2]$ 时,softmax 输出约 $[0.27, 0.73]$,而不是线性的 $[0.33, 0.67]$——赢家更突出。 平移不变:$\text{softmax}(z + c) = \text{softmax}(z)$(对任意常数 $c$)。分子分母同乘 $e^c$,抵消了。这个性质是后面 log-sum-exp 技巧的基础。 还有一个常被提及的变体:温度参数 $T$,写作 $\text{softmax}(z / T)$。$T < 1$ 时分布更"尖锐"(注意力更集中),$T > 1$ 时更"平滑"。在 Attention 里,softmax 的温度直接控制"注意力有多集中"。 Softmax 的梯度 softmax 的输入输出都是向量,所以它的"导数"是一个 Jacobian 矩阵。记 $s_i = \text{softmax}(z)_i$,并令分母 $Z = \sum_k e^{z_k}$。 ...

📅 August 3, 2026 · 🔄 更新于 2026-08-04 · ⏱️ 12 min · 📝 约 1888 字 · 👁️ — 次阅读

线性代数基础(三):特征值与分解

前言 前两篇讲了向量和矩阵。这一篇回答一个更深刻的问题:矩阵这个变换,有没有"主轴"? 沿着某个方向,变换可能只是单纯地拉伸(方向不变、长度变);沿着另一个方向,可能完全不动。抓住这些"不改变方向"的方向,矩阵的行为就一目了然了。 这就是特征值与特征向量的思想。它在深度学习里极其重要——梯度消失/爆炸、LoRA、PCA、甚至注意力里的缩放,背后都有它的影子。 特征值与特征向量 定义 对 $n \times n$ 矩阵 $A$,如果存在非零向量 $v$ 和标量 $\lambda$ 使得: $$ Av = \lambda v $$则 $\lambda$ 称为 $A$ 的特征值,$v$ 是它对应的特征向量。 几何意义:$v$ 是变换 $A$ 的"主轴"方向——被 $A$ 作用后方向不变,只是长度缩放 $\lambda$ 倍。$\lambda > 1$ 拉伸,$0 < \lambda < 1$ 压缩,$\lambda < 0$ 反向。 如何求特征值 把定义移项:$(A - \lambda I)v = 0$。非零解存在的条件是矩阵不可逆,即: $$ \det(A - \lambda I) = 0 $$这就是特征多项式,是 $\lambda$ 的一个 $n$ 次多项式,有 $n$ 个根(计重数)。 例:求 $A = \begin{bmatrix} 2 & 1 \\ 1 & 2 \end{bmatrix}$ 的特征值与特征向量。 ...

📅 August 4, 2026 · ⏱️ 12 min · 📝 约 1907 字 · 👁️ — 次阅读

线性代数基础(二):矩阵与线性变换

前言 上一篇讲了向量。这一篇把向量"组织"起来——矩阵。矩阵是连接向量与线性变换的桥梁,也是神经网络里几乎所有计算(全连接层、注意力中的 $QK^\top$、反向传播的梯度回传)的载体。 读完本文,你会理解三件事:矩阵乘法到底在算什么、为什么神经网络一层是 $z = Wx + b$、以及 Jacobian 为什么能写成矩阵。 矩阵:数与表 矩阵是排成矩形的数表。一个 $m \times n$ 矩阵有 $m$ 行、$n$ 列: $$ A = \begin{bmatrix} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \dots & a_{mn} \end{bmatrix} $$几个常用特例: 单位阵 $I$:对角线上全为 1,其余为 0。作用类似乘法里的"1"($IA = AI = A$)。 对角阵:非对角线全为 0。相当于对每个分量独立缩放。 零矩阵:全为 0。 转置 $A^\top$:把行列互换,$(A^\top)_{ij} = A_{ji}$。 对称矩阵:$A = A^\top$。它很重要,在特征值篇会看到它有多好用。 矩阵乘法 两个矩阵 $A$($m \times k$)和 $B$($k \times n$)可以相乘,结果 $C = AB$ 是 $m \times n$ 矩阵,其中: ...

📅 August 4, 2026 · ⏱️ 11 min · 📝 约 1734 字 · 👁️ — 次阅读
Comments