基于CPM的中文作文生成模型,引经据典、修辞手法,信手拈来

以前语言生成都是给一段或者标题,生成一段文字,没有想到可以这样使用,生成多段一篇文章,非常不错 。
在本文中,笔者将介绍CPM()模型,这是一个中文预训练生成模型,并且分享笔者训练的一个基于CPM的中文作文生成模型,包括模型权重、笔者爬取的26万篇中文作文语料,也将对模型和训练细节进行介绍 。
首先展示一下模型生成效果,下图中的样例均为模型生成,且未经过人为修改 。可以看到模型生成的作文总体上比较切题,也比较通顺,还能引经据典,使用修辞手法 。
项目地址:
论文标题:
CPM: A Large-scalePre-Model
01
模型简介
CPM()模型是北京智源人工智能研究院和清华大学发布的中文大规模预训练模型 。官方发布了三种规模的模型,参数量分别为109M、334M、2.6B,用户需申请与通过审核,方可下载模型权重 。笔者尝试了使用2.6B的模型进行生成,效果挺不错,不过由于参数量较大,需要较大的显存来加载模型 。
从CPM模型的论文介绍来看,这是一个对标的GPT-3的中文生成预训练模型,整体结构采用的GPT的结构,使用了100G的中文语料进行训练,本质上是一个中文的GPT2模型 。
以往的中文预训练模型中,往往采用字符粒度的词表,也就是一个字符作为token 。但是在中文中,词语往往由多个汉字构成,其中包含了丰富的语义信息,如果只使用汉字词表,将会损失这种语义的内在关联 。所以在CPM模型中,作者同时使用字符和词语来构造模型词表 。在代码中,作者使用来构造词表 。
在本项目之前,笔者也尝试过在中文生成任务中,使用字符粒度的词表,生成效果虽然也不错,但主观上来说,使用词语词表的生成效果会比字符词表更好 。
上图展示了GPT2模型的整体结构,它的结构与的大体相同 。输入由单词嵌入和位置嵌入两部分组成,模型主要是由掩膜多头注意力、层归一化、全连接层和残差连接等结构组成 。在训练的时候,掩膜矩阵为下三角矩阵,使用第n个位置的输出向量,预测第n+1个位置的单词 。第n个位置的输出向量包含了前n个单词的语义信息,本质上也就是根据前n个单词,预测第n+1个单词 。
【基于CPM的中文作文生成模型,引经据典、修辞手法,信手拈来】02
实验介绍

基于CPM的中文作文生成模型,引经据典、修辞手法,信手拈来

文章插图
模型配置
CPM官方代码库需要考虑大规模参数模型的训练和使用,所以需要安装较为复杂的环境依赖,使用上也相对较为复杂 。由于显卡资源有限,笔者使用GPT2+CPM词表实现了一个小版本的CPM模型,并且简化了模型的训练和使用过程 。
如果大家的显卡资源充足,可以尝试训练参数量更大的模型,不过按照笔者的经验,100M左右的参数量的模型已经能够获得不错的生成效果 。本项目中GPT2的模型参数配置如下:
n_ctx: 1024n_embd: 768n_head: 12n_layer: 12n_positions: 1024vocab_size: 30000
数据集
由于没有找到开源的大规模的作文数据集,所以笔者从网上爬取了26w篇中文作文,作为训练语料 。每一篇作文的格式如下:
对26w篇作文进行预处理时,使用大小为200的滑动窗口对文本进行截断,得到60w+长度为200的训练数据 。
训练细节和使用
对于每篇作文,取出标题与内容,将标题与内容按照"title[sep][eod]"的方式拼接起来,然后使用分词器对其进行分词,然后将分词转换成词表中的id 。最后使用大小为200,步长为200的滑动窗口对其进行截断,得到60w+条训练数据 。