首发于简单NLP
PPLM-可控文本生成

PPLM-可控文本生成

提到文本生成算法,GPT-2可谓让人眼前一亮,虽说GPT-2生成的文本从句式和内容上来说都接近人写出来的水平,但是它还存在一些问题,其中一点就是生成的内容不受限。没有办法人为的干预朝着自己想要的方向生成文本。

过去我是在语言模型的训练中解决控制语言模型的生成属性,比如针对散文,控制模型生成“励志”、“开心”、“难过”等属性,做法就是简单的在数据预处理的过程中,对每一个属性的属性文本前面加上各个属性的标识,这样在做文本生成的时候,想生成哪种属性,就在开头加上哪种属性的标签即可,这种方法也有效的控制了文本的生成,但是该方法是直接应用于模型预训练中,故也需要特别大的参数,并且扩展性比较差。而PPLM(即插即用的语言模型)就可以在一定程度上解决文本可控性和扩展性的问题。

如果使用PPLM,则首先需要一个预训练好的语言模型,该语言模型可以是GPT2或者是其它模型。有了该预训练模型之后,PPLM要做的就是对该模型生成的文本进行微调。微调的方法是基于条件概率p(x|a),即基于某个属性a,生成文本x。该条件概率公式可以展开为:

即要想得到基于属性a生成的文本x,我们首先可以通过已有的语言模型p(x)生成文本,然后再判断这个生成的文本属于哪一个属性p(a|x),判断的方法很多,比如我们可以训练一个分类器,通过分类器来判断该生成的文本属于哪一个属性。有了p(a|x)和p(x),我们就能获得p(x|a)。

下图是PPLM的某个时间段的流程:

总共分为三部分:

1、通过分类器预测语言模型生成的文本的属性分类p(a|x);

2、根据1中属性判别回传的梯度,更新语言模型内部历史参数,增加模型预测接近想要属性的可能性;

3、然后从更新后的参数中进行中心采样。生成新的词;

更新参数的过程在每个时间步都重复一次,从而逐步过渡到所需的属性。为了计算效率,可以选择只修改最近的过去的某个窗口内的延迟,即点红色区域。

因为论文中使用的是GPT-2模型,GPT-2是基于transformer的,所以历史 H 用的是每层 K 和 V 的值。

设∆Ht为对Ht的更新,这样(Ht +∆Ht)将改变生成的文本的分布,使其更有可能拥有所需的属性。∆Ht处初始化为0,并通过一个属性模型的梯度进行更新,该属性模型测量生成的文本包含所需属性的程度。我们将属性模型p(a|x)重写为p(a|Ht +∆Ht),然后对∆Ht进行基于梯度的更新如下:

其中α是步长,γ是标准化的缩放系数。这个更新步骤可以重复m次,通常取3-10。

随后,更新好的参数向前传播,生成下一个时间步的Ht+1和ot+1。

这就是PPLM的思想,但是如果单单这样做的话,会导致生成一些有问题的句子,比如说要生成正面的话,那么说不定会疯狂重复,“好好好好好”,如果使用词袋模型,也会疯狂重复词袋中的某些词。为了避免这种情况分发生,增加使得生成句子的通顺度,论文采用了Kullback–Leibler(KL) 散度和Post-norm Geometric Mean Fusion(后范数几何平均融合),具体的使用方法可以祥看论文。

论文中给出的属性判别器有两种方法:

1、词袋模型

词袋模型顾名思义就是对不同的属性总结出一批有代表性的关键词,比如对于体育这个属性可以总结出一批有代表性的关键词:篮球、足球、冠军、奥运会、亚运会、冬奥会等等。在PPLM进行训练的时候,会调整预训练语言模型参数来使得模型生成的结果中尽可能的包含这些词袋里边的关键词。

2、判别器模型

判别器模型则需要针对数据集训练一个分类器,训练好分类器后,针对预训练模型生成的文本进行判断属于哪个属性,然后调整参数,使得模型预测的文本更

偏向于想要的属性。

实验总结:

1、该模型为即插即用方法,因为是边训练边生成结果,相对来说效率较低。

2、gamma参数和kl散度参数对模型的影响较大,并且对于不同的输入都需要进行调参,才能有一个比较好的结果。

论文:

博客:

代码:


编辑于 2020-01-06 17:58