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

知识蒸馏 Knowledge Distillation 1. 监督式微调(SFT):极大似然是前向 KL 的特例

知识蒸馏 Knowledge Distillation 1. 监督式微调(SFT):极大似然是前向 KL 的特例

flyfish

代码实践
论文 Generalized Knowledge Distillation (GKD)
On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes

序列级散度的逐 token 分解公式 或 token-level distillation loss。

在论文语境下,它是 教师分布与学生分布在序列 y 上的散度定义。

联合概率、条件概率、边缘概率

乘法法则、全概率公式、贝叶斯定理

概率链式法则(Probability Chain Rule)

序列的联合概率 分解成 基于历史的条件概率的连乘序列

知识蒸馏 Knowledge Distillation 0. 基础:自回归分解与逐 token散度

从概率和似然开始

1. 什么是概率?

概率(Probability)是我们日常生活中常用到的概念,它描述一个事件发生的“可能性”大小。简单说,概率是针对“未知事件”的度量,它总是介于0到1之间(或0%到100%):
0 表示不可能发生(比如,太阳从西边升起)。
1 表示一定发生(比如,明天太阳会升起)。
0.5 表示一半一半的机会(比如,抛硬币正面朝上的概率)。

概率是基于一个“模型”或“假设”的。例如,假设一个硬币是公平的(两面等概率),那么抛硬币得正面的概率是0.5。
概率总是“归一化”的:所有可能结果的概率加起来必须等于1。比如,硬币只有正面和反面,它们的概率必须是0.5 + 0.5 = 1。
在数学上,概率用 ppp 表示,比如 p(正面)=0.5p(\text{正面}) = 0.5p(正面)=0.5
想象一个袋子里有10个球,4个红的、6个蓝的。抽到一个红球的概率是4/10 = 0.4。这里的“模型”是袋子里的球分布是固定的,我们用它来预测未来事件。

概率是“前瞻性”的:给定模型参数,计算数据(事件)出现的可能性。
为什么说概率是“前瞻性”的呢?这里的前瞻性指的是它面向未来的、预测性的视角。也就是说,概率总是假设某些条件或模型已经固定下来,然后用它来展望或估计接下来会发生什么。换句话说,它像一个预言家:给定已知的信息,去推测未知的事件。举个苹果的例子吧。假如你有一个篮子,里面装了10个苹果,其中6个是红苹果,4个是绿苹果。你想知道随机抽出一个苹果是红苹果的概率是多少?这里,模型(或条件)是固定的:篮子里的苹果分布已经确定(6红4绿)。概率计算就是6/10 = 0.6。这里的“前瞻性”体现在:你还没抽苹果,你在提前预测——基于篮子的已知组成,未来抽到红苹果的可能性是60%。你不是在解释过去发生的事,而是在往前看,预判下一个动作的结果。如果篮子里的苹果比例变了(比如突然加了更多绿苹果),概率也会随之改变,但核心是,它总是在给定模型下,向前推断数据或事件的出现。概率总是“归一化”的,这意味着所有可能结果的概率加起来必须等于1。比如,在这个篮子里,红苹果的概率0.6加上绿苹果的0.4正好是1,这确保了它像一个完整的预测系统,不会遗漏任何可能性。

2. 什么是似然?

似然(Likelihood)听起来和概率很像,但它们是不同的概念。似然也是一个度量“可能性”的数值,但它是“后瞻性”的:它不是计算事件发生的概率,而是给定已经发生的数据,来评估模型参数的“合理性”。

似然衡量的是“给定模型参数,观测到这些数据有多‘可能’”。它不是一个概率分布(不像概率必须加起来等于1),而是一个函数,用于比较不同参数的好坏。似然值越大,说明这个参数越能“解释”数据。
似然函数通常记作 L(θ∣数据)L(\theta | \text{数据})L(θ数据),其中 θ\thetaθ 是模型参数,数据是已经观测到的东西。似然往往是多个概率的乘积(因为数据可能是多个独立事件)。
还是那个硬币例子。假设你已经抛了10次硬币,观测到8次正面(数据固定)。现在,你想评估硬币的“正面概率参数 ppp”有多合理:
如果假设 p=0.5p = 0.5p=0.5(公平硬币),似然是计算“观测到8次正面”的可能性:很小,因为太偏了。
如果假设 p=0.8p = 0.8p=0.8,似然会更大,因为这更能解释为什么有这么多正面。
这里,数据是固定的(8次正面),我们改变参数 ppp 来计算似然。似然不是概率:它可以大于1或小于1,不需要归一化。

