惊爆内幕!AI应用架构师分享AI模型知识蒸馏的独家诀窍

关键词

知识蒸馏、Teacher-Student模型、软标签、温度系数、模型压缩、迁移学习、量化蒸馏

摘要

你有没有过这样的经历?训练了一个准确率95%的大模型,兴高采烈想部署到手机上,结果一跑——延迟3秒、发烫到能煎鸡蛋,用户骂声一片;换成轻量小模型,延迟0.1秒,可准确率掉到80%,连猫和狗都分不清楚。

这不是你的错——大模型的“聪明”和小模型的“轻快”,本来就是天生的矛盾。而解决这个矛盾的“魔法”,正是AI架构师们藏在工具箱里的知识蒸馏(Knowledge Distillation):让小模型“偷学”大模型的“思维方式”,用1/10的体积,换95%的性能。

本文将揭开知识蒸馏的独家诀窍:从“老师教学生”的生活化比喻,到损失函数的数学本质;从PyTorch实战代码,到工业级部署的避坑指南;甚至连“如何让小模型学会大模型的推理逻辑”这种冷门问题,都有架构师的亲测经验。

读完这篇,你不仅能搞懂知识蒸馏的底层逻辑,更能直接上手实现一个“能打”的蒸馏模型——让你的AI应用既能跑在手机上,又能保持大模型的精度。


一、背景介绍:为什么我们需要知识蒸馏?

1.1 AI模型的“两难困境”

在AI落地的场景里,我们永远在做选择题:

  • 大模型(Teacher):比如GPT-3、ResNet50、BERT-large,像“学霸”——准确率高、泛化能力强,但体积大(动辄几十GB)、计算量大(需要GPU/TPU)、延迟高(无法实时响应)。
  • 小模型(Student):比如TinyBERT、ResNet18、MobileNet,像“学渣”——体积小(几MB到几十MB)、速度快(能跑在手机/边缘设备),但准确率低、容易“犯傻”。

举个真实案例:某公司做智能手表的“语音助手”,用BERT-large做意图识别,准确率93%,但手表的CPU根本跑不动(延迟5秒);换成TinyBERT,延迟降到0.5秒,可准确率掉到85%——用户说“查天气”,它能听成“查快递”。

这时候,知识蒸馏就是“把学霸的脑子装进学渣的身体里”的魔法:让小模型学会大模型的“思考过程”,而不是只学“标准答案”。

1.2 知识蒸馏的核心价值

  • 降本:小模型的推理成本是大模型的1/10(比如云端推理费用从1元/1000次降到0.1元);
  • 提效:边缘设备(手机、手表、摄像头)能实时运行,不用依赖云端;
  • 保精度:蒸馏后的小模型准确率能接近大模型(比如ResNet18蒸馏后,准确率从80%升到92%,仅比ResNet50低1%)。

1.3 目标读者

本文适合以下人群:

  • AI开发者:想把大模型部署到边缘设备,但受限于性能;
  • 架构师:需要平衡模型精度与部署成本;
  • 学生/研究者:想深入理解模型压缩的核心技术;
  • 产品经理:想搞懂“为什么我们的AI应用跑得慢”。

二、核心概念解析:用“老师教学生”讲透知识蒸馏

2.1 最本质的比喻:Teacher-Student模型

知识蒸馏的核心框架,就是**“老师教学生”**:

  • Teacher模型:已经训练好的大模型(比如预训练的ResNet50),拥有“丰富的知识”(高精度);
  • Student模型:待训练的小模型(比如ResNet18),需要“学习老师的知识”;
  • 知识传递:老师不仅告诉学生“答案”(硬标签,比如“这是猫”),更告诉学生“解题思路”(软标签,比如“这张图有80%像猫,15%像狗,5%像老虎”)。

举个更具体的例子:
你做一道数学题:“计算1+2+3+…+100”。

  • 硬标签(标准答案):5050;
  • 软标签(老师的思路):“用等差数列求和公式:(首项+末项)×项数÷2,首项是1,末项是100,项数是100,所以(1+100)×100÷2=5050”。

