以前语言生成都是给一段或者标题,生成一段文字,没有想到可以这样使用,生成多段一篇文章,非常不错。

在本文中,笔者将介绍CPM(Chinese Pretrained Models)模型,这是一个中文预训练生成模型,并且分享笔者训练的一个基于CPM的中文作文生成模型,包括模型权重、笔者爬取的26万篇中文作文语料,也将对模型和训练细节进行介绍。

首先展示一下模型生成效果,下图中的样例均为模型生成,且未经过人为修改。可以看到模型生成的作文总体上比较切题,也比较通顺,还能引经据典,使用修辞手法。

生成aeskey 256_深度学习

项目地址:

https://github.com/yangjianxin1/CPM

论文标题:

CPM: A Large-scale Generative Chinese Pre-trained Language Model

01

模型简介

CPM(Chinese Pretrained Models)模型是北京智源人工智能研究院和清华大学发布的中文大规模预训练模型。官方发布了三种规模的模型,参数量分别为109M、334M、2.6B,用户需申请与通过审核,方可下载模型权重。笔者尝试了使用2.6B的模型进行生成,效果挺不错,不过由于参数量较大,需要较大的显存来加载模型。

从CPM模型的论文介绍来看,这是一个对标OpenAI的GPT-3的中文生成预训练模型,整体结构采用的GPT的结构,使用了100G的中文语料进行训练,本质上是一个中文的GPT2模型。

以往的中文预训练模型中,往往采用字符粒度的词表,也就是一个字符作为token。但是在中文中,词语往往由多个汉字构成,其中包含了丰富的语义信息,如果只使用汉字词表,将会损失这种语义的内在关联。所以在CPM模型中,作者同时使用字符和词语来构造模型词表。在代码中,作者使用SentencePiece来构造词表。

在本项目之前,笔者也尝试过在中文生成任务中,使用字符粒度的词表,生成效果虽然也不错,但主观上来说,使用词语词表的生成效果会比字符词表更好。

生成aeskey 256_自然语言处理_02

上图展示了GPT2模型的整体结构,它的结构与Transformer的Decoder大体相同。输入由单词嵌入和位置嵌入两部分组成,模型主要是由掩膜多头注意力、层归一化、全连接层和残差连接等结构组成。在训练的时候,掩膜矩阵为下三角矩阵,使用第n个位置的输出向量,预测第n+1个位置的单词。第n个位置的输出向量包含了前n个单词的语义信息,本质上也就是根据前n个单词,预测第n+1个单词。

02

实验介绍

模型配置

CPM官方代码库需要考虑大规模参数模型的训练和使用,所以需要安装较为复杂的环境依赖,使用上也相对较为复杂。由于显卡资源有限,笔者使用GPT2+CPM词表实现了一个小版本的CPM模型,并且简化了模型的训练和使用过程。

如果大家的显卡资源充足,可以尝试训练参数量更大的模型,不过按照笔者的经验,100M左右的参数量的模型已经能够获得不错的生成效果。本项目中GPT2的模型参数配置如下:

n_ctx: 1024
n_embd: 768
n_head: 12
n_layer: 12
n_positions: 1024
vocab_size: 30000

数据集

由于没有找到开源的大规模的作文数据集,所以笔者从网上爬取了26w篇中文作文,作为训练语料。每一篇作文的格式如下:

生成aeskey 256_生成模型_03

对26w篇作文进行预处理时,使用大小为200的滑动窗口对文本进行截断,得到60w+长度为200的训练数据。

训练细节和使用

对于每篇作文,取出标题与内容,将标题与内容按照"title[sep]content[eod]"的方式拼接起来,然后使用分词器对其进行分词,然后将分词转换成词表中的id。最后使用大小为200,步长为200的滑动窗口对其进行截断,得到60w+条训练数据。

笔者使用了三张GTX 1080Ti对模型并行训练,batch_size为50,模型输入长度为200。三张显卡的显存满载,训练一轮大约需要3个小时,一共训练了40轮,loss降到2.1左右,单词预测准确率大约为54%。

在生成阶段,根据输入的标题和上文,在每一步中,模型输出下一个位置的单词概率分布,然后使用topk采样或者topp采样(核采样)生成下一个位置的单词。

如果读者拥有充足的显卡资源,可以尝试训练更大规模的模型,并且把输入的长度调到1024,这样能够提升模型的生成效果。

GPT2是一个生成模型,本质上是在学习单词之间的概率依赖关系,读者也可以使用各种数据集来训练模型,得到不同的生成模型,例如作文、小说、新闻、古诗等。

03

生成效果

生成样例1

title:家乡的四季

context:家乡的四季,最美不过了

生成aeskey 256_人工智能_04

生成aeskey 256_人工智能_05

生成样例2

title: 徜徉在书籍的阳光世界

context: 一本书是一个人的眼睛,它可以让你看到另一个世界的奇妙

生成aeskey 256_生成aeskey 256_06

生成aeskey 256_自然语言处理_07

生成样例3

title: 我最敬佩的一个人

context:在我的生活中,有外冷内热的妈妈,有拼命工作的爸爸

生成aeskey 256_生成aeskey 256_08

生成aeskey 256_生成模型_09

04

结语

本文介绍了CPM模型,并且分享了笔者训练的一个作文生成模型,以及训练细节,整体生成效果还不错。对于中文生成任务,从笔者的实践经验来说,笔者主观上觉得词语词表的效果会比字符词表的效果更佳。