中文诗歌生成论文学习笔记

在CSLT实习的第一个任务是阅读三篇论文,内容主要是讨论中文诗歌生成,分别为:

  1. Chinese Song Iambics Generation with Neural Attention-based Model
  2. Can Machine Generate Traditional Chinese Poetry? A Feigenbaum Test
  3. Flexible and Creative Chinese Poetry Generation Using Neural Memory

第一篇是讲注意力机制的诗歌生成模型,主要用于元曲生成;第二篇将模型应用到唐诗绝句上,做了一些改动;第三篇针对注意力机制模型在生成诗歌时创新性不足的问题,对模型结构进行了改进,加入了记忆机制。整理了阅读论文后记录的笔记,供参考。

Chinese Song Iambics Generation with Neural Attention-based Model

提出:利用注意力机制的seq2seq模型生成宋词,encoder部分是双向LSTM,decoder部分是另外一个LSTM。

诗歌的三个约束(dancing in fetters):

  • Structural pattern 控制行数以及每行的字数
  • Rhythmical pattern 控制某几行的最后一个字有同样的元音
  • Tonal pattern 要求特定位置的字有特定的平仄声

这三个约束重要性降序排列;除此之外,还需要有语义上以及情感特征上的一致性。宋词比起其他形式的文学作品,更加flexible。第一,比唐诗更长,不好控制主题;第二,约束比较复杂多样,不容易学习;第三,流传至今的样本有限。

诗歌生成的老方法:基于规则和模板、基于各种遗传算法、统计机器翻译(SMT,给出各个part的每种可能翻译,然后选取概率最大的最可能出现的)、从现有诗歌中拼凑总结。

怎样提升模型:首先,用双向LSTM做输入;其次,pretrain word embedding matrix,解决注意力模型中data sparsity的问题;Hybrid-tune Training,将tune有关的内容加在背景向量中,告诉模型正在用的是什么tune。

Can Machine Generate Traditional Chinese Poetry? A Feigenbaum Test

本篇仍是注意力机制的RNN模型,输入主题关键词输出相应主题的诗。应用于唐诗绝句。
Quatrain:唐诗绝句,四行诗,五言或七言;第二行和第四行的最后一个字押韵;平仄要求。因为唐诗比较严格,所以很难写(咋跟上一篇说元曲的时候矛盾了呢…)

比起之前一个论文的模型更简单,所以应用更广,可以应用到Sonnet and Haiku,十四行诗和俳句。之前元曲的模型应用到绝句时出现了很大问题。做了一些修改:通过关键词而不是第一局来生成诗句;single-word注意机制,用来提升对关键词的敏感度;loop generation方法,提升模型的流畅连贯和前后一致性。

该模型中encoder部分是双向gru,decoder部分也是gru。Gru和lstm区别:

  1. GRU和LSTM的性能在很多任务上不分伯仲。
  2. GRU 参数更少因此更容易收敛,但是数据集很大的情况下,LSTM表达性能更好。
  3. 从结构上来说,GRU只有两个门(update和reset),LSTM有三个门(forget,input,output),GRU直接将hidden state 传给下一个单元,而LSTM则用memory cell 把hidden state 包装起来。

目标函数为交叉熵(decoder生成的和ground truth之间的交叉熵),为了加速训练采用Minibatch stochastic gradient descent (SGD)算法,每句话都会重新计算梯度,采用AdaDelta算法调整learning rate。在训练阶段没有关键词的输入,所以用第一行作为输入来生成整句诗。

但是基础模型效果不好,原因是诗歌的感情各不相同,导致各自的训练数据都不够;还有就是在生成的最后阶段,即使有注意力机制,主题还是会变得模棱两可。关于模型改进:

  1. Character Vector Initialization:诗歌各自比较独特,直接训练模型会有data sparsity的问题,于是先用外部语料库学习每个字的语义表达,在用这些预训练过的表达去训练注意力模型。在实际中,先用word2vec将原字生成字向量,再用字向量来初始化word embedding matrix。
  2. Input Reconstruction:诗歌表达感情的方式比较隐晦含蓄,不好学习,导致生成的时候会跑题(theme drift),于是在根据句1生成234句后,再强制生成第1句,这样便于模型记住第一句,不会跑题。
  3. Input Vector Attention:隐含层表达的是综合后的语义,所以主题往往比较global,而不能根据各个关键词生成diverse的诗歌。于是采用多注意力机制,既关注隐含层也关注输入的字向量,这样accumulated和individual的语义都会被考虑到。关键词越多,生成的诗歌越惊艳。
  4. Hybrid-style Training:用杂交方式用同一个模型训练两种绝句(五言和七言),用一个type indicator来区分。这个indicator是一个200x200的随机矩阵的特征向量,每首诗都被分配了一个唯一的特征向量,输入到decoder的第一个隐含层,在训练过程中作为常量。

Flexible and Creative Chinese Poetry Generation Using Neural Memory

诗歌除了要遵循抽象的规则,还应该有美学上的创新。提出一个memory-augmented neural model。原问题出在只有rule-based reasoning(neural model), 没有instance-based memory。在模型基础上加上neural memory,这样特殊实例就能被saved and referred to。这个灵感来自neural Turing machine,但无需训练。

在memory augmentation的机制中,除了原本的neural model component,还有memory component。后者由从输入到输出的映射组成,记录特定例子。这里memory部分也可以看成是一种对neural model的regularization。Neural model部分,encoder用的是双向rnn(with gru units)。