知识蒸馏 Knowledge Distillation 序列的联合概率 分解成 基于历史的条件概率的连乘序列

flyfish

代码实践

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

自回归分解 将 “序列的联合概率” 分解成 “基于历史的条件概率的连乘序列”

自回归

以句子“你现在读的这句话”为例

首先明确句子的token时序顺序(从左到右,依次生成):
第1个token:你 → 第2个token:现 → 第3个token:在 → 第4个token:读 → 第5个token:的 → 第6个token:这 → 第7个token:句 → 第8个token:话

自回归的核心逻辑是:每个“当前token”只依赖“它前面所有已生成的历史token”(即左侧的、早于它的token),与右侧未生成的token无关。具体依赖关系如下:

当前token生成顺序依赖的“历史token”(仅左侧已生成的)不依赖的内容(右侧未生成的)
第1步无(第一个生成的token,仅依赖输入prompt,如“请说一句话:”)现、在、读、的、这、句、话
第2步仅依赖第1个token“你”在、读、的、这、句、话
第3步依赖第1-2个token“你、现”读、的、这、句、话
第4步依赖第1-3个token“你、现、在”的、这、句、话
第5步依赖第1-4个token“你、现、在、读”这、句、话
第6步依赖第1-5个token“你、现、在、读、的”句、话
第7步依赖第1-6个token“你、现、在、读、的、这”
第8步依赖第1-7个token“你、现、在、读、的、这、句”无(最后一个token)

生成过程

语言模型生成“你现在读的这句话”的过程,就像人写字“一笔接一笔、从左到右”:

  1. 第一步:看到prompt(比如“请写一个日常场景的短句”),先写出第一个字“你”——此时只需要考虑“prompt要求”,不需要想后面要写什么;
  2. 第二步:写完“你”后,思考“‘你’后面接什么字合理”,选择“现”——只看已经写好的“你”,不看还没写的“在、读、的…”
  3. 第三步:写完“你、现”后,思考“‘你现’后面接什么字合理”,选择“在”——只看已经写好的“你、现”,不看后面的“读、的…”
  4. 以此类推,直到写完最后一个字“话”——每一步的选择,都只基于“左边已经写好的内容”,右侧的内容是“下一步才会生成的”,当前步骤完全无法预知,自然也无法依赖。

这里为了简单介绍一个字是一个token,实际会有多种token算法

自回归的“自”(自身历史),特指**“自身左侧已生成的时序历史”,而非“整个句子的所有内容”。原则是:
文本生成是“单向时序过程”,后面的token还没被模型生成,当前token只能“回头看左边的历史”,不能“超前看右边的未来”自回归语言生成是
严格按“从左到右”的时序展开**,当前token只能依赖“它左边已经生成的历史token”,绝不可能依赖“右边还没生成的token”。

条件链式法则的序列形式

自回归分解的公式
P(y1,…,yL∣x)=∏n=1LP⁣(yn∣y<n,x)P(y_1,\dots,y_L\mid x)=\prod_{n=1}^{L} P\!\left(y_n \mid y_{<n},x\right) P(y1,,yLx)=n=1LP(yny<n,x)
本质是条件概率链式法则的直接推广。

回顾基础链式法则:对于随机变量序列 Y1,Y2,…,YLY_1,Y_2,\dots,Y_LY1,Y2,,YL 和给定的条件变量 XXX,它们的条件联合概率可以分解为一系列条件概率的乘积。这里的关键是:

  • 每一步的条件概率 P(yn∣y<n,x)P(y_n \mid y_{<n},x)P(yny<n,x) 只依赖于“之前所有已出现的变量 y<n=(y1,…,yn−1)y_{<n} = (y_1,\dots,y_{n-1})y<n=(y1,,yn1)”和“外部条件 xxx”;
  • 整个序列的联合概率被拆解为 L个“局部条件概率”的连乘,将高维联合概率的计算转化为低维条件概率的乘积,大幅降低了建模难度。

为什么自回归分解是“最优解”?

语言模型的核心任务是建模文本序列的概率分布(如“一句话是否合理”“下一个词是什么”),而自回归分解完美适配语言的“时序特性”,主要原因有三点:

1. 符合语言的“顺序生成特性”

