环境声明

  • Python版本:Python 3.12+(建议使用3.10以上版本)
  • 深度学习框架:PyTorch 2.0+
  • 预训练模型库:Hugging Face Transformers 4.35+
  • 硬件要求:支持CUDA的GPU(推荐)或CPU
  • 操作系统:Windows / macOS / Linux(通用)

学习目标

通过本章学习,你将掌握:

  1. 迁移学习的核心概念与主要类型
  2. 特征提取与微调的实践策略
  3. 领域自适应的理论与方法
  4. 预训练语言模型(BERT、GPT、T5、LLaMA)的架构原理
  5. 计算机视觉预训练模型与自监督学习
  6. 参数高效微调(PEFT)技术:LoRA、Adapter、Prompt Tuning
  7. 使用BERT进行文本分类的完整实战流程

1. 迁移学习概述与类型

1.1 什么是迁移学习

迁移学习(Transfer Learning)是机器学习的一个重要分支,其核心思想是:将在源领域(Source Domain)学到的知识迁移到目标领域(Target Domain),从而减少对目标领域大量标注数据的依赖。

用一个形象的比喻:假设你已经学会了骑自行车(源任务),那么学习骑摩托车(目标任务)会容易得多,因为你已经掌握了平衡感、转向控制等通用技能。迁移学习正是利用这种"知识复用"的能力。

1.2 迁移学习的数学定义

给定源域 Ds={Xs,P(Xs)}D_s = \{X_s, P(X_s)\}Ds={Xs,P(Xs)} 和目标任务 Ts={Ys,fs(⋅)}T_s = \{Y_s, f_s(\cdot)\}Ts={Ys,fs()},以及目标域 Dt={Xt,P(Xt)}D_t = \{X_t, P(X_t)\}Dt={Xt,P(Xt)} 和目标任务 Tt={Yt,ft(⋅)}T_t = \{Y_t, f_t(\cdot)\}Tt={Yt,ft()},迁移学习的目标是:利用 DsD_sDsTsT_sTs 中的知识,提升目标域 DtD_tDt 上目标预测函数 ft(⋅)f_t(\cdot)ft() 的学习效果,其中 Ds≠DtD_s \neq D_tDs=DtTs≠TtT_s \neq T_tTs=Tt

1.3 迁移学习的类型

类型 定义 特点 典型应用
归纳式迁移学习 源任务与目标任务不同,但领域可能相同或不同 需要源域标注数据 图像分类、文本分类
直推式迁移学习 源任务与目标任务相同,但领域不同 源域有标注,目标域无标注 跨领域情感分析
无监督迁移学习 源任务与目标任务均不同,且均无标注 难度最大,依赖自监督 特征表示学习
领域自适应 源域与目标域分布不同,但任务相同 核心问题是对齐分布 域迁移图像识别

1.4 迁移学习的应用场景

迁移学习在以下场景中尤为重要:

  • 数据稀缺场景:目标领域标注数据极少(如医疗影像分析)
  • 计算资源受限:无法从头训练大规模模型
  • 快速部署需求:需要在短时间内获得可用模型
  • 多任务学习:多个相关任务共享底层表示

2. 特征提取与微调

2.1 特征提取(Feature Extraction)

特征提取策略将预训练模型作为固定的特征提取器,只训练顶层分类器。

实现方式

  1. 冻结预训练模型的所有参数
  2. 移除原始分类层
  3. 添加新的任务特定层
  4. 仅训练新添加的层

适用场景

  • 目标数据集较小
  • 目标数据与预训练数据分布相似
  • 计算资源非常有限

2.2 微调(Fine-tuning)

微调策略允许调整预训练模型的部分或全部参数。

微调策略分类

策略 描述 适用情况
全量微调 更新所有参数 数据充足,计算资源充裕
逐层解冻 从顶层开始逐层解冻 中等规模数据
选择性微调 只微调特定层 特定层包含任务相关信息
差分学习率 不同层使用不同学习率 需要精细控制

2.3 学习率设置策略

# 差分学习率示例(PyTorch实现)
# 底层使用较小学习率,顶层使用较大学习率
optimizer = torch.optim.Adam([
    {'params': model.layer1.parameters(), 'lr': 1e-5},
    {'params': model.layer2.parameters(), 'lr': 1e-4},
    {'params': model.classifier.parameters(), 'lr': 1e-3}
])

