当前位置: 首页 > news >正文

【DeepSeek背后的技术】系列二:大模型知识蒸馏(Knowledge Distillation)

目录

  • 1 引言
  • 2 操作步骤和公式说明
    • 2.1 准备教师模型(Teacher Model)和学生模型(Student Model)
    • 2.2 生成软标签(Soft Labels)
    • 2.3 定义蒸馏损失函数
    • 2.4 训练学生模型
    • 2.5 调整超参数
    • 2.6 评估与部署
  • 3 其他知识蒸馏技术
  • 4 实践
  • 参考文献

1 引言

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,从而导致模型变得越来越大,因此,我们需要一些大模型压缩技术来降低模型部署的成本,并提升模型的推理性能。而大模型压缩主要分为如下几类::剪枝(Pruning)、知识蒸馏(Knowledge Distillation)、量化(Quantization)、低秩分解(Low-Rank Factorization)。

模型压缩方法分类:
模型压缩

技术概述图:
技术介绍

大规模语言模型(LLM)近年来在自然语言处理领域取得了巨大进步,使得人类对话和文本生成成为可能。然而,开源LLM模型由于参数规模较小,性能难以达到商业LLM的水平。知识蒸馏技术可以解决这一问题,它通过利用商业LLM的高性能,将其知识“蒸馏”(Knowledge Distillation,知识蒸馏,简称KD)到更小的开源模型中,从而实现高性能和低成本。

KD

模型蒸馏(Model Distillation)最初由Hinton等人于2015年在论文《Distilling the Knowledge in a Neural Network》提出,其核心思想是通过知识迁移的方式,将一个复杂的大模型(教师模型)的知识传授给一个相对简单的小模型(学生模型),简单概括就是利用教师模型的预测概率分布作为软标签对学生模型进行训练,从而在保持较高预测性能的同时,极大地降低了模型的复杂性和计算资源需求,实现模型的轻量化和高效化。

下面是模型蒸馏的要点:

  • 首先需要训练一个大的模型,这个大模型也称为 teacher 模型。
  • 利用 teacher 模型输出的概率分布训练小模型,小模型称为 student 模型。
  • 训练 student 模型时,包含两种 label,soft label 对应了 teacher 模型输出的概率分布,而 hard label 是原来的 one-hot label。
  • 模型蒸馏训练的小模型会学习到大模型的表现以及泛化能力。

2 操作步骤和公式说明

2.1 准备教师模型(Teacher Model)和学生模型(Student Model)

  • 教师模型:已经训练好的高性能大型模型(如BERT、GPT等)。
  • 学生模型:结构更简单的小型模型(如TinyBERT、DistilBERT等),参数量远小于教师模型。

公式说明
假设教师模型的输出概率分布为 pt,学生模型的输出概率分布为 ps

2.2 生成软标签(Soft Labels)

  • 操作
    对训练数据中的每个样本 x,用教师模型计算其输出概率分布(软标签)。
    通过引入温度参数T 平滑概率分布,使类别间的关系更明显。

公式说明
教师模型的软标签计算:

软标签

其中:

  • zt 是教师模型的原始输出(logits),
  • T是温度参数(通常 T > 1,如 T=3)。

高温T使概率分布更平滑,学生模型能学习到类别间的隐含关系(例如“猫”和“狗”的相似性),硬标签(One-hot编码)仅包含0/1信息,而软标签包含更多知识。

2.3 定义蒸馏损失函数

  • 操作
    设计总损失函数,结合蒸馏损失(模仿教师模型)和任务损失(拟合真实标签)。

公式说明

  1. 蒸馏损失(KL散度):

公式2

其中
公式3

zs是学生模型的logits,乘以 T2 是为了平衡温度缩放对梯度的影响。

  1. 任务损失(交叉熵):

公式4

其中
公式5

是学生模型的原始概率分布。

  1. 总损失
    公式6