似然是“后瞻性”的。这里的后瞻性指的是它面向过去的、解释性的视角。也就是说,似然假设数据已经发生了(固定不变),然后用它来回头审视模型或假设有多“合适”。它像一个侦探:数据是已经存在的证据,你用似然来评估哪个模型最能解释这些证据。还是用苹果例子来说明吧。假设你已经从篮子里抽出了5个苹果,结果是4个红苹果和1个绿苹果(数据固定了)。现在,你想知道篮子里红苹果的比例可能是多少?这里不是预测未来,而是解释过去:给定这些抽到的苹果,哪个比例假设最合理?
比如,假设1:篮子里红苹果比例是0.5(一半一半)。似然计算就是基于这个假设,观测到4红1绿的“可能性”——用一个简单的公式(比如二项分布)算出来是个小数,比如大约0.156(我这里不深挖数学,但你可以想象它是个基于概率乘积的分数)。假设2:红苹果比例是0.8。似然会更大,比如大约0.410,因为这个假设更能解释为什么抽到这么多红苹果。似然的“后瞻性”就在这里:数据(抽到的苹果)是已知的、过去的,你在往后看(其实是回头看),评估哪个模型能最好地“事后”解释这些数据。如果你算出比例0.8的似然最高,那它就是最合理的解释。注意,似然不是说“未来抽到红苹果的概率是0.8”,而是“鉴于已经抽到的结果,0.8这个模型最匹配过去的数据”。在数学上,似然函数通常记作L(θ | 数据),其中θ是模型参数,比如红苹果比例,数据是那些抽到的苹果。似然往往是多个概率的乘积,因为数据可能是多个独立事件,比如每个苹果的抽取。

似然与概率的区别
概率:固定模型参数,计算数据(事件)出现的可能性。问的是:“如果参数是 θ\thetaθ,数据出现的概率是多少?”(前瞻:预测未来)。
似然:固定数据,计算模型参数的“合适度”。问的是:“如果数据已经发生了,参数 θ\thetaθ 的似然是多少?”(后瞻:解释过去)。
概率必须 summed to 1(归一化),似然不需要——它只是一个“分数”来比较参数。
在简单情况下,似然函数的值就是概率的乘积。但似然更像“未归一化的概率”。
概率像天气预报(给定模型,预测明天下雨的概率)。似然像事后分析(下雨已经发生了,评估哪个天气模型最能解释这个事实)。
我们用似然来“训练”模型:找到让似然最大的参数,这样模型就能最好地“拟合”数据。

3. 什么是极大似然估计(MLE)?

现在,基于似然,我们来谈极大似然估计(Maximum Likelihood Estimation, MLE)。MLE 是一种找模型参数的方法:它选择那些让观测数据似然最大的参数。

步骤

  1. 你有数据(比如,抛硬币的结果)。
  2. 构建似然函数 L(θ∣数据)L(\theta | \text{数据})L(θ数据)
  3. 找到 θ\thetaθ 的值,使 LLL 最大(这就是“极大”:最大化似然)。
    为什么叫“极大似然”?“极大”是因为我们最大化(maximize)它;“似然”是因为基于似然函数。
    往往最大化对数似然(log-likelihood),因为乘积变加法更容易计算。负对数似然(negative log-likelihood)则用于最小化(优化算法喜欢最小化损失)。
    :MLE 可能过拟合(太贴合数据,忽略一般性)。比如,在硬币例中,如果你只抛一次正面,MLE 会估计 p=1p = 1p=1,但这不现实。
    在语言模型中,MLE 用于训练:数据是文本,模型参数是神经网络权重,我们最大化模型预测正确文本的似然。
4. 在监督式微调(SFT)中的应用:负对数似然损失

现在,我们进入论文上下文。监督式微调(Supervised Fine-Tuning, SFT)是语言模型(如 GPT)训练的一个阶段:用人工标注的数据(输入-输出对)来“微调”模型。