学习率衰减策略

  • 线性衰减:学习率随训练轮数线性下降
  • 余弦退火:使用余弦函数调整学习率
  • 预热策略:前几轮从小学习率逐渐增大

3. 领域自适应

3.1 领域自适应的核心问题

领域自适应(Domain Adaptation)处理源域与目标域数据分布不一致的问题。核心挑战是:

Ps(X)≠Pt(X)P_s(X) \neq P_t(X)Ps(X)=Pt(X)

即源域和目标域的特征分布存在差异。

3.2 分布差异度量

最大均值差异(Maximum Mean Discrepancy, MMD)

MMD是衡量两个分布差异的常用指标:

MMD(Xs,Xt)=∥1ns∑i=1nsϕ(xis)−1nt∑j=1ntϕ(xjt)∥HMMD(X_s, X_t) = \left\| \frac{1}{n_s} \sum_{i=1}^{n_s} \phi(x_i^s) - \frac{1}{n_t} \sum_{j=1}^{n_t} \phi(x_j^t) \right\|_HMMD(Xs,Xt)= ns1i=1nsϕ(xis)nt1j=1ntϕ(xjt) H

其中,ϕ(⋅)\phi(\cdot)ϕ() 是将样本映射到再生核希尔伯特空间(RKHS)的函数。

其他度量方法

方法 特点 适用场景
CORAL 对齐二阶统计量 特征协方差对齐
对抗距离 通过判别器度量 对抗式方法
Wasserstein距离 考虑几何结构 分布差异较大时

3.3 对抗式领域自适应

**域对抗神经网络(Domain-Adversarial Neural Network, DANN)**是领域自适应的经典方法。

DANN架构组成

  1. 特征提取器(G):提取领域不变特征
  2. 标签预测器(F):预测样本标签
  3. 域判别器(D):区分样本来自源域还是目标域

对抗训练目标

min⁡Gmax⁡DLy−λLd\min_G \max_D \mathcal{L}_y - \lambda \mathcal{L}_dGminDmaxLyλLd

其中,Ly\mathcal{L}_yLy 是分类损失,Ld\mathcal{L}_dLd 是域分类损失,λ\lambdaλ 控制对抗强度。

梯度反转层(Gradient Reversal Layer, GRL)

GRL在前向传播时保持输入不变,在反向传播时反转梯度符号,实现对抗训练:

class GradientReversalLayer(torch.autograd.Function):
    @staticmethod
    def forward(ctx, x, lambda_val):
        ctx.lambda_val = lambda_val
        return x.view_as(x)
    
    @staticmethod
    def backward(ctx, grad_output):
        return -ctx.lambda_val * grad_output, None

4. 预训练语言模型

4.1 预训练语言模型发展历程

预训练语言模型(Pre-trained Language Models, PLMs)的发展经历了多个阶段:

阶段 代表模型 核心特点
词向量时代 Word2Vec, GloVe 静态词表示
上下文嵌入时代 ELMo 动态词表示
Transformer时代 BERT, GPT 深层双向/单向编码
大模型时代 GPT-3, LLaMA 超大规模参数

4.2 BERT架构解析

BERT(Bidirectional Encoder Representations from Transformers) 采用双向Transformer编码器架构。

核心设计

  1. 双向编码:同时考虑左右上下文
  2. 预训练任务
    • 掩码语言模型(MLM):随机掩码15%的词进行预测
    • 下一句预测(NSP):判断两个句子是否连续

BERT变体

模型 参数量 层数 隐藏维度 适用场景
BERT-Base 110M 12 768 通用任务
BERT-Large 340M 24 1024 复杂任务
DistilBERT 66M 6 768 资源受限场景
RoBERTa 355M 24 1024 优化训练策略

4.3 GPT系列架构

GPT(Generative Pre-trained Transformer) 采用自回归解码器架构。

演进历程

  • GPT-1:1.17亿参数,证明生成式预训练的有效性
  • GPT-2:15亿参数,展示零样本学习能力
  • GPT-3:1750亿参数,涌现上下文学习能力
  • GPT-4:多模态能力,推理能力大幅提升

自回归语言建模

