前面说了Memory-network的基础模型以及可以end to end的扩展形式.但是其模型还是有很多缺陷,比如只能处理简单的文本数据,无法适用于目前主流的一些QA文本资源,比如知识库和wiki文章.本篇文章说的Key-Value Memory-network就是解决这个问题的模型.
模型结构:
Key-value Memory-network的结构跟End-to-end Memory-network的结构大体相同,可以从结构图中看出,key,value模块分别对应着End-to-end中的Input memory和Output memory,而且作用也是一样的,Key和Input都是计算记忆memory对于问题question的相关程度(权重得分),而value和Output就是根据memory权重得分求出输出的答案信息.
这两个模型的主要区别是在于输入模块在数据处理上的不同,这也是Key-value Memory-network可以适用于KB和wiki数据文本资源的原因.End-to-end模型在数据处理上,只是简单的求出输入的Bow向量+位置向量作为记忆向量存储在memory slot中.而Key-value模型在求每个问题时会进行一个key hashing的预处理操作,从KB source里面选择出与之相关的记忆,然后在进行模型的训练。在这里,所有的记忆都被存储在Key-Value memory中,key负责寻址lookup,也就是对memory与Question的相关程度进行评分,而value则负责reading,也就是对记忆的值进行加权求和得到输出.下面看一下Key-value的详细过程:
1.Key Hashing:本人理解为就是信息检索(IR),从文本资源(KB,wiki)中检索出与问题相关的内容,比如实体信息或者wiki文章等.原论文中用到了倒排索引的方法,该过程可以在数据预处理中进行,然后在训练时将其作为输入喂到模型中.
2.Key Addressing:寻址,该过程实现的功能就是End-to-end中的Input memory的作用,也就是计算memory对于问题的相关程度评分,此处用到softmax函数.
3.Value Reading:就像上面介绍的一样,该过程相当于End-to-end中的Output memory作用,根据上一步得到的评分,对memory加权求和得到答案信息,
以上就是单层的Key-value Memory-network过程,而正常的模型都是多层叠加的,跟End-to-end相同.将输出向量o与输入问题的向量表示q相加,经过Ri矩阵进行映射,在作为下一层的输入,重复循环这个过程即可。
Key-value Memory-network的设计目的就是为了使Memory-network可以处理不同的数据集(先验知识),论文中也给出了处理不同数据集的方法:
1.KB Triple:KB知识库是一个三元组(主题-关系-对象)的结构,可以很容易的表示为Key-value形式,如将主题-关系认为是key,对象object是value.也要考虑到逆序的情况,也就是对象-关系-主题,所以论文中进行了double处理.“Blade Runner - directed_by - Ridley Scott” and“Ridley Scott - !directed_by - Blade Runner”
2.Sentence Level:先验知识是以句子方式存在的,这样形式数据的处理跟之前End-to-end方式一样,使用Bow向量存储为memory,在这里的key和value是相同的.
3.Window Level:将实体词作为中心词,视为value,以该词为中心取固定的窗口中的词作为key.
4.Window + Center Encoding:将字典double,使用第二个字典对窗口中心进行编码,这样能更精确的找到中心词。也会跟答案最相关。
5.Window + Title:仍然使用窗口的BoW表示作为key,但是使用wiki文章的标题title作为value,因为对于电影信息而言,文章标题往往就意味这电影名称,所以更贴近问题的答案。这里还会同时保持Center Encoding的方式同时作为value进行训练.
以上就是Key-Value Memory-Network的全部知识内容.
参考:
论文地址:Key-Value Memory Networks for Directly Reading Documents
https://zhuanlan.zhihu.com/p/30030487
https://blog.csdn.net/Irving_zhang/article/details/79174025