seq2seq预训练模型的使用

        在这篇文章中,我们以transformers库为例,来说明如何使用预训练模型来进行seq2seq任务的训练和预测。

0. Train from scratch

        虽然要讨论预训练模型,但还是应该知道没有预训练模型时应该如何从头开始训练模型。在没有预训练模型时,我们可以创建config.json文件,设置好模型的框架。

        然后通过下面两行代码来初始化模型:

        config = AutoConfig.from_pretrained(your_config_path)

        model = AutoModelForSeq2SeqLM.from_config(config)

      使用AutoModelForSeq2SeqLM而不是MBartForConditionalGeneration等,是因为后者没有from_config的方法,或者说后者把from_config的方法集成到了前者中。大家有兴趣可以读一下transformers的代码,看一下AutoModelForSeq2SeqLM可以包括哪些生成式模型。

1. MBart预训练模型

        我们以MBart的模型来讨论seq2seq预训练模型的使用,其他模型如t5等在结构上和MBart非常接近。

        Mbart模型比较大,en2many的模型大小为2.8G,由于使用了shard_embeds, 所有many2many模型,在主要结构参数一致的情况下,大小差不多。由于模型包含了多种语言,里面的词表大小约为25w,如果我们只考虑两个语种之间的翻译,或者只涉及一个语种的文本摘要任务,则大部分词和模型中对应的词向量我们是用不到的,因此可以考虑模型裁剪(主要是词表裁剪)。

1.1 词表和模型裁剪

        词表裁剪时,需要先根据已有的语料生成新的词表。再根据新的词表对tokenizer和模型中的tensor进行优化。

      在对tokenizer进行优化时,主要有两种方式,一种是建立新旧词表之间的对应关系,将tokenizer生成的旧的id通过映射关系,来得到新的id。另一种是检查tokenizer.json中的结构,重新构建所需token的id (tokenizer_dict[model][vocab])。

       之后就是对模型进行裁剪,找到模型中的词向量矩阵,source_embedding, target_embedding, shared_embedding等进行裁剪,还要注意和词表大小对应的bias的裁剪。一个比较保险的方法是加载模型后(torch.load(pytorch_model.bin)),查找某个维度包含原有词表大小的tensor及对应的名字,逐个检查是否需要裁剪。

        裁剪完成后注意修改config.json中的词表大小,及相关的token_id.裁剪完的词表大小约为5w,裁剪后的模型大小约为1.6G。

1.2 模型微调

        可以参考的代码如下,

        https://www.kaggle.com/ajax0564/mbart-finetuning-hintoenglish-translation

        设置training_args,然后通过trainer.train()方法进行微调。

1.3 模型预测

    Transformers的seq2seqLM模型提供了model.generate()方法来生成tokens,再通过tokenizer.batch_decode()方法将id转换为对应的token。

你可能感兴趣的:(深度学习,nlp)