《DATASET DISTILLATION》
这篇文章提出了数据浓缩的办法,在前面已有的知识浓缩(压缩模型)的经验上,提出了不压缩模型,转而压缩数据集的办法,在压缩数据集上训练模型得到的效果尽可能地接近原始数据集的效果。
摘要
模型蒸馏的目的是将复杂模型的知识提炼为简单模型的知识。在本文中考虑了一个替代的公式,称为数据集蒸馏:我们保持模型固定,而不是尝试从一个大的训练数据集提取知识到一个小的。其思想是合成少量的数据点,这些数据点不需要来自于正确的数据分布,但当给学习算法作为训练数据时,会近似于在原始数据上训练的模型。例如,文章展示了可以将6万幅MNIST训练图像压缩成10幅合成蒸馏图像(每类一张),在给定一个固定的网络初始化条件下,只需几个梯度下降步骤,就可以达到接近原始性能的效果。
效果1:使用压缩后的图片进行训练,10张MNIST或者100张CIFAR10,就可以达到94%的准确率和54%的准确率。
效果2:使用压缩数据进行fine-tune,可以很好地微调数据集效果。
效果3:将攻击数据集浓缩,可以更好地强化攻击的效果,仅仅用300张图片就使得目标类的分类准确率降低至7%。
相关工作:
Pass
方法:
准备工作
考虑有数据集 x = { x i } i = 1 N \mathbf{x}=\left\{x_i\right\}_{i=1}^N x={xi}i=1N为原始数据集,神经网络为 θ \theta θ, ℓ ( x i , θ ) \ell\left(x_i, \theta\right) ℓ(xi,θ)是 x i x_i xi在模型 θ \theta θ上的损失。
θ ∗ = arg min θ 1 N ∑ i = 1 N ℓ ( x i , θ ) ≜ arg min θ ℓ ( x , θ ) \theta^*=\underset{\theta}{\arg \min } \frac{1}{N} \sum_{i=1}^N \ell\left(x_i, \theta\right) \triangleq \underset{\theta}{\arg \min } \ell(\mathbf{x}, \theta) θ∗=θargminN1i=1∑Nℓ(xi,θ)≜θargminℓ(x,θ)
上式就是神经网络优化的最终目标,训练获得一个 θ ∗ \theta^* θ∗使得模型在数据集上的损失最小。
这里为了方便,直接将
ℓ ( x , θ ) \ell(\mathbf{x}, \theta) ℓ(x,θ)
记为数据集上的损失平均和
优化浓缩数据
浓缩数据和浓缩学习率都是随机初始化的,通过不断地计算损失梯度下降,优化得到最终的浓缩数据集以及浓缩学习率,如何获得优化函数便是这里的重点。
x ~ = { x ~ i } i = 1 M \tilde{\mathbf{x}}=\left\{\tilde{x}_i\right\}_{i=1}^M x~={x~i}i=1M中 M ≪ N M \ll N M≪N 并且对应的学习率 η ~ \tilde{\eta} η~,对应的梯度下降为:
θ 1 = θ 0 − η ~ ∇ θ 0 ℓ ( x ~ , θ 0 ) \theta_1=\theta_0-\tilde{\eta} \nabla_{\theta_0} \ell\left(\tilde{\mathbf{x}}, \theta_0\right) θ1=θ0−η~∇θ0ℓ(x~,θ0)
使用生成的浓缩数据集 x ~ \tilde{\mathbf{x}} x~ 可以极大地增强训练的效果。给定一个初始的 θ 0 \theta_0 θ0,我们获得 x ~ \tilde{\mathbf{x}} x~ 和学习率 η ~ \tilde{\eta} η~ 通过最小化以下损失函数 L \mathcal{L} L :
x ~ ∗ , η ~ ∗ = arg min x ~ , η ~ L ( x ~ , η ~ ; θ 0 ) = arg min x ~ , η ~ ℓ ( x , θ 1 ) = arg min x ~ , η ~ ℓ ( x , θ 0 − η ~ ∇ θ 0 ℓ ( x ~ , θ 0 ) ) , \tilde{\mathbf{x}}^*, \tilde{\eta}^*=\underset{\tilde{\mathbf{x}}, \tilde{\eta}}{\arg \min } \mathcal{L}\left(\tilde{\mathbf{x}}, \tilde{\eta} ; \theta_0\right)=\underset{\tilde{\mathbf{x}}, \tilde{\eta}}{\arg \min } \ell\left(\mathbf{x}, \theta_1\right)=\underset{\tilde{\mathbf{x}}, \tilde{\eta}}{\arg \min } \ell\left(\mathbf{x}, \theta_0-\tilde{\eta} \nabla_{\theta_0} \ell\left(\tilde{\mathbf{x}}, \theta_0\right)\right), x~∗,η~∗=x~,η~argminL(x~,η~;θ0)=x~,η~argminℓ(x,θ1)=x~,η~argminℓ(x,θ0−η~∇θ0ℓ(x~,θ0)),
现在看着可能会很抽象,这里简单的讲解一下,方法就是:
- 先使用随机初始化的 x ~ \tilde{\mathbf{x}} x~和 η ~ \tilde{\eta} η~,将浓缩数据集 x ~ \tilde{\mathbf{x}} x~和浓缩学习率 η ~ \tilde{\eta} η~丢入神经网络 θ 0 \theta_0 θ0进行一轮训练。
- 使用原始数据集 检验 使用浓缩数据集 x ~ \tilde{\mathbf{x}} x~和浓缩学习率 η ~ \tilde{\eta} η~训练得到的新一轮神经网络 θ 1 \theta_1 θ1,计算原始数据集在这个模型上的损失。
- 这个损失就是我们的优化目标,我们要让这个损失最小。
模型随机初始化
上面的函数中,模型总是使用 θ 0 \theta_0 θ0进行训练获得浓缩数据集和浓缩学习率,作者担心这样获得的浓缩数据集和浓缩学习率会和 θ 0 \theta_0 θ0有较大的关系,不能很好地泛化到其他初始化,因此作者又提出使用随机的 θ 0 \theta_0 θ0来训练。
于是作者就改成,每一轮的 θ \theta θ都不同, θ 0 \theta_0 θ0是一个满足 p ( θ ) p(\theta) p(θ)的分布。
SGD下降法
每次选中一个batch,每个batch使用不同的初始化,就是把之前的GD修改为minibatch梯度下降。
具体算法如下图所示:
将原始数据集划分为 x t x_t xt的batch,每一个batch有不同的初始化 θ 0 \theta_0 θ0,每一个batch的计算方法与前面相同,最后将每个batch计算获得的 x ~ \tilde{\mathbf{x}} x~和 η ~ \tilde{\eta} η~平均。
相关文章:

