专栏首页从流域到海域Deep Memory Network 深度记忆网络

Deep Memory Network 深度记忆网络

RNN解决长期依赖的能力随着文本长度的增加越来越差,attention机制是解决这种问题的一种思路,今天我们再来看另外一种思路,深度记忆网络。Deep Memory Network在QA和Aspect based Sentiment等NLP领域都有过成功的实践,但其提出者本身是以通用模型的形式提出的。

Introduce of Memory Network

Memory Network是一种新的可学习模型,它使用一个整合了长期记忆的一个组件(称为Memory)作为推断组件(inference components)来进行推理。长期记忆Memory可以被读和写,以实现预测的最终目的。原论文作者认为RNN的记忆问题(无法完成简单的复制任务,即将输入原样输出)也可以被Memory Network解决。它核心思想来自机器学习文献中成功应用的使用外置的可读写的记忆模块来进行推断。

Memory Networks

一个记忆网络是由一个记忆mmm(一个以mim_imi​作为索引的数组对象)和4个组件I,G,O,RI,G,O,RI,G,O,R组成。其中:

  • I:(input feature map) - 将输入转化为中间特征表示。
  • G:(Generalization) - 给定新输入的条件下更新旧记忆。原作者称之为泛化,因为网络在该阶段有机会将记忆压缩和泛化以供后面使用。
  • O:(Output feature map) - 给定新输入和当前记忆状态,产生一个新的输出(在特征表示空间上)。
  • R:(Response) - 将output(即O)转化到目标形式(例:一个文本的回复或者一个动作)
Memory Networks的处理过程

给定一个输入x(例:字符、词或者句子(视处理力度而定),图像或者声音信号),模型处理过程如下:

  1. 将x转化为中间特征表示I(x)I(x)I(x)。
  2. 使用新输入更新记忆mim_imi​: mi=G(mi,I(x),m),∀im_i=G(m_i, I(x), m), \forall imi​=G(mi​,I(x),m),∀i
  3. 使用新输入的中间特征表示和记忆计算输出特征ooo: o=O(I(x),m)o=O(I(x), m)o=O(I(x),m)
  4. 最后,解码输出特征到最终回复: r=R(o)r=R(o)r=R(o)

这个过程在训练和测试时都适用,两者之间的区别在于:测试时记忆也会被存储,但模型参数I,G,O,RI,G,O,RI,G,O,R将不会再更新。I,G,O,RI,G,O,RI,G,O,R可以使用现有任何机器学习的方法来实现(SVM, 决策树)。

组件III: III可以使用标准的预处理步骤来实现,比如输入文本的语法分析、指代消解、实体识别等。它同样也可以将输入编码到一个中间的特征表示(将文本转化为稀疏或者稠密的特征向量)。

组件GGG: 最简单的G的形式可以是将I(x)I(x)I(x)储存起来的槽位(slot): mH(x)=I(x)m_{H(x)}=I(x)mH(x)​=I(x) 其中H(x)H(x)H(x)是选择槽位的一个函数。即,GGG只更新m的索引H(x)H(x)H(x),其他索引下的记忆部分将保持不变。更复杂的GGG的实现还可以允许GGG去根据当前输入x得到的新证据去更新先前存储的记忆。如果输入是字符级别或者词级别的你也可以将其进行分组。

如果记忆非常庞大(假设要记忆整个Freebase或者Wikipedia),你可能不得不把记忆使用H(x)H(x)H(x)来组织起来。

如果记忆已经被填满。你也可以使用HHH来实现一种遗忘机制。

OOO和RRR组件:OOO组件被特别应用于读取记忆和执行推断,RRR组件则根据OOO的输出产生最终回复。例:在QA中,使用OOO查找相关的记忆,然后RRR生成文字来组成答案。RRR可以是RNN,视OOO的输出而定。这种设计基于的假设是,如果没有限定在这种记忆上,RNN会表现得相当差(事实上很多场景下确实如此)。

原论文给了一个QA的例子,但由于这个模型并没有广泛使用这里就不介绍了。我们转而介绍一种常用的端到端的记忆网络实现。

End-To-End Memory Network

端到端的记忆网络本质上也是一种RNN架构,但与RNN不同之处在于,在递归过程中会多次读取大型外部存储的记忆来输出一个符号。下面介绍的Memory Network可以有很多层,也易于反向传播,需要对网络的每一层进行监督训练。它以端到端的形式被应用于QA和Aspect Based Sentiment。

模型将一系列离散的输入xi,...,xnx_i,...,x_nxi​,...,xn​存储在记忆中,并接受一个查询qqq,输出回答aaa。模型会将所有的xxx写为记忆存储在一个固定大小的缓存中,然后寻求一个xxx和qqq的连续表示。该连续表示会被多跳处理以输出a。这使得错误信号能够在多级记忆中反向传播到输入。

Single Layer

整个模型是很多层堆起来的,我们先介绍单个层。

输入记忆表示(Input memory representation):假定我们被给定输入集x1,...,xix_1,...,x_ix1​,...,xi​存储在记忆中。整个输入集xi{x_i}xi​都会经由每个xix_ixi​所处的连续空间的嵌入(embedding)被转化为维度为ddd的记忆向量mi{m_i}mi​,最简单的实现方法可以使用一个嵌入矩阵A(d×V)A(d\times V)A(d×V),查询qqq也会被嵌入,可以用维度与AAA相同的嵌入矩阵BBB来得到一个中间状态uuu,在嵌入空间上,我们使用内积计算uuu和记忆mim_imi​的匹配程度,然后再softmax: pi=Softmax(uTmi) (1)p_i=Softmax(u^Tm_i) \ (1)pi​=Softmax(uTmi​) (1)

