知识蒸馏 - 基于KL散度的知识蒸馏 HelloWorld 示例 采用PyTorch 内置函数F.kl_div的实现方式

flyfish

kl_div 是 Kullback-Leibler Divergence的英文缩写。
其中,KL 对应提出该概念的两位学者(Kullback 和 Leibler)的姓氏首字母“div”是 divergence(散度)的缩写。

F.kl_div(logQ, P, reduction='sum') 等价于 torch.sum(P * (torch.log(P) - logQ))

import torch
import torch.nn.functional as F# 1. 定义示例输入(教师和学生的logits)
teacher_logits = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]], dtype=torch.float32)
student_logits = torch.tensor([[1.2, 2.1, 2.9], [3.8, 5.2, 6.1]], dtype=torch.float32)
T = 2.0  # 温度参数
batch_size = teacher_logits.size(0)# 2. 温度软化处理
teacher_scaled = teacher_logits / T
student_scaled = student_logits / T# 3. 计算分布
teacher_soft = F.softmax(teacher_scaled, dim=-1)  # 教师分布 P
student_log_soft = F.log_softmax(student_scaled, dim=-1)  # 学生对数分布 log Q# 4. 两种方式计算KL散度
# 方式1:手动计算(原始公式)
manual_kl = torch.sum(teacher_soft * (torch.log(teacher_soft) - student_log_soft)) / batch_size
manual_kl *= T**2  # 温度补偿# 方式2:使用PyTorch自带的F.kl_div
# 注意:F.kl_div(input=logQ, target=P, reduction='sum') 对应 sum(P*(logP - logQ))
torch_kl = F.kl_div(student_log_soft, teacher_soft, reduction='sum') / batch_size
torch_kl *= T**2  # 温度补偿# 5. 结果对比
print("===== 教师分布 P (softmax后) =====")
print(teacher_soft)
print("\n===== 学生对数分布 logQ (log_softmax后) =====")
print(student_log_soft)
print("\n===== KL散度计算结果 =====")
print(f"手动计算: {manual_kl.item():.6f}")
print(f"F.kl_div计算: {torch_kl.item():.6f}")
print(f"两者是否等价 (误差<1e-6): {torch.allclose(manual_kl, torch_kl, atol=1e-6)}")
===== 教师分布 P (softmax后) =====
tensor([[0.1863, 0.3072, 0.5065],[0.1863, 0.3072, 0.5065]])===== 学生对数分布 logQ (log_softmax后) =====
tensor([[-1.5909, -1.1409, -0.7409],[-1.8200, -1.1200, -0.6700]])===== KL散度计算结果 =====
手动计算: 0.008507
F.kl_div计算: 0.008507
两者是否等价 (误差<1e-6): True

说明:

1.输入设置:构造了教师和学生模型的logits(模拟不同的预测结果),并设置温度参数T=2.0

2.分布计算:
教师分布teacher_soft:通过softmax得到概率分布 PPP
学生对数分布student_log_soft:通过log_softmax得到 log⁡Q\log QlogQ

3.两种KL计算方式:

手动计算:严格按照公式 KL(P∥Q)=∑P⋅(log⁡P−log⁡Q)\text{KL}(P \parallel Q) = \sum P \cdot (\log P - \log Q)KL(PQ)=P(logPlogQ) 实现,除以批次大小后乘以温度平方补偿。

F.kl_div计算:直接调用PyTorch函数,注意参数顺序为(logQ, P),使用reduction='sum'确保与手动计算的求和逻辑一致。

4.等价性验证:通过torch.allclose检查两者结果是否在允许的浮点数误差范围内(1e-6)一致。

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

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

相关文章

C语言基础_补充知识、数据类型转换、选择结构

0、补充知识&#xff1a; 原码、反码、补码的知识&#xff1a; 计算机中原码转补码&#xff0c;正数不变&#xff0c;负数是符号位不变&#xff0c;其余各位取反码加一。负数的补码转原码应该是补码减一然后再取反&#xff0c;为什么负数的补码转原码是补码取反然后再加一&…

ubuntu自动重启BUG排查指南

当 Ubuntu 系统意外重启时&#xff0c;排查原因需要从系统日志、硬件状态和定时任务等多个方面入手。 示例&#xff1a;通过日志检查重启原因 last -x | head | tac 此命令显示最近的关机和重启记录。如果记录中包含 shutdown 或 crash&#xff0c;则可能是人为操作或系统故障导…

2. JS 有哪些数据类型

总结 基础类型&#xff08;7 种&#xff09;&#xff1a;number, string, boolean, null, undefined, symbol, bigint引用类型&#xff08;对象及其子类&#xff09;&#xff1a;object, array, function, date, regexp, map, set 等 判断方式推荐&#xff1a; 基础类型&#x…

pipeline方法关系抽取--课堂笔记

Pipeline方法课堂笔记 一、Pipeline方法原理 pipeline方法是指在实体识别已经完成的基础上再进行实体之间关系的抽取. pipeline方法流程&#xff1a; 先对输入的句子进行实体抽取&#xff0c;将识别出的实体分别组合&#xff1b;然后再进行关系分类. 注意&#xff1a;这两个子过…

linux系统离线环境安装clickhouse客户端

1、下载离线安装包&#xff1a; 方式1&#xff1a;网站直接下载 链接&#xff1a;https://packagecloud.io/altinity/clickhouse 注意要下载同一版本的四个包 方式2&#xff1a;夸克网盘分享 链接&#xff1a;https://pan.quark.cn/s/7e77e6a1bc5f 2、将本地下载的安装包上传…

GPT-5的诞生之痛:AI帝国的现实危机