P(x)=∏i=1nP(xi∣x1,x2,...,xi−1)P(x) = \prod_{i=1}^{n} P(x_i | x_1, x_2, ..., x_{i-1})P(x)=i=1nP(xix1,x2,...,xi1)

4.4 T5与编码器-解码器架构

T5(Text-to-Text Transfer Transformer) 将所有NLP任务统一为文本到文本的格式。

核心思想

  • 输入:“translate English to German: The house is wonderful.”
  • 输出:“Das Haus ist wunderbar.”

T5预训练任务

  1. Span Corruption:随机掩码连续片段,预测被掩码内容
  2. 去噪自编码:类似于BART的降噪目标

4.5 LLaMA架构

LLaMA(Large Language Model Meta AI) 是Meta开源的大语言模型系列。

架构优化

技术 说明 效果
Pre-normalization 使用RMSNorm代替LayerNorm 训练稳定性提升
SwiGLU激活函数 替代ReLU 表达能力增强
旋转位置编码(RoPE) 相对位置编码 外推能力增强
分组查询注意力(GQA) 减少KV缓存 推理速度提升

5. 计算机视觉预训练模型

5.1 ImageNet预训练

ImageNet预训练是计算机视觉领域的标准做法。

经典预训练模型

模型 年份 参数量 Top-1准确率 特点
ResNet-50 2015 25.6M 76.1% 残差连接
ResNet-101 2015 44.5M 77.4% 更深网络
EfficientNet-B0 2019 5.3M 77.1% 复合缩放
ConvNeXt 2022 88.6M 83.8% 现代化CNN
ViT-Base 2020 86M 84.2% 纯Transformer

5.2 自监督学习

自监督学习通过设计预训练任务,从无标注数据中学习视觉表示。

主要方法

  1. 对比学习(Contrastive Learning)

    • SimCLR:通过数据增强生成正样本对
    • MoCo:使用动量编码器维护负样本队列
    • CLIP:跨模态对比学习
  2. 掩码图像建模(Masked Image Modeling)

    • BEiT:将图像离散化为视觉token
    • MAE:高比例掩码,重建像素

5.3 MAE(Masked Autoencoder)详解

MAE是视觉自监督学习的里程碑工作。

核心思想

  • 随机掩码图像块(掩码比例高达75%)
  • 编码器仅处理可见块
  • 解码器重建完整图像

MAE架构优势

特点 说明
非对称设计 编码器轻量,解码器简单
高掩码率 75%掩码率,迫使学习高层语义
像素重建 直接预测原始像素,无需复杂tokenizer

6. 参数高效微调PEFT

6.1 PEFT概述

参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)旨在通过训练少量参数,实现与全量微调相当的效果。

PEFT方法分类

类别 代表方法 核心思想
添加参数 Adapter, Prompt Tuning 引入可训练模块
选择参数 BitFit 只训练偏置项
重参数化 LoRA, DoRA 低秩近似权重更新
混合方法 UniPELT 组合多种方法

6.2 LoRA(Low-Rank Adaptation)

LoRA是2021年提出的低秩适应方法,已成为PEFT的事实标准。

核心思想

对于预训练权重矩阵 W0∈Rd×kW_0 \in \mathbb{R}^{d \times k}W0Rd×k,不直接更新 W0W_0W0,而是引入低秩分解:

W=W0+ΔW=W0+BAW = W_0 + \Delta W = W_0 + BAW=W0+ΔW=W0+BA

其中,B∈Rd×rB \in \mathbb{R}^{d \times r}BRd×rA∈Rr×kA \in \mathbb{R}^{r \times k}ARr×kr≪min⁡(d,k)r \ll \min(d, k)rmin(d,k)

LoRA特点

特性 说明
参数效率 可训练参数减少为原来的 r/dr/dr/d
无推理开销 推理时可合并权重,不增加延迟
模块化 不同任务训练不同的LoRA模块
可组合 多个LoRA模块可线性组合

LoRA实现示例

import torch
import torch.nn as nn
import math

