使用預訓練模型自動續(xù)寫文本的四種方法
作者:皮皮雷 來源:投稿
編輯:學姐
這篇文章以中文通用領域文本生成為例,介紹四種常用的模型調用方法。在中文文本生成領域,huggingface上主要有以下比較熱門的pytorch-based預訓練模型:

本文用到了其中的uer/gpt2-chinese-cluecorpussmall和hfl/chinese-xlnet-base,它們都是在通用領域文本上訓練的。
但是要注意有些模型(如CPM-Generate共有26億參數(shù))模型文件較大,GPU有限的情況下可能會OOM。
依賴包:transformers 4
本文使用的例句來源于豆瓣爬下的部分書評。
方法1:transformers.pipline
簡介:
直接調用transformers里面的pipline。
源碼及參數(shù)選擇參考:
https://huggingface.co/docs/transformers/v4.17.0/en/main_classes/pipelines#transformers.pipeline
缺點:不能以batch形式生成句子,不能并行,大規(guī)模調用的時候時間復雜度較高。
方法2:transformers中的TextGenerationPipeline類
源碼及參數(shù)選擇參考:
https://huggingface.co/docs/transformers/v4.17.0/en/main_classes/pipelines#transformers.TextGenerationPipeline
優(yōu)點:相較方法1,可以設置batch size。
方法3:transformers通用方法,直接加載模型
源碼及參數(shù)選擇參考:
https://github.com/huggingface/transformers/blob/c4d4e8bdbd25d9463d41de6398940329c89b7fb6/src/transformers/generation_utils.py#L101
缺點:封裝度較差,代碼較為冗長。
優(yōu)點:由于是transformers調用模型的通用寫法,和其他模型(如bert)的調用方式相似,(如tokenizer的使用),可以舉一反三。
方法4:Simple Transformers
簡介:Simple Transformers基于HuggingFace的Transformers,對特定的NLP經(jīng)典任務做了高度的封裝。在參數(shù)的設置上也較為靈活,可以通過詞典傳入?yún)?shù)。模型的定義和訓練過程非常直觀,方便理解整個AI模型的流程,很適合NLP新手使用。
simple transformers 指南:
https://simpletransformers.ai/docs/language-generation-model/
優(yōu)點:這個包集成了微調的代碼,不僅可以直接做生成,進一步微調也非常方便。
缺點:有些中文模型不能直接輸入huggingface上的模型名稱進行自動下載,會報錯找不到tokenizer文件,需要手動下載到本地。
$ pip install simpletransformers
下載中文生成模型到本地文件夾?models/chinese-xlnet-base

觀察:用gpt2-chinese-cluecorpussmall生成的文本
參數(shù)設置:
注:每一段文字的開頭(標藍)是預先給定的prompt

PS:乍一看生成語句的流利度和自然度都較好,還挺像人話的;而且有些句子能夠按照“書評”的方向寫。但仔細看就會發(fā)現(xiàn)噪音較多,而且容易“自由發(fā)揮”而跑題。這就是自由文本生成的常見問題:因為過于自由而不可控。
那么如何將生成的文本限定在想要的格式或領域中呢?這就是可控文本生成的研究范圍了。一個較為常見的做法是對GPT-2作增量訓練,讓模型熟悉當前的語境。
總結
本文列舉和比較了四種使用pytorch調用生成式模型做文本生成的方式。分別是:
① transformers自帶的pipline
② transformers中的TextGenerationPipeline類
③ transformers通用方法,直接加載模型
④ Simple Transformers
這些方法各有優(yōu)缺點。如果需要后續(xù)微調,建議使用③或④。如果只是簡單地體驗生成效果,建議使用①和②,但是方法①不能以batch形式輸入,速度較慢。
關注【學姐帶你玩AI】公眾號,參與活動贏獎勵~
10個贊學姐的午飯就可以有個雞腿??