MEMORY NETWORK导读
出发点
常见的机器学习模型都缺少一种简单的方法来存储长程记忆,其潜在含义就是常见的模型的记忆能力并不强,并不能够保存大量的记忆。虽然存在着一些例如LSTM这样的模型能够记忆更多的前项信息,但是对于较长的时序数据来说,这显然是不够的。例如当试图对一段话进行encode时,在完成最终的encode后段首的信息往往很难保存下来,所以实际上并不能够很好的完成“记忆”的功能。所以在本文中,其中心思想是创建一个框架,使用该框架能够对长程记忆进行有效的存储及其他操作。
模型框架
该框架被分解成四个组件:$I, G, O, R$。
I (input feature map):将原始数据嵌入到一个向量空间中。例如对单个的词进行处理时可以使用embedding将词嵌入到向量空间中。
G (genetalization):先对向量进行计算,产生记忆(memory),再将记忆插入(更新已使用的或寻找尚未使用的)到记忆槽(slot)内。在寻找记忆槽的过程中可以使用$H(x)$函数作为选择记忆槽的标准。最简单的方法可以找寻一个空槽进行存放。当需要存储大量信息的时候,可以采用分类等方式减少每次插入时$H(x)$所导致的计算量。
O (output feature map):在给定的记忆状态下,产生一个匹配的输出。例如可以通过简单的读取最相关的一行记忆进行返回。
R (response):将返回的输出转化为所需要的形式。例如可以通过RNN产生一个新的序列。
在给定的输入$x$时候具体的流程如下:
1.将输入$x$嵌入到向量空间$I(x)$
2.更新某个记忆槽$m_i$使得:$m_i = G(m_i,I(x),m), \forall(i)$
3.根据新的输入$x$计算返回的输出:$o = O(I(x), m)$
4.最终对输出进行解码:$r = R(o)$
在训练和测试过程中都会对记忆槽进行更新,但在测试过程中不会对$I, G, O, R$中的参数进行更新。而记忆槽中的特征(产生)也可以利用其他的机器学习方法。
一个简单的例子
在得到形如下列的数据后,对每个句子和每个问题的回答进行embedding处理。通过输入
Joe went to the kitchen.
Fred went to the kitchen.
Joe picked up the milk.
Joe travelled to the office.
Joe left the milk.
Joe went to the bathroom.
Where is the milk now? A: office
Where is Joe? A: bathroom
Where was Joe before the office? A: kitchen
$I(x)$:对每一个句子和回答的单词进行embedding,得到一个代表句子或单词的向量。
$G(x)$:记忆槽选择函数$S(x)$(也就是上文中的$H(x)$)只简单的选择下一个空的记忆槽$N:m_N = x, N = N + 1$。
$O(x)$:模型的重点在于通过$O$函数在要求输出答案时对记忆槽中的数据进行选择,此时假设对每次的输出答案,我们要求返回$K = 2$个最匹配的记忆$o_1, o_2$,则将会通过选择函数$S_O$进行选择。
$$o_1 = O_1(x , m) = \mathop{\arg\max}{i=1,...,N}s_O(x, m_i)$$
$$o_2 = O_2(x , m) = \mathop{\arg\max}{i=1,...,N}s_O([x, m_{o_1}], m
_i)$$
$R(x)$:最终将得到的两个记忆$m_{o_1}, m_{o_2}$作为$R(x)$的输入选择最匹配的输出。
$$r = {\arg\max}{w\in W}s_R([x,m{o_1}, m_{o_2}], w)$$
上述公式中,选择函数$s$通过对输入值与现存记忆或词向量的进行打分来选择最终返回的值。
意义
一般我们使用LSTM或Attention机制来对长程记忆进行处理以保证当出现当前信息依赖于距离较远的信息时,模型能够对长程记忆有一个更好的处理。但是在MEMORY NETWORK中,通过上述的框架能够更准确的找出当前输出时所需要信息的位置以及具体的信息,并专注于少数个有效信息(相比于Attention机制)。但作为一个很粗糙的框架,只是提供了一个比较简单的用于存储数据的思路,后具体使用的过程中需要考虑例如大规模数据检索问题或检索信息量问题(也就是上述公式中的K应该如何选择)。