AI-17_迁移学习与预训练模型:从 ImageNet 到通用表示的范式转变
迁移学习与预训练模型:从 ImageNet 到通用表示的范式转变
2012 年 AlexNet 之后,深度学习在计算机视觉领域取得了飞速发展。但一个根本性问题始终存在:每个新任务都需要从零开始训练一个深度网络,这需要大量标注数据和计算资源。迁移学习和预训练模型的出现彻底改变了这一局面——先在大规模数据上预训练一个通用模型,再在下游任务上微调,成为了深度学习的标准范式。本文将深入拆解迁移学习的理论基础、预训练模型的发展脉络、微调策略,以及这一范式如何为 BERT/GPT 时代奠定基础。
一、前言:为什么需要迁移学习?
1.1 从零训练的困境
在深度学习的早期(2012-2014),每个视觉任务都需要从零开始训练一个深度网络。这带来了几个根本性问题:
数据需求巨大:深度网络通常有数百万到数千万参数,需要大量标注数据才能有效训练。ImageNet 有 120 万张标注图像,但大多数特定领域(医疗影像、卫星图像、工业缺陷检测)根本没有这么多标注数据。
计算成本高昂:训练一个 AlexNet 需要 5-6 天(2012 年的 GPU),训练更深的网络(VGG、ResNet)需要数周。每个任务都从零训练,计算成本不可接受。
泛化能力有限:在小数据集上从零训练深度网络容易过拟合,泛化能力差。
1.2 迁移学习的核心思想
迁移学习(Transfer Learning)的核心思想是:将在一个任务(源任务)上学到的知识迁移到另一个相关任务(目标任务)上。在深度学习中,这通常表现为:
- 预训练:在大规模数据集(如 ImageNet)上训练一个深度网络,学习通用的视觉特征(边缘、纹理、形状等)
- 微调:将预训练网络的权重作为初始化,在目标任务的小规模数据集上继续训练(微调),适应特定任务
这个思想的直觉是:深度网络的底层学习的是通用特征(边缘、角点、纹理),这些特征对大多数视觉任务都有用;只有顶层学习的是任务特定的特征(猫脸、车轮等)。因此,底层特征可以直接迁移,只需要微调顶层。
1.3 历史背景
迁移学习的思想早于深度学习。在传统机器学习中,迁移学习已经被广泛研究(如域适应、多任务学习)。但深度学习使得迁移学习变得极其有效——因为深度网络自动学习的层次化特征表示天然适合迁移。
2014 年,Yosinski 等人的论文《How transferable are features in deep neural networks?》通过实验系统地研究了深度网络中不同层特征的可迁移性,证明了:
- 底层特征(第1-2层)是通用的,可迁移性高
- 中层特征(第3-4层)的可迁移性中等
- 顶层特征(第5层以上)是任务特定的,可迁移性低
- 即使是随机初始化的网络,前几层的特征也有一定的可迁移性
这篇论文为迁移学习在深度学习中的应用奠定了理论基础。
二、迁移学习的理论基础

