记忆网络之Hierarchical Memory Networks(架构分层)

记忆网络之Hierarchical Memory Networks(架构分层)

这是中科院去年发表的一篇论文“Hierarchical Memory Networks for Answer Selection on Unknown Words”。其仿真代码作者已经开源,是用Lasagne实现的。虽然和上一篇一样都叫做“Hierarchical Memory Networks”,但是却千差万别。上一篇主要是将memory以分层结构进行存储和搜索,以实现大规模记忆时可以加快计算速度。而本篇则是从模型结构上面进行分层构建,从sentence-level和word-level两个层面进行训练以达到准确度的提升和对unknown words的识别。

作者认为End-to-End MemNN仅从句子层面对输入进行编码会丢失一些细节信息,尤其是当答案是稀有词或者从未出现过的词时(答案肯定会在输入文本中,只不过作者说大部分工作中会把稀有词直接当做unknown对待。可是那是因为别人的答案并不是稀有词的前提下啊。而且究其根源最终的目标不过是从一段材料中找到一个答案而已。反正感觉有些牵强吧==)。所以作者提出HMN模型来解决这种问题,该模型首先使用sentence-level的memory作为推理模块找到输入memory中与问题的相关程度,然后使用k-max pooling选择出最相关的k个句子。接下来对所有句子中每个单词使用Bi-GRU进行word-level的建模,得到word-level的memory,然后对k个句子中的每个单词按照句子层面的输出进行Attention操作,得到最终单词层面的输出。最后将句子和单词的输出相加并进行联合训练即可。模型的架构图如下所示,接下来我们来看一下模型的细节部分:

首先句子层面的memory部分,与End-to-End MemNN完全相同,这里就不再赘述。

k-max pooling:将sentence-level memory最后一层计算出来的权重向量alpha作为句子重要性判断依据,使用k-max pooling操作取出最大的k个句子认为是与问题最相关的句子,然后对相应的单词进行Attention操作。

word-level Memory:首先对所有的输入使用Bi-GRU进行编码,得到每个单词对应的memory信息;接下来对k-max pooling选择出的k个句子所包含单词的记忆进行Attention操作,公式如下所示:

由于这里得到的结果是k个句子中所包含的单词对应的,所以需要进行一次转换,将其变成长度是V的向量,使用的方法就是补零。

最后将word-level和sentence-level的输出相加用于生成最终的答案。整个模型就是这样,之所以可以回答低频次的问题,我感觉主要是因为作者在选择出关键句子之后再次从单词层面上进行一次检索,而且返回结果中其他单词都直接补零,这样可能有助于选择正确答案的样子吧。

至于论文时用的数据集是作者新创建的,关于机票预订、酒店预订的数据集,包含中英文,而且句子都很短(就像bAbI一样),最终的实验结果就使用MemNN在该数据集上跑了一遍,效果自然不如HMN,对比如下所示:

最后作者又结合一个实际的例子进行了介绍,倒没有什么新鲜的,就是从直观的角度来介绍模型每一层的Attention都可以选择出正确的句子和单词。如下图所示:

你可能感兴趣的:(深度学习,QA,QA_对话机器人_机器阅读专题)