前言
最近刚好在看BAMnet这篇做KBQA的实验,顺带把记忆网络的几篇经典文章看了一下做一下总结。另外就是 Facebook 7月份刚上传的一篇用 memory 来改进 BERT 结构的文章 Large Memory Layers with Product Keys 在精度不降的前提下提高了 BERT 的效率,看来脸书是真的喜欢 Memory这个概念的运用拓展。
MemNN
MEMORY NETWORKS ICLR2015
记忆网络的提出主要是解决 RNN 的隐层无法保存长期记忆、能传达的记忆内容太少的问题。这里就引入了一种外部记忆模块就和 RAM 一样能保存大量历史信息,与一些读写模块一起组成了 Memory Network,如下图:
由图中可以看出一共有四个模块:
I: input feature map
把输入映射为向量G: generalization
使用新的输入数据更新记忆内容O: output
给定新的输入和现有的记忆状态,在特征空间里产生输出R: response
将输出转化为指定输出形式(自然语言)
具体来说,I模块是 embedding lookup,将原始文本转化为词向量,G模块将输入的向量存储在memory数组的下一个位置,不做其他操作,对老的记忆不做修改。O模块根据输入的问题向量在所有的记忆中选择出 topk 相关的记忆,具体选择方式为,先选记忆中最相关的memory:
o 1 = O 1 ( x , m ) = arg max i = 1 , … , N s O ( x , m i ) o_{1}=O_{1}(x, \mathbf{m})=\underset{i=1, \ldots, N}{\arg \max } s_{O}\left(x, \mathbf{m}_{i}\right) o1=O1(x,m)=i=1,…,NargmaxsO(x,mi)
其中目标函数是用 Bilinear Regression 来建模问题 q q q 和记忆 m m m 的相关程度:
s ( x , y ) = Φ x ( x ) ⊤ U ⊤ U Φ y ( y ) s(x, y)=\Phi_{x}(x)^{\top} U^{\top} U \Phi_{y}(y) s(x,y)=Φx(x)⊤U⊤UΦy(y)
接下来根据选择出的 o 1 o_1 o1 和输入 x x x 一起选择与他们两个最相关的记忆 o 2 o_2 o2:
o 2 = O 2 ( x , m ) = arg max i = 1 , … , N s O ( [ x , m o 1 ] , m i ) o_{2}=O_{2}(x, \mathbf{m})=\underset{i=1, \ldots, N}{\arg \max } s_{O}\left(\left[x, \mathbf{m}_{o_{1}}\right], \mathbf{m}_{i}\right) o2=O2(x,m)=i=1,…,NargmaxsO([x,mo1],mi)
然后一直迭代下去,就这样选择出于Question最相关的 topk 个 memory slot 。将其作为R模块的输入,用于生成最终的答案。其实这里也很简单就是使用与上面相同的评分函数计算所有候选词与R输入的相关性,得分最高的词语就作为正确答案输出即可:
r = argmax w ∈ W s R ( [ x , m o 1 , m o 2 ] , w ) r=\operatorname{argmax}_{w \in W} s_{R}\left(\left[x, \mathbf{m}_{o_{1}}, \mathbf{m}_{o_{2}}\right], w\right) r=argmaxw∈WsR([x,mo1,mo2],w)
如果数据集是输出一句话的,那么最后可以用RNNLM来生成带有回复信息的句子。
最后它定义的损失函数(margin ranking loss)如下,设 k = 2 k=2 k=2 :
∑ f ‾ ≠ m o 1 max ( 0 , γ − s O ( x , m o 1 ) + s O ( x , f ‾ ) ) + ∑ f ‾ ′ ≠ m o 2 max ( 0 , γ − s O ( [ x , m o 1 ] , m o 2 ] ) + s O ( [ x , m o 1 ] , f ‾ ′ ] ) ) + ∑ r ⃗ ≠ r max ( 0 , γ − s R ( [ x , m o 1 , m o 2 ] , r ) + s R ( [ x , m o 1 , m o 2 ] , r ‾ ] ) ) \begin{array}{c}{\sum_{\overline{f} \neq \mathbf{m}_{o_{1}}} \max \left(0, \gamma-s_{O}\left(x, \mathbf{m}_{o_{1}}\right)+s_{O}(x, \overline{f})\right)+} \\ {\sum_{\overline{f}^{\prime} \neq \mathbf{m}_{o_{2}}} \max \left(0, \gamma-s_{O}\left(\left[x, \mathbf{m}_{o_{1}}\right], \mathbf{m}_{o_{2}}\right]\right)+s_{O}\left(\left[x, \mathbf{m}_{o_{1}}\right], \overline{f}^{\prime}\right] ) )+} \\ {\sum_{\vec{r} \neq r} \max \left(0, \gamma-s_{R}\left(\left[x, \mathbf{m}_{o_{1}}, \mathbf{m}_{o_{2}}\right], r\right)+s_{R}\left(\left[x, \mathbf{m}_{o_{1}}, \mathbf{m}_{o_{2}}\right], \overline{r}\right]\right) )}\end{array} ∑f=mo1max(0,γ−sO(x,mo1)+sO(x,f))+∑f′=mo2max(0,γ−sO([x,mo1