知识蒸馏 - 通过引入温度参数T调整 Softmax 的输出

知识蒸馏 - 通过引入温度参数T调整 Softmax 的输出

flyfish

import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as np# 设置中文字体支持
plt.rcParams["font.family"] = ['AR PL UMing CN']  # Linux
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 模拟模型输出的logits
logits = torch.tensor([10.0, 4.0, 1.0])# 定义不同的温度值
temperatures = [0.5, 1.0, 5.0, 10.0, 20.0]# 计算不同温度下的softmax输出
results = {}
for T in temperatures:soft_labels = F.softmax(logits / T, dim=0)results[T] = soft_labels.numpy()# 打印结果(保留四位小数)
print("原始logits:", logits.numpy())
for T, soft_labels in results.items():# 使用列表推导式和格式化字符串保留四位小数formatted_probs = [f"{p:.4f}" for p in soft_labels]print(f"温度 T={T} 时的软标签: [{', '.join(formatted_probs)}]")# 可视化不同温度下的概率分布
plt.figure(figsize=(14, 7))
x = np.arange(len(logits))
width = 0.8 / len(temperatures)for i, (T, soft_labels) in enumerate(results.items()):bars = plt.bar(x + i * width - 0.4 + width/2, soft_labels, width, label=f'T={T}')# 在每个柱子上方添加保留四位小数的概率值for bar in bars:height = bar.get_height()plt.text(bar.get_x() + bar.get_width()/2., height + 0.01,f'{height:.4f}', ha='center', va='bottom', rotation=90)plt.xticks(x, ['猫', '狗', '狐狸'])
plt.ylabel('概率')
plt.title('不同温度T下的softmax概率分布')
plt.legend()
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.ylim(0, 1.1)  # 调整y轴范围,使标签显示完整
plt.tight_layout()
plt.show()

原始logits: [10. 4. 1.]
温度 T=0.5 时的软标签: [1.0000, 0.0000, 0.0000]
温度 T=1.0 时的软标签: [0.9974, 0.0025, 0.0001]
温度 T=5.0 时的软标签: [0.6819, 0.2054, 0.1127]
温度 T=10.0 时的软标签: [0.5114, 0.2807, 0.2079]
温度 T=20.0 时的软标签: [0.4204, 0.3115, 0.2681]
在这里插入图片描述

低温(T=0.5):分布极陡峭,几乎只保留最大值对应的类别(猫)
标准温度(T=1.0):接近传统 softmax,突出最大值但保留少量其他类别概率
高温(T=10.0):分布非常平滑,所有类别概率接近均等

对于给定的logits向量z=[z1,z2,...,zk]\mathbf{z} = [z_1, z_2, ..., z_k]z=[z1,z2,...,zk](其中ziz_izi是模型对第iii类的原始输出分数,比如代码中的logits = [10.0, 4.0, 1.0]),以及温度参数TTT,第iii类的软标签概率pip_ipi计算公式为:

pi=ezi/T∑j=1kezj/T p_i = \frac{e^{z_i / T}}{\sum_{j=1}^{k} e^{z_j / T}} pi=j=1kezj/Tezi/T

解释:

ziz_izi:代码中的logits[i](如logits[0] = 10.0对应“猫”的原始分数);
TTT:代码中的温度参数(如T=0.5,1.0,5.0等);
ezi/Te^{z_i / T}ezi/T:对“原始分数除以温度”做指数运算(代码中由F.softmax内部实现);
分母∑j=1kezj/T\sum_{j=1}^{k} e^{z_j / T}j=1kezj/T:所有类别的指数结果之和,用于归一化(确保所有概率之和为1);
pip_ipi:最终的软标签概率(代码中soft_labels[i],如“猫”在T=5.0时的概率约为0.6811)。

作用:

通过温度TTT缩放logits的“差异幅度”:
T→0+T \to 0^+T0+时,指数部分对大的ziz_izi更敏感,概率分布会极度陡峭(接近硬标签);
T→+∞T \to +\inftyT+时,所有zi/Tz_i / Tzi/T趋近于0,指数结果趋近于1,概率分布会趋近均匀(所有类别概率接近相等)。
T=0.5时“猫”的概率接近1,T=20时三类概率更均匀。

在知识蒸馏(Knowledge Distillation)中,引入温度参数TTT 调整 Softmax 输出的核心目的是获取更有信息量的“软标签”(Soft Labels),以便让学生模型(Student Model)更好地学习教师模型(Teacher Model)的“知识”。温度TTT 的核心作用是通过“软化”教师模型的输出分布,保留更多关于类别间关系的细粒度知识,让学生模型能更有效地学习教师的经验。

原因

1. 原始 Softmax(T=1T=1T=1)的局限性

原始 Softmax 函数的公式为:
pi=ezi∑jezj p_i = \frac{e^{z_i}}{\sum_{j} e^{z_j}} pi=jezjezi
其中ziz_izi 是模型输出的 logits(未归一化的分数)。

