1. 实践 !Code

模型下载:

# pip3 install huggingface_hub -i https://pypi.tuna.tsinghua.edu.cn/simple
export HF_ENDPOINT=https://hf-mirror.com
hf download microsoft/deberta-v3-base --local-dir ./models/deberta-v3-base

模型使用:

from transformers import (
    AutoTokenizer,
    AutoModel,
    AutoModelForSequenceClassification, 
)
model_name = tokenizer_name ='models/deberta-v3-base'

# ---- 模型加载 ----
tokenizer = AutoTokenizer.from_pretrained(tokenizer_name)
encoder = AutoModel.from_pretrained(model_name) # DebertaV2Model(V2/V3模型架构相同)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)

# ---- 实践测试 ----
text = "google.com"

# tokenizer.tokenize(text)  # 这是分词,结果是:['▁google', '.', 'com']
# 这是预处理
inputs = tokenizer(text)
print("input:", inputs)
"""
input: {'input_ids': [7374, 260, 549], 'token_type_ids': [0, 0, 0], 'attention_mask': [1, 1, 1]}
"""

# 这是执行编码(嵌入向量)任务
vectors = encoder(**inputs)
print("vectors:", vectors)
"""
vectors: BaseModelOutput(last_hidden_state=tensor([[[-0.7759, -0.5239,  0.5591,  ..., -0.8560,  0.3115, -0.4250],
         [-0.5972, -0.6318,  0.3904,  ..., -0.9189,  0.4106, -0.6348],
         [-0.6953, -0.8018,  0.4766,  ..., -0.4629,  0.4282, -0.5708]]],
       dtype=torch.float16, grad_fn=<NativeLayerNormBackward0>), hidden_states=None, attentions=None)
"""

# 这是执行分类任务
result = model(**inputs)
print("ouput:", result)
"""
ouput: SequenceClassifierOutput(loss=None, logits=tensor([[-0.0219,  0.0830]], dtype=torch.float16, grad_fn=<AddmmBackward0>), hidden_states=None, attentions=None)
"""

2. 预训练模型介绍

预训练模型是深度学习模型精细化发展后的重要组成。早期神经网络模型(如CNN)完整实现对特征的编码和分类功能,而后神经网络模型的功能拆分为:编码功能块分类功能块(如的Transformer的编码器、解码器)。将编码功能和分类功能进行拆分后,我们可以使用和目标任务相关的数据对编码块进行训练(即预训练),然后再最终的目标任务中使用少量数据对编码块进行微调。

3. DeBERTa-V3介绍

BERT对输入实现双向理解(根据上下文理解),常用于语言理解、特征编码(GPT常用于语言生成)。Transformer提出Self-Attention / Multi-Head Attention,BERT 使用 Multi-Head Attention 进行堆叠(GPT 使用 Causal-Attention / Masked Multi-Head Attention)。**Multi-Head Attention 是增强了并行/理解能力的 Self-Attention,是 Fully-visible的(非因果注意力)。**Causal-Attention / Masked Multi-Head Attention是添加了掩码的Muti-Head Attention,使得每一个 yk 只看得到 x1…xk的输入。

从BERT,到RoBERTa、ALBERT,再到DeBERTa。DeepSeek总结如下:

模型出身核心改进点适用场景
BERT2018年 Google AI
RoBERTa2019年 Facebook AI1.** 移除NSP任务,专注MLM**
2. 动态掩码策略
3. 更大批次/更多数据/更长训练
1. 需要更高精度的理解任务
2. 替代BERT作为新基线
ALBERT2019年 Google Research1. 跨层参数共享
2. 嵌入分解技术
3. SOP句序预测任务(替代NSP)
1. 内存/存储受限环境
2. 大规模模型部署
DistilBERT2019年 Hugging Face
1. **知识蒸馏压缩:**6层轻量架构
3. 三重损失函数
1. 实时推理系统
2. 延迟敏感应用
3. CPU环境部署
DeBERTa2020年6月 (v1)
2021年 (v2/v3)
微软研究院
1. 分离注意力机制
2. 增强掩码解码器
3. 绝对位置编码改进
1. 追求SOTA性能的任务
2. GLUE/SuperGLUE竞赛
3. 复杂语义理解场景

不同版本DeBERTa:

版本发布时间模型架构变化预训练创新核心创新
v12020 (ICLR)✅ 全新架构增强掩码解码器 (EMD)1. 分离注意力机制
2. 增强掩码解码器
v22021⚠️ 微调(非重构)更大数据/规模1. SiFT优化算法
2. 更大规模预训练
3. 共享位置嵌入
v32021 (EMNLP)❌ 与 v2 完全相同RTD 替代 MLM + GDES1. ELECTRA式预训练
2. 梯度解耦嵌入共享
3. 多语言扩展

4. DeBERTa-V3进阶:微调/fine-tuning

示例代码如下:

4.1. 微调
# -*- coding: utf-8 -*-
"""
DeBERTa v3 Fine-tuning 完整示例(英文分类任务)
数据集: GLUE/MRPC (Microsoft Research Paraphrase Corpus)
任务: 判断两句话是否语义等价 (二分类)
"""