《DATASET DISTILLATION》
这篇文章提出了数据浓缩的办法,在前面已有的知识浓缩(压缩模型)的经验上,提出了不压缩模型,转而压缩数据集的办法,在压缩数据集上训练模型得到的效果尽可能地接近原始数据集的效果。 摘要 模型蒸馏的目的是…...
GDPU 数据结构 天码行空1
1. 病历信息管理 实现病历查询功能。具体要求如下: 定义一个结构体描述病人病历信息(病历号,姓名,症状);完成功能如下: 输入功能:输入5个病人的信息; 查询功能:输入姓名,在5个病历中进行查找,如果找到则显示该人的信息,…...

【C++】红黑树的模拟实现
🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…...

【多线程】Thread 类 详解
Thread 类 详解 一. 创建线程1. 继承 Thread 类2. 实现 Runnable 接口3. 其他变形4. 多线程的优势-增加运行速度 二. Thread 类1. 构造方法2. 常见属性3. 启动线程-start()4. 中断线程-interrupt()5. 线程等待-join()6. 线程休眠-sleep()7. 获取当前线程引用 三. 线程的状态1. …...

LINUX 网络管理
目录 一、NetworkManager的特点 二、配置网络 1、使用ip命令临时配置 1)查看网卡在网络层的配置信息 2)查看网卡在数据链路层的配置信息 3)添加或者删除临时的网卡 4)禁用和启动指定网卡 2、修改配置文件 3、nmcli命令行…...

refresh rate
1920 x 1080 显卡刷新率 60...
使用 NGINX Unit 实施应用隔离
原文作者:Artem Konev - Senior Technical Writer 原文链接:使用 NGINX Unit 实施应用隔离 转载来源:NGINX 中文官网 NGINX 唯一中文官方社区 ,尽在 nginx.org.cn NGINX Unit 特性集的最新动态之一是支持应用隔离,该特…...

2023/09/12 qtc++
实现一个图形类(Shape) ,包含受保护成员属性:周长、面积, 公共成员函数:特殊成员函数书写 定义一个圆形类(Circle) ,继承自图形类,包含私有属性:半径 公共成员函数:特殊成员函数…...

全科医学科常用评估量表汇总,建议收藏!
根据全科医学科医生的量表使用情况,笔者整理了10个常用的全科医学科量表,可在线评测直接出结果,可转发使用,可生成二维码使用,可创建项目进行数据管理,有需要的小伙伴赶紧收藏! 日常生活能力量表…...

