(2018年12月3日补充:第二篇不是论文,应该是斯坦福写的一个类似教程之类的东西,但是写的太像论文了(ˇˍˇ),我都搞混了 )
看名字就知道第一篇是原论文,第二篇是第一篇的实现。(这里必须吐槽一下,第一篇论文一个图都没有,让我这种看论文先看图的人瞬间丧失好感。第二篇就人性化的多,简单的一个模型架构图就能瞬间让人领悟许多。)
在第二篇论文里面的引言部分有一些比较精辟的话,我也摘录出来,不妨作为NLP的部分真理以供参考。
看下面这个图就很清楚,这个模型主要包括五个部分:Memory单元和I、G、O、R。
举个例子。假设有下面一段文字,针对文字可以提出几个问题,然后让模型去回答:
这里我们首先使用Input模块对文档进行编码,Generalization模块存储编码结果,然后使用Input对问题where is the milk now?进行编码,Output模块根据问题编码后的向量从Memory单元中选出最相关的一句话:Joe left the milk,然后再对剩下的记忆进行评分,找出与where is the milk now?和Joe left the milk最相关的memory。我们发现是Joe travelled to the office。这样我们就找到了最相关的记忆,接下来使用R模块对所有的单词进行评分找到得分最高的单词作为答案即可。
这是Facebook AI在Memory networks后的续作。上文记忆网络介绍模型并非端到端的QA训练,该论文End-To-End Memory Networks就在上文的基础上进行端到端的模型构建,减少生成答案时需要事实依据的监督项,在实际应用中应用意义更大。
End to end:一端输入我的原始数据,一端输出我想得到的结果。只关心输入和输出,中间的步骤全部都不管。
这一篇文章提到一个更加具体但是复杂一点的模型如上图所示。
模型主要的参数包括A,B,C,W四个矩阵,其中A,B,C三个矩阵就是embedding矩阵,主要是将输入文本和Question编码成词向量,W是最终的输出矩阵。从上图可以看出,对于输入的句子s分别会使用A和C进行编码得到Input和Output的记忆模块,Input用来跟Question编码得到的向量相乘得到每句话跟q的相关性,Output则与该相关性进行加权求和得到输出向量。然后再加上q并传入最终的输出层。
通过把每句话压缩成一个向量对应到memory中的一个slot(上图中的蓝色或者黄色竖条),将输入的文本转化成向量并保存在memory中(通过词向量得到句向量)。论文中提出了两种编码方式,BoW和位置编码:
输入模块把输入文本编码为向量,保存在Input和Output两个模块中,Input模块用于跟Question相互作用得到各个memory slot与问题的相关程度,使用Output模块的信息产生输出。
Response模块主要是根据输出向量o和问题向量q产生最终的答案。其结合o和q两个向量的和与W相乘在经过一个softmax函数产生各个单词是答案的概率,值最高的单词就是答案。并且使用交叉熵损失函数最为目标函数进行训练。
将多个单层模型进行stack在一块,结构图如下所示:
上面几层的输入就是下层o和u的和。至于各层的参数选择,论文中提出了两种方法(主要是为了减少参数量,如果每层参数都不同的话会导致参数很多难以训练)。
具体的公式如下:
论文中说NLP中很多任务都可以归结为QA问题,所以本文的DMN模型以QA为基础进行训练,但是可以扩展到很多别的任务中,包括序列标注、分类、翻译等等。