知識蒸餾 - 基于KL散度的知識蒸餾 HelloWorld 示例 采用PyTorch 內置函數F.kl_div的實現方式

知識蒸餾 - 基于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?(logP?logQ) 實現,除以批次大小后乘以溫度平方補償。

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;字符串處理是開發中的常見需求&…