class LoRALayer(nn.Module):
    def __init__(self, in_features, out_features, rank=8):
        super().__init__()
        self.rank = rank
        # 低秩矩阵A和B
        self.lora_A = nn.Parameter(torch.zeros(in_features, rank))
        self.lora_B = nn.Parameter(torch.zeros(rank, out_features))
        # 初始化:A用高斯初始化,B用零初始化
        nn.init.kaiming_uniform_(self.lora_A, a=math.sqrt(5))
        nn.init.zeros_(self.lora_B)
        self.scaling = 1.0
    
    def forward(self, x):
        # 计算低秩更新:x @ A @ B
        return x @ self.lora_A @ self.lora_B * self.scaling

6.3 QLoRA与量化技术

QLoRA(Quantized LoRA) 结合4-bit量化和LoRA,实现单卡微调大模型。

关键技术

  1. 4-bit NormalFloat量化:信息论最优的4-bit数据类型
  2. 双量化:对量化常数进行二次量化
  3. 分页优化器:使用NVIDIA统一内存处理内存峰值

QLoRA优势

  • 在48GB GPU上微调65B参数模型
  • 保持16-bit全量微调的99.3%性能

6.4 DoRA(Weight-Decomposed Low-Rank Adaptation)

DoRA是2024年提出的LoRA改进方法,将权重分解为幅度和方向分别更新。

权重分解

W=m⋅V∥V∥W = m \cdot \frac{V}{\|V\|}W=mVV

其中,mmm 是幅度向量,VVV 是方向矩阵。

DoRA更新

  • 幅度 mmm:直接微调
  • 方向 VVV:使用LoRA进行低秩更新

DoRA优势

特性 LoRA DoRA
学习能力 基础 增强
训练稳定性 一般 提升
推理开销
适用模型 通用 LLM和VLM效果更佳

6.5 Adapter Tuning

Adapter在Transformer层中插入小型瓶颈层。

Adapter结构

输入 -> 降维(d -> r)-> 非线性激活 -> 升维(r -> d)-> 输出

Adapter特点

  • 参数量小(通常 r=16r=16r=16646464
  • 可并行训练多个任务
  • 推理时需要额外计算

6.6 Prompt Tuning与Prefix Tuning

Prompt Tuning

在输入嵌入层添加可训练的软提示(Soft Prompt)token。

Prefix Tuning

在每层Transformer的key和value前添加可训练的前缀向量。

比较

方法 参数位置 参数量 效果
Prompt Tuning 输入层 较小 大模型效果好
Prefix Tuning 每层K,V 中等 通用性强
P-Tuning v2 深层Prefix 较大 小模型也有效

6.7 2024-2025年PEFT新进展

最新研究方向

  1. 多模态PEFT:适配视觉-语言模型(如LLaVA)
  2. 长上下文PEFT:支持更长序列的微调方法
  3. 联邦PEFT:隐私保护下的分布式微调
  4. 自动化PEFT:自动选择最优PEFT配置

7. 实战案例:使用BERT进行文本分类微调

7.1 任务描述

本案例使用BERT-base-chinese模型,在中文情感分类数据集上进行微调。

7.2 环境准备

# 安装依赖
# pip install transformers datasets torch scikit-learn

import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from transformers import (
    BertTokenizer, 
    BertForSequenceClassification,
    AdamW,
    get_linear_schedule_with_warmup
)
from datasets import load_dataset
from sklearn.metrics import accuracy_score, f1_score
import numpy as np

# 设置随机种子
torch.manual_seed(42)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"使用设备: {device}")

7.3 数据准备

# 加载中文情感分析数据集(ChnSentiCorp)
# 如果没有该数据集,可以使用自定义数据
def load_data():
    """加载数据集,返回train和test数据集"""
    # 示例:使用Hugging Face的datasets库加载中文情感数据
    try:
        dataset = load_dataset("chnsenticorp")
        train_dataset = dataset['train']
        test_dataset = dataset['test']
    except:
        # 如果无法下载,创建示例数据
        print("使用示例数据进行演示...")
        train_texts = ["这个产品很好", "质量太差了", "非常满意", "不值得购买"] * 100
        train_labels = [1, 0, 1, 0] * 100
        test_texts = ["效果不错", "很失望"] * 50
        test_labels = [1, 0] * 50
        
        from datasets import Dataset
        train_dataset = Dataset.from_dict({"text": train_texts, "label": train_labels})
        test_dataset = Dataset.from_dict({"text": test_texts, "label": test_labels})
    
    return train_dataset, test_dataset