目录 前言 一、“俄里翁”的陨落&#xff1a;一场梦碎的代际飞跃 二、扎克伯格的“抄家式”突袭 三、天才的诅咒&#xff1a;当AI聪明到无法与我们对话 四、烧钱的无底洞与微软的影子 结语&#xff1a;AI帝国的黄昏&#xff0c;还是黎明前的黑暗&#xff1f; &#x1f3a…

探索设计模式的宝库:Java-Design-Patterns

在软件开发领域&#xff0c;设计模式是解决常见问题的经典方案&#xff0c;它们如同建筑师的蓝图&#xff0c;为开发者提供了经过验证的最佳实践。今天我要向大家介绍一个GitHub上的明星项目——java-design-patterns&#xff0c;这是一个全面、实用且持续更新的设计模式宝藏项…

JavaScript中的作用域、闭包、定时器 由浅入深

1. JavaScript中的作用域是什么&#xff1f; 作用域&#xff08;Scope&#xff09;是程序中定义变量的区域&#xff0c;它决定了变量的可访问性&#xff08;可见性&#xff09;。在JavaScript中&#xff0c;作用域主要分为三种&#xff1a;全局作用域、函数作用域和块级作用域&…

仓库管理系统-11-前端之头部区域Header的用户登录和退出功能

文章目录 1 登录功能 1.1 登录页面(Login.vue) 1.1.1 页面布局 1.1.2 初始化数据 1.1.3 confirm方法 1.1.4 UserController.java(登录接口) 1.1.5 Login.vue 1.2 登录页面的路由 1.2.1 创建路由文件(router/index.js) 1.2.2 注册路由器(main.js) 1.2.3 路由视图(App.vue) 2 退出…

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…

飞算科技:以自主创新引领数字科技浪潮,飞算JavaAI赋能产业智能化升级

技术创新已成为企业突破瓶颈、实现跨越式发展的核心驱动力。作为国家级高新技术企业&#xff0c;飞算数智科技&#xff08;深圳&#xff09;有限公司&#xff08;简称“飞算科技”&#xff09;凭借其深厚的互联网科技、大数据与人工智能技术积淀&#xff0c;以及在民生产业、中…

51单片机按键复位电路电压随着电容放电升高的分析

一、引言在单片机系统中&#xff0c;复位电路是一个至关重要的组成部分&#xff0c;它确保了单片机在特定情况下能够恢复到初始状态&#xff0c;从而避免程序运行错误或系统崩溃。对于51单片机而言&#xff0c;按键复位电路是一种常用的复位方式&#xff0c;它通过手动按下复位…

JVM学习日记(十五)Day15——性能监控与调优(二)

好了我们这一篇继续来说命令行监控指令&#xff0c;上一篇说了4个比较重要的指令&#xff0c;其中用的比较多的也就是jstat和jmap了。 jhat&#xff1a;堆转储分析工具 他是JDK自带的分析工具&#xff0c;分析我们上一篇说的jmap转存的内存快照&#xff0c;​​内置了一个微型…

Docker国内镜像列表

Docker 镜像源列表&#xff08;8月3日更新-长期&免费&#xff09;_docker国内镜像源-CSDN博客

Orange AI 管理平台单体版安装教程(Docker Compose 部署)

Orange AI 管理平台单体版安装教程&#xff08;Docker Compose 部署&#xff09; 本文介绍如何通过 Docker Compose 快速安装 Orange AI 管理平台单体版&#xff0c;适用于本地开发和测试环境。步骤简单&#xff0c;适合初学者和有一定运维经验的用户。 一、环境准备 已安装 …

PHP的魔术方法

一、介绍 ‌PHP魔术方法是以双下划线__开头的一组特殊方法&#xff0c;用于在对象生命周期、属性访问、方法调用等场景中实现自动化操作。‌简化面向对象编程。 二、17个现有的魔术方法 &#xff08;一&#xff09;、对象生命周期相关 1、__construct() 类的构造函数方法&a…

vue2实现类似chatgpt和deepseek的AI对话流打字机效果,实现多模型同时对话

实现多模型同时对话功能特点&#xff1a;1、抽离对话框成单独组件ChatBox.vue&#xff0c;在新增模型对比窗口时可重复利用2、通过sse与后台实时数据流&#xff0c;通过定时器实现打字效果3、适应深度思考内容输出&#xff0c;可点击展开与闭合4、可配置模型参数&#xff0c;本…

电脑上不了网怎么办?【图文详解】wifi有网络但是电脑连不上网?网络设置

一、问题背景 你有没有遇到过这种情况&#xff1a;电脑右下角的网络图标明明显示连接正常&#xff0c;可打开浏览器就是加载不出网页&#xff0c;聊天软件也刷不出新消息&#xff1f; 这种 "网络已连接但无法上网" 的问题特别常见&#xff0c;既不是没插网线&#xf…

思途Spring学习 0804

SpringBoot 核心概念与开发实践SpringBoot 是一个基于 Spring 框架的快速开发脚手架&#xff0c;通过约定大于配置的原则简化了传统 Spring 应用的初始化配置。其核心目标是整合 Spring 生态&#xff08;如 SSM&#xff09;并支持微服务架构开发。控制反转&#xff08;IoC&…

Hutool工具类:Java开发必备神器

Hutool工具类使用说明Hutool是一个Java工具类库&#xff0c;提供了丰富的功能模块&#xff0c;包括字符串处理、日期时间操作、IO流、加密解密、HTTP客户端等。以下是一些常用模块的具体使用方法。字符串工具&#xff08;StrUtil&#xff09;字符串处理是开发中的常见需求&…