跨语言模型中的翻译任务:XLM-RoBERTa在翻译任务中的应用

发布于:2025-08-06 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、XLM-RoBERTa概述

1.1 XLM-RoBERTa 介绍

XLM-RoBERTa((Cross-lingual Language Model Pretraining - RoBERTa),简称 XLM-R) 是 Facebook 于 2020 年提出的仅编码器(encoder-only)跨语言预训练模型,在 2.5 TB、覆盖 100 种语言的 CommonCrawl 语料上以 MLM 目标训练而成 。

  • 与早期 XLM 相比,不依赖语言 ID embedding,统一用 SentencePiece 分词,参数量更大(base 270 M / large 550 M)。
  • 典型优势:低资源语言表征好、跨语言迁移强,但原生架构无解码器,因此需要“编码器+外挂解码器”或“编码器→Seq2Seq 适配”才能做翻译。

XLM-RoBERTa在多种语言上进行了训练,使用了大量单语和双语数据集,使其能够学习到丰富的跨语言表示。尽管它主要用于理解任务,如文本分类、情感分析等,但在翻译任务中也显示出了一定的应用潜力。

XLM-RoBERTa虽然主要用于文本分类和其他语言理解任务,但通过适当的微调,也可以实现简单的翻译任务。

1.2 核心特点

  • 跨语言预训练:基于大规模多语言文本(如CommonCrawl)训练,支持100+语言。
  • 架构改进:在RoBERTa基础上优化,取消下一句预测(NSP)任务,专注于MLM(掩码语言建模)。
  • 优势
    • 零样本翻译:未直接训练翻译任务,但能实现跨语言迁移。
    • 上下文感知:擅长处理长文本和复杂语义。

1.3 XLM-RoBERTa 的翻译能力原理

(1)跨语言表示学习

  • 共享词表:所有语言共享同一子词词表(SentencePiece),实现词汇级对齐。
  • 统一嵌入空间:通过MLM任务迫使不同语言的相似语义映射到相近的向量空间。

(2)翻译任务适配

  • 直接生成:将翻译视为**序列到序列(Seq2Seq)**任务,通过微调解码器生成目标语言。
  • 中间表示:利用模型的跨语言嵌入作为输入,接一个轻量级解码器(如Transformer Decoder)。

1.4 与其他模型的对比

模型 优势 劣势
MarianMT 专为翻译优化,轻量级 跨语言迁移能力弱
mBART 原生Seq2Seq结构,多语言支持 训练资源消耗大
XLM-RoBERTa 强大的表示能力,零样本潜力 需额外解码器,生成效果不稳定

二、XLM-RoBERTa实现翻译的代码实现

通过使用共享的编码器,XLM-RoBERTa在翻译任务中生成目标语言的文本,并通过对源语言和目标语言的双向上下文理解,提升翻译质量。

代码参考书籍《Transformer深度解析与NLP应用开发》

2.1 基于XLM-RoBERTa进行翻译

下面代码展示基于XLM-RoBERTa进行翻译任务。

from transformers import XLMRobertaForSequenceClassification, XLMRobertaTokenizer, Trainer, TrainingArguments
from datasets import load_dataset, load_metric
import numpy as np
import torch

# 加载XLM-RoBERTa模型和分词器
model_name = "xlm-roberta-base"
model = XLMRobertaForSequenceClassification.from_pretrained(model_name, num_labels=2)
tokenizer = XLMRobertaTokenizer.from_pretrained(model_name)

# 加载示例数据集
dataset = load_dataset("amazon_reviews_multi", "en")
train_data = dataset['train']
test_data = dataset['test']

# 数据预处理:将文本转换为模型所需的输入格式
def preprocess_function(examples):
    return tokenizer(examples["review_body"], truncation=True, padding="max_length", max_length=128)

encoded_train_data = train_data.map(preprocess_function, batched=True)
encoded_test_data = test_data.map(preprocess_function, batched=True)

# 定义评估指标
accuracy_metric = load_metric("accuracy")

def compute_metrics(eval_pred):
    logits, labels = eval_pred
    predictions = np.argmax(logits, axis=-1)
    return accuracy_metric.compute(predictions=predictions, references=labels)