输出记忆表示(Output memory representation):每一个xix_ixi​都有一个相关的输出向量cic_ici​(最简单的情况下使用另外的嵌入矩阵CCC)。自记忆ooo产生的回复向量通过使用自输入产生的概率向量pip_ipi​与转化后的cic_ici​加权求和得到: o=∑ipicio=\sum_ip_ic_io=i∑​pi​ci​

产生最终预测:在单层的情况下,输出向量ooo的和输入嵌入uuu求和再乘上一个最终的权重矩阵WWW,然后经过softmax产生预测标签: a^=Softmax(W(o+u))\hat{a}=Softmax(W(o+u))a^=Softmax(W(o+u))

Multi Layers

模型可以扩展到处理K跳操作。记忆层是以如下方式进行堆积的:

  • 下一层的input由上一层的输出oko^kok和输入uku^kuk求和得来: uk+1=uk+oku^{k+1}=u^k+o^kuk+1=uk+ok
  • 每一层都有自己的嵌入矩阵Ak,CkA^k, C^kAk,Ck,本用于对输入xi{x_i}xi​进行嵌入。但是,这些矩阵被限制在易于训练并且能减少参数的数量的程度。
  • 在网络顶层,WWW对应的输入同样组合了输入和记忆层顶层的输出: a^=Softmax(WuK+1)=Softmax(W(oK+uK))\hat{a}=Softmax(Wu^{K+1})=Softmax(W(o^K+u^K))a^=Softmax(WuK+1)=Softmax(W(oK+uK))

原论文探索了两种类型的权重捆绑:

  1. 邻接(Adjacent):一个层输出的嵌入是下一层的输入,即:Ak+1=CKA^{k+1}=C^KAk+1=CK,作者同样也限制: (a)回答预测矩阵要和最终的输出嵌入相同,即:WT=CK{W^T=C^K}WT=CK。(b)问题嵌入和第一层的输入嵌入相同,即B=A1B=A^1B=A1
  2. 层级别(Layer-wise,类RNN):层与层之间共享输入个输出嵌入,即: A1=A2=...=AKA^1=A^2=...=A^KA1=A2=...=AK且C1=C2=...=CKC^1=C^2=...=C^KC1=C2=...=CK。作者发现在层间加上一个线性的映射函数HHH非常有用,即uk+1=Huk+oku^{k+1}=Hu^k+o^kuk+1=Huk+ok。H同样也是被学习的参数和其他参数一起更新。

在使用层级别权重捆绑的情况下,Deep Memory Network某种程度上退化到了RNN,这一点读者可以仔细体会一下。

参考文献

  1. MEMORY NETWORKS (ICLR 2015)
  2. End-To-End Memory Networks (NIPS 2015)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《Java程序设计基础》 第3章手记

    《Java程序设计基础》 第3章手记 本章主要内容: 1. 数据类型 2. 变量 3. 基本类型变量 4. 数据类型的转换规则 ...

    Steve Wang
  • Logistic Regression cost function and Maximum likehood estimate

    Ify=1:p(y∣x)=y′If y = 1: p(y|x) = y'Ify=1:p(y∣x)=y′ Ify=0:p(y∣x)=1−y′If y...

    Steve Wang
  • yolo.h5文件问题的解决 - 吴恩达深度学习:目标检测之YOLO算法

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

    Steve Wang
  • C语言 | 每日问答(96)

    阿一:在C语言里没有一个标准且可移植的方法。在标准中跟本就没有提及屏幕和 键盘的概念, 只有基于字符 “流” 的简单输入输出。在某个级别, 与键盘的交互输入一般...

    C语言入门到精通
  • 让深度学习帮你创作爵士乐

    数学与音乐有着内在的联系。 用算法作曲的历史,可以追溯到计算机科学出现的初期。翻译模型可以把一张图片转译为音乐。这都是基于规则的:如果图片里有一条水平的线,就会...

    AI研习社
  • 【系统】[CentOS]装完CentOS7重启提示Initial setup of CentOS Linux 7 (core)

    在用U盘装完CentOS后,重新开机启动后显示: Initial setup of CentOS Linux 7 (core) 1) [x] Creat...

    谙忆
  • 实用的top命令(r3笔记54天)

    对于系统级的监控来说,top命令是实用而高效的瑞士军刀。相比vmstat,sar来说提供的是实时的进程信息,对于监控性能,排查问题是很高效的。而且提供了交互式的...

    jeanron100
  • Python动态图见得多了?Excel:亦可赛艇!我可是身经百战了

    如今 Python 是个大热门,从基础数据处理,到高端人工智能,都有它的身影。而在数据分析领域,尤其是在可视化部分,Python 的各类绘图库也给用户带来了惊喜...

    朱小五
  • Elasticsearch UNASSIGNED索引分片问题分析

    线上突然有一台服务器宕机重启了,从而导致Elastisearch集群有些索引的分片出现UNASSIGNED的状态,情况如下:

    后场技术
  • node初

    www.nodejs.org 下载nodejs的安装文件, 然后就直接下一步,下一步,下一步傻瓜式安装 (打开命令符 widow+r 输入cmd) nod...

    河湾欢儿

扫码关注云+社区

领取腾讯云代金券