欢迎光临散文网 会员登陆 & 注册

使用预训练模型自动续写文本的四种方法

2022-07-01 18:15 作者:深度之眼官方账号  | 我要投稿

作者:皮皮雷 来源:投稿

编辑:学姐

这篇文章以中文通用领域文本生成为例,介绍四种常用的模型调用方法。在中文文本生成领域,huggingface上主要有以下比较热门的pytorch-based预训练模型:

本文用到了其中的uer/gpt2-chinese-cluecorpussmall和hfl/chinese-xlnet-base,它们都是在通用领域文本上训练的。

但是要注意有些模型(如CPM-Generate共有26亿参数)模型文件较大,GPU有限的情况下可能会OOM。

依赖包:transformers 4

本文使用的例句来源于豆瓣爬下的部分书评。


方法1:transformers.pipline


简介:

直接调用transformers里面的pipline。

源码及参数选择参考:

https://huggingface.co/docs/transformers/v4.17.0/en/main_classes/pipelines#transformers.pipeline

缺点:不能以batch形式生成句子,不能并行,大规模调用的时候时间复杂度较高。

方法2:transformers中的TextGenerationPipeline类

源码及参数选择参考:

https://huggingface.co/docs/transformers/v4.17.0/en/main_classes/pipelines#transformers.TextGenerationPipeline

优点:相较方法1,可以设置batch size。

方法3:transformers通用方法,直接加载模型

源码及参数选择参考:

https://github.com/huggingface/transformers/blob/c4d4e8bdbd25d9463d41de6398940329c89b7fb6/src/transformers/generation_utils.py#L101

缺点:封装度较差,代码较为冗长。

优点:由于是transformers调用模型的通用写法,和其他模型(如bert)的调用方式相似,(如tokenizer的使用),可以举一反三。

方法4:Simple Transformers

简介:Simple Transformers基于HuggingFace的Transformers,对特定的NLP经典任务做了高度的封装。在参数的设置上也较为灵活,可以通过词典传入参数。模型的定义和训练过程非常直观,方便理解整个AI模型的流程,很适合NLP新手使用。

simple transformers 指南:

https://simpletransformers.ai/docs/language-generation-model/


优点:这个包集成了微调的代码,不仅可以直接做生成,进一步微调也非常方便。

缺点:有些中文模型不能直接输入huggingface上的模型名称进行自动下载,会报错找不到tokenizer文件,需要手动下载到本地。

$ pip install simpletransformers

下载中文生成模型到本地文件夹 models/chinese-xlnet-base

观察:用gpt2-chinese-cluecorpussmall生成的文本

参数设置:


注:每一段文字的开头(标蓝)是预先给定的prompt


PS:乍一看生成语句的流利度和自然度都较好,还挺像人话的;而且有些句子能够按照“书评”的方向写。但仔细看就会发现噪音较多,而且容易“自由发挥”而跑题。这就是自由文本生成的常见问题:因为过于自由而不可控。

那么如何将生成的文本限定在想要的格式或领域中呢?这就是可控文本生成的研究范围了。一个较为常见的做法是对GPT-2作增量训练,让模型熟悉当前的语境。


总结


本文列举和比较了四种使用pytorch调用生成式模型做文本生成的方式。分别是:

① transformers自带的pipline

② transformers中的TextGenerationPipeline类

③ transformers通用方法,直接加载模型

④ Simple Transformers


这些方法各有优缺点。如果需要后续微调,建议使用③或④。如果只是简单地体验生成效果,建议使用①和②,但是方法①不能以batch形式输入,速度较慢。


关注【学姐带你玩AI】公众号,参与活动赢奖励~


10个赞学姐的午饭就可以有个鸡腿🍗


使用预训练模型自动续写文本的四种方法的评论 (共 条)

分享到微博请遵守国家法律