2.1 特征层次与可迁移性
深度卷积网络的特征表示具有明显的层次性:
| 网络层 | 学习的特征 | 可迁移性 | 示例 |
|---|---|---|---|
| 第1-2层 | 低级视觉特征 | 极高 | 边缘、角点、颜色、纹理 |
| 第3-4层 | 中级视觉特征 | 高 | 纹理组合、简单形状、部件 |
| 第5层 | 高级视觉特征 | 中等 | 物体部件、复杂纹理 |
| 全连接层 | 任务特定特征 | 低 | 物体类别、场景语义 |
这种层次性意味着:
- 底层特征几乎可以直接迁移到任何视觉任务,不需要微调
- 中层特征需要少量微调来适应新任务
- 顶层特征需要较多微调,甚至可以随机初始化重新训练
2.2 微调策略
根据目标任务的数据量和与源任务的相似度,有几种不同的微调策略:
策略一:特征提取(Feature Extraction)
- 冻结预训练网络的所有卷积层,只训练顶层的全连接层
- 适用于:目标任务数据量很小,且与源任务相似度高
- 优点:训练快,不容易过拟合
- 缺点:表达能力有限
策略二:浅层冻结 + 深层微调
- 冻结前几层(通用特征),微调后面的层
- 适用于:目标任务数据量中等,与源任务有一定差异
- 优点:平衡了通用特征的保留和任务适应
- 这是最常用的策略
策略三:全网络微调
- 微调整个网络,使用较小的学习率
- 适用于:目标任务数据量较大,与源任务差异较大
- 优点:表达能力最强
- 缺点:训练慢,容易过拟合,需要小心调整学习率
策略四:渐进式解冻(Gradual Unfreezing)
- 先只训练顶层,然后逐步解冻下面的层
- 适用于:目标任务数据量较小,但希望充分利用预训练特征
- 优点:训练稳定,效果好
- 这是 ULMFiT、fast.ai 等框架推荐的策略
2.3 学习率的选择
微调时的学习率选择至关重要:
- 预训练层的学习率应该较小(通常是顶层学习率的 1/10 到 1/100),因为预训练权重已经很好,不需要大幅修改
- 顶层(随机初始化的层)的学习率可以较大,因为它们需要从头学习
- 使用学习率调度(如余弦退火、1cycle 政策)可以提升效果
判别式学习率(Discriminative Learning Rates)——给不同层设置不同学习率——是微调的关键技巧。
三、预训练模型的发展脉络