人类语言天然是时序序列:说话/写作时,我们总是“先说出第一个词,再根据第一个词说第二个词,以此类推”。自回归分解恰好模拟了这一过程——每个词 yny_nyn 的生成只依赖于“已经说过的词 y<ny_{<n}y<n”和“上下文提示 xxx”,与人类语言生成的直觉一致。

2. 降低建模复杂度

直接建模整个序列的联合概率 P(y1,…,yL∣x)P(y_1,\dots,y_L \mid x)P(y1,,yLx) 几乎不可能:对于词汇表大小为 VVV 的语言,序列长度为 LLL 的可能组合有 VLV^LVL 种,无法直接枚举或存储。

而自回归分解将问题转化为逐一生成每个位置的词,只需建模 P(yn∣y<n,x)P(y_n \mid y_{<n},x)P(yny<n,x)——这个条件概率的“输入维度”是“已生成序列 y<ny_{<n}y<n + 提示 xxx”,输出是“下一个词 yny_nyn 的概率分布”,可以用神经网络(如Transformer)高效建模。

3. 支持“增量生成”

语言模型的核心功能之一是生成文本(如续写、翻译),自回归分解天然支持“增量生成”:

  • 第一步:根据提示 xxx 生成第一个词 y1y_1y1,即采样自 P(y1∣x)P(y_1 \mid x)P(y1x)
  • 第二步:根据 xxxy1y_1y1 生成 y2y_2y2,采样自 P(y2∣y1,x)P(y_2 \mid y_1, x)P(y2y1,x)
  • 第L步:根据 xxxy1,…,yL−1y_1,\dots,y_{L-1}y1,,yL1 生成 yLy_LyL,最终得到完整序列。

自回归语言模型的生成逻辑——每一步只需要“看前面的词”,就能继续生成下一个词。

语言模型如何“学习”这个分解?

语言模型的训练目标,本质上是通过海量文本数据,学习自回归分解中的每个条件概率 P(yn∣y<n,x)P(y_n \mid y_{<n},x)P(yny<n,x)

具体来说:

  • 训练数据是大量文本序列(如句子、段落),每个序列可视为 (x,y1,…,yL)(x, y_1,\dots,y_L)(x,y1,,yL)(其中 xxx 可能是序列的前缀,或空提示);
  • 模型通过“预测下一个词”的任务学习条件概率:给定 xxxy<ny_{<n}y<n,模型输出对 yny_nyn 的概率分布,通过交叉熵损失优化,让模型的预测尽可能接近真实文本中 yny_nyn 的出现概率;
  • 训练完成后,模型就能对“任意前缀序列”输出下一个词的合理概率分布,从而支持生成连贯的文本。

一句话的自回归分解

以生成句子“我爱吃苹果”(假设 xxx 为空提示,即生成独立句子)为例,其概率可分解为:
P(我,爱,吃,苹果)=P(我)×P(爱∣我)×P(吃∣我,爱)×P(苹果∣我,爱,吃)P(\text{我},\text{爱},\text{吃},\text{苹果}) = P(\text{我}) \times P(\text{爱} \mid \text{我}) \times P(\text{吃} \mid \text{我},\text{爱}) \times P(\text{苹果} \mid \text{我},\text{爱},\text{吃}) P(,,,苹果)=P()×P()×P(,)×P(苹果,,)

  • P(我)P(\text{我})P():第一个词是“我”的概率(语言模型中,通常会给句首词一个先验分布);
  • P(爱∣我)P(\text{爱} \mid \text{我})P():在“我”之后接“爱”的概率(比如“我”后面更可能接“爱”“是”“想”等词,而不是“苹果”“跑步”);
  • 以此类推,每个步骤的概率都依赖于前面的词,最终乘积就是整个句子的联合概率。
    自回归分解是将“序列的联合概率”分解成“基于历史的条件概率的连乘序列”,而这个分解过程是条件概率链式法则——但它不是“任意的链式法则”,而是加了“自回归约束”的链式法则应用。

第一步:先明确“自回归分解分解的是什么?”

自回归分解的核心目标,是把“一个token序列(比如句子)的整体概率”拆解开,变成“每一步生成token的局部概率”,方便语言模型计算和预测。
比如,对于一个长度为n的token序列 X = [x₁, x₂, x₃, ..., xₙ]x₁是第一个token,xₙ是最后一个token),我们要分解的是这个序列的联合概率 P(X) = P(x₁, x₂, x₃, ..., xₙ)