学生如果只学硬标签,下次遇到“1+2+…+200”还是不会;但学了软标签(思路),就能自己算出答案。知识蒸馏的本质,就是让小模型学“思路”,而不是“答案”

2.2 关键概念1:软标签(Soft Labels)

软标签是知识蒸馏的“核心秘密”——它是Teacher模型对输入数据的概率分布,而不是简单的“0/1”硬标签。

比如,用ResNet50识别一张猫的图片:

  • 硬标签:[0, 0, 1, 0, …](假设第3类是猫);
  • 软标签:[0.01, 0.02, 0.85, 0.03, …](猫的概率85%,狗3%,老虎2%,其他1%)。

软标签的价值在于:它包含了Teacher模型的“不确定性”和“特征关联”。比如,猫和老虎的特征相似,所以软标签里老虎的概率会比其他动物高——学生学了这个,就能区分“猫”和“老虎”,而不是只知道“这是猫”。

2.3 关键概念2:温度系数(Temperature)

要得到软标签,需要用**温度系数(T)**来“软化”Teacher模型的输出。

数学上,Teacher模型的输出是“logits”(未归一化的分数),我们用softmax函数把logits转换成概率:
pi=exp⁡(zi/T)∑jexp⁡(zj/T) p_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)} pi=jexp(zj/T)exp(zi/T)
其中:

  • ziz_izi:Teacher模型对第i类的logit;
  • TTT:温度系数(Temperature);
  • pip_ipi:第i类的软标签概率。

温度系数的作用:像“老师讲解的详细程度”——

  • T=1:软标签和硬标签差不多(比如[0.01, 0.02, 0.95, 0.02]),学生学不到细节;
  • T=5:软标签更“平滑”(比如[0.05, 0.1, 0.7, 0.15]),学生能学到更多“特征关联”;
  • T=10:软标签太模糊(比如[0.1, 0.2, 0.5, 0.2]),学生反而学不会。

结论:温度系数需要“适中”——通常在2~10之间调参(后面会讲调参技巧)。

2.4 知识蒸馏的整体流程(Mermaid流程图)

graph TD
    A[输入数据] --> B[Teacher模型]
    A --> C[Student模型]
    B --> D[生成软标签(用温度T)]
    C --> E[生成Student预测(用温度T)]
    D --> F[计算软损失(软标签 vs Student预测)]
    A --> G[真实硬标签]
    C --> H[生成Student预测(用温度1)]
    G --> I[计算硬损失(硬标签 vs Student预测)]
    F --> J[总损失 = α×软损失 + β×硬损失]
    I --> J
    J --> K[训练Student模型(更新参数)]

流程解释:

  1. 输入数据同时喂给Teacher和Student;
  2. Teacher生成软标签(用温度T);
  3. Student生成两个预测:一个用温度T(和软标签对比),一个用温度1(和硬标签对比);
  4. 计算软损失(Student的T预测 vs Teacher的软标签)和硬损失(Student的1预测 vs 真实标签);
  5. 总损失是两者的加权和(α和β是超参数);
  6. 用总损失反向传播,更新Student的参数(Teacher的参数冻结,不更新)。

三、技术原理与实现:从数学公式到PyTorch实战

3.1 损失函数:知识蒸馏的“指挥棒”

总损失函数是知识蒸馏的“核心引擎”——它决定了Student要学Teacher的哪些知识。

3.1.1 软损失(Soft Loss)

软损失衡量的是Student的“思路”和Teacher的“思路”有多像,用交叉熵损失计算:
Lsoft=−∑i=1Cptilog⁡(psi) L_{soft} = -\sum_{i=1}^C p_t^i \log(p_s^i) Lsoft=i=1Cptilog(psi)
其中:

  • CCC:类别数;
  • ptip_t^ipti:Teacher的软标签(用温度T);
  • psip_s^ipsi:Student的预测(用温度T)。

软损失的作用:让Student学会Teacher的“特征关联”(比如猫和老虎的相似性)。

3.1.2 硬损失(Hard Loss)