3.1 ImageNet 预训练时代
从 2012 年 AlexNet 开始,ImageNet 预训练成为计算机视觉的标准做法。研究者们在 ImageNet 上训练越来越深、越来越强的网络,然后将预训练权重开放给社区使用:
| 年份 | 模型 | 层数 | Top-5 错误率 | 贡献 |
|---|---|---|---|---|
| 2012 | AlexNet | 8 | 15.3% | 深度学习的突破 |
| 2014 | VGGNet | 16-19 | 7.3% | 小卷积核 + 深度 |
| 2014 | GoogLeNet | 22 | 6.7% | Inception 模块 |
| 2015 | ResNet | 152 | 3.57% | 残差连接 |
| 2017 | DenseNet | 121 | - | 密集连接 |
| 2017 | SENet | - | 2.25% | 通道注意力 |
这些预训练模型成为了计算机视觉研究的基础设施——几乎所有视觉任务(目标检测、语义分割、图像生成、人脸识别等)都使用 ImageNet 预训练模型作为骨干网络。
3.2 从监督预训练到自监督预训练
ImageNet 预训练虽然有效,但存在一个根本问题:需要大规模标注数据。ImageNet 的标注耗费了大量人力,而且标注的类别(1000 类物体)不一定覆盖所有下游任务。
自监督学习(Self-Supervised Learning)通过设计预训练任务,让模型从无标注数据中自动学习特征表示,摆脱了对标注数据的依赖:
对比学习(Contrastive Learning):
- MoCo(He et al., 2020):动量对比学习,使用队列和动量编码器
- SimCLR(Chen et al., 2020):简单对比学习框架,证明了大 batch size 和强数据增强的重要性
- SimCLRv2(Chen et al., 2020):引入了非线性投影头和半监督微调
掩码图像建模(Masked Image Modeling):
- MAE(He et al., 2022):掩码自编码器,随机掩码图像的 75%,然后重建被掩码的部分
- SimMIM(Xie et al., 2022):简单的掩码图像建模框架
自监督预训练的优势:
- 可以利用互联网上的海量无标注图像
- 学到的特征表示更通用,不局限于 ImageNet 的 1000 类
- 在许多下游任务上已经超越了监督预训练
3.3 从视觉到语言:预训练范式的跨域迁移
预训练 + 微调的范式最早在计算机视觉领域成熟,但它的影响远远超出了视觉领域:
自然语言处理:
- 2018 年的 ELMo(Peters et al.):双向 LSTM 预训练,上下文相关的词表示
- 2018 年的 BERT(Devlin et al.):Transformer 编码器预训练,掩码语言模型
- 2018 年的 GPT(Radford et al.):Transformer 解码器预训练,自回归语言模型
- 2019 年的 GPT-2、2020 年的 GPT-3:更大规模的自回归预训练
语音处理:
- wav2vec(Schneider et al., 2019):对比学习预训练语音表示
- HuBERT(Hsu et al., 2021):掩码预测预训练语音表示
- Whisper(Radford et al., 2023):大规模弱监督语音识别预训练
多模态:
- CLIP(Radford et al., 2021):对比学习预训练图文对齐表示
- ALIGN(Jia et al., 2021):更大规模的图文对比预训练
- BLIP(Li et al., 2022):语言-图像预训练
预训练 + 微调已经成为整个 AI 领域的标准范式,从视觉到语言、语音、多模态,无处不在。
四、代码实现:迁移学习微调
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms, models
import os
import copy
def get_pretrained_model(model_name='resnet50', num_classes=10, pretrained=True):
"""
加载预训练模型,替换分类头
支持: resnet18, resnet50, vgg16, efficientnet_b0
"""
if model_name == 'resnet18':
model = models.resnet18(pretrained=pretrained)
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, num_classes)
# 特征提取部分: model.layer1, layer2, layer3, layer4
feature_extractor = nn.Sequential(model.conv1, model.bn1, model.relu, model.maxpool,
model.layer1, model.layer2, model.layer3, model.layer4,
model.avgpool)
elif model_name == 'resnet50':
model = models.resnet50(pretrained=pretrained)
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, num_classes)
feature_extractor = nn.Sequential(model.conv1, model.bn1, model.relu, model.maxpool,
model.layer1, model.layer2, model.layer3, model.layer4,
model.avgpool)
elif model_name == 'vgg16':
model = models.vgg16(pretrained=pretrained)
num_features = model.classifier[6].in_features
model.classifier[6] = nn.Linear(num_features, num_classes)
feature_extractor = model.features
elif model_name == 'efficientnet_b0':
model = models.efficientnet_b0(pretrained=pretrained)
num_features = model.classifier[1].in_features
model.classifier[1] = nn.Linear(num_features, num_classes)
feature_extractor = model.features
else:
raise ValueError(f"Unsupported model: {model_name}")
return model, feature_extractor
def freeze_layers(model, num_layers_to_freeze=0):
"""
冻结指定数量的层(从底层开始)
num_layers_to_freeze=0: 不冻结(全网络微调)
num_layers_to_freeze=-1: 冻结所有特征层(特征提取)
"""
if num_layers_to_freeze == -1:
# 冻结所有层,除了最后的分类头
for param in model.parameters():
param.requires_grad = False
# 解冻最后的分类层
if hasattr(model, 'fc'):
for param in model.fc.parameters():
param.requires_grad = True
elif hasattr(model, 'classifier'):
for param in model.classifier.parameters():
param.requires_grad = True
elif num_layers_to_freeze > 0:
# 按顺序冻结前 N 层
layers = list(model.children())
for i, layer in enumerate(layers[:num_layers_to_freeze]):
for param in layer.parameters():
param.requires_grad = False
def get_discriminative_lr(model, base_lr=1e-4, classifier_lr=1e-3):
"""
判别式学习率: 特征层用小学习率,分类头用大学习率
返回参数组列表,可直接传给优化器
"""
params = []
# 特征层参数(requires_grad=True 的)
feature_params = []
classifier_params = []
for name, param in model.named_parameters():
if not param.requires_grad:
continue
if 'fc' in name or 'classifier' in name:
classifier_params.append(param)
else:
feature_params.append(param)
if feature_params:
params.append({'params': feature_params, 'lr': base_lr})
if classifier_params:
params.append({'params': classifier_params, 'lr': classifier_lr})
return params
def train_with_transfer_learning(model, train_loader, val_loader, num_epochs=20,
base_lr=1e-4, classifier_lr=1e-3, device='cuda',
save_path='best_model.pth'):
"""
迁移学习训练流程
使用判别式学习率 + 余弦退火学习率调度 + 早停
"""
model = model.to(device)
criterion = nn.CrossEntropyLoss()
# 判别式学习率
params = get_discriminative_lr(model, base_lr, classifier_lr)
optimizer = optim.AdamW(params, weight_decay=1e-4)
# 余弦退火学习率调度
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=num_epochs)
best_val_acc = 0.0
best_model_wts = copy.deepcopy(model.state_dict())
for epoch in range(num_epochs):
# 训练阶段
model.train()
running_loss = 0.0
correct = 0
total = 0
for inputs, labels in train_loader:
inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item() * inputs.size(0)
_, predicted = outputs.max(1)
total += labels.size(0)
correct += predicted.eq(labels).sum().item()
train_loss = running_loss / total
train_acc = 100. * correct / total
# 验证阶段
model.eval()
val_correct = 0
val_total = 0
with torch.no_grad():
for inputs, labels in val_loader:
inputs, labels = inputs.to(device), labels.to(device)
outputs = model(inputs)
_, predicted = outputs.max(1)
val_total += labels.size(0)
val_correct += predicted.eq(labels).sum().item()
val_acc = 100. * val_correct / val_total
scheduler.step()
print(f"Epoch [{epoch+1}/{num_epochs}] "
f"Train Loss: {train_loss:.4f} Train Acc: {train_acc:.2f}% "
f"Val Acc: {val_acc:.2f}% "
f"LR: {optimizer.param_groups[0]['lr']:.6f}")
# 保存最佳模型
if val_acc > best_val_acc:
best_val_acc = val_acc
best_model_wts = copy.deepcopy(model.state_dict())
torch.save(best_model_wts, save_path)
print(f" -> New best model saved (Val Acc: {best_val_acc:.2f}%)")
# 加载最佳模型
model.load_state_dict(best_model_wts)
print(f"\n训练完成。最佳验证准确率: {best_val_acc:.2f}%")
return model
def gradual_unfreezing(model, train_loader, val_loader, num_classes=10,
num_epochs_per_stage=5, device='cuda'):
"""
渐进式解冻(Gradual Unfreezing)策略
阶段1: 只训练分类头
阶段2: 解冻最后一个卷积块
阶段3: 解冻倒数第二个卷积块
...
"""
model = model.to(device)
criterion = nn.CrossEntropyLoss()
# 阶段1: 只训练分类头
print("=== 阶段1: 只训练分类头 ===")
freeze_layers(model, num_layers_to_freeze=-1) # 冻结所有特征层
optimizer = optim.AdamW(model.fc.parameters(), lr=1e-3)
model = train_with_transfer_learning(model, train_loader, val_loader,
num_epochs=num_epochs_per_stage,
base_lr=1e-3, classifier_lr=1e-3,
device=device, save_path='stage1.pth')
# 阶段2: 解冻 layer4
print("\n=== 阶段2: 解冻 layer4 ===")
for param in model.layer4.parameters():
param.requires_grad = True
params = [
{'params': model.layer4.parameters(), 'lr': 1e-4},
{'params': model.fc.parameters(), 'lr': 1e-4},
]
optimizer = optim.AdamW(params, weight_decay=1e-4)
model = train_with_transfer_learning(model, train_loader, val_loader,
num_epochs=num_epochs_per_stage,
base_lr=1e-4, classifier_lr=1e-4,
device=device, save_path='stage2.pth')
# 阶段3: 解冻 layer3
print("\n=== 阶段3: 解冻 layer3 ===")
for param in model.layer3.parameters():
param.requires_grad = True
params = [
{'params': model.layer3.parameters(), 'lr': 5e-5},
{'params': model.layer4.parameters(), 'lr': 1e-4},
{'params': model.fc.parameters(), 'lr': 1e-4},
]
optimizer = optim.AdamW(params, weight_decay=1e-4)
model = train_with_transfer_learning(model, train_loader, val_loader,
num_epochs=num_epochs_per_stage,
base_lr=5e-5, classifier_lr=1e-4,
device=device, save_path='stage3.pth')
return model
if __name__ == "__main__":
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"使用设备: {device}")
# 数据预处理(使用 ImageNet 标准化)
train_transform = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
])
val_transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
])
# 加载预训练模型
model, feature_extractor = get_pretrained_model(
model_name='resnet50', num_classes=10, pretrained=True)
# 统计可训练参数量
total_params = sum(p.numel() for p in model.parameters())
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f"总参数量: {total_params:,}")
print(f"可训练参数量: {trainable_params:,}")
print(f"可训练比例: {100*trainable_params/total_params:.1f}%")
# 前向传播测试
x = torch.randn(4, 3, 224, 224)
output = model(x)
print(f"\n输入形状: {x.shape}")
print(f"输出形状: {output.shape}")
五、迁移学习的扩展与前沿

