记忆网络之Hierarchical Memory Networks

来源:互联网 发布:手机炉石记牌器软件 编辑:程序博客网 时间:2024/05/21 15:55

记忆网络之Hierarchical Memory Networks

这是Bengio团队在2017年发表在ICLR上面的论文“hierarchical Memory Networks”,这篇论文的主要思想是使用分层结构的Memory,目的是在维持准确度的基础上实现训练速度的提升。因为当需要的记忆量很大时,对所有的记忆进行Attention操作,必然会及其浪费时间,而通过本文提出的Hierarchical Memory结构,可以加速选择相关记忆的速度。总结一下本文贡献就是,提出一种新的memory数据结构(基于聚类),和一种新的搜索方法(MIPS)来适应该结构进行评分计算。但是这两个东西都是他们之前的论文“clustering is efficient approximate maximum inner product search”提出的,只不过是用到Memory Networks中来。所以可以理解为是在数据结构层面的改进,而不是模型架构,和前面的论文不太一样。下面我们来看一下:

首先说一下两种用于memory选择的Attention的概念和区别:

  • soft Attention: 一般使用softmax对所有的memory计算得分,好处是可以方便的计算梯度并反向传播,缺点是当memory比较大时,计算量比较大。
  • hard Attention:仅一个或者几个相关的记忆被计算,优点是计算量小,缺点是非凸,无法使用反向传播进行计算,所以一般结合强化学习进行优化,比较复杂。

上面两种都有各自的优缺点,所以本文在此基础上提出了基于MIPS的Hierarchical Memory Networks,可以理解为介于两者之间的方法,一方面使用分层结构进行存储和寻址,相比soft Attention速度更快,而且仍然可以进行端到端的反向传播进行训练,比hard Attention简单。此外,本文主要是为了解决本专栏第三篇文章“记忆网络之open-domain QA 应用”中介绍的bordes的那篇论文“large-scale simple Question Answering with Memory Networks”,该paper中使用关键词匹配的方法获得一个问题的相关记忆子集,这是一种启发式的方法,相对而言不是这么智能,所以本文提出的方法就是为了解决这个问题,想要一种自动、端到端、快速的方法来寻找query相关的记忆子集并求其相关性得分。

说了这么多,那么我们接下来结合“clustering is efficient approximate maximum inner product search”这篇文章来看一下分层的MIPS(maximum inner product search)的方法。为了加速计算过程,通常有三种结构被用于组织数据:

  • Hashing-based:不依赖于具体数据。将memorys分成多个bins,然后只返回与query最相关的几个bins进行MIPS
  • Tree-based:依赖于数据。将memory保存在叶子节点上。这里有很多方案,在github上面也可以找到相应的实现方案。
    • ball tree:java实现https://github.com/saulvargas/BallTrees,python实现:https://github.com/gamboviol/miptree
    • cone tree:python实现:https://github.com/ZexinYan/MIP-Search
  • clustering-based:将memory分成多个相关的簇,并返回与query最相关的几个簇然后执行MIPS。C++实现:https://github.com/walkowiak/k-means-mips(也就是本文方法)

接下来我们叙述一下K-MIPS问题的数学描述:给定一个查询q和一个数据集x,选择出最相关的K个数据即可。其复杂度与x的大小成线性相关。可以表述为:

为了解决上面的问题,我们可以使用最近邻或者最大相似度搜索方法,但是上式中内积既不满足三角不等式,也不满足相似度函数的概念,所以没办法直接使用,我们首先要将K-MIPS转化为K-MCSS(maximum cosine similarity search)问题。K-MCSS问题表述如下所示:

通过上面两个公式的定义我们可以看出,当x的模相等时,MIPS就等价于MCCS,所以我们要做的就是转化x的模。所以使用P和Q两个函数分别对x和q进行映射,映射之后MIPS就转化为了MCCS:

接下来就是将数据分簇,按照其方向的相关度进行分。而分层是为了进一步加快速度和缩小簇的大小。可以参考下图:

总结一下起流程就是,将memory使用分层聚类的方法进行存储和排列,然后输入一个query时,先返回与q最相关的一个或者几个聚类,然后在这个自己上进行MIPS搜索,得到最相关的K个memory及其得分。但是该方法仍然存在两个最大的缺点和局限:

  1. 但是在刚开始训练的时候,很可能返回的几个聚类中并不包含目标答案,为了避免这个问题,使用超监督的方法,以确保所有的正确答案均在返回的几个聚类中。
  2. 训练过程中memory向量需要保持不变==也就是静态记忆。因为如果memory实时变化的话,MIPS搜索的效果会大幅度下降,导致无法搜到正确的相关性得分。看到这里时,其实我是懵比的,如果memory不变的话,我们怎么进行初始化呢??随机吗,这效果怎么保证呢,然后看了作者的实验设置才发现,其使用别人模型跑出来的memory作为初始值。所以这应该也是一个很大的缺点。

所以整体来讲,本篇论文所提出的模型还需要一段时间的发展和完善才能取得比较好的效果,目前来讲可能只是一个简单的版本。效果上来讲的话,也只是起到速度上的提升,而准确度并没有办法改善。