为什么要分解?因为直接计算“整个序列同时出现”的联合概率非常困难(可能性太多),但分解成“每一步基于前面内容的条件概率”后,模型只需要预测“当前token在历史token下的概率”,难度会大幅降低。

第二步:自回归分解如何用“条件概率链式法则”?

条件概率链式法则是概率论的基础规则:多个随机变量的联合概率,可分解为第一个变量的边缘概率,乘以第二个变量在第一个变量条件下的概率,再乘以第三个变量在第一、二个变量条件下的概率……以此类推

对序列 X = [x₁, x₂, ..., xₙ]通用的条件概率链式法则是这样的:
P(x1,x2,...,xn)=P(x1)×P(x2∣x1)×P(x3∣x1,x2)×P(x4∣x1,x2,x3)×...×P(xn∣x1,x2,...,xn−1)P(x₁, x₂, ..., xₙ) = P(x₁) × P(x₂ | x₁) × P(x₃ | x₁, x₂) × P(x₄ | x₁, x₂, x₃) × ... × P(xₙ | x₁, x₂, ..., xₙ₋₁) P(x1,x2,...,xn)=P(x1)×P(x2x1)×P(x3x1,x2)×P(x4x1,x2,x3)×...×P(xnx1,x2,...,xn1)

自回归分解,就是完全遵循这个链式法则,但额外加了一个“自回归约束”
约束:对于第k个token xₖ,它的条件依赖只能是“它前面所有已生成的历史token(x₁到xₖ₋₁)”,绝对不能依赖“它后面未生成的token(xₖ₊₁到xₙ)”。

自回归分解没有“发明新的分解规则”,而是把“条件概率链式法则”直接用在了“时序序列”上——因为语言生成是“从左到右、先有历史再有当前”的单向过程,后面的token还没生成,自然无法成为当前token的依赖,这就和链式法则中“xₖ只依赖x₁到xₖ₋₁”的形式完美匹配。

第三步:用具体例子看“自回归分解的结果”

还是用之前的句子“你现在读的这句话”,对应的token序列 X = [x₁=你, x₂=现, x₃=在, x₄=读, x₅=的, x₆=这, x₇=句, x₈=话]