5.1 多任务学习
多任务学习(Multi-Task Learning)是迁移学习的扩展——同时学习多个相关任务,让任务之间共享特征表示,互相促进。多任务学习的优势:
- 数据效率高:多个任务共享训练数据
- 泛化能力强:共享特征表示减少了过拟合
- 表示更通用:需要同时满足多个任务的特征表示更可能学到本质特征
在深度学习中,多任务学习通常通过硬参数共享(共享底层网络,顶层有多个任务头)或软参数共享(每个任务有独立网络,但参数之间有正则化约束)实现。
5.2 域适应与域泛化
域适应(Domain Adaptation)解决的是源域和目标域的数据分布不同的问题。例如,在真实照片上训练的分类器,应用到手绘图像上时性能会大幅下降。域适应的目标是让模型在源域上学到的特征表示在目标域上也有效。
常用方法:
- 对抗域适应(DANN, 2016):用对抗训练学习域不变的特征表示
- 最大均值差异(MMD):最小化源域和目标域特征分布的差异
- 自训练(Self-Training):用源域模型给目标域数据打伪标签,然后在伪标签上微调
域泛化(Domain Generalization)是更难的问题——在训练时看不到目标域,要求模型直接泛化到未知域。
5.3 少样本学习与零样本学习
少样本学习(Few-Shot Learning)要求模型在只有少量标注样本(如 1-shot、5-shot)的情况下学习新类别。迁移学习是少样本学习的基础——先在大规模数据上预训练一个好的特征提取器,然后用少量样本快速适应新类别。
常用方法:
- 度量学习(Prototypical Networks, Matching Networks):学习一个度量空间,新类别的样本通过与支持集样本的距离分类
- 元学习(MAML, Reptile):学习一个"好的初始化",使得模型可以在少量梯度更新后适应新任务
- 提示学习(Prompt Learning):在大模型时代,通过设计提示词来引导预训练模型完成少样本任务
零样本学习(Zero-Shot Learning)要求模型在没有任何标注样本的情况下识别新类别,通常通过类别描述(如属性、文本描述)来实现。
5.4 大模型时代的迁移学习
在大语言模型(LLM)时代,迁移学习的范式发生了新的变化:
全参数微调:微调整个模型的所有参数。效果好,但计算成本高,且可能导致"灾难性遗忘"。
参数高效微调(Parameter-Efficient Fine-Tuning, PEFT):只训练少量参数,冻结大部分预训练权重:
- Adapter(Houlsby et al., 2019):在 Transformer 层中插入小型适配器模块
- LoRA(Hu et al., 2022):低秩适应,用低秩矩阵近似权重更新
- Prefix Tuning(Li & Liang, 2021):在输入前添加可训练的前缀向量
- Prompt Tuning(Lester et al., 2021):只训练软提示词嵌入
指令微调(Instruction Tuning):在大量指令-输出对上微调,让模型学会遵循人类指令。
RLHF(Reinforcement Learning from Human Feedback):用人类反馈训练奖励模型,然后用强化学习微调语言模型,让模型输出更符合人类偏好。
这些新的迁移学习方法使得在大模型时代高效地进行任务适应成为可能。
六、核心论文引用
-
Yosinski, J., Clune, J., Bengio, Y., & Lipson, H. (2014). How Transferable are Features in Deep Neural Networks? NeurIPS 2014. — 系统研究了深度网络不同层特征的可迁移性,为迁移学习奠定了理论基础。
-
Donahue, J., Jia, Y., Vinyals, O., et al. (2014). DeCAF: A Deep Convolutional Activation Feature for Generic Visual Recognition. ICML 2014. — 首次证明了 ImageNet 预训练特征可以迁移到其他视觉任务。
-
Girshick, R., Donahue, J., Darrell, T., & Malik, J. (2014). Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation. CVPR 2014. — R-CNN 论文,将 ImageNet 预训练特征应用于目标检测,引发了目标检测的深度学习革命。
-
Chen, T., Kornblith, S., Norouzi, M., & Hinton, G. (2020). A Simple Framework for Contrastive Learning of Visual Representations. ICML 2020. — SimCLR 论文,自监督对比学习的里程碑。
-
He, K., Fan, H., Wu, Y., Xie, S., & Girshick, R. (2020). Momentum Contrast for Unsupervised Visual Representation Learning. CVPR 2020. — MoCo 论文,动量对比学习。
-
He, K., Chen, X., Xie, S., Li, Y., Dollár, P., & Girshick, R. (2022). Masked Autoencoders Are Scalable Vision Learners. CVPR 2022. — MAE 论文,掩码图像建模的里程碑。
-
Howard, J., & Ruder, S. (2018). Universal Language Model Fine-tuning for Text Classification. ACL 2018. — ULMFiT 论文,将迁移学习系统地应用于 NLP,提出了渐进式解冻和判别式学习率。
-
Devlin, J., Chang, M. W., Lee, K., & Toutanova, K. (2019). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. NAACL 2019. — BERT 论文,NLP 预训练范式的里程碑。
七、总结
迁移学习和预训练模型是深度学习发展史上最重要的范式转变之一。回顾这段历史,我们可以获得几个深刻的洞察:
1. 通用表示是 AI 的基础设施
ImageNet 预训练模型成为了计算机视觉的基础设施——几乎所有视觉任务都基于预训练模型构建。同样,BERT/GPT 等预训练语言模型成为了 NLP 的基础设施,CLIP 成为了多模态的基础设施。通用表示的学习是 AI 发展的核心驱动力之一——一旦有了好的通用表示,下游任务的门槛就大幅降低,整个领域的创新速度就会加快。
2. 预训练 + 微调是效率与效果的平衡
从零训练需要大量数据和计算,但表达能力最强;特征提取需要的数据和计算最少,但表达能力有限。预训练 + 微调在两者之间取得了平衡——用大规模数据预训练一个通用模型,然后用小规模数据微调适应特定任务。这个范式使得深度学习从"实验室技术"变成了"工业基础设施",让中小企业和个人开发者也能利用最先进的 AI 能力。
3. 从监督到自监督:摆脱标注依赖
ImageNet 预训练虽然有效,但依赖大规模标注数据。自监督学习通过设计预训练任务,从无标注数据中自动学习表示,摆脱了对标注的依赖。这是一个根本性的转变——互联网上的海量无标注数据(图像、文本、视频)成为了 AI 训练的燃料,而标注数据的瓶颈被打破了。自监督预训练在视觉、语言、语音、多模态等领域都取得了超越监督预训练的效果。
4. 迁移学习的思想贯穿 AI 发展史
迁移学习的思想——将一个任务上学到的知识迁移到另一个任务——贯穿了整个 AI 发展史。从传统机器学习的域适应,到深度学习的预训练微调,到大模型时代的参数高效微调、指令微调、RLHF,迁移学习的形式在不断演变,但核心思想始终如一。理解迁移学习的本质,有助于我们把握 AI 技术发展的主线。
正如我们在 AI-10 中讨论的,深度学习是符号主义、连接主义和统计学习三次范式的融合。迁移学习是这种融合在"知识复用"方向的体现——它用连接主义的神经网络学习通用表示,用统计学习的微调理论保证泛化能力,用符号主义的层次化思想组织特征表示。
下一篇(AI-18),我们将探讨图神经网络与表示学习,看看深度学习如何处理非欧几里得结构的数据(如图、分子、社交网络),以及这如何为知识图谱和关系推理奠定基础。
本系列覆盖 AI 大模型基础、Agent 开发、MCP 协议、Skill 开发、RAG、模型微调、部署推理 七大方向,从入门到实战的全栈内容持续更新中。
所有文章的 Markdown 源文件、可运行代码、高清配图已整理成完整资料包。
👍 点赞 + ⭐ 关注,评论区扣「1」,挨个发你领取方式 👇
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)