【AI】预训练模型 DeBERTa-V3 实践与介绍
·
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总结如下:
| 模型 | 出身 | 核心改进点 | 适用场景 |
|---|---|---|---|
| BERT | 2018年 Google AI | ||
| RoBERTa | 2019年 Facebook AI | 1.** 移除NSP任务,专注MLM** 2. 动态掩码策略 3. 更大批次/更多数据/更长训练 | 1. 需要更高精度的理解任务 2. 替代BERT作为新基线 |
| ALBERT | 2019年 Google Research | 1. 跨层参数共享 2. 嵌入分解技术 3. SOP句序预测任务(替代NSP) | 1. 内存/存储受限环境 2. 大规模模型部署 |
| DistilBERT | 2019年 Hugging Face | 1. **知识蒸馏压缩:**6层轻量架构 3. 三重损失函数 | 1. 实时推理系统 2. 延迟敏感应用 3. CPU环境部署 |
| DeBERTa | 2020年6月 (v1) 2021年 (v2/v3) 微软研究院 | 1. 分离注意力机制 2. 增强掩码解码器 3. 绝对位置编码改进 | 1. 追求SOTA性能的任务 2. GLUE/SuperGLUE竞赛 3. 复杂语义理解场景 |
不同版本DeBERTa:
| 版本 | 发布时间 | 模型架构变化 | 预训练创新 | 核心创新 |
|---|---|---|---|---|
| v1 | 2020 (ICLR) | ✅ 全新架构 | 增强掩码解码器 (EMD) | 1. 分离注意力机制 2. 增强掩码解码器 |
| v2 | 2021 | ⚠️ 微调(非重构) | 更大数据/规模 | 1. SiFT优化算法 2. 更大规模预训练 3. 共享位置嵌入 |
| v3 | 2021 (EMNLP) | ❌ 与 v2 完全相同 | RTD 替代 MLM + GDES | 1. 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")
参考
更多推荐



所有评论(0)