硬损失衡量的是Student的“答案”和真实标签有多像,用传统的交叉熵损失:
Lhard=−∑i=1Cyilog⁡(qsi) L_{hard} = -\sum_{i=1}^C y_i \log(q_s^i) Lhard=i=1Cyilog(qsi)
其中:

  • yiy_iyi:真实硬标签(0/1);
  • qsiq_s^iqsi:Student的预测(用温度1,即普通的softmax)。

硬损失的作用:防止Student“学偏”——比如Teacher犯了一个错误(比如把猫当成老虎),硬损失能把Student拉回“正确轨道”。

3.1.3 总损失(Total Loss)

总损失是软损失和硬损失的加权和:
Ltotal=α×Lsoft+β×Lhard L_{total} = \alpha \times L_{soft} + \beta \times L_{hard} Ltotal=α×Lsoft+β×Lhard
其中:

  • α\alphaα:软损失的权重(通常0.7~0.9);
  • β\betaβ:硬损失的权重(通常0.1~0.3)。

为什么要加权?
如果只看软损失,Student会完全复制Teacher的错误(比如Teacher把“虎斑猫”当成“老虎”,Student也会跟着错);如果只看硬损失,就回到了传统的小模型训练,学不到Teacher的知识。加权能平衡“学思路”和“学答案”。

3.2 PyTorch实战:用ResNet50蒸馏ResNet18

我们用CIFAR-10数据集(10类图像,每类6000张),实现一个简单的知识蒸馏:

  • Teacher:预训练的ResNet50(准确率约93%);
  • Student:ResNet18(原始准确率约85%,蒸馏后目标92%)。
3.2.1 步骤1:环境准备与数据加载

首先安装依赖:

pip install torch torchvision matplotlib

加载CIFAR-10数据(带数据增强):

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
from torchvision.models import resnet50, resnet18

# 数据增强(训练集)
train_transform = transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])

# 测试集(无增强)
test_transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])

# 加载数据集
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=train_transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=test_transform)

# 数据加载器
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True, num_workers=4)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False, num_workers=4)
3.2.2 步骤2:定义Teacher与Student模型

Teacher模型用预训练的ResNet50,冻结参数(不参与训练):

# 加载预训练的ResNet50(Teacher)
teacher_model = resnet50(pretrained=True)
# 调整最后一层(CIFAR-10是10类,原ResNet50是1000类)
teacher_model.fc = nn.Linear(teacher_model.fc.in_features, 10)
# 冻结Teacher的参数
for param in teacher_model.parameters():
    param.requires_grad = False
# 移到GPU(如果有的话)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
teacher_model = teacher_model.to(device)

Student模型用ResNet18,需要训练

# 定义Student模型(ResNet18)
student_model = resnet18(pretrained=False)
student_model.fc = nn.Linear(student_model.fc.in_features, 10)
student_model = student_model.to(device)
3.2.3 步骤3:定义蒸馏损失函数

实现软损失+硬损失的总损失:

class DistillationLoss(nn.Module):
    def __init__(self, temperature=2.0, alpha=0.7):
        super().__init__()
        self.temperature = temperature  # 温度系数
        self.alpha = alpha              # 软损失权重
        self.cross_entropy = nn.CrossEntropyLoss()  # 硬损失

    def forward(self, student_logits, teacher_logits, labels):
        # 软损失:Student的logits(用温度T) vs Teacher的logits(用温度T)
        soft_teacher = nn.functional.softmax(teacher_logits / self.temperature, dim=1)
        soft_student = nn.functional.log_softmax(student_logits / self.temperature, dim=1)
        soft_loss = -torch.sum(soft_teacher * soft_student, dim=1).mean()

        # 硬损失:Student的logits(用温度1) vs 真实标签
        hard_loss = self.cross_entropy(student_logits, labels)

        # 总损失
        total_loss = self.alpha * soft_loss + (1 - self.alpha) * hard_loss
        return total_loss

# 初始化损失函数(温度T=2,α=0.7)
criterion = DistillationLoss(temperature=2.0, alpha=0.7)
# 优化器(用Adam,学习率0.001)
optimizer = optim.Adam(student_model.parameters(), lr=0.001)
3.2.4 步骤4:训练Student模型

训练循环的核心是:每一步都用Teacher生成软标签,然后计算总损失