train_data, test_data = load_data()
print(f"训练集大小: {len(train_data)}")
print(f"测试集大小: {len(test_data)}")

7.4 数据预处理

# 加载BERT中文分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')

def tokenize_function(examples):
    """对文本进行tokenize处理"""
    return tokenizer(
        examples['text'],
        padding='max_length',
        truncation=True,
        max_length=128
    )

# 对数据集进行编码
train_encoded = train_data.map(tokenize_function, batched=True)
test_encoded = test_data.map(tokenize_function, batched=True)

# 设置数据格式
train_encoded.set_format(
    type='torch', 
    columns=['input_ids', 'attention_mask', 'label']
)
test_encoded.set_format(
    type='torch', 
    columns=['input_ids', 'attention_mask', 'label']
)

# 创建DataLoader
train_loader = DataLoader(train_encoded, batch_size=16, shuffle=True)
test_loader = DataLoader(test_encoded, batch_size=16)

7.5 模型定义

# 加载预训练BERT模型,添加分类头
model = BertForSequenceClassification.from_pretrained(
    'bert-base-chinese',
    num_labels=2,  # 二分类:正面/负面
    output_attentions=False,
    output_hidden_states=False
)
model = model.to(device)

# 查看模型结构
print(f"模型参数量: {sum(p.numel() for p in model.parameters()) / 1e6:.2f}M")

7.6 训练配置

# 定义优化器和学习率调度器
optimizer = AdamW(model.parameters(), lr=2e-5, weight_decay=0.01)

# 计算总训练步数
epochs = 3
total_steps = len(train_loader) * epochs

# 学习率预热(前10%的步数)
warmup_steps = int(0.1 * total_steps)
scheduler = get_linear_schedule_with_warmup(
    optimizer,
    num_warmup_steps=warmup_steps,
    num_training_steps=total_steps
)

# 损失函数
loss_fn = nn.CrossEntropyLoss()

7.7 训练循环

def train_epoch(model, data_loader, optimizer, scheduler, device):
    """训练一个epoch"""
    model.train()
    total_loss = 0
    
    for batch in data_loader:
        # 将数据移至设备
        input_ids = batch['input_ids'].to(device)
        attention_mask = batch['attention_mask'].to(device)
        labels = batch['label'].to(device)
        
        # 清零梯度
        optimizer.zero_grad()
        
        # 前向传播
        outputs = model(
            input_ids=input_ids,
            attention_mask=attention_mask,
            labels=labels
        )
        loss = outputs.loss
        
        # 反向传播
        loss.backward()
        
        # 梯度裁剪,防止梯度爆炸
        torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
        
        # 更新参数
        optimizer.step()
        scheduler.step()
        
        total_loss += loss.item()
    
    return total_loss / len(data_loader)

def evaluate(model, data_loader, device):
    """评估模型性能"""
    model.eval()
    predictions = []
    true_labels = []
    
    with torch.no_grad():
        for batch in data_loader:
            input_ids = batch['input_ids'].to(device)
            attention_mask = batch['attention_mask'].to(device)
            labels = batch['label'].to(device)
            
            outputs = model(
                input_ids=input_ids,
                attention_mask=attention_mask
            )
            
            # 获取预测结果
            preds = torch.argmax(outputs.logits, dim=1)
            predictions.extend(preds.cpu().numpy())
            true_labels.extend(labels.cpu().numpy())
    
    # 计算指标
    accuracy = accuracy_score(true_labels, predictions)
    f1 = f1_score(true_labels, predictions, average='weighted')
    
    return accuracy, f1

# 训练循环
print("开始训练...")
for epoch in range(epochs):
    print(f"\nEpoch {epoch + 1}/{epochs}")
    
    # 训练
    train_loss = train_epoch(model, train_loader, optimizer, scheduler, device)
    print(f"训练损失: {train_loss:.4f}")
    
    # 评估
    acc, f1 = evaluate(model, test_loader, device)
    print(f"测试准确率: {acc:.4f}, F1分数: {f1:.4f}")

7.8 使用LoRA进行高效微调

# 使用PEFT库进行LoRA微调
# pip install peft

from peft import LoraConfig, get_peft_model, TaskType