其中 α 是蒸馏损失的权重,取值范围通常是 [0.5, 0.9]。

蒸馏损失强制学生模仿教师的概率分布,任务损失确保学生模型不偏离真实标签,温度T和权重 α需调参以平衡两者。

2.4 训练学生模型

  • 操作
    使用教师生成的软标签和真实标签联合训练学生模型,优化总损失 Ltotal
    训练时需注意:
    • 温度参数T:训练阶段使用高温(如T=3),推理阶段恢复T=1。
    • 梯度更新:同时优化学生对教师分布和真实标签的拟合。

公式说明
反向传播时,总损失的梯度计算为:
公式7

其中 θs是学生模型的参数。

注意:训练时高温 ( T ) 增强知识迁移,推理时恢复标准概率分布。

2.5 调整超参数

  • 温度T
    • 较高的T(如3~10)增强软标签的平滑性,适合复杂任务。
    • 较低的T(如1~2)贴近原始分布,适合简单任务。
  • 损失权重 α
    • 若教师模型质量高,可增大 α(如0.7~0.9)。
    • 若真实标签噪声小,可增大任务损失权重。

示例调参策略

  • 两阶段训练:
    1. 第一阶段:高T和大α,专注于学习教师知识。
    2. 第二阶段:逐渐降低T和α,贴近真实任务。

2.6 评估与部署

  • 评估指标
    • 学生模型在测试集上的准确率、F1值等任务指标。
    • 计算学生模型与教师模型的输出相似性(如KL散度)。
  • 部署
    • 学生模型以T=1运行,直接输出原始概率分布 psraw

核心思想:
通过教师模型的软标签(富含类别间关系)和学生模型的任务损失(保留真实标签信息),蒸馏实现了知识的迁移。

  • 温度T 是核心超参数,控制知识迁移的“清晰度”。
  • 两阶段训练(先学教师,再微调)是常见优化策略。

3 其他知识蒸馏技术

知识蒸馏技术分类

KD分类

前向KL和逆向KL对比

4 实践

