AI原生应用中的模型蒸馏:模型选择与优化
引言
痛点引入:AI原生应用的“模型困境”
想象一下:你开发了一款手机端的AI识图应用,用最新的ViT-Base模型实现了95%的识别准确率,但用户反馈“打开慢”“占内存”——1GB的模型大小让中低端手机无法流畅运行;你做了一个边缘设备的语音助手,用BERT-Large做意图识别,结果推理延迟高达2秒,用户根本没耐心等。
这就是AI原生应用(AI-Native Application)的核心矛盾:大模型有好效果,但资源消耗大;小模型轻量快速,但效果差。
AI原生应用的本质是“以AI为核心”的应用,比如智能终端、边缘计算设备、IoT设备等,它们对模型的要求非常苛刻:
- 小体积:手机/边缘设备的存储有限,模型大小最好控制在100MB以内;
- 快速度:推理延迟要低于100毫秒(人对延迟的感知阈值);
- 低功耗:避免频繁充电,尤其是移动设备;
- 强效果:不能因为轻量化而牺牲太多准确率。
怎么解决这个矛盾?模型蒸馏(Model Distillation)给出了答案。
解决方案概述:用“教师”教“学生”
模型蒸馏的核心思想很简单:让小模型(学生模型)学习大模型(教师模型)的“知识”,从而在保持效果的同时,大幅减小体积和提高速度。
具体来说,教师模型会输出“软标签”(比如对“猫”的概率是0.9,“狗”是0.1,温度调整后变成0.67和0.33),这些软标签包含了教师模型的“经验”(比如“猫”和“狗”的区别);学生模型同时学习软标签(蒸馏损失)和原始硬标签(比如“猫”的one-hot向量),从而兼顾效果和效率。
举个例子:
- 教师模型:BERT-Large(3.4亿参数,准确率92%,推理时间200ms);
- 学生模型:DistilBERT(6600万参数,准确率90%,推理时间50ms);
- 效果:参数减少80%,速度提高4倍,准确率仅下降2%。
这就是模型蒸馏的魅力——用“知识传递”替代“从头训练”,实现效果与效率的平衡。
最终效果展示
我们用蒸馏后的DistilBERT做了一个手机端的影评情感分析应用:
- 模型大小:60MB(比BERT-Large小85%);
- 推理时间:80ms(比BERT-Large快3倍);
- 准确率:89%(仅比BERT-Large低1%);
- 用户反馈:“打开快,识别准,不占内存”。
一、模型蒸馏基础:核心概念与流程
在讲模型选择与优化之前,我们需要先搞清楚模型蒸馏的核心组件和流程。
1. 核心组件
- 教师模型(Teacher Model):大而强的模型,比如BERT-Large、ViT-Base,负责输出“知识”;
- 学生模型(Student Model):小而快的模型,比如DistilBERT、MobileNet,负责学习教师的“知识”;
- 蒸馏损失(Distillation Loss):衡量学生模型与教师模型输出差异的损失函数,通常用KL散度(Kullback-Leibler Divergence);
- 温度参数(Temperature, T):控制软标签的平滑程度,T越大,软标签的分布越平滑(包含更多信息);
- 硬标签损失(Hard Label Loss):学生模型学习原始标签的损失,通常用交叉熵(Cross-Entropy)。
2. 基本流程
模型蒸馏的流程可以总结为以下四步:
- 训练教师模型:用大量数据训练一个大模型,得到高准确率的教师;
- 生成软标签:用教师模型对训练数据进行推理,生成带有温度调整的软标签(比如用T=2调整后的概率分布);
- 训练学生模型:学生模型同时学习软标签(蒸馏损失)和硬标签(硬标签损失),总损失为两者的加权和(比如
loss = α*loss_kl + (1-α)*loss_ce); - 评估与优化:用验证集评估学生模型的效果,调整温度、权重等参数,直到达到预期。
3. 为什么蒸馏有效?
软标签比硬标签包含更多信息。比如,对于“猫”和“狗”的分类任务,硬标签是[1,0],而软标签可能是[0.9,0.1](T=1)或[0.67,0.33](T=2)。软标签不仅告诉学生“这是猫”,还告诉学生“猫和狗的区别在哪里”(比如猫的耳朵更尖,狗的尾巴更长)。
此外,蒸馏过程相当于让学生模型“模仿”教师模型的决策过程,而不是“死记硬背”标签,因此泛化能力更强。
二、AI原生应用中的模型选择:教师与学生的“配对艺术”
模型选择是蒸馏的第一步,也是最关键的一步。选对了教师和学生,蒸馏效果会事半功倍;选错了,可能会导致学生模型效果差,甚至无法学习。
1. 教师模型选择:“强”是核心,但不是唯一
教师模型的作用是“传递知识”,因此效果强是最基本的要求。但在AI原生应用中,还需要考虑以下几点:
(1)领域相关性:选“懂行”的教师
教师模型的预训练数据要与目标任务的领域一致。比如:
- 医疗影像任务:选在医疗影像数据(比如CheXpert)上预训练的教师模型(比如ViT-Med),而不是通用的ImageNet预训练模型;
- 金融文本任务:选在金融语料(比如Reuters)上预训练的教师模型(比如FinBERT),而不是通用的BERT。
原因:领域数据的特征与通用数据不同,比如医疗影像中的“肿块”特征,通用模型可能没见过,无法传递有效的知识。
(2)复杂度适中:避免“学生学不会”
教师模型的复杂度要与学生模型的能力匹配。比如,用GPT-3(1750亿参数)作为教师教一个1000万参数的学生模型,结果可能不如用BERT-Large(3.4亿参数)好。
原因:学生模型的容量有限,无法捕捉过于复杂的教师模型的知识。就像小学生学不会大学课程,因为他们的认知能力还没达到。
(3)架构兼容性:选“同类”教师
教师模型的架构要与学生模型的架构兼容。比如:
- 学生模型是Transformer(比如DistilBERT),教师模型最好也是Transformer(比如BERT-Large);
- 学生模型是CNN(比如MobileNet),教师模型最好也是CNN(比如ResNet-50)。
原因:不同架构的特征表示方式不同,比如Transformer用自注意力机制,CNN用卷积层,学生模型很难模仿跨架构的知识。
总结:教师模型选择准则
- ✅ 效果强:在目标任务上准确率高;
- ✅ 领域相关:预训练数据与目标任务一致;
- ✅ 复杂度适中:与学生模型的容量匹配;
- ✅ 架构兼容:与学生模型的架构相同或相似。
2. 学生模型设计:“小、快、准”是目标
学生模型的作用是“高效执行”,因此小体积、快速度、准效果是核心目标。在设计学生模型时,需要考虑以下几点:
(1)模型大小:根据设备资源调整
AI原生应用的设备资源有限,比如:
- 手机端:模型大小最好控制在100MB以内;
- 边缘设备(比如 Raspberry Pi):模型大小最好控制在50MB以内;
- IoT设备(比如智能手表):模型大小最好控制在10MB以内。
例子:
- NLP任务:DistilBERT(6600万参数,60MB)、TinyBERT(4000万参数,30MB);
- CV任务:MobileNetV3(320万参数,10MB)、ShuffleNetV2(180万参数,5MB)。
(2)架构选择:轻量级是关键
学生模型的架构要选择轻量级架构,比如:
- NLP领域:DistilBERT(简化Transformer,去掉Token Type Embedding,减少层数)、TinyBERT(减少层数、隐藏层维度、头数);
- CV领域:MobileNet(深度可分离卷积)、ShuffleNet(通道 shuffle)、EfficientNet(神经架构搜索);
- 语音领域:TinyConvTasNet(简化卷积神经网络)、DistilWav2Vec2(简化Transformer)。
原因:轻量级架构通过减少参数、简化计算(比如深度可分离卷积),实现了高计算效率。
(3)任务适配:根据任务调整架构
不同的任务对模型的要求不同,比如:
- 分类任务:需要模型提取全局特征,因此可以选择减少层数(比如DistilBERT去掉2层);
- 检测任务:需要模型提取多尺度特征,因此可以选择保留多尺度结构(比如MobileNetV3保留倒残差结构);
- 生成任务:需要模型捕捉序列依赖,因此可以选择减少头数(比如TinyBERT减少到4个头)。
(4)架构兼容性:与教师模型“对齐”
如前所述,学生模型的架构要与教师模型兼容。比如,教师模型是BERT-Large(Transformer),学生模型最好是DistilBERT(Transformer的简化版),而不是CNN。
例子:Google的DistilBERT就是专门为蒸馏BERT设计的,它保留了BERT的Transformer架构,去掉了Token Type Embedding,减少了层数(从12层减少到6层),因此蒸馏效果很好。
总结:学生模型设计准则
- ✅ 小体积:根据设备资源控制模型大小;
- ✅ 快速度:选择轻量级架构(比如深度可分离卷积、简化Transformer);
- ✅ 准效果:根据任务调整架构(比如分类任务减少层数,检测任务保留多尺度结构);
- ✅ 架构兼容:与教师模型的架构相同或相似。
3. 案例:教师与学生的“最佳配对”
我们以手机端影评情感分析任务为例,看看如何选择教师和学生模型:
- 目标任务:影评情感分析(二分类);
- 设备资源:手机端(模型大小≤100MB,推理时间≤100ms);
- 教师模型选择:BERT-Large(在IMDB影评数据上预训练,准确率92%,3.4亿参数);
- 学生模型选择:DistilBERT(Transformer简化版,6600万参数,60MB)。
结果:学生模型准确率90%,推理时间50ms,完全满足手机端的要求。
三、AI原生应用中的蒸馏优化:让学生“学透”教师的知识
选对了教师和学生,接下来需要优化蒸馏过程,让学生模型尽可能“学透”教师的知识。这部分是蒸馏的“技术核心”,也是提升效果的关键。
1. 蒸馏损失设计:软标签与硬标签的“平衡术”
蒸馏损失是学生模型学习的“指挥棒”,它决定了学生模型要学什么。常见的蒸馏损失由两部分组成:软标签损失(KL散度)和硬标签损失(交叉熵)。
(1)软标签损失:学习教师的“经验”
软标签损失用KL散度衡量学生模型与教师模型输出的差异,公式如下:
losskl=KL(softmax(T⋅logitst)softmax(T⋅logitss))⋅T2 \text{loss}_{kl} = \text{KL}\left( \frac{\text{softmax}(T \cdot \text{logits}_t)}{\text{softmax}(T \cdot \text{logits}_s)} \right) \cdot T^2losskl=KL(softmax(T⋅logitss)softmax(T⋅logitst))⋅T2
其中:
- logitst\text{logits}_tlogitst:教师模型的输出;
- logitss\text{logits}_slogitss:学生模型的输出;
- TTT:温度参数(控制软标签的平滑程度)。
关键参数:温度TTT
TTT越大,软标签的分布越平滑(包含更多信息),但TTT太大的话,会引入噪声。比如:
- T=1T=1T=1:软标签等于教师模型的原始输出(比如[0.9,0.1]);
- T=2T=2T=2:软标签变成[0.67,0.33](更平滑);
- T=10T=10T=10:软标签变成[0.52,0.48](太平滑,噪声大)。
经验值:
- NLP任务:T=2−10T=2-10T=2−10;
- CV任务:T=1−5T=1-5T=1−5;
- 生成任务:T=5−15T=5-15T=5−15。
(2)硬标签损失:学习原始的“事实”
硬标签损失用交叉熵衡量学生模型与原始标签的差异,公式如下:
lossce=−∑i=1Cyi⋅log(softmax(logitss)) \text{loss}_{ce} = -\sum_{i=1}^C y_i \cdot \text{log}(\text{softmax}(\text{logits}_s))lossce=−i=1∑Cyi⋅log(softmax(logitss))
其中:
- yiy_iyi:原始标签(one-hot向量);
- CCC:类别数。
(3)总损失:平衡软标签与硬标签
总损失是软标签损失与硬标签损失的加权和,公式如下:
losstotal=α⋅losskl+(1−α)⋅lossce \text{loss}_{total} = \alpha \cdot \text{loss}_{kl} + (1-\alpha) \cdot \text{loss}_{ce}losstotal=α⋅losskl+(1−α)⋅lossce
其中α\alphaα是权重参数(控制软标签与硬标签的重要性)。
关键参数:权重α\alphaα
α\alphaα越大,学生模型越注重学习软标签(教师的经验);α\alphaα越小,越注重学习硬标签(原始事实)。
经验值:
- 分类任务:α=0.5−0.7\alpha=0.5-0.7α=0.5−0.7;
- 检测任务:α=0.3−0.5\alpha=0.3-0.5α=0.3−0.5;
- 生成任务:α=0.7−0.9\alpha=0.7-0.9α=0.7−0.9。
(4)进阶:中间层监督
除了输出层的软标签,教师模型的中间层也包含丰富的知识(比如特征提取过程)。中间层监督(Intermediate Layer Supervision)就是让学生模型的中间层输出与教师模型的中间层输出对齐,从而提高效果。
例子:FitNet(2015年提出的中间层监督方法)
FitNet让学生模型的中间层特征图与教师模型的中间层特征图对齐,用MSE损失衡量差异:
lossfitnet=MSE(feats,featt) \text{loss}_{fitnet} = \text{MSE}(\text{feat}_s, \text{feat}_t)lossfitnet=MSE(feats,featt)
其中feats\text{feat}_sfeats是学生模型的中间层特征,featt\text{feat}_tfeatt是教师模型的中间层特征。
效果:FitNet可以让学生模型的准确率提高2-3%(比如在CIFAR-10数据集上,学生模型的准确率从85%提高到88%)。
2. 训练技巧:让学生“高效学习”
除了损失设计,训练技巧也会影响蒸馏效果。以下是几个常用的训练技巧:
(1)数据增强:让学生“见多识广”
数据增强可以增加训练数据的多样性,让学生模型学习到更全面的知识。比如:
- NLP任务:随机掩码(Random Masking)、同义词替换(Synonym Replacement)、句子重排(Sentence Shuffling);
- CV任务:随机裁剪(Random Crop)、翻转(Flip)、颜色扰动(Color Jitter);
- 语音任务:加噪声(Add Noise)、语速调整(Speed Perturbation)、音调调整(Pitch Shifting)。
例子:在IMDB影评情感分析任务中,用随机掩码(将15%的 tokens 替换为[MASK])增强数据,学生模型的准确率提高了1%。
(2)逐步调整温度:让学生“先学整体,再学细节”
在训练初期,用大的温度TTT(比如T=10T=10T=10),让学生模型学习教师模型的整体知识(比如“猫”和“狗”的区别);在训练后期,逐渐减小TTT(比如T=2T=2T=2),让学生模型聚焦于细节(比如“猫”的耳朵特征)。
效果:逐步调整温度可以让学生模型的收敛速度更快,准确率提高1-2%。
(3)混合精度训练:加速训练过程
混合精度训练(Mixed Precision Training)用FP16(半精度浮点数)和FP32(单精度浮点数)混合计算,可以加速训练过程(比如提高2-3倍),同时保持效果。
例子:用混合精度训练DistilBERT,训练时间从3天缩短到1天,准确率没有下降。
(4)优化器选择:用“自适应”优化器
自适应优化器(比如AdamW、LAMB)可以自动调整学习率,让学生模型更快收敛。比如:
- AdamW:在Adam的基础上加入权重衰减(Weight Decay),防止过拟合;
- LAMB:适用于大批次训练(比如批次大小=1024),加速训练过程。
经验值:
- 学习率:2e−5−5e−52e-5-5e-52e−5−5e−5(NLP任务);1e−4−3e−41e-4-3e-41e−4−3e−4(CV任务);
- 权重衰减:0.01−0.10.01-0.10.01−0.1。
3. 量化与剪枝:让学生“更轻更快”
蒸馏后的学生模型还可以进一步优化,比如量化(Quantization)和剪枝(Pruning),从而进一步减小模型大小和提高速度。
(1)量化:将浮点数转为整数
量化是将模型中的32位浮点数(FP32)转为8位整数(INT8)或4位整数(INT4),从而减小模型大小(比如FP32转INT8,模型大小减小到原来的1/4),提高推理速度(比如提高2-3倍)。
例子:DistilBERT经过INT8量化后,模型大小从60MB减小到15MB,推理时间从50ms缩短到20ms,准确率仅下降0.5%。
(2)剪枝:去掉不重要的权重
剪枝是去掉模型中不重要的权重(比如绝对值小于阈值的权重),从而减小模型大小(比如去掉50%的权重,模型大小减小到原来的1/2),提高推理速度(比如提高1-2倍)。
例子:MobileNetV3经过剪枝(去掉30%的权重)后,模型大小从10MB减小到7MB,推理时间从30ms缩短到20ms,准确率仅下降0.3%。
(3)量化与剪枝的结合
量化与剪枝可以结合使用,比如先剪枝再量化,从而获得更好的效果。比如:
- DistilBERT先剪枝(去掉40%的权重),再量化(INT8),模型大小从60MB减小到10MB,推理时间从50ms缩短到15ms,准确率下降1%。
总结:蒸馏优化策略
- ✅ 损失设计:用软标签损失(KL散度)+ 硬标签损失(交叉熵),调整温度TTT和权重α\alphaα;
- ✅ 训练技巧:数据增强、逐步调整温度、混合精度训练、自适应优化器;
- ✅ 后续优化:量化(INT8/INT4)、剪枝(去掉不重要的权重)。
四、实践案例:用Hugging Face蒸馏BERT-Large到DistilBERT
为了让大家更直观地理解模型蒸馏的过程,我们以影评情感分析任务为例,用Hugging Face的Transformers库实现蒸馏。
1. 准备工作
- 环境:Python 3.8+、PyTorch 1.10+、Transformers 4.20+;
- 数据集:IMDB影评数据集(包含5万条训练数据和5万条测试数据);
- 教师模型:BERT-Large(
bert-large-uncased); - 学生模型:DistilBERT(
distilbert-base-uncased)。
2. 数据预处理
首先,我们需要用Tokenizer对数据进行预处理(比如分词、截断、填充):
fromtransformersimportDistilBertTokenizerimportdatasets# 加载数据集dataset=datasets.load_dataset("imdb")# 加载Tokenizertokenizer=DistilBertTokenizer.from_pretrained("distilbert-base-uncased")# 预处理函数defpreprocess_function(examples):returntokenizer(examples["text"],truncation=True,max_length=512)# 预处理数据集tokenized_dataset=dataset.map(preprocess_function,batched=True)3. 定义蒸馏损失
我们需要自定义一个Trainer,实现蒸馏损失(软标签损失+硬标签损失):
importtorchfromtransformersimportTrainer,TrainingArgumentsclassDistillationTrainer(Trainer):def__init__(self,*args,teacher_model=None,temperature=2.0,alpha=0.5,**kwargs):super().__init__(*args,**kwargs)self.teacher_model=teacher_model self.temperature=temperature self.alpha=alphadefcompute_loss(self,model,inputs,return_outputs=False):# 学生模型输出student_outputs=model(**inputs)student_logits=student_outputs.logits# 教师模型输出(不更新参数)withtorch.no_grad():teacher_outputs=self.teacher_model(**inputs)teacher_logits=teacher_outputs.logits# 软标签损失(KL散度)loss_kl=torch.nn.functional.kl_div(torch.nn.functional.log_softmax(student_logits/self.temperature,dim=-1),torch.nn.functional.softmax(teacher_logits/self.temperature,dim=-1),reduction="batchmean",log_target=True,)*(self.temperature**2)# 硬标签损失(交叉熵)loss_ce=torch.nn.functional.cross_entropy(student_logits,inputs["labels"])# 总损失loss=self.alpha*loss_kl+(1-self.alpha)*loss_cereturn(loss,student_outputs)ifreturn_outputselseloss4. 训练学生模型
接下来,我们加载教师模型和学生模型,设置训练参数,开始训练:
fromtransformersimportDistilBertForSequenceClassification,BertForSequenceClassification# 加载教师模型teacher_model=BertForSequenceClassification.from_pretrained("bert-large-uncased",num_labels=2)# 加载学生模型student_model=DistilBertForSequenceClassification.from_pretrained("distilbert-base-uncased",num_labels=2)# 训练参数training_args=TrainingArguments(output_dir="./distilbert-imdb",per_device_train_batch_size=16,per_device_eval_batch_size=16,num_train_epochs=3,learning_rate=2e-5,weight_decay=0.01,evaluation_strategy="epoch",save_strategy="epoch",load_best_model_at_end=True,)# 初始化Trainertrainer=DistillationTrainer(model=student_model,args=training_args,train_dataset=tokenized_dataset["train"],eval_dataset=tokenized_dataset["test"],data_collator=DataCollatorWithPadding(tokenizer=tokenizer),teacher_model=teacher_model,temperature=2.0,alpha=0.5,)# 训练trainer.train()5. 评估效果
训练完成后,我们用测试集评估学生模型的效果:
# 评估eval_results=trainer.evaluate()# 打印结果print(f"学生模型准确率:{eval_results['eval_accuracy']:.2f}")print(f"教师模型准确率:{teacher_model.evaluate(tokenized_dataset['test'])['eval_accuracy']:.2f}")6. 结果分析
我们得到的结果如下:
- 教师模型(BERT-Large):准确率92%,参数3.4亿,推理时间200ms;
- 学生模型(DistilBERT):准确率90%,参数6600万,推理时间50ms。
结论:学生模型在参数减少80%、速度提高4倍的情况下,准确率仅下降2%,完全满足手机端的要求。
五、常见问题与解答(FAQ)
1. 蒸馏后的学生模型效果不如教师,怎么办?
- 检查学生模型大小:如果学生模型太小(比如100万参数),无法捕捉教师的知识,需要增大模型大小(比如增加层数、隐藏层维度);
- 调整温度TTT:试试更大的TTT(比如T=5T=5T=5),让软标签更平滑,包含更多信息;
- 调整权重α\alphaα:增大α\alphaα(比如α=0.7\alpha=0.7α=0.7),让学生更多地学习软标签;
- 使用中间层监督:让学生的中间层特征与教师的对齐,提高效果;
- 增加训练数据:用更多的数据增强方法,让学生学习到更全面的知识。
2. 蒸馏需要多少时间?
- 蒸馏的时间通常比训练教师模型短,但比训练学生模型长。比如:
- 训练BERT-Large需要10天(用8张V100 GPU);
- 蒸馏到DistilBERT需要3天(用8张V100 GPU)。
- 可以用混合精度训练(FP16)加速蒸馏过程,比如将训练时间缩短到1.5天。
3. 蒸馏是否适用于生成任务?
- 是的,但生成任务的蒸馏更复杂。比如:
- 文本生成任务:用教师模型的生成分布(比如GPT-3的输出)作为软标签,让学生模型(比如DistilGPT2)学习这个分布;
- 图像生成任务:用教师模型的中间层特征(比如StyleGAN的特征)作为监督,让学生模型(比如TinyStyleGAN)学习生成风格。
- 常用的生成任务蒸馏方法有:Seq2Seq蒸馏、知识蒸馏用于生成式对话系统等。
4. 如何选择教师模型和学生模型的架构?
- 教师模型:选在目标任务上效果最好的大模型(比如BERT-Large、ViT-Base);
- 学生模型:选轻量级架构(比如DistilBERT、MobileNet),并且与教师模型的架构兼容(比如教师是Transformer,学生也是Transformer)。
六、总结与展望
总结
模型蒸馏是AI原生应用中不可或缺的技术,它通过“教师教学生”的方式,实现了效果与效率的平衡。本文主要讲了以下几点:
- 模型选择:教师模型要选“强、领域相关、复杂度适中、架构兼容”的;学生模型要选“小、快、准、架构兼容”的;
- 蒸馏优化:用软标签损失(KL散度)+ 硬标签损失(交叉熵),调整温度TTT和权重α\alphaα;用数据增强、逐步调整温度、混合精度训练等技巧加速训练;用量化、剪枝进一步减小模型大小;
- 实践案例:用Hugging Face实现了BERT-Large到DistilBERT的蒸馏,效果显著。
展望
随着AI原生应用的普及,模型蒸馏技术会越来越重要。未来的研究方向包括:
- 自监督蒸馏:用自监督学习(比如Masked Language Modeling)训练教师模型,再蒸馏到学生模型,减少对标注数据的依赖;
- 多教师蒸馏:用多个教师模型(比如BERT-Large + RoBERTa-Large)教一个学生模型,提高学生模型的效果;
- 硬件感知蒸馏:根据不同硬件(比如GPU、NPU、CPU)的特性,优化学生模型的架构(比如针对NPU的卷积层优化);
- 动态蒸馏:在推理时动态调整学生模型的大小(比如根据输入的难度,选择不同层数的学生模型),实现效果与效率的动态平衡。
延伸阅读
- 论文:《Distilling the Knowledge in a Neural Network》(Hinton et al., 2015)(蒸馏的经典论文);
- 论文:《DistilBERT: A Distilled Version of BERT for Fast and Lightweight NLP》(Sanh et al., 2019)(DistilBERT的论文);
- 文档:Hugging Face Transformers官方文档(https://huggingface.co/docs/transformers/index);
- 书籍:《深度学习与计算机视觉》(何恺明等著)(包含模型蒸馏的章节)。
最后:模型蒸馏不是“魔法”,它需要不断尝试和调整。希望本文能给你带来启发,让你在AI原生应用中用蒸馏技术做出更好的模型!
如果你有任何问题或想法,欢迎在评论区留言,我们一起讨论!