动态记忆网络(DMN)
论文:Ask Me Anything: Dynamic Memory Networks for Natural Language Processing
1、概述
Question answering(QA)是一个复杂的自然语言处理任务,它需要杰出的文本理解力和推理能力。自然语言处理中不部分任务都可以归结为 QA 问题。例如机器翻译(这句话翻译成法语是什么?);序列标注问题(包括词性标注、命名实体识别等);情感分类等。动态神经网络(DMN)是一个统一的神经网络框架,可以用来处理输出的问题序列,形成语义与情景记忆,然后生成相应的答案。DMN 的整体流程就是输入数据(包括数据和问题),然后生成相应的记忆片段,最后解析生成回答。
2、动态神经网络结构
动态神经网络包含了5个模块:输入模块、语义记忆模块、问题模块、片段记忆模块、回答模块。具体的网络结构如下:

1)输入模块
输入模块可以看作一个函数的中间过程,而这个函数最终将返回一个向量表示。输入模块将它的中间值发送给片段记忆模块,片段记忆模块基于问题模块输入的问题和注意机制完成上述函数的计算。输入模块是一个循环神经网络,一般选用GRU,它的输入是词向量(可以通过Glove或者word2vec获得),通过给定的词向量去计算隐藏状态 $c_t$ 。其计算公式如下:
$ c_t = SEQ-MODEL(L[w_t^I], h_{t-1})$
其中 $L$ 是词嵌入矩阵,$w_t^I$ 是第 $t$ 个词的输入序列。
输入模块的输出序列是多个。在输入只有一个句子的情况下,输入模块输出 GRU 的所有隐藏状态。在输入是多个句子的情况下,我们将所有句子拼接,并在每个句子末尾插入句末标记, 每个句末标记的位置的隐藏状态作为输出。
2)语义记忆模块
在上面图中的语义记忆模块是Glove词向量,事实上就是用来生成词向量的模块,作为输入模块的输入。不过作者说在本工作总没有使用它。
3)问题模块
问题模块的模型和输入模块相同,并且共享输入模块中的网络结构和词嵌入权重。问题模块的主要作用是帮助片段记忆模块去提取输入模块中输入的信息。隐藏状态的计算公式和输入模块相同,但是输出的结果只有最后时刻的向量值。
4)片段记忆模块
片段记忆网络基于问题模块中的问题来检索出输入模块中的有用信息。然后推断这些信息生成一个最终的信息表示(也称为记忆),回答模块会基于这个信息表示生成回答。而且片段记忆模块允许多词输入信息,通过注意机制关注每次输入的不同信息。每个输入都会产生一个片段,最后将这些片段归结为记忆。这样我们的模块就可以由多个片段组成,注意机制会关注每个片段的重要信息。这样就行成了传递式推理,因为第一次输入后也许会发现我们需要更多的信息才能得到好的结果。
例如上图中的例子:
$ question\ :\ Where\ is\ the\ football?$
$ inpyt\ :\ John\ put\ down\ the\ football.$
通过上面的输入和并不能很好的解决问题,而且又引入了新的问题,因此需要进一步迭代无寻找关于 $John$ 的输入,正如上图中一个问题对应了三个输入一样。值得注意的是在第二次迭代时错误的给予了输入模块中句子2一些权重(0.3)。
片段记忆模块中的模型是GRU网络,在这里使用门函数作为注意机制,表达式如下:
$ g_t^i = G(c_t, m^{i-1}, q) $
在这里 $c_t$ 表示本次输入的值,$m^{i-1}$ 表示 $i-1$ pass时的值,$ q$ 表示问题向量。具体的门函数表达式如下:
$G(c, m, q) = \sigma(W^{(2)} tanh(W^{(1)}z(c,m,q) + b^{(1)}) + b^{(2)})$
隐藏层更新表达式:
$ h_t^i = g_t^iGRU(c_t, h_{t-1}^i) + (1-g_t^i)h_{t-1}^i$
第 $i $ 次pass的计算片段,为第 $i$ 个序列的隐藏层最后的输出值,其表达是如下:
$ e^i = h_{T_C}^i$
第 $i $ 次pass之后的记忆值,其计算公式如下:
$ m^i = GRU(e^i, m^{i-1})$
5)回答模块
回答模块也是一个GRU网络,从记忆中解码处代表答案的单词序列。回答模块中的网络可以看作是一对多的输入-输出结构。
初始化输入值:$a_0 = m$
$ t $ 时刻的值:$a_t = GRU([y_{t-1}, q], a_{t-1})$
输出值:$ y_t = softmax(W^{(a)};a_t)$
3、训练模型
模型的损失函数:回答序列的交叉熵。
最小化回答序列的交叉熵来训练模型。
动态记忆网络(DMN)的更多相关文章
- NLP教程(7) - 问答系统
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www.showmeai.tech/article-det ...
- 【深度学习Deep Learning】资料大全
最近在学深度学习相关的东西,在网上搜集到了一些不错的资料,现在汇总一下: Free Online Books by Yoshua Bengio, Ian Goodfellow and Aaron C ...
- 论文笔记:Learning Dynamic Memory Networks for Object Tracking
Learning Dynamic Memory Networks for Object Tracking ECCV 2018Updated on 2018-08-05 16:36:30 Paper: ...
- fastText、TextCNN、TextRNN……这里有一套NLP文本分类深度学习方法库供你选择
https://mp.weixin.qq.com/s/_xILvfEMx3URcB-5C8vfTw 这个库的目的是探索用深度学习进行NLP文本分类的方法. 它具有文本分类的各种基准模型,还支持多标签分 ...
- 斯坦福大学CS224d课程目录
https://www.zybuluo.com/hanxiaoyang/note/404582 Lecture 1:自然语言入门与次嵌入 1.1 Intro to NLP and Deep Learn ...
- NLP十大里程碑
NLP十大里程碑 2.1 里程碑一:1985复杂特征集 复杂特征集(complex feature set)又叫做多重属性(multiple features)描写.语言学里,这种描写方法最早出现在语 ...
- NLP项目
GitHub NLP项目:自然语言处理项目的相关干货整理 自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域.本文作者为自然语言处理NLP初学者整理了 ...
- NLP文本分类方法汇总
模型: FastText TextCNN TextRNN RCNN 分层注意网络(Hierarchical Attention Network) 具有注意的seq2seq模型(seq2seq with ...
- 一文看懂NLP神经网络发展历史中最重要的8个里程碑!
导读:这篇文章中作者尝试将 15 年的自然语言处理技术发展史浓缩为 8 个高度相关的里程碑事件,不过它有些偏向于选择与当前比较流行的神经网络技术相关的方向.我们需要关注的是,本文中介绍的许多神经网络模 ...
随机推荐
- JSP使用过滤器防止SQL注入
什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...
- webpack4 系列教程(十四):Clean Plugin and Watch Mode
作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十四):Clean Plugin and Watch Mode>原文地址.更欢迎 ...
- WPF Modern UI 主题更换原理
WPF Modern UI 主题更换原理 一 . 如何更换主题? 二 . 代码分析 代码路径 : FirstFloor.ModernUI.App / Content / SettingsAppeara ...
- JavaScript定时器实现的原理分析
原文链接:http://www.cnblogs.com/st-leslie/p/6082450.html 一.储备知识 在我们在项目中一般会遇见过这样的两种定时器,第一种是setTimeOut,第二种 ...
- 【资料】Mac OS X 10.9虚拟机镜像及tools
原文链接 http://bbs.itheima.com/thread-141793-1-1.html 1.首先解压文件,两个同时选中,右键进行解压. 2.打开虚拟机VMware workstation ...
- Android为TV端助力 MediaPlayer API大全已经方法详解(转载)
通过这张图,我们可以知道一个MediaPlayer对象有以下的状态: 1)当一个MediaPlayer对象被刚刚用new操作符创建或是调用了reset()方法后,它就处于Idle状态.当调用了rele ...
- listview reclyerview上下拉刷新
x写控件挺麻烦的,因为有很多细节要处理好,列表控件使用太频繁了,网上也各种自定义的方法,一般的listview自定义肯定会联想到加个头部,然后监听事件加动画,其实方式很多种,今天记录的方式是另外一种方 ...
- Android Studio Git 分支使用实践
新公司有些项目是用的 Git,以前公司都是 svn,为了练手 Git,我个人 APP 用到了,但是仅简单的 git pull/push 的使用,并未用到 Git 精髓,只有当项目中用到,才会紧迫去全面 ...
- 深入理解Java虚拟机05--虚拟机类加载机制
一.前言 我们一定心里有个疑问,我们那个多态是怎么回事?我们指定的一个接口,却可以等到运行时可以对应于不同的实现类.这是因为,Java有个特性就是依赖运行期动态加载和动态连接,这样实现了Java可以动 ...
- Centos7安装netstat及简单使用
Centos7默认不安装netstat组件,需要使用时需要自己安装. 1.查看当前机器net-tools包所在位置 2.安装net-tools包 3.使用netstat命令查看端口占用情况 4.查看指 ...