以下是一个简单的模型蒸馏代码示例,使用一个预训练的ResNet-18模型作为教师模型,并使用一个简单的CNN模型作为学生模型。同时,将使用交叉熵损失函数和L2正则化项来优化学生模型的性能表现。

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, models, transforms# 定义教师模型和学生模型
teacher_model = models.resnet18(pretrained=True)
student_model = nn.Sequential(nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2),nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2),nn.Flatten(),nn.Linear(128 * 7 * 7, 10)
)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer_teacher = optim.SGD(teacher_model.parameters(), lr=0.01, momentum=0.9)
optimizer_student = optim.Adam(student_model.parameters(), lr=0.001)# 训练数据集
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])
trainset = datasets.MNIST('../data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)# 蒸馏过程
for epoch in range(10):running_loss_teacher = 0.0running_loss_student = 0.0for inputs, labels in trainloader:# 教师模型的前向传播outputs_teacher = teacher_model(inputs)loss_teacher = criterion(outputs_teacher, labels)running_loss_teacher += loss_teacher.item()# 学生模型的前向传播outputs_student = student_model(inputs)loss_student = criterion(outputs_student, labels) + 0.1 * torch.sum((outputs_teacher - outputs_student) ** 2)running_loss_student += loss_student.item()# 反向传播和参数更新optimizer_teacher.zero_grad()optimizer_student.zero_grad()loss_teacher.backward()optimizer_teacher.step()loss_student.backward()optimizer_student.step()print(f'Epoch {epoch+1}/10 \t Loss Teacher: {running_loss_teacher / len(trainloader)} \t Loss Student: {running_loss_student / len(trainloader)}')

在这个示例中:
(1)首先定义了教师模型和学生模型,并初始化了相应的损失函数和优化器;
(2)然后,加载了MNIST手写数字数据集,并对其进行了预处理;
(3)接下来,进入蒸馏过程:对于每个批次的数据,首先使用教师模型进行前向传播并计算损失函数值;然后使用学生模型进行前向传播并计算损失函数值(同时加入了L2正则化项以鼓励学生模型学习教师模型的输出);
(4)最后,对损失函数值进行反向传播和参数更新:打印了每个批次的损失函数值以及每个epoch的平均损失函数值。
通过多次迭代训练后,我们可以得到一个性能较好且轻量化的学生模型。

参考文献

  1. A Survey on Knowledge Distillation of Large Language Models
  2. A Survey on Model Compression for Large Language Models
  3. BERT模型蒸馏指南(知乎)

相关文章:

【DeepSeek背后的技术】系列二:大模型知识蒸馏(Knowledge Distillation)

目录 1 引言2 操作步骤和公式说明2.1 准备教师模型(Teacher Model)和学生模型(Student Model)2.2 生成软标签(Soft Labels)2.3 定义蒸馏损失函数2.4 训练学生模型2.5 调整超参数2.6 评估与部署 3 其他知识蒸…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.14 内存映射:处理超大型数组的终极方案

2.14 内存映射:处理超大型数组的终极方案 目录 #mermaid-svg-G91Kn9O4eN2k8xEo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-G91Kn9O4eN2k8xEo .error-icon{fill:#552222;}#mermaid-svg-G91Kn9O4eN2k…...

【C++】STL——vector的使用

目录 💕1.vector介绍 💕2.vector的基本用法 💕3.vector功能的具体用法 (讲解) 💕4.vector——size,capacity函数的使用 (简单略讲) 💕5.resize&#xff…...

springboot/ssm互联网智慧医院体检平台web健康体检管理系统Java代码编写

springboot/ssm互联网智慧医院体检平台web健康体检管理系统Java代码编写 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库&am…...

介绍一下Mybatis的Executor执行器

Executor执行器是用来执行我们的具体的SQL操作的 有三种基本的Executor执行器: SimpleExecutor简单执行器 每执行一次update或select,就创建一个Statement对象,用完立刻关闭Statement对象 ReuseExecutor可重用执行器 可重复利用Statement…...

Wide Deep 模型:记忆能力与泛化能力

实验和完整代码 完整代码实现和jupyter运行:https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 Wide & Deep 模型是一种结合了线性模型(Wide)和深度神经网络(Deep)的混…...

Hot100之矩阵

73矩阵置零 题目 思路解析 收集0位置所在的行和列 然后该行全部初始化为0 该列全部初始化为0 代码 class Solution {public void setZeroes(int[][] matrix) {int m matrix.length;int n matrix[0].length;List<Integer> list1 new ArrayList<>();List<…...

Python语言的安全开发

Python语言的安全开发 引言 在信息技术迅速发展的今天&#xff0c;网络安全问题愈发凸显。随着Python语言的广泛应用&#xff0c;尤其是在数据分析、人工智能、Web开发等领域&#xff0c;其安全问题越来越受到重视。Python作为一门高效且易于学习的编程语言&#xff0c;虽然在…...

蓝桥杯刷题DAY3:Horner 法则 前缀和+差分数组 贪心

所谓刷题&#xff0c;最重要的就是细心 &#x1f4cc; 题目描述 在 X 进制 中&#xff0c;每一数位的进制不固定。例如&#xff1a; 最低位 采用 2 进制&#xff0c;第二位 采用 10 进制&#xff0c;第三位 采用 8 进制&#xff0c; 则 X 进制数 321 的十进制值为&#xff…...

java项目验证码登录

1.依赖 导入hutool工具包用于创建验证码 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.2</version></dependency> 2.测试 生成一个验证码图片&#xff08;生成的图片浏览器可…...

手写MVVM框架-环境搭建

项目使用 webpack 进行进行构建&#xff0c;初始化步骤如下: 1.创建npm项目执行npm init 一直下一步就行 2.安装webpack、webpack-cli、webpack-dev-server&#xff0c;html-webpack-plugin npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin 3.配置webpac…...

2025年2月2日(网络编程 tcp)

tcp 循环服务 import socketdef main():# 创建 socket# 绑定tcp_server socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server.bind(("", 8080))# socket 转变为被动tcp_server.listen(128)while True:# 产生专门为链接进来的客户端服务的 socketprint(&qu…...

【Docker项目实战】使用Docker部署MinIO对象存储(详细教程)

【Docker项目实战】使用Docker部署MinIO对象存储 前言一、 MinIO介绍1.1 MinIO简介1.2 主要特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载MinIO镜像五、…...

使用ollama本地部署Deepseek r1

1、下载ollama 在浏览器地址输入&#xff1a;https://ollama.com/ 选择windows版本的下载 2、安装ollama 3、运行ollama 安装完成后&#xff0c;打开命令行工具win r 在命令行输入&#xff1a;ollama 4、使用ollama下载并部署Deepseed r1 在ollama网站&#xff0c;下载…...

Unity飞行代码 超仿真 保姆级教程

本文使用Rigidbody控制飞机&#xff0c;基本不会穿模。 效果 飞行效果 这是一条优雅的广告 如果你也在开发飞机大战等类型的飞行游戏&#xff0c;欢迎在主页搜索博文并参考。 搜索词&#xff1a;Unity游戏(Assault空对地打击)开发。 脚本编写 首先是完整代码。 using System.Co…...

DeepSeek蒸馏模型:轻量化AI的演进与突破

目录 引言 一、知识蒸馏的技术逻辑与DeepSeek的实践 1.1 知识蒸馏的核心思想 1.2 DeepSeek的蒸馏架构设计 二、DeepSeek蒸馏模型的性能优势 2.1 效率与成本的革命性提升 2.2 性能保留的突破 2.3 场景适应性的扩展 三、应用场景与落地实践 3.1 智能客服系统的升级 3.2…...

使用 sunshine+moonlight 配置串流服务无法使用特殊键

最近了解到串流技术&#xff0c;使用的方案是 sunshine 为串流服务端&#xff0c;moonlight 为客户端&#xff0c;分别在 ipad&#xff0c;android&#xff0c;tv 端安装。 存在的问题 不管说什么平台都会有特殊键无法使用的问题&#xff0c;最初我发现在安卓电视&#xff0c…...

5.角色基础移动

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 角色的xyz轴与移动方向拌合输入轴值add movement inputget controller rotationget right vectorget forward vector 发现模型的旋转改变后&#xff0c;xyz轴也会改变&#xff0c;所以需要旋转值来计算xyz轴方向。 …...

单细胞-第四节 多样本数据分析,下游画图

文件在单细胞\5_GC_py\1_single_cell\2_plots.Rmd 1.细胞数量条形图 rm(list ls()) library(Seurat) load("seu.obj.Rdata")dat as.data.frame(table(Idents(seu.obj))) dat$label paste(dat$Var1,dat$Freq,sep ":") head(dat) library(ggplot2) lib…...

Linux的循环,bash的循环

Linux的循环,bash的循环 在 Linux 系统中&#xff0c;Bash 循环是最常用的循环实现方式&#xff08;Bash 是 Linux 默认的 Shell&#xff09;&#xff0c;但广义上“Linux 的循环”可能涉及其他 Shell 或编程语言的循环结构。以下是 Bash 循环的详细解析及其在 Linux 环境中的…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...

用 FFmpeg 实现 RTMP 推流直播

RTMP&#xff08;Real-Time Messaging Protocol&#xff09; 是直播行业中常用的传输协议。 一般来说&#xff0c;直播服务商会给你&#xff1a; ✅ 一个 RTMP 推流地址&#xff08;你推视频上去&#xff09; ✅ 一个 HLS 或 FLV 拉流地址&#xff08;观众观看用&#xff09;…...