了解消息中间件的基础知识
为什么要使用消息中间件? 解耦:消息中间件可以使不同的应用程序通过解耦的方式进行通信,减少系统间的依赖关系提供异步通信:消息中间件可以实现异步消息传递,提高系统的响应性能。流量削峰:消息中间件可以…...

【linux】Linux wps字体缺失、加粗乱码解决
解决wps字体缺失问题 1、下载字体包 git clone https://github.com/iamdh4/ttf-wps-fonts.git2、创建单独放置字体的目录 mkdir /usr/share/fonts/wps-fonts3、复制字体到系统目录下 cp ttf-wps-fonts/* /usr/share/fonts/wps-fonts4、修改字体权限 chmod 644 /usr/share/f…...
每日两题 103二叉树的锯齿形层序遍历(数组) 513找树左下角的值(队列)
103 题目 103 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例 1: 输入:root [3,9,…...
ROS2报错:ImportError: cannot import name ‘Log‘ from ‘rosgraph_msgs.msg‘
在使用ros2的bag命令查看数据集信息时报错 Traceback (most recent call last):File "/opt/ros/noetic/bin/rosbag", line 34, in <module>import rosbagFile "/opt/ros/noetic/lib/python3/dist-packages/rosbag/__init__.py", line 33, in <mo…...
【Vue】Vue中的代码分为哪几种类型?
在 Vue 中的代码可以分为以下几种类型: 1.模板代码 模板代码是 Vue 中用来生成 HTML 的一种语法,可以通过 Vue 的模板语法和指令来动态渲染页面。模板代码一般写在 Vue 组件的 template 标签中。 2.JavaScript 代码 JavaScript 代码是 Vue 组件中用来…...
es6中includes用法
js中的includes用法 1.数组 includes 可以判断一个数组中是否包含某一个元素,并返回true 或者false [a,b,c].includes(a) true [a,b,c].includes(1) false includes可以包含两个参数,第二个参数表示判断的起始位置 起始位置第一个数字是0。 2.字符串 …...
QT中QRadioButton实现分组C++
通过对QRadioButton组件进行分组可解决QRadioButton组件的互斥性 实现如下。 假设已设计好UI并且有UI代码情况: 头文件引用: #include <QButtonGroup> 分组功能 ,cpp文件代码实现: Your_Project::Your_Project(QWidge…...

kafka实战报错解决问题
需求 在一个在线商城中,用户下单后需要进行订单的处理。为了提高订单处理的效率和可靠性,我们使用Kafka来实现订单消息的异步处理。当用户下单后,订单信息会被发送到Kafka的一个Topic中,然后订单处理系统会从该Topic中消费订单消…...

vite+react 使用 react-activation 实现缓存页面
对应的版本 "react": "^18.2.0", "react-activation": "^0.12.4", "react-dom": "^18.2.0", "react-router-dom": "^6.15.0",react-activation 这是一个npm包,在react keep alive…...
【android 蓝牙开发——蓝牙耳机】
【android 蓝牙开发——传统蓝牙】 【android 蓝牙开发——BLE(低功耗)蓝牙 2021-10-09更新】 总结一下蓝牙开发的基本使用以及蓝牙耳机的断开和链接。 所以需权限: <uses-permission android:name"android.permission.ACCESS_FIN…...

Golang goroutine 进程、线程、并发、并行
goroutine 看一个需求 需求:要求统计1-200000000000的数字中,哪些是素数? 分析思路: 1)传统的方法,就是使用一个循环,循环的判断各个数是不是素数(一个任务就分配给一个cpu去做,这样很不划算…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...

Linux实现线程同步的方式有哪些?
什么是线程同步? 想象一下超市收银台:如果所有顾客(线程)同时挤向同一个收银台(共享资源),场面会一片混乱。线程同步就是给顾客们发"排队号码牌",确保: 有序访…...

【自然语言处理】大模型时代的数据标注(主动学习)
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构D 实验设计E 个人总结 A 论文出处 论文题目:FreeAL: Towards Human-Free Active Learning in the Era of Large Language Models发表情况:2023-EMNLP作者单位:浙江大…...
CSP信奥赛C++常用系统函数汇总
# CSP信奥赛C常用系统函数汇总## 一、输入输出函数### 1. cin / cout(<iostream>) cpp int x; cin >> x; // 输入 cout << x << endl;// 输出 优化:ios::sync_with_stdio(false); 可提升速度 2. scanf() /…...