数据是 (x,y)(x, y)(x,y) 对,比如 xxx 是问题,yyy 是正确答案。模型学习预测 yyy 给定 xxx
论文中的 LSFT(θ)=E(x,y)∼(X,Y)[−log⁡pSθ(y∣x)]L_{\text{SFT}}(\theta) = \mathbb{E}_{(x,y) \sim (X,Y)} [-\log p_S^\theta(y|x)]LSFT(θ)=E(x,y)(X,Y)[logpSθ(yx)]
这就是负对数似然(Negative Log-Likelihood, NLL)。
为什么是MLE的特例?最小化这个损失 等价于 最大化似然。因为 −log⁡-\loglog 反转了最大化成最小化。
在训练中,模型调整参数 θ\thetaθ 来最大化 pSθ(y∣x)p_S^\theta(y|x)pSθ(yx)(学生模型预测正确 yyy 的概率),这正是 MLE。
这里,似然是 pSθ(y∣x)p_S^\theta(y|x)pSθ(yx) 的乘积(对多个token)。我们最大化它,让模型“解释”数据最好。

5. 什么是KL散度?前向KL和反向KL

KL散度(Kullback-Leibler Divergence)是一种衡量两个概率分布差异的“距离”。它不对称(A到B ≠ B到A),不是真正的距离(因为不对称且不满足三角不等式)。
假设有两个分布 pTp_TpT(老师/参考)和 pSp_SpS(学生/近似)。KL 量化它们有多不一样。
一般 KL 是 DKL(p∥q)=Ey∼p[log⁡p(y)q(y)]D_{\mathrm{KL}}(p \| q) = \mathbb{E}_{y \sim p} \left[ \log \frac{p(y)}{q(y)} \right]DKL(pq)=Eyp[logq(y)p(y)]。值越大,差异越大(0表示相同)。
前向KL(Forward KL: DKL(pT∥pS)D_{\mathrm{KL}}(p_T \| p_S)DKL(pTpS)):
从老师视角:惩罚学生在老师高概率地方的低概率。
行为:学生试图“覆盖”老师的模式(mode-seeking:聚焦高密度区)。
等价于交叉熵(cross-entropy)减去老师熵(entropy,常数)。
反向KL(Reverse KL: DKL(pS∥pT)D_{\mathrm{KL}}(p_S \| p_T)DKL(pSpT)):
从学生视角:惩罚学生在低概率地方的概率。
行为:学生试图“平均”覆盖老师(mean-seeking:更泛化,但可能模糊)。

**老师分布是真实地图,学生是你的地图。前向KL:确保学生地图覆盖老师的关键点(但可能忽略边缘)。反向KL:确保学生不画多余的东西(但可能错过细节)。

在蒸馏(distillation)中,用KL让学生模仿老师。

6. 为什么极大似然(MLE)是前向KL的特例?

现在连接起来:论文说“极大似然是前向KL的特例”,因为在SFT中,没有“老师模型”,只有数据。但我们可以把数据看成特殊老师。

在一般蒸馏:损失是 DKL(pT∥pS)D_{\mathrm{KL}}(p_T \| p_S)DKL(pTpS),最小化让学生 pSp_SpS 接近老师 pTp_TpT(软概率)。
在SFT(MLE):老师 pTp_TpT 是“δ-分布”(Dirac delta:one-hot,目标 yyy 概率1,其他0)。
代入前向KL:DKL(δy∥pS)=−log⁡pS(y∣x)D_{\mathrm{KL}}(\delta_y \| p_S) = -\log p_S(y|x)DKL(δypS)=logpS(yx)(因为δ的期望只在 yyy 上)。
于是,MLE的负对数似然 精确等于 前向KL的特例!
MLE 是KL的“硬标签”版本:学生直接对齐确切目标,而不是软分布。
:前向KL像让学生抄老师的笔记(软提示)。MLE像老师只给正确答案(硬要求),是特例。

7. 梯度形态:单步token的解释

在优化中,我们用梯度更新参数。论文提到对logits zzz(softmax前分数),前向KL/交叉熵的梯度是 ∇z=pS−pT\nabla_z = p_S - p_Tz=pSpT

Softmax 把 zzz 转成概率 pSp_SpS。梯度告诉怎么调整 zzz 减小损失。
pS−pTp_S - p_TpSpT:如果学生概率高于老师,拉低它;低于,拉高它。本质是“对齐”分布。
pTp_TpT 是one-hot,所以梯度推动学生概率向1(正确token)靠近。

8. SFT的局限:训练-推理分布失配(exposure bias)

训练时,模型用完美数据前缀预测(像老师喂食)。但推理时,自生成,可能出错,累积成“没见过”的状态。
exposure bias:模型在训练中“暴露”于太少错误,导致推理时分布不匹配。

先铺垫:自回归模型 = 学生 “逐句写答案”