当模型对正确类别有较高置信度时(比如教师模型很“确信”某个样本是“猫”),原始 Softmax 的输出会极度集中在最大 logits 对应的类别上,其他类别的概率几乎为 0(例如:p猫≈0.999p_{\text{猫}} \approx 0.999p0.999p狗≈0.001p_{\text{狗}} \approx 0.001p0.001p狐狸≈0p_{\text{狐狸}} \approx 0p狐狸0)。

这种“陡峭”的概率分布(接近硬标签)丢失了很多有价值的信息:教师模型可能认为“狗”比“狐狸”更接近“猫”(即p狗>p狐狸p_{\text{狗}} > p_{\text{狐狸}}p>p狐狸),但原始 Softmax 会将这种差异压缩到几乎不可见。

2. 温度TTT 的作用:“软化”概率分布,保留更多知识

当引入温度TTT 后,Softmax 公式变为:
pi=ezi/T∑jezj/T p_i = \frac{e^{z_i / T}}{\sum_{j} e^{z_j / T}} pi=jezj/Tezi/T

T>1T > 1T>1:logits 被“缩放”(除以TTT),导致指数函数的“敏感度”降低,不同类别的概率差异被拉平(分布更平缓)。
例如,教师模型对“猫”“狗”“狐狸”的 logits 为 [10, 4, 1]:
T=1T=1T=1 时,输出可能是 [0.997, 0.002, 0.001](几乎只有“猫”有概率);
T=10T=10T=10 时,输出可能是 [0.607, 0.242, 0.151](保留了“狗比狐狸更接近猫”的信息)。

这种“软化”的软标签包含了教师模型对类别间相似性的判断(哪些类别容易混淆、哪些类别差异大),这些信息比单纯的硬标签(如“猫”)更丰富,能帮助学生模型学习到更鲁棒的特征。

3. 知识蒸馏中的配合使用

在知识蒸馏中,教师模型用高温TTT 生成软标签,学生模型在训练时既学习软标签(用相同的TTT),也学习原始硬标签(可选)。推理时,学生模型再用T=1T=1T=1 输出最终的硬预测。

通过这种方式,学生模型不仅学到了“正确答案”,还学到了教师模型的“推理过程”(如何权衡不同类别的可能性),从而在参数更少的情况下达到接近教师模型的性能。

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

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

相关文章

Java研学-RabbitMQ(三)