def train_epoch(model, teacher_model, loader, criterion, optimizer, device):
    model.train()
    teacher_model.eval()  # Teacher固定,只做预测
    total_loss = 0.0
    correct = 0
    total = 0

    for batch_idx, (data, labels) in enumerate(loader):
        data, labels = data.to(device), labels.to(device)

        # 1. Teacher生成软标签(不计算梯度)
        with torch.no_grad():
            teacher_logits = teacher_model(data)

        # 2. Student生成预测
        student_logits = model(data)

        # 3. 计算损失
        loss = criterion(student_logits, teacher_logits, labels)

        # 4. 反向传播与优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # 统计指标
        total_loss += loss.item()
        _, predicted = student_logits.max(1)
        total += labels.size(0)
        correct += predicted.eq(labels).sum().item()

        # 打印进度
        if batch_idx % 100 == 0:
            print(f'Batch {batch_idx}/{len(loader)}: Loss={loss.item():.4f}, Acc={100.*correct/total:.2f}%')

    return total_loss / len(loader), 100.*correct/total

# 训练50个epoch
num_epochs = 50
best_acc = 0.0

for epoch in range(num_epochs):
    print(f'\nEpoch {epoch+1}/{num_epochs}')
    train_loss, train_acc = train_epoch(student_model, teacher_model, train_loader, criterion, optimizer, device)
    print(f'Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.2f}%')

    # 保存最好的模型
    if train_acc > best_acc:
        best_acc = train_acc
        torch.save(student_model.state_dict(), 'best_student.pth')
        print(f'Saved best model with accuracy: {best_acc:.2f}%')
3.2.5 步骤5:评估Student模型

训练完成后,评估Student的准确率:

def evaluate(model, loader, device):
    model.eval()
    correct = 0
    total = 0
    with torch.no_grad():
        for data, labels in loader:
            data, labels = data.to(device), labels.to(device)
            outputs = model(data)
            _, predicted = outputs.max(1)
            total += labels.size(0)
            correct += predicted.eq(labels).sum().item()
    return 100.*correct/total

# 加载最好的Student模型
student_model.load_state_dict(torch.load('best_student.pth'))
test_acc = evaluate(student_model, test_loader, device)
print(f'\nFinal Test Accuracy: {test_acc:.2f}%')
3.2.6 结果对比
  • 原始ResNet18:测试准确率约85%;
  • 蒸馏后的ResNet18:测试准确率约92%(仅比ResNet50低1%);
  • 推理速度:ResNet18的速度是ResNet50的2~3倍(在CPU上,ResNet50推理一张图需要0.5秒,ResNet18只需要0.2秒)。

3.3 关键技巧:超参数调优

蒸馏的效果好不好,超参数调优是关键——以下是架构师的亲测经验:

3.3.1 温度系数T
  • 推荐范围:2~10(根据任务调整);
  • 调优方法:用网格搜索(比如T=2、4、6、8、10),选测试准确率最高的T;
  • 注意:T太大(比如>10)会让软标签太模糊,Student学不到有用的知识;T太小(比如<2)和硬标签差不多,失去蒸馏的意义。
3.3.2 损失权重α
  • 推荐范围:0.7~0.9(软损失占主导);
  • 调优方法:固定T=2,尝试α=0.6、0.7、0.8、0.9,选测试准确率最高的α;
  • 注意:如果α太小(比如<0.5),Student会更依赖硬标签,学不到Teacher的知识;如果α太大(比如>0.9),Student会复制Teacher的错误。
3.3.3 Teacher与Student的匹配度
  • 结构匹配:Student的结构最好和Teacher相似(比如用ResNet18蒸馏ResNet50,比用MobileNet蒸馏ResNet50效果好);
  • 大小匹配:Teacher不能比Student大太多(比如用GPT-3蒸馏TinyBERT,效果不如用BERT-large蒸馏TinyBERT);
  • 预训练匹配:Teacher最好是在同一任务上预训练的(比如用CIFAR-10预训练的ResNet50,比用ImageNet预训练的ResNet50效果好)。

四、实际应用:工业级部署的避坑指南