from datasets import load_dataset
from transformers import (
    AutoTokenizer,
    AutoModelForSequenceClassification,
    TrainingArguments,
    Trainer,
    DataCollatorWithPadding,
    set_seed
)
import torch
import numpy as np
from sklearn.metrics import accuracy_score, f1_score

# ========================================
# 1. 配置与随机种子
# ========================================
set_seed(42)
model_name = "microsoft/deberta-v3-base"  # 可替换为本地路径 'models/deberta-v3-base'
num_labels = 2
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")

# ========================================
# 2. 加载数据集 (GLUE/MRPC)
# ========================================
dataset = load_dataset("glue", "mrpc")
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 预处理函数
def preprocess_function(examples):
    return tokenizer(
        examples["sentence1"],
        examples["sentence2"],
        truncation=True,
        max_length=128,
        padding=False  # Trainer 会自动动态 padding
    )

# 应用预处理
encoded_dataset = dataset.map(
    preprocess_function,
    batched=True,
    remove_columns=dataset["train"].column_names  # 移除原始文本列
)

# ========================================
# 3. 加载模型
# ========================================
model = AutoModelForSequenceClassification.from_pretrained(
    model_name,
    num_labels=num_labels,
    ignore_mismatched_sizes=False  # 确保分类头正确初始化
).to(device)

# ========================================
# 4. 评估指标
# ========================================
def compute_metrics(eval_pred):
    logits, labels = eval_pred
    predictions = np.argmax(logits, axis=1)
    return {
        "accuracy": accuracy_score(labels, predictions),
        "f1": f1_score(labels, predictions)
    }

# ========================================
# 5. 训练配置
# ========================================
training_args = TrainingArguments(
    output_dir="./results/deberta-v3-mrpc",
    overwrite_output_dir=True,
    
    # 训练超参(小数据集推荐配置)
    num_train_epochs=5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=64,
    learning_rate=2e-5,
    weight_decay=0.01,
    warmup_ratio=0.1,
    
    # 评估与保存
    evaluation_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
    metric_for_best_model="f1",
    
    # 其他
    logging_dir="./logs",
    logging_steps=50,
    fp16=torch.cuda.is_available(),  # GPU 自动启用混合精度
    report_to="none",  # 禁用 wandb/tensorboard(可选)
    seed=42
)

# ========================================
# 6. Trainer 初始化与训练
# ========================================
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=encoded_dataset["train"],
    eval_dataset=encoded_dataset["validation"],
    tokenizer=tokenizer,
    data_collator=DataCollatorWithPadding(tokenizer),
    compute_metrics=compute_metrics
)

print("🚀 Starting fine-tuning...")
trainer.train()

# ========================================
# 7. 最终评估
# ========================================
print("\n📊 Final evaluation on validation set:")
eval_results = trainer.evaluate()
print(f"  Accuracy: {eval_results['eval_accuracy']:.4f}")
print(f"  F1 Score: {eval_results['eval_f1']:.4f}")

# ========================================
# 8. 保存模型(含 tokenizer)
# ========================================
save_path = "./models/deberta-v3-mrpc-finetuned"
trainer.save_model(save_path)
tokenizer.save_pretrained(save_path)
print(f"\n✅ Model saved to: {save_path}")
4.2. 微调后使用
# -*- coding: utf-8 -*-
"""
加载微调后的 DeBERTa 模型进行推理
"""

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

# ========================================
# 1. 加载微调模型
# ========================================
model_path = "./models/deberta-v3-mrpc-finetuned"  # 替换为你的保存路径

tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForSequenceClassification.from_pretrained(model_path)
model.eval()  # 推理模式
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

# ========================================
# 2. 推理函数
# ========================================
def predict(text1, text2):
    inputs = tokenizer(
        text1,
        text2,
        return_tensors="pt",
        truncation=True,
        max_length=128,
        padding=True
    ).to(device)
    
    with torch.no_grad():
        outputs = model(**inputs)
        logits = outputs.logits
        probs = torch.softmax(logits, dim=-1)
        pred = torch.argmax(logits, dim=-1).item()
    
    label_map = {0: "NOT_PARAPHRASE", 1: "PARAPHRASE"}
    return {
        "prediction": label_map[pred],
        "confidence": probs[0][pred].item(),
        "probabilities": {label_map[i]: probs[0][i].item() for i in range(2)}
    }

# ========================================
# 3. 测试示例
# ========================================
test_cases = [
    ("How old are you?", "What is your age?"),
    ("I love this movie", "This film is terrible"),
    ("The cat sits on the mat", "A feline is resting on a rug")
]

print("🔍 Inference Examples:\n")
for text1, text2 in test_cases:
    result = predict(text1, text2)
    print(f"Text1: {text1}")
    print(f"Text2: {text2}")
    print(f"→ Prediction: {result['prediction']} (Confidence: {result['confidence']:.2%})")
    print(f"   Probabilities: {result['probabilities']}\n")

参考

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