# 配置LoRA
lora_config = LoraConfig(
    task_type=TaskType.SEQ_CLS,  # 序列分类任务
    r=8,  # 低秩维度
    lora_alpha=16,  # 缩放参数
    lora_dropout=0.1,
    bias="none",
    target_modules=["query", "key", "value", "dense"]  # 目标模块
)

# 将LoRA应用于模型
lora_model = get_peft_model(model, lora_config)
lora_model.print_trainable_parameters()

# 使用LoRA模型进行训练(训练代码同上)
# 优势:可训练参数从1.1亿减少到约30万

7.9 模型保存与加载

# 保存微调后的模型
output_dir = "./bert_sentiment_model"
model.save_pretrained(output_dir)
tokenizer.save_pretrained(output_dir)

# 保存LoRA权重(如果使用LoRA)
lora_model.save_pretrained("./bert_lora_model")

# 加载模型进行推理
from transformers import pipeline

# 创建文本分类pipeline
classifier = pipeline(
    "sentiment-analysis",
    model=output_dir,
    tokenizer=output_dir,
    device=0 if torch.cuda.is_available() else -1
)

# 测试推理
test_texts = ["这个产品质量非常好,强烈推荐!", "太失望了,完全不值这个价钱"]
results = classifier(test_texts)
for text, result in zip(test_texts, results):
    print(f"文本: {text}")
    print(f"预测: {result}\n")

8. 避坑小贴士

8.1 数据相关

  1. 数据分布检查:微调前务必检查目标数据与预训练数据的分布差异,差异过大时考虑领域自适应
  2. 数据量评估:数据量小于1000条时,优先考虑特征提取;数据量大于10000条时,可尝试全量微调
  3. 类别平衡:分类任务中注意类别不平衡问题,可使用加权损失或过采样

8.2 训练相关

  1. 学习率选择:预训练层使用较小学习率(1e-5到5e-5),新层可使用较大学习率(1e-3)
  2. 预热步数:使用学习率预热,避免早期训练不稳定
  3. 早停策略:监控验证集损失,避免过拟合
  4. 梯度累积:显存不足时,使用梯度累积模拟大batch训练

8.3 模型相关

  1. 模型选择:中文任务优先选择bert-base-chinese或chinese-roberta
  2. 序列长度:根据任务选择合适的max_length,过长浪费计算,过短信息丢失
  3. 层冻结策略:底层捕获通用特征,应使用更小学习率或保持冻结

8.4 PEFT相关

  1. LoRA秩选择:一般任务r=8即可,复杂任务可尝试r=16或32
  2. 目标模块选择:注意力层的query、value是关键,优先添加LoRA
  3. QLoRA注意:4-bit量化可能略微影响精度,对精度要求极高的任务慎用

9. 本章小结

本章系统介绍了迁移学习与预训练模型的核心知识:

核心概念

  • 迁移学习通过知识复用,解决数据稀缺和计算资源受限问题
  • 领域自适应处理源域与目标域分布不一致的挑战
  • 预训练模型(BERT、GPT、T5、LLaMA)提供强大的基础能力

关键技术

  • 特征提取与微调的权衡与选择
  • 对抗式领域自适应(DANN)的原理与实现
  • 参数高效微调(PEFT)大幅降低微调成本

实践要点

  • LoRA已成为PEFT的事实标准,QLoRA实现单卡微调大模型
  • DoRA作为2024年的改进方法,在稳定性和学习能力上有所提升
  • 使用Hugging Face Transformers可快速实现BERT微调

一句话总结:迁移学习让我们"站在巨人肩膀上",以更低的成本获得强大的模型能力;PEFT技术进一步降低了门槛,使得个人开发者也能微调大模型。


参考资源

  1. Devlin J, et al. BERT: Pre-training of Deep Bidirectional Transformers. NAACL 2019.
  2. Hu E, et al. LoRA: Low-Rank Adaptation of Large Language Models. ICLR 2022.
  3. Dettmers T, et al. QLoRA: Efficient Finetuning of Quantized LLMs. NeurIPS 2023.
  4. Liu S, et al. DoRA: Weight-Decomposed Low-Rank Adaptation. ICML 2024.
  5. Ganin Y, et al. Domain-Adversarial Training of Neural Networks. JMLR 2016.

本文是《机器学习精通》系列教程的第15章,欢迎持续关注后续内容。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