Transformer实战------Transformer跨语言零样本学习
-
- [0. 前言](#0. 前言)
- [1. mT5](#1. mT5)
- [2. 实现零样本分类](#2. 实现零样本分类)
- 相关链接
0. 前言
我们已经学习了如何使用单语言模型进行零样本文本分类,使用 XLM-R 进行多语言和跨语言零样本分类与单语言模型使用的方法和代码类似,在本节中,我们将使用 mT5 模型实现跨语言零样本学习。
1. mT5
mT5 是一个大规模的多语言预训练语言模型,基于 Transformer 的编码器-解码器架构,与 T5 模型相同,不同之处在于,T5 是在英语上进行预训练的,而 mT5 则是在来自 mC4 (Multilingual Common Crawl) 的 101 种语言上进行训练的。mT5 在 XNLI (Cross-lingual Natural Language Inference) 数据集上经过微调的版本可以从 Hugging Face 库获取。
T5 模型及其变体 mT5 是完全的文本到文本模型,这意味着它们将为任何给定的任务生成文本,即使任务是分类或自然语言推理 (Natural Language Inference, NLI)。因此,使用该模型进行推理时,需要额外的步骤。
2. 实现零样本分类
(1) 首先,加载模型和分词器:
python
from torch.nn.functional import softmax
from transformers import MT5ForConditionalGeneration, MT5Tokenizer
model_name = "alan-turing-institute/mt5-large-finetuned-mnli-xtreme-xnli"
tokenizer = MT5Tokenizer.from_pretrained(model_name)
model = MT5ForConditionalGeneration.from_pretrained(model_name)
(2) 接下来,提供用于零样本分类的样本------一个句子和标签:
python
sequence_to_classify = "Wen werden Sie bei der nächsten Wahl wählen? "
candidate_labels = ["spor", "ekonomi", "politika"]
hypothesis_template = "Dieses Beispiel ist {}."
可以看到,句子本身是德语 ("Wen arden Sie bei der nächsten Wahl wählen?"),但是标签是土耳其语 ("spor","ekonomi","politika")。hypothesis_template 用德语表示:"Dieses Beispiel ist {}."。
(3) 接下来,设置用于推理时生成结果的标签标识符 (ID),包括蕴含 (entailment)、矛盾 (contradicts) 和中立 (neutral):
python
ENTAILS_LABEL = "▁0"
NEUTRAL_LABEL = "▁1"
CONTRADICTS_LABEL = "▁2"
label_inds = tokenizer.convert_tokens_to_ids([
ENTAILS_LABEL,
NEUTRAL_LABEL,
CONTRADICTS_LABEL])
(4) T5 模型通过前缀来识别它应该执行哪种任务。process_nli() 函数提供了 XNLI 前缀,并将前提和假设以正确的格式提供:
python
def process_nli(premise, hypothesis):
return f'xnli: premise: {premise} hypothesis: {hypothesis}'
(5) 为每个标签生成一个句子:
python
pairs = [(sequence_to_classify, hypothesis_template.format(label)) for label in candidate_labels]
seqs = [process_nli(premise=premise,
hypothesis=hypothesis)
for premise, hypothesis in pairs]
(6) 打印生成的序列:
python
print(seqs)
# ['xnli: premise: Wen werden Sie bei der nächsten Wahl wählen? hypothesis: Dieses Beispiel ist spor.', 'xnli: premise: Wen werden Sie bei der nächsten Wahl wählen? hypothesis: Dieses Beispiel ist ekonomi.', 'xnli: premise: Wen werden Sie bei der nächsten Wahl wählen? hypothesis: Dieses Beispiel ist politika.']
这些序列表示任务是 XNLI 编码的,前缀为 xnli:,前提 (premise) 句子是 "Wen arden Sie bei der nächsten Wahl wählen?",假设 (hypothesis) 句子是 "Dieses Beispiel ist spor.","Dieses Beispiel ist ekonomi." 或 "Dieses Beispiel ist politika."。
(7) 接下来,将这些序列分词,并将它们输入模型以生成相应的文本:
python
inputs = tokenizer.batch_encode_plus(seqs, return_tensors="pt", padding=True)
out = model.generate(**inputs, output_scores=True, return_dict_in_generate=True, num_beams=1)
(8) 生成的文本实际上会给出词汇表中每个词元的分数,我而我们关注的是蕴含、矛盾和中立的分数,使用它们的词元 ID 来获取这些分数:
python
scores = out.scores[0]
scores = scores[:, label_inds]
(9) 分数情况如下所示:
python
print(scores)
"""
tensor([[-0.9851, 2.2550, -0.0783],
[-5.1691, -0.7202, -2.5855],
[ 2.7442, 3.6727, 0.7169]])
"""
(10) 中立分数对于我们的目的并不重要,我们只需要比较矛盾与蕴含的分数。因此,可以仅获取这两项分数:
python
entailment_ind = 0
contradiction_ind = 2
entail_vs_contra_scores = scores[:, [entailment_ind, contradiction_ind]]
(11) 得到每个样本序列的分数后,应用 softmax 层来获得概率值:
python
entail_vs_contra_probas = softmax(entail_vs_contra_scores, dim=1)
(12) 查看概率值:
python
print(entail_vs_contra_probas)
(13) 通过选择这三个样本的蕴含分数并应用 softmax 层,比较它们的蕴含概率:
python
entail_scores = scores[:, entailment_ind]
entail_probas = softmax(entail_scores, dim=0)
(14) 查看概率值:
python
print(entail_probas)
# tensor([2.3438e-02, 3.5716e-04, 9.7620e-01])
(15) 结果表明,第三个序列的概率最高。为了更清楚地展示结果,可以使用以下代码:
python
print(dict(zip(candidate_labels, entail_probas.tolist())))
# {'spor': 0.023438215255737305, 'ekonomi': 0.00035715653211809695, 'politika': 0.9762045741081238}
整个过程可以总结如下:每个标签与前提一起输入到模型中,模型会为词汇表中的每个词元生成分数。我们使用这些分数来确定蕴含 (entailment) 标签的分数与矛盾 (contradiction) 标签的分数之间的差异。
相关链接
Transformer实战(1)------词嵌入技术详解
Transformer实战(2)------循环神经网络详解
Transformer实战(3)------从词袋模型到Transformer:NLP技术演进
Transformer实战(4)------从零开始构建Transformer
Transformer实战(5)------Hugging Face环境配置与应用详解
Transformer实战(6)------Transformer模型性能评估
Transformer实战(7)------datasets库核心功能解析
Transformer实战(8)------BERT模型详解与实现
Transformer实战(9)------Transformer分词算法详解
Transformer实战(10)------生成式语言模型 (Generative Language Model, GLM)
Transformer实战(11)------从零开始构建GPT模型
Transformer实战(12)------基于Transformer的文本到文本模型
Transformer实战(13)------从零开始训练GPT-2语言模型
Transformer实战(14)------微调Transformer语言模型用于文本分类
Transformer实战(15)------使用PyTorch微调Transformer语言模型
Transformer实战(16)------微调Transformer语言模型用于多类别文本分类
Transformer实战(17)------微调Transformer语言模型进行多标签文本分类
Transformer实战(18)------微调Transformer语言模型进行回归分析
Transformer实战(19)------微调Transformer语言模型进行词元分类
Transformer实战(20)------微调Transformer语言模型进行问答任务
Transformer实战(21)------文本表示(Text Representation)
Transformer实战(22)------使用FLAIR进行语义相似性评估
Transformer实战(23)------使用SBERT进行文本聚类与语义搜索
Transformer实战(24)------通过数据增强提升Transformer模型性能
Transformer实战(25)------自动超参数优化提升Transformer模型性能
Transformer实战(26)------通过领域适应提升Transformer模型性能
Transformer实战(27)------参数高效微调(Parameter Efficient Fine-Tuning,PEFT)
Transformer实战(28)------使用 LoRA 高效微调 FLAN-T5
Transformer实战(29)------大语言模型(Large Language Model,LLM)
Transformer实战(30)------Transformer注意力机制可视化
Transformer实战(31)------解释Transformer模型决策
Transformer实战(32)------Transformer模型压缩
Transformer实战(33)------高效自注意力机制
Transformer实战(34)------多语言和跨语言Transformer模型
Transformer实战(35)------跨语言相似性任务