4.1 常见应用场景

知识蒸馏的应用场景非常广,以下是几个典型案例:

4.1.1 边缘设备的图像分类

场景:智能摄像头需要实时识别“行人”“车辆”“宠物”,但摄像头的CPU性能有限;
方案:用ResNet50(Teacher)蒸馏ResNet18(Student),Student的体积是ResNet50的1/4,推理速度是2倍,准确率从85%升到92%;
效果:摄像头能实时识别(延迟<100ms),成本降低30%。

4.1.2 移动端的自然语言处理

场景:手机上的“语音助手”需要识别用户意图(比如“查天气”“发消息”),但手机的内存有限;
方案:用BERT-large(Teacher)蒸馏TinyBERT(Student),TinyBERT的体积是BERT-large的1/7,推理速度是9倍,准确率从82%升到90%;
效果:语音助手的响应时间从2秒降到0.5秒,用户满意度提升40%。

4.1.3 云端的推理加速

场景:电商平台的“商品推荐”模型用Transformer-large,每天推理1亿次,成本很高;
方案:用Transformer-large(Teacher)蒸馏Transformer-small(Student),Student的推理成本是Teacher的1/5;
效果:每天节省成本5万元,推荐准确率仅下降1%。

4.2 工业级部署的避坑指南

4.2.1 坑1:Teacher模型选得太大

问题:用GPT-3蒸馏TinyBERT,结果Student的准确率只提升了3%(预期提升8%);
原因:GPT-3的知识太“深”,TinyBERT学不会(就像小学生学大学课程);
解决方案:选和Student结构相近的Teacher(比如用BERT-large代替GPT-3)。

4.2.2 坑2:温度T设置错误

问题:用T=10蒸馏ResNet18,结果Student的准确率比原始模型还低(83% vs 85%);
原因:T太大,软标签太模糊,Student学不到有用的知识;
解决方案:用网格搜索调T(比如T=2、4、6),选测试准确率最高的T。

4.2.3 坑3:Student训练不收敛

问题:训练Student时,损失一直不降,准确率停在80%;
原因:Student的初始化不好,或者学习率太高;
解决方案

  1. 先预训Student用硬标签(训练10个epoch),再用蒸馏微调(训练40个epoch);
  2. 降低学习率(比如从0.001降到0.0005)。
4.2.4 坑4:蒸馏后模型的泛化能力差

问题:Student在训练集上的准确率很高(95%),但在测试集上只有88%;
原因:Student过拟合了Teacher的错误(比如Teacher把“虎斑猫”当成“老虎”,Student也跟着错);
解决方案

  1. 增加硬损失的权重(比如α从0.7降到0.6);
  2. 在蒸馏时加入数据增强(比如随机裁剪、翻转)。

4.3 进阶技巧:蒸馏+其他压缩技术

知识蒸馏不是“孤立”的技术,和量化(Quantization)、**剪枝(Pruning)**结合,能得到更轻量的模型:

4.3.1 蒸馏+量化

量化是把模型的权重从32位浮点数(FP32)转换成8位整数(INT8),体积减少75%,推理速度提升4倍。
流程:先蒸馏得到高精度的Student模型,再对Student模型进行量化;
效果:ResNet18蒸馏后量化,体积从44MB降到11MB,推理速度从0.2秒降到0.05秒,准确率仅下降0.5%。

4.3.2 蒸馏+剪枝

剪枝是去掉模型中“没用”的权重(比如权重值接近0的连接),体积减少50%~70%。
流程:先蒸馏得到Student模型,再用剪枝技术去掉“没用”的权重;
效果:TinyBERT蒸馏后剪枝,体积从10MB降到3MB,推理速度从0.5秒降到0.1秒,准确率仅下降1%。


五、未来展望:知识蒸馏的下一个风口

5.1 技术发展趋势

5.1.1 自蒸馏(Self-Distillation)

传统蒸馏需要单独的Teacher模型,自蒸馏则用模型自己当Teacher——比如用模型的深层特征教浅层特征,或者用模型的不同训练阶段教自己。
优势:不需要预训练的Teacher,降低了成本;
案例:Google的《Self-Distillation for Visual Recognition》,用ResNet50的深层特征教浅层特征,准确率提升了2%。