根据自回归分解(基于条件链式法则),这个序列的联合概率会被分解成以下条件概率的连乘序列
P(你,现,在,读,的,这,句,话)=P(你)(第一个token,无历史,只看边缘概率)×P(现∣你)(第二个token,依赖前1个历史token“你”)×P(在∣你,现)(第三个token,依赖前2个历史token“你、现”)×P(读∣你,现,在)(第四个token,依赖前3个历史token)×P(的∣你,现,在,读)(第五个token,依赖前4个)×P(这∣你,现,在,读,的)(第六个token,依赖前5个)×P(句∣你,现,在,读,的,这)(第七个token,依赖前6个)×P(话∣你,现,在,读,的,这,句)(第八个token,依赖前7个)\begin{align*} P(你,现,在,读,的,这,句,话) &= P(你) \quad \text{(第一个token,无历史,只看边缘概率)} \\ &\times P(现 \mid 你) \quad \text{(第二个token,依赖前1个历史token“你”)} \\ &\times P(在 \mid 你,现) \quad \text{(第三个token,依赖前2个历史token“你、现”)} \\ &\times P(读 \mid 你,现,在) \quad \text{(第四个token,依赖前3个历史token)} \\ &\times P(的 \mid 你,现,在,读) \quad \text{(第五个token,依赖前4个)} \\ &\times P(这 \mid 你,现,在,读,的) \quad \text{(第六个token,依赖前5个)} \\ &\times P(句 \mid 你,现,在,读,的,这) \quad \text{(第七个token,依赖前6个)} \\ &\times P(话 \mid 你,现,在,读,的,这,句) \quad \text{(第八个token,依赖前7个)} \\ \end{align*} P(,,,,,,,)=P()(第一个token,无历史,只看边缘概率)×P()(第二个token,依赖前1个历史token“×P(,)(第三个token,依赖前2个历史token“你、现×P(,,)(第四个token,依赖前3个历史token×P(,,,)(第五个token,依赖前4个)×P(,,,,)(第六个token,依赖前5个)×P(,,,,,)(第七个token,依赖前6个)×P(,,,,,,)(第八个token,依赖前7个)

这个连乘序列,就是“自回归分解”的最终结果——它完全是条件概率链式法则在“语言生成时序”下的直接体现,每一项都是“当前token基于历史的条件概率”,没有任何超出历史的依赖。

自回归分解与条件链式法则的关系

结论具体解释
分解的对象序列的联合概率(如P(x₁,x₂,...,xₙ)
分解的工具条件概率链式法则(概率论基础规则)
分解的约束自回归约束:xₖ仅依赖x₁~xₖ₋₁(左侧历史,无未来依赖)
分解的结果一个条件概率的连乘序列(每一项对应一步生成的概率)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94327.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94327.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/94327.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React15.x版本 子组件调用父组件的方法,从props中拿的,这个方法里面有个setState,结果调用报错

在React 15.x中&#xff0c;子组件通过props调用父组件包含setState的方法时出现错误&#xff0c;最常见的原因是父组件方法的this指向丢失&#xff0c;导致调用setState时出现Cannot read property setState of undefined之类的错误。 核心原因 React类组件的方法默认不会绑定…

交叉编译.so到鸿蒙使用

以下是在 Ubuntu 20.04 系统上的操作&#xff0c;tpc_c_cplusplus 他是把编译的流程都给写进去了&#xff0c;你只需要关注你要编译的库配置好环境就行了。 第一步&#xff1a;下载 tpc_c_cplusplus 仓库地址&#xff1a; GitCode - 全球开发者的开源社区,开源代码托管平台…

LLaMA-Factory 中配置文件或命令行里各个参数的含义

常见参数分类 & 含义对照表&#xff1a; &#x1f539;模型相关参数含义model_name_or_path基础模型的路径&#xff08;本地或 HuggingFace Hub 上的名字&#xff0c;如 meta-llama/Llama-2-7b-hf&#xff09;adapter_name_or_pathLoRA/Adapter 权重路径&#xff08;如果要…

JavaScript 性能优化实战技术文章大纲

一、引言1.1 背景阐述在当今 Web 应用高度交互化、复杂化的趋势下&#xff0c;JavaScript 作为核心脚本语言&#xff0c;其性能优劣直接决定了用户体验的好坏。从单页应用&#xff08;SPA&#xff09;的流畅运行&#xff0c;到复杂数据可视化的实时交互&#xff0c;JavaScript …

正点原子【第四期】Linux之驱动开发学习笔记-2.1LED灯驱动实验(直接操作寄存器)

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子【第四期】手把手教你学Linux系列课程之 Linux驱动开发篇”视频的学习笔记&#xff0c;该课程配套开发板为正点原子alpha/mini Linux开发板。在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内…

【GM3568JHF】FPGA+ARM异构开发板 测试命令

本章节的命令操作均在板卡的终端执行 1 初探/sys目录 与/proc目录类似&#xff0c;/sys目录下的文件/文件夹向用户提供了一些关于设备、内核模块、文件系统以及其他内核组件的信息&#xff0c; 如子目录block中存放了所有的块设备&#xff1b;子目录bus中存放了系统中所有的总…

【Win】Motrix+Aria2浏览器下载加速

系统安装Motrix Motrix官网下载&#xff0c;推荐下载NSIS Installer 安装版 浏览器安装Aria2 下载Aria2插件&#xff0c;然后开发者模式安装到浏览器 Aria2扩展选项的配置如下&#xff1a; 端口号需要改成Motrix的&#xff0c;默认是16800

SpringBoot applicationContext.getBeansOfType获取某一接口所有实现类,应用于策略模式

本文介绍了如何在Springboot项目中通过ApplicationContext获取接口的实现类&#xff0c;并通过枚举策略模式避免if/else&#xff0c;展示了如何使用getBeansOfType获取TrafficModeService的实现&#xff0c;以及如何在实际场景中应用&#xff0c;如查询交通方式费用 1 在实际工…

大模型问题:幻觉分类+原因+各个训练阶段产生幻觉+幻觉的检测和评估基准

1. 什么是幻觉&#xff1f;大模型出现幻觉&#xff0c;简而言之就是“胡说八道”。 用《A Survey on Hallucination in Large Language Models》1文中的话来讲&#xff0c;是指模型生成的内容与现实世界事实或用户输入不一致的现象。 研究人员将大模型的幻觉分为事实性幻觉&…

智慧冷库物联网解决方案——实现降本增效与风险可控的冷库管理新范式

一、冷库管理痛点设备孤岛化&#xff1a;冷库品牌、型号分散&#xff0c;缺乏统一接入标准&#xff0c;数据互通难&#xff0c;依赖人工巡检&#xff0c;故障响应滞后。能耗黑洞&#xff1a;制冷系统能耗占冷库总运营成本的60%以上&#xff0c;传统管理粗放&#xff0c;缺乏动态…

太空生活的八种要素

数代以来&#xff0c;科学家们一直在银河系中搜寻地外行星存在生命的证据。他们试图找到一组特定的环境条件与化学物质&#xff0c;在恰当的时间、恰当的地点交汇融合。 通过研究人类、植物、动物及微生物在地球上的生存与繁衍方式&#xff0c;科学家们已识别出生命演化所需的关…

Flutter 小技巧之有趣的 UI 骨架屏框架 skeletonizer

很久没有更新过小技巧系列&#xff0c;今天简单介绍一个非常好用的骨架屏框架 skeletonizer &#xff0c;它主要是通过将你现有的布局自动简化为简单的骨架&#xff0c;并添加动画效果来实现加载过程&#xff0c;而使用成本则是简单的添加一个 Skeletonizer 作为 parent &…

基于SpringBoot的宠物用品系统【2026最新】

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

MongoDB 分片集群修改管理员密码

记得关注一下博主&#xff0c;博主每天都会更新IT技术&#xff0c;让你有意想不到的小收获哦^_^ 文章目录*记得关注一下博主&#xff0c;博主每天都会更新IT技术&#xff0c;让你有意想不到的小收获哦^_^*一、注释MongoDB分片集群认证参数&#xff08;三台主机都要操作&#xf…

C++函数重载与引用详解

一、函数重载&#xff1a;同名函数的 “差异化生存”​1. 概念定义​函数重载&#xff08;Function Overloading&#xff09;是 C 的重要特性&#xff0c;指在同一作用域内&#xff0c;允许存在多个同名函数&#xff0c;但要求这些函数的参数列表必须不同。&#xff08;参数个数…

2025-08-17 李沐深度学习16——目标检测

文章目录1 介绍1.1 实际应用1.2 边界框1.3 数据集2 锚框2.1 什么是锚框2.2 交并比2.3 分配标签2.4 非极大值抑制3 经典目标检测网络3.1 R-CNN3.1.1 R-CNN (原始版本)3.1.2 Fast R-CNN3.1.3 Faster R-CNN3.1.4 Mask R-CNN3.2 单阶段检测器&#xff1a;SSD 和 YOLO3.2.1 SSD (Sin…

Bluedroid vs NimBLE

&#x1f539; 对比&#xff1a;Bluedroid vs NimBLE 1. 协议栈体积 & 内存占用 Bluedroid&#xff1a;体积大&#xff0c;RAM 占用也大&#xff08;几十 KB 到上百 KB&#xff09;。NimBLE&#xff1a;轻量级&#xff0c;内存占用大概是 Bluedroid 的一半甚至更少。 &…

(纯新手教学)计算机视觉(opencv)实战八——四种边缘检测详解:Sobel、Scharr、Laplacian、Canny

边缘检测详解&#xff1a;Sobel、Scharr、Laplacian、Canny边缘检测是图像处理和计算机视觉中的重要步骤&#xff0c;主要用于发现图像中亮度变化剧烈的区域&#xff0c;即物体的轮廓、边界或纹理特征。OpenCV 提供了多种常用的边缘检测算子&#xff0c;本教程将通过四种方法带…

PyTorch 环境配置

目录一、安装 CUDA二、安装 PyTorch1. 创建虚拟环境2. 安装 PyTorch三、在 PyCharm 上创建一个 PyTorch 项目参考文章&#xff1a; 【2025年最新PyTorch环境配置保姆级教程&#xff08;附安装包&#xff09;】 【超详细 CUDA 安装与卸载教程&#xff08;图文教程&#xff09;】…

鸿蒙中冷启动分析:Launch分析

启动的分类&#xff08;热身环节&#xff09; 启动动类型触发条件系统开销 & 速度主要优化方向冷启动应用进程不存在&#xff08;首次启动或进程被杀后启动&#xff09;最高&#xff0c;需创建进程、加载资源、初始化所有组件主要优化目标&#xff0c;减少主线程任务&…