论文阅读:Memory Networks(Facebook. 2014)
一、Abstract
开篇点题——现有问题:传统的深度学习模型(RNN、LSTM、GRU等)使用hidden states或者Attention机制作为他们的记忆功能,但是这种方法产生的记忆太小了,无法精确记录一段话中所表达的全部内容,也就是在将输入编码成dense vectors的时候丢失了很多信息。
所以本文就提出了一种可读写的外部记忆模块,并将其和inference组件联合训练,最终得到一个可以被灵活操作的记忆模块。
二、Introduction
看一下其框架(QA)
首先来说,模型主要包含一系列的记忆单元(可以看成是一个数组,每个元素保存一句话的记忆)和I,G,O,R四个模块。结构图如下所示:
简单来说,就是输入的文本经过Input模块编码成向量,然后将其作为Generalization模块的输入,该模块根据输入的向量对memory进行读写操作,即对记忆进行更新。然后Output模块会根据Question(也会进过Input模块进行编码)对memory的内容进行权重处理,将记忆按照与Question的相关程度进行组合得到输出向量,最终Response模块根据输出向量编码生成一个自然语言的答案出来。
四个模块的功能
- I:将输入转换为特征表示,不同的应用有不同的方法。例如NLP中的词向量化等。
- G : 负责根据输入更新memory单元
- O: 负责根据输入获取memory单元的输出
- R: 将memory的输出转换为目标输出
所以,I、R算是memory的配套设施,G、O则是直接与memory交互。
重点来看一下G:
H(.)用来选择更新memory中的哪一个slot(插槽),这个过程类似于计算机中的寻址。
也就是说G只更新H(.)寻址到的slot,其他位置不变。这篇论文只实现了G将记忆插入slot中。
这篇论文中还提出了关于H(.)的一些其他设想,例如其可以进行记忆的重组和删除等,在该系列的后续论文中得到了实现。
OR部分的描述比较简洁,可以直观的理解为:
O读取记忆中的对应答案,R组织措辞进行最终回答。
三、具体例子
I:I输入的是一句话,简单地将I转换为一个频率的向量空间模型。
G:也是如上,简单地把读到的对话组里的每一句话的向量空间模型,插到记忆的list里,这里默认记忆插槽比对话组句子还多。
O:O干的事,就是输入一个问题x,将最合适的k个支撑记忆(the supporting memories,在下文的数据集里会举出例子),也就是top-k。做法就是把记忆数组遍历,挑出最大的值。最后,O返回一个长度为k的数组。
对于top1有
o
1
=
O
1
(
x
,
m
)
=
a
r
g
m
a
x
i
=
1
,
.
.
.
,
N
S
o
(
x
,
m
i
)
o1=O1(x,m)=argmax_{i=1,...,N}So(x,mi)
o1=O1(x,m)=argmaxi=1,...,NSo(x,mi)
对于top2有
o
2
=
O
2
(
x
,
m
)
=
a
r
g
m
a
x
i
=
1
,
.
.
.
,
N
S
o
(
[
x
,
m
o
1
]
,
m
i
)
o2=O2(x,m)=argmax_{i=1,...,N}So([x,mo1],mi)
o2=O2(x,m)=argmaxi=1,...,NSo([x,mo1],mi)
这里有几点说明:
1、在这里,返回的oi简单就是记忆数组的序号索引。
2、在这里(向量空间模型向量表示),有
S
o
(
[
x
,
m
o
1
]
,
m
i
)
=
S
o
(
x
,
m
i
)
+
S
o
(
m
o
1
,
m
i
)
So([x,mo1],mi)=So(x,mi)+So(mo1,mi)
So([x,mo1],mi)=So(x,mi)+So(mo1,mi)
也就是对于多事实的情况,可以分开同时计算其与记忆的“关联度”,然后加总。对于其他向量表示方式,则不一定有这样的线性关系。
也就是对于多事实的情况,可以分开同时计算其与记忆的“关联度”,然后加总。对于其他向量表示方式,则不一定有这样的线性关系。