不管是 AI 写摘要、算题,还是学生写作文、解数学题,只要是 “一步接一步推导 / 书写”,都和 “学生逐句写答案” 一样:比如要写 “保护环境很重要”,得先写 “保”,再根据 “保” 写 “护”,接着根据 “保护” 写 “环境”,最后写 “很重要”—— 每一步都得靠前面写的内容,这就是 “自回归” 的核心。

训练时(平时练习):老师全程给 “正确的答案”(这就是 “暴露”)exposure

平时练习时,老师为了让学生学好,会全程给 “正确的前半段”,帮学生避开错误:
比如让学生写作文《保护环境》,目标是写出 “保护环境很重要,我们要节约资源”:
写第一句时,老师说 “开头要点题,先写‘保护环境’”(对应 AI 训练时,教师模型给 “正确的前序 token”);
学生要写第二句了,老师不看学生刚才写没写错,直接给正确衔接:“接着‘保护环境’写‘很重要’”(哪怕学生刚才差点把 “保” 写成 “宝”,老师也立刻纠正,让学生按正确的来);
写第三句时,老师又给正确前半段:“接着‘保护环境很重要’写‘我们要’”;
全程学生都在 “老师给的正确前半段” 上写,从不用自己写的错误内容当 “答案”—— 就像 AI 训练时,不管预测错没,下一步都用 “人工标注的正确前序”,相当于开了 “错题保护”。

推理时(考试 / 独立作业):学生只能用 “自己瞎写的答案”(这就是 “偏差”)bias

等考试了,老师不提示了,学生得自己写:
第一步就可能错:学生把 “保护环境” 写成 “宝护环境”(对应 AI 推理时第一步预测错 token);
接下来只能对着自己写的 “宝护环境” 往下凑:为了让句子 “看起来连贯”,可能写成 “宝护环境很简单”(本来该是 “很重要”,因为前半段错了,后半段也跟着偏);
再往后错得更离谱:接着 “宝护环境很简单”,可能写成 “宝护环境很简单,我们要多扔垃圾”(完全背离 “保护环境” 的主题,错误连锁反应);
最后交卷的答案,和平时练习的正确答案差了十万八千里 —— 这就是 “暴露偏差”:平时练习靠老师给的正确答案,考试时靠自己的错答案,差距太大,成绩崩了。

这推动“on-policy”蒸馏:让模型从自生成错误中学习,桥接差距。

http://www.xdnf.cn/news/18782.html

相关文章:

  • Grafana k6 性能测试
  • 深度模块化剖析:构建一个健壮的、支持动态Cookie和代理的Python网络爬虫
  • 保姆级Maven安装与配置教程(Windows版)
  • 基于 MATLAB 的信号处理实战:滤波、傅里叶变换与频谱分析
  • 从文本树到结构化路径:解析有限元项目架构的自动化之道
  • 服务器硬件电路设计之 SPI 问答(四):3 线 SPI、Dual SPI 与 Qual SPI 的奥秘
  • Leetcode 3660. Jump Game IX
  • k8sday16调度器
  • MSF基础知识
  • Java 内存模型(JMM)与并发可见性:深入理解多线程编程的基石
  • Java:HashMap的使用
  • K8s 实战:六大核心控制器
  • 什么是 Nonce?
  • 电力电子simulink练习10:反激Flyback电路搭建
  • Linux 的 TCP 网络编程常用API
  • 图像均衡化详解:从直方图均衡到 CLAHE,让图片告别 “灰蒙蒙“
  • 高数 不定积分(4-3):分部积分法
  • 使用虚幻引擎5(UE5)开发类似《原神》的开放世界游戏:从技术架构到实践指南
  • 内网后渗透攻击--域控制器安全(1)
  • 单表查询-分析函数的应用
  • 重置MySQL数据库的密码指南(Windows/Linux全适配)
  • 在 Ruby 客户端里用 ES|QL
  • WSL-linux部署IndexTTS 记录(含本地 CUDA/cuDNN 编译依赖说明)
  • 鸿蒙 ArkTS 开发:Number、Boolean、String 三种核心基本数据类型详解(附实战案例)
  • 夜间跌倒检测响应速度↑150%!陌讯多模态骨架追踪算法在智慧养老院的落地实践
  • 手写MyBatis第32弹-设计模式实战:Builder模式在MyBatis框架中的精妙应用
  • Anaconda搭建keras开发环境小记
  • EP01:【DA】数据分析的概述
  • 【LeetCode】分享|如何科学的刷题?
  • 2025年渗透测试面试题总结-31(题目+回答)