# 设置训练参数
training_args = TrainingArguments(
    output_dir="./results",
    evaluation_strategy="epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    num_train_epochs=3,
    weight_decay=0.01,
    logging_dir="./logs"
)

# 定义Trainer对象
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=encoded_train_data,
    eval_dataset=encoded_test_data,
    compute_metrics=compute_metrics
)

# 开始训练与评估
trainer.train()

# 评估模型
eval_results = trainer.evaluate()
print("Evaluation results:", eval_results)



import torch
from transformers import XLMRobertaTokenizer, XLMRobertaForSequenceClassification
from torch.utils.data import DataLoader, Dataset
import torch.nn.functional as F

# 自定义数据集类
class TranslationDataset(Dataset):
    def __init__(self, sentences, tokenizer, max_len=128):
        self.sentences = sentences
        self.tokenizer = tokenizer
        self.max_len = max_len

    def __len__(self):
        return len(self.sentences)

    def __getitem__(self, idx):
        encoded = self.tokenizer.encode_plus(
            self.sentences[idx],
            max_length=self.max_len,
            padding='max_length',
            truncation=True,
            return_tensors='pt'
        )
        input_ids = encoded['input_ids'].squeeze()
        attention_mask = encoded['attention_mask'].squeeze()
        return input_ids, attention_mask

# 初始化模型与分词器
model_name = "xlm-roberta-base"
tokenizer = XLMRobertaTokenizer.from_pretrained(model_name)
model = XLMRobertaForSequenceClassification.from_pretrained(model_name, num_labels=2)

# 句子示例
sentences = ["这是一个中文句子。", "Esto es una oración en español."]

# 构建数据集和数据加载器
dataset = TranslationDataset(sentences, tokenizer)
dataloader = DataLoader(dataset, batch_size=2)

# 模型推理
model.eval()
translations = []
with torch.no_grad():
    for input_ids, attention_mask in dataloader:
        outputs = model(input_ids=input_ids, attention_mask=attention_mask)
        logits = outputs.logits
        predicted_tokens = torch.argmax(F.softmax(logits, dim=-1), dim=-1)
        for token_ids in predicted_tokens:
            translation = tokenizer.decode(token_ids, skip_special_tokens=True)
            translations.append(translation)

# 输出结果
print("Translations:")
for i, translation in enumerate(translations):
    print(f"Sentence {i + 1}: {translation}")

代码说明
1、上面代码首先定义了TranslationDataset 类,该类接收输入句子列表,并将句子编码为适合模型输入的格式。
2、在模型部分,加载了XLM-RoBERTa 模型和分词器,通过设置 num_labels可以实现对翻译结果的预测。
3、然后定义了一些中文和西班牙文的句子示例。
4、接着使用 DataLoader 创建数据加载器,并将这些句子示例传递给模型进行推理。
5、在推理时,通过 torch.argmax 获取生成的翻译结果,并通过 tokenizer.decode 对生成的翻译句子进行解码,最终得到翻译的文本。

2.2 模型微调与质量提升

微调过程如下:

import torch
from transformers import XLMRobertaTokenizer, XLMRobertaForSequenceClassification
from torch.utils.data import DataLoader, Dataset
import torch.nn.functional as F

# 自定义数据集类
class TranslationDataset(Dataset):
    def __init__(self, sentences, tokenizer, max_len=128):
        self.sentences = sentences
        self.tokenizer = tokenizer
        self.max_len = max_len

    def __len__(self):
        return len(self.sentences)

    def __getitem__(self, idx):
        encoded = self.tokenizer.encode_plus(
            self.sentences[idx],
            max_length=self.max_len,
            padding='max_length',
            truncation=True,
            return_tensors='pt'
        )
        input_ids = encoded['input_ids'].squeeze()
        attention_mask = encoded['attention_mask'].squeeze()
        return input_ids, attention_mask

# 初始化模型与分词器
model_name = "xlm-roberta-base"
tokenizer = XLMRobertaTokenizer.from_pretrained(model_name)
model = XLMRobertaForSequenceClassification.from_pretrained(model_name, num_labels=2)

# 句子示例
sentences = ["这是一个中文句子。", "Esto es una oración en español."]