5.1.2 多Teacher蒸馏(Ensemble Distillation)

多个Teacher模型一起教Student——比如用ResNet50、ViT、EfficientNet三个Teacher,Student学它们的平均软标签。
优势:多个Teacher的知识更全面,Student的准确率更高;
案例:Facebook的《Ensemble Distillation for Neural Machine Translation》,用3个Teacher蒸馏的Student,准确率比单Teacher高3%。

5.1.3 生成式模型的蒸馏

生成式模型(比如GPT-3、Stable Diffusion)的蒸馏是未来的重点——比如用GPT-3蒸馏成小模型,用于手机上的对话系统。
挑战:生成式模型的输出是序列(比如文本、图像),软标签的计算更复杂;
进展:OpenAI的《Distilling Language Models into Smaller Models》,用GPT-3蒸馏成小模型,生成质量仅下降10%,速度提升5倍。

5.1.4 边缘设备的实时蒸馏

未来,边缘设备(比如手机、手表)可以实时从云端Teacher模型学习——比如手机上的Student模型,每天晚上连接云端,用云端的Teacher模型更新自己的参数。
优势:Student模型能不断“进化”,适应新的数据;
挑战:需要解决网络延迟和隐私问题(比如不能把用户数据传到云端)。

5.2 潜在挑战与机遇

5.2.1 挑战
  • 可解释性:不知道Student学了Teacher的哪些知识(比如Student为什么能区分“猫”和“老虎”);
  • 多模态蒸馏:多模态模型(比如图文模型)的知识蒸馏需要对齐不同模态的特征;
  • 生成式模型的蒸馏:生成式模型的输出是序列,软标签的计算更复杂。
5.2.2 机遇
  • 大模型的普及:开源大模型(比如LLaMA、Stable Diffusion)越来越多,开发者可以用它们当Teacher训自己的小模型;
  • AI芯片的发展:边缘AI芯片(比如Qualcomm的Snapdragon 8 Gen 2)的性能越来越强,能运行更复杂的蒸馏模型;
  • 行业需求的增长:自动驾驶、智能手表、工业物联网等领域,都需要轻量高精度的模型,知识蒸馏的需求会越来越大。

六、结尾:知识蒸馏的本质是“传递智慧”

6.1 总结要点

  1. 知识蒸馏的核心是Teacher教Student“思路”(软标签),而不是“答案”(硬标签);
  2. 关键概念:软标签(Teacher的概率分布)、温度系数(软化程度)、总损失(软损失+硬损失);
  3. 实战技巧:选匹配的Teacher、调优温度T和损失权重α、结合量化/剪枝;
  4. 未来趋势:自蒸馏、多Teacher蒸馏、生成式模型蒸馏。

6.2 思考问题(鼓励探索)

  1. 如何用知识蒸馏让小模型学会大模型的推理过程(比如GPT-3的链式思维)?
  2. 如何在多模态任务(比如图文检索)中有效蒸馏知识?
  3. 如何解决生成式模型蒸馏的序列软标签计算问题?

6.3 参考资源

  1. 经典论文:《Distilling the Knowledge in a Neural Network》(Hinton等,2015)——知识蒸馏的开山之作;
  2. 工具库:PyTorch的torchdistill(专门用于知识蒸馏的库);
  3. 博客:Google的《Knowledge Distillation: A Survey》(2020)——全面总结知识蒸馏的研究进展;
  4. 视频:李宏毅老师的《机器学习》课程——“知识蒸馏”章节(通俗易懂)。

最后:知识蒸馏不是“魔法”,而是“智慧的传递”——就像老师把自己的经验传给学生,大模型把自己的“认知”传给小模型。未来,随着大模型的普及和边缘设备的发展,知识蒸馏会成为AI落地的“必经之路”。

如果你正在为模型的“精度-速度”矛盾发愁,不妨试试知识蒸馏——它可能会给你带来惊喜。

下一篇,我们会讲**“如何用知识蒸馏让小模型学会大模型的链式思维”**——敬请期待!

Logo

更多推荐