Recurrent Entity Network笔记
Recurrent Entity Network笔记
- Recurrent Entity Network简称EntNet,最初在论文TRACKING THE WORLD STATE WITH RECURRENT ENTITY NETWORKS中提出,文中给出了lua+torch的代码地址。作者包括Facebook AI研究院的Mikael Henaff, Jason Weston(MemNN和MemN2N的作者)以及Yann LeCun.
1.Introduction
EntNet使用了动态长期记忆,因此可以用在语言理解任务,QA等。它跟NTM一样使用固定长度的memory,并且学习基于位置和内容的读写操作。不过它的更新可以多个memory并行处理。EntNet在bAbI数据集上取得了state-of-art的结果,并且是第一个解决了所有了bAbI-10k问题的模型,此外在大的数据集如Children’s Book Test上结果也很好。
简单来说,EntNet的每个memory cell由key和value组成,分别为
wi 和hi 。 每个cell都有一个关联的processor,即一个gated RNN,负责根据当前输入和过去的状态来更新状态。各个memory cell是独立的,因此EntNet可以看做是一系列共享权值的gated RNN。- 注意,在多层RNN中,每层的状态更新是通过前一时刻的状态和底层状态来决定的,所以层与层之间的状态是关联的,这与EntNet是不一样的。在另外一篇论文中给出了RelNet,在EntNet的基础上增加了参数
rij 给出每个两个memoryhi 和hj 的的关联程度,也取得了很好的结果。
2. Model
2.1 Input
- 输入是一个固定长度的向量,用来表示一个sentence。这个向量包含了embedding和position。t时刻的输出
st=∑fi⊙ei
其中fi 是需要学习的multiplicative mask, 使用这个mask的目的在于加入位置信息, 也可以用其他的position encoding的方法。每次输入时都使用相同的fi , 并同其他的参数一起学习。而ei 是单词的embedding表示。
2.2 Dynamic Memory
-
这一块是一个gated RNN。我们把隐含层的状态分为m块,即
hi,h2,...hm ,把这m个合为一个整体就是整个隐含层状态。m一般是5~20, 每个hi 有20~100个单元。t时刻输入
st 时,每个隐含层状态hj 通过st 和keywj 来更新,更新公式如下:gj←σ(sTthj+sTtwj) hj~←ϕ(Uhj+Vwj+Wst) hj←hj+gj⊙hj~ hj←hj∥hj∥
这里σ 表示sigmoid函数,gj 是门限,由wj 和hj 决定,前者表示与关键字的匹配程度,后者表示与memory 内容的匹配程度。了对第j个memory需要更新多少,hj~ 表示需要添加到已有的memory中的状态值,ϕ 可以是任意的**函数,代码里面使用的是PReLU. U,W,v都是需要学习的参数,并且所有的gated RNN共享这些参数。最后一步的归一化文中说是为了忘记之前的记忆,这个解释暂时还不太明白。 结构图如下:
2.3 Output
- 给定一个query向量q,输出的计算公式如下:
pj=Softmax(qThj) u=∑jpjhj y=Rϕ(q+Hu)
其中H和R是要学习的参数。整个模型可以通过反向传播进行学习
3.Experiment
Experiment主要在Synthetic World Model Task、bAbI Task和CHILDREN’S BOOK TEST (CBT)。
3.1 Synthetic World Model Task
- 这个任务很有意思,在一张10X10的网格上,随机初始化放置两个agent, 每个时间步t, 随机选择一个agent, 要么改变其方向(东南西北,概率相同),要么向前走几步(1~5,概率相同),经过固定时间T之后,问模型每个agent的位置(如果agent跑到网格外面了则这一步无效,重新采样使得agent能够在网格里面)。这要求模型必须根据T-2个supporting facts(剪掉的两个是初始化步骤,分别给出位置和方向)来更新memory。整个过程以文本的形式交给模型,由模型给出答案。步骤和结果如下图:
3.2 bAbI Task
在bAbI-10k Task上,模型使用了Adam算法,mini-batch = 32, 梯度的范数限定不超过40,
η=0.01 , 并且每25epochs学习速率减半直到200epoch为止。embedding维度d=100, m=20。PReLU的参数和encoding模块的参数初始化为1,其他所有参数初始化为服从(0, 0.1)的高斯分布。在bAbI上的结果如图所示:
但是在bAbI-1k上效果并不理想,见下图:
- 另外文中还给出了一个bAbI上的实验来显示模型最后的记忆有没有记住了每个实体对象的位置,详细情况见原文
Children’s Book Test
这个测试来自论文The goldilocks principle: Reading
children’s books with explicit memory representations, 模型需要连续阅读20个句子(来自childres’s books)记作S, 然后有21个含有空格的句子需要填空,记作Q, C包含10个候选单词,a是答案。一个example就记作(S,Q,C,a)。
- 在这个测试上的结果如下图
Conclusion
AI领域相关联的两个问题分别是对经过长期动态变化的世界的状态进行评估,以及根据部分的观测来预测未来的演进。EntNet在前者做了进了一步。
在bAbI-1k问题上的结果不好,需要进一步提高
EntNet除了用在文本处理上,还可以在其他的领域
[1]论文连接:https://arxiv.org/pdf/1612.03969.pdf
[2]代码:https://github.com/facebook/MemNN/tree/master/EntNet-babi
[3]Tensorflow实现:https://github.com/jimfleming/recurrent-entity-networks