文章目录
大多基于神经网络的故事生成都是有提示的,比如看图写作、根据关键词写作、文章续写(通常是一句话,而且和前面看图写作及根据关键词写作不同的是,我们不关心系统生成的句子如何) ???存疑
4.1 看图写作
Storytelling Workshop在2018年举办了一场看图写作的比赛,根据五张有序图片生成一个故事。
而看图写作本身则是通过一张图片生成一段文本。比如
有趣的是,看图写作不是照搬了有监督image captioning
,因为在这里并没有刻意学习的数据对。
4.4.1 句子编码
Kiros在2015年提出了Skip-Thought Vectors的方法,它是一种通用的句子编码方法。其实Skip-thought
的想法和word2vec
是一致的。在一句话中,一个词与它的上下文存在某种语义联系,那么在一段话中,一个句子与其上下句也是存在某种语义联系的,skip-thought
的动机和word2vec
中的skip-gram
类似,是想通过一个句子预测出它上下文的句子,以此来训练得到句表示。
4.4.2 数据集
源数据使用的是COCO
数据集(用于image captioning
)。通过这个数据集学习得到image
和caption
对应的skip-thought
编码的映射。
目标文案数据使用的是Taylor Swift lyrics
。
4.4.3 模型训练
训练一个RNN-LM
,并用它将skip-thought
的向量解码成可读的文字。
4.4.4 参考链接
一种传统的句表示学习方法——Skip-Thought Vectors
4.2 根据关键词写作
在这个任务中,每一个故事都会给定几个简短的写作提示词。2018年,Fan等人整理了一份根据关键词写作的数据集并给出了一种基于层级结构的关键词故事生成方法。
简单说一下模型的改进:
- 该模型在seq2seq基础上使用了卷积结构,加速了模型训练预测过程;
- 使用了
gated multi-head multi-scale self-attention 注意力机制。
self-attention可以更好的学习长句子;使用
gate则可以更好的有选择的进行attention操作;
multi-head和
multi-scale`则是对不同粒度的信息(fine-grained和coarse-grained)使用不同的注意力机制 - 该模型是两个seq2seq模型的融合。第一个seq2seq模型是一个预训练模型,用于生成比较常见的词或符号。需要注意的是第一个LM的隐变量是第二个模型的输入,这使得模型可以更好的根据提示词进行文本生成。
这里简单说一下模型的效果:
- 生成的句子和提示词相关
- 句子也富有多样性,而不是无关痛痒的、没毛病但是没意义的句子
- 故事结构和情节也比较精彩
但是模型仍然存在很多问题:
- 大多数的句子都是描述性的、情景类描述,缺乏具体的事件或场面
- 当生成更长篇幅的故事时,主题并没有什么变化,就是缺乏更多新意(这是一致性问题)
4.3 故事生成任务中的挑战
基于神经网络的语言模型确实可以写出很多看似流畅的故事,但是这些故事大多存在冗余、空洞的问题。
语言模型是生成词序列,而故事生成需要的句子序列。
当我们将一个故事的时候,我们建模时需要考虑很多:
- 事件和他们之间的因果关系;
- 人物,他们的性格、背景、和其他人物之间的关系
- 叙事结构(前期铺垫、制造冲突推动情节发展到最后问题解决和故事收尾)
- 遵守一个好的写作原则:不要随便就写个东西,然后丢在一边没用了。
而上述这些实现起来是非常非常困难的。
4.4 event2event的故事生成
讲义给出的是Martins等人在2018年的一篇论文
本文研究的问题非常有趣,通过给定一系列的events、action和words,生成一个故事。本文的方法是先将输入处理成一个event序列,然后将离散的event序列转化成一系列连续的event,最后再将这些event生成一段故事。流程图如下:
文中对比了三类模型,其中第一行All Generalized Events & Generalized Sentence
是本文提出的模型。实验内容是,分别给出三个故事(《哈利波特与阿兹卡班的囚徒》、《猴岛传说》和《勇往直前》)的一句,让模型生成下面的一句
4.5 结构化故事生成
讲义中以Fan等人在2019年发表的一篇论文为例
这篇文章将故事生成拆成了若干任务,逐个击破。简单说,就是根据提示条件,先生成谓词和参数序列。然后,使用占位符实体(如ent0
)生成一个故事。最后,我们用特定的引用替换占位符。整个流程实例如下图所示。
模型结构上,作者用的是基于CNN的seq2seq模型,注意力机制什么的和他2018年的那篇论文一样
TODO具体的论文阅读