# 构建数据集和数据加载器
dataset = TranslationDataset(sentences, tokenizer)
dataloader = DataLoader(dataset, batch_size=2)

# 模型推理
model.eval()
translations = []
with torch.no_grad():
    for input_ids, attention_mask in dataloader:
        outputs = model(input_ids=input_ids, attention_mask=attention_mask)
        logits = outputs.logits
        predicted_tokens = torch.argmax(F.softmax(logits, dim=-1), dim=-1)
        for token_ids in predicted_tokens:
            translation = tokenizer.decode(token_ids, skip_special_tokens=True)
            translations.append(translation)

# 输出结果
print("Translations:")
for i, translation in enumerate(translations):
    print(f"Sentence {i + 1}: {translation}")
from transformers import XLMRobertaForSequenceClassification, XLMRobertaTokenizer, Trainer, TrainingArguments
from datasets import load_dataset, load_metric
import numpy as np
import torch
from torch.utils.data import DataLoader, WeightedRandomSampler
from torch.nn import CrossEntropyLoss

# 加载XLM-RoBERTa模型和分词器
model_name = "xlm-roberta-base"
model = XLMRobertaForSequenceClassification.from_pretrained(model_name, num_labels=3)  # 假设三分类任务
tokenizer = XLMRobertaTokenizer.from_pretrained(model_name)

# 加载多语言数据集
dataset = load_dataset("amazon_reviews_multi", "all_languages")
train_data = dataset['train']
test_data = dataset['test']

# 数据预处理:将文本转换为模型所需的输入格式
def preprocess_function(examples):
    return tokenizer(examples["review_body"], truncation=True, padding="max_length", max_length=128)

encoded_train_data = train_data.map(preprocess_function, batched=True)
encoded_test_data = test_data.map(preprocess_function, batched=True)

# 计算标签权重(基于类别不均衡性)
label_counts = train_data['stars'].value_counts()
total_labels = sum(label_counts.values())
class_weights = {label: total_labels / count for label, count in label_counts.items()}
weights = [class_weights[label] for label in train_data['stars']]
sampler = WeightedRandomSampler(weights=weights, num_samples=len(weights), replacement=True)

# 创建数据加载器
train_dataloader = DataLoader(encoded_train_data, sampler=sampler, batch_size=8)
test_dataloader = DataLoader(encoded_test_data, batch_size=8)

# 定义加权损失函数
class_weights_tensor = torch.tensor(list(class_weights.values()), dtype=torch.float)
loss_fn = CrossEntropyLoss(weight=class_weights_tensor)

# 自定义训练步骤以应用加权损失
def train(model, dataloader, optimizer, device):
    model.train()
    for batch in dataloader:
        optimizer.zero_grad()
        inputs = {k: v.to(device) for k, v in batch.items() if k in ["input_ids", "attention_mask"]}
        labels = batch["labels"].to(device)
        outputs = model(**inputs)
        loss = loss_fn(outputs.logits, labels)
        loss.backward()
        optimizer.step()

# 定义评估指标
accuracy_metric = load_metric("accuracy")

def compute_metrics(eval_pred):
    logits, labels = eval_pred
    predictions = np.argmax(logits, axis=-1)
    return accuracy_metric.compute(predictions=predictions, references=labels)

# 设置训练参数
training_args = TrainingArguments(
    output_dir="./results",
    evaluation_strategy="epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    num_train_epochs=3,
    weight_decay=0.01,
    logging_dir="./logs"
)

# 使用Trainer进行训练和评估
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=encoded_train_data,
    eval_dataset=encoded_test_data,
    compute_metrics=compute_metrics
)

# 进行训练
trainer.train()

# 评估模型
eval_results = trainer.evaluate()
print("Evaluation results:", eval_results)

三、总结

XLM-RoBERTa通过共享跨语言表示空间,为翻译任务提供了灵活的基础模型。虽然需额外设计解码逻辑,但其在少样本/零样本场景下的潜力使其成为研究热点。建议结合Hugging Face的Seq2SeqTrainer进行端到端微调,或探索提示工程与大模型结合的前沿方向。


网站公告

今日签到

点亮在社区的每一天
去签到