如何使用拥抱面部转换器为翻译任务训练编码器-解码器模型?
Posted
技术标签:
【中文标题】如何使用拥抱面部转换器为翻译任务训练编码器-解码器模型?【英文标题】:How do I train a encoder-decoder model for a translation task using hugging face transformers? 【发布时间】:2020-10-08 07:47:06 【问题描述】:我想为翻译任务训练如下配置的编码器解码器模型。有人可以指导我如何为这样的模型设置训练管道吗?任何链接或代码 sn-ps 将不胜感激。
from transformers import BertConfig, EncoderDecoderConfig, EncoderDecoderModel
# Initializing a BERT bert-base-uncased style configuration
config_encoder = BertConfig()
config_decoder = BertConfig()
config = EncoderDecoderConfig.from_encoder_decoder_configs(config_encoder, config_decoder)
# Initializing a Bert2Bert model from the bert-base-uncased style configurations
model = EncoderDecoderModel(config=config)
【问题讨论】:
你找到关于这个主题的任何东西了吗? 【参考方案1】:编码器-解码器模型的使用与 Transformers 中的任何其他模型相同。它接受成批的标记化文本作为词汇索引(即,您需要一个适合您的序列到序列任务的标记器)。当您向模型提供输入 (input_ids
) 和所需的输出 (decoder_input_ids
和 labels
) 时,您将获得可以在训练期间优化的损失值。请注意,如果批处理中的句子长度不同,您也需要进行屏蔽。这是EncoderDecoderModel
文档的最小示例:
from transformers import EncoderDecoderModel, BertTokenizer
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = EncoderDecoderModel.from_encoder_decoder_pretrained(
'bert-base-uncased', 'bert-base-uncased')
input_ids = torch.tensor(
tokenizer.encode("Hello, my dog is cute", add_special_tokens=True)).unsqueeze(0)
outputs = model(
input_ids=input_ids, decoder_input_ids=input_ids, labels=input_ids,
return_dict=True)
loss = outputs.loss
如果您不想自己编写训练循环,可以使用 Transformers 的数据集处理 (DataCollatorForSeq2Seq
) 和训练 (Seq2SeqTrainer
) 实用程序。你可以关注Seq2Seq example on GitHub。
【讨论】:
能否更新 Github 上示例的链接?它不工作以上是关于如何使用拥抱面部转换器为翻译任务训练编码器-解码器模型?的主要内容,如果未能解决你的问题,请参考以下文章
令牌索引序列长度大于此模型的指定最大序列长度 (651 > 512),具有拥抱面部情感分类器
CLIP模型的使用和训练-利用CLIP实现zero-shot的分类任务
基于 BERT 的 CNN - 卷积和 Maxpooling