一 消息通信协议 1 AMQP AMQP 是一个开放的、跨语言、跨平台的消息协议标准,用于在分布式系统中传递业务消息。它定义了消息队列的二进制协议格式和交互模型(如交换机、队列、绑定等),确保不同语言(Java、Python、C#等…

http.client 教程-如何使用 Python 标准库发送 HTTP 请求

http.client 教程-如何使用 Python 标准库发送 HTTP 请求以下是 http.client 模块的详细使用教程,帮助你理解如何使用 Python 标准库发送 HTTP 请求:1. http.client 概述http.client 是 Python 内置的 HTTP 客户端库,提供了底层的 HTTP 协议实…

Android-三种持久化方式详解

持久化技术分为3种,文件,sharedPreferences存储,数据库来存储; 目录 文件存储: 利用SharedPreferences中读取数据 SQLite创建数据库 更新 添加 删除 查找: 文件存储: 文件存储是 Andr…

并发安全之锁机制一

锁机制一 锁机制是计算机系统中解决并发冲突的核心工具,其存在和应用场景源于一个根本问题:当多个执行单元(线程、进程、分布式节点)同时访问或修改同一份共享资源时,如何保证数据的正确性、一致性和系统可靠性&#x…

结合项目阐述 设计模式:单例、工厂、观察者、代理

原文链接:https://download.csdn.net/blog/column/12433305/133862792#_1613 1、工厂模式应用 C17及之后可编译 /*日志落地模块的实现1.抽象落地基类2.派生子类(根据不同落地方向进行派生)3.使用工厂模式进行创建与表示的分离 */#ifndef _…

uniapp 更新apk有缓存点不动,卸载安装apk没有问题。android

方式一。pages.json:"globalStyle" : {"navigationBarTextStyle" : "black","navigationBarTitleText" : "uni-app","navigationBarBackgroundColor" : "#F8F8F8","backgroundColor&qu…

HTML响应式SEO公司网站源码

核心优势 100%纯HTML/CSS开发自动适配手机/平板/PC内置SEO优化结构0.5秒极速加载 包含页面 • 首页(关键词布局优化版) • 服务项目展示页 • 客户案例库 • 新闻资讯系统 • 联系方式(带地图API) 技术参数 兼容Chrome/Firefo…

Error: llama runner process has terminated: exit status 2

我是i7 12700h ,3080显卡,在 Windows 11 上运行 ollama run deepseek-r1:1.5b 出现 Error: llama runner process has terminated: exit status 2 之前是好用的,后来不知为什么就不好用了。 原因: 检查 Microsoft Visual C Redistributab…

Linux中ssh远程登录原理与配置

SSH连接的五个阶段 1. 版本协商阶段(Protocol Version Negotiation)目的:协商使用SSH-1或SSH-2协议(现代系统默认SSH-2)。流程:关键点:若版本不兼容(如客户端只支持SSH-1&#xff0c…

Kubernetes --存储入门

一、Volume 的概念对于大多数的项目而言,数据文件的存储是非常常见的需求,比如存储用户上传的头像、文件以及数据库的数据。在 Kubernetes 中,由于应用的部署具有高度的可扩展性和编排能力(不像传统架构部署在固定的位置&#xff…

蚂蚁 KAG 框架开源:知识图谱 + RAG 双引擎

引言:从RAG到KAG,专业领域知识服务的技术突破 在大语言模型(LLM)应用落地过程中,检索增强生成(RAG) 技术通过引入外部知识库有效缓解了模型幻觉问题,但在专业领域仍面临三大核心挑战…

V-Ray 7.00.08 for 3ds Max 2021-2026 安装与配置教程(含语言补丁)

本文介绍 V-Ray 7.00.08 渲染器在 3ds Max 2021-2026 各版本中的安装与使用配置步骤,适合需要进行可视化渲染工作的设计师、建筑师及相关从业者。附带语言补丁配置方式,帮助用户获得更顺畅的使用体验。 📁 一、安装文件准备 软件名称&#xf…

Go-Elasticsearch Typed Client查询请求的两种写法强类型 Request 与 Raw JSON

1 为什么需要两种写法? 在 Golang 项目中访问 Elasticsearch,一般会遇到两类需求:需求场景特点最佳写法后台服务 / 业务逻辑查询固定、字段清晰,需要编译期保障Request 结构体仪表盘 / 高级搜索 / 模板 DSL查询片段由前端或脚本动…

Leaflet 综合案例-聚类图层控制

看过的知识不等于学会。唯有用心总结、系统记录,并通过温故知新反复实践,才能真正掌握一二 作为一名摸爬滚打三年的前端开发,开源社区给了我饭碗,我也将所学的知识体系回馈给大家,助你少走弯路! OpenLayers…

React组件中的this指向问题

在 React 组件中,函数定义方式影响this指向的核心原因是箭头函数与普通函数的作用域绑定规则不同,具体差异如下:​ 1. 普通函数(function定义)需要手动bind(this)的原因​ 当用function在组件内定义方法时&#xff1…

Vue 项目中的组件引用如何实现,依赖组件间的数据功能交互及示例演示

在 Vue 项目中,组件间的引用与数据交互是核心功能之一。以下是组件引用和数据交互的详细实现方式及示例:一、组件引用方式 1. 基本组件引用 局部注册:在父组件中按需引入子组件并注册。 // ParentComponent.vue import ChildComponent from .…

✨ 使用 Flask 实现头像文件上传与加载功能

文章目录&#x1f9f1; 技术栈&#x1f5c2;️ 项目结构与配置&#x1f510; 用户身份校验逻辑&#x1f4e4; 头像上传接口&#xff1a;/file/avatar/upload&#x1f4e5; 加载头像接口&#xff1a;/file/avatar/load/<filename>&#x1f9ea; 示例请求&#xff08;使用 …

去除视频字幕 5: 使用 ProPainter, 记录探索过程

使用 ProPainter 去除视频上的字幕&#xff0c;效果演示&#xff08;比之前好多了。&#xff09;。 1. 项目目标 去除视频 (bear.webm) 中的硬字幕。 2. 初始尝试与关键失败&#xff1a;IOPaint 方法: 使用 IOPaint&#xff08;一个图像修复工具&#xff09;配合 PaddleOCR 逐…

JavaScript HTTP 请求:从老古董到新潮流

前端开发离不开跟后端打交道&#xff0c;HTTP 请求就是这座桥梁。JavaScript 提供了好几种方式来发请求&#xff0c;从老牌的 XMLHttpRequest (XHR) 到现代的 Fetch API&#xff0c;再到各种好用的第三方库&#xff08;像 Axios、Ky、Superagent&#xff09;。咱们一个一个聊清…

Windows10系统使用Cmake4.1.0构建工具+Visual Studio2022编译Opencv4.11教程

安装提示 后续安装本Cmake和Opencv版本及以上都可以。Microsoft Visual Studio2022已默认安装&#xff0c;没有安装给出教程链接。 一、Cmake4.1.0下载 1.官网下载&#xff1a;https://cmake.org/download/&#xff0c;找到cmake-4.1.0-rc3-windows-x86_64.zip版本 2.压缩包…