QA: Dynamic Memory Networks for Natural Language Processing
来源:互联网 发布:柠檬网络电视 | 柠檬tv 编辑:程序博客网 时间:2024/05/18 02:36
摘要
我们提出一种动态内存网络(DMN)的方式,来解决,输入多个描述句子和问题来生成答案的这种场景。
简介
Question answering (QA):根据上下文(文本,图片等),结合问题(question), 来生成答案
dynamic memory network (DMN):它是一种网络结构,处理的是(context_input-querstion-answer)这样的三元组。
inputs: 提前需要记住的上下文输入
querstion: 问题
answer: 输出

网络框架
DMN的目标是: 先将输入的inputs encoding 成一个向量,然后这个向量结合question 来生成answer
各个模块的介绍:
Input Module:
处理的是这个问题的上下文输入,比如一段话,一个图片,视频等。然后将这个原始信息encoding 成一个向量。
Semantic Memory Module:
这个模块存储的是通用的语义内容,比如知识图谱,词向量等
Question Module:
这个模块将原始的文本问题通过计算后生成向量,然后这些向量触发episodic memory module开始迭代计算
episodic memory module:
DMN的核心,这个模块根据问题,从输入模块中选取相关的信息,然后开始迭代,生成一个表示
Answer Module:
将episodic memory module输出的表示生成答案

详细介绍:
Input Module
后续我们称每一个输入的上下文是一个fact,我们的目标是对facts进行encodding 生成一个向量。
我们先不考虑图片的问题
输入是一段话:
TI=(wI1,wI2,,...,wITI) TI 是对fact的词个数,那我们直接将这个序列输入一个序列模型,
比如(LSTM,GRU)等,会得到一个状态向量ct
它的shape是:
[batch_size, sentence_count, word_dim] = [batch大小,词的个数,词向量的长度]c_t, _ = tf.nn.dynamic_rnn(gru_cell, input, T_I, dtype=tf.float32)
输入的是n句话:
facts=(fact1,fact2,...,factF) facti=(wi1,wi2,...,wiL) 其中F是input的输入句子数量,L是每个句子最长的值,我们将facts写成矩阵的形式
他的shape是:
[batch_size, fact_count, sentence_count, word_dim] = [batch大小,fact个数,词的个数,词向量的长度]这里有两种处理方式:
直接将facts 变成一段话,得到 F*L 个序列 将这L个序列进入序列模型
facts = tf.reshape(facts, [batch_size, F * L, word_dim])c_t, _ = tf.nn.dynamic_rnn(gru_cell, facts, F * L, dtype=tf.float32)
将每个fact的向量直接相加,然后得到L个序列
facts = tf.reduce_sum(facts, 2)c_t, _ = tf.nn.dynamic_rnn(gru_cell, facts, L, dtype=tf.float32)
ct 这个向量就是我们需要输入内存的向量
Semantic Memory Module
- 保存基本概念,比如知识图谱
- 基础的词向量等
Question Module
question mudule很简单,question的输入是一个问题
将这个序列通过seq model后得到的state即可:
ques_embed = tf.nn.embedding_lookup(embedding, question) # [N, Q, V]ques_embed = tf.unstack(ques_embed, axis=1) # Q X [N, V]_, question_vec = tf.nn.static_rnn(gru, ques_embed, dtype=tf.float32) # [N, d]
Episodic Memory Module
它的作用是根据问题从输入的上下文中选出相关的facts,然后根据这些facts生成一个合理的表示memory,这个表示输出到answer module。
然后这个模块可以多次处理这些facts,每次处理这些facts可以聚焦不同的点。每次通过后就生成一个 episodic, 然后所有的episodic都被归结成一个memory。
所以episodic memory module 是一种attention 机制,这个机制简单描述是:
- 将所有的facts通过attention机制聚焦,生成episodic
- 将所有的episodic归纳成memory
我们从后开始介绍:
memory是经过多次迭代得到的,
我们令这个内存memory序列为:
episodic序列为:
那么meory的迭代如下:
memory = question_vecmemory, _ = gru(e_i, memory)
最终输出的memory
下面我们给出
那它的计算和facts有关,上面在Input module我们介绍过,facts encoding出来的结果是
我们令 t 的最大长度为
所以 episodic 是
这里 EP 是呆权重因子的序列模型,我们令第i次迭代的attention机制通过gate weight 方式实现
现在我们开始计算gate 权重,它是一个sigmoid函数:
到此我们就完成了
input facts => episodic => memory 的计算
Answer Sequence
上面的模块最终生成了memory m,这个模块就是根据m生成答案
这里还是一个序列模型,比如GRU,它的初始状态
然后生成答案(seq2seq里面的decode步骤)
训练数据
face book 发布的 bAbI
- QA: Dynamic Memory Networks for Natural Language Processing
- Ask Me Anything: Dynamic Memory Networks for Natural Language Processing 阅读笔记及tensorflow实现
- Natural language processing: Deep Neural networks with multitask learning
- NLP:Natural Language Processing
- Natural Language Processing Knowledge
- Natural Language Processing
- A New General Deep Learning Approach for Natural Language Processing
- Synonyms-Chinese Synonyms for Natural Language Processing and Understanding
- Natural Language Processing On Coursera
- 20+ Natural Language Processing APIs
- Natural Language Processing (nlp) 路线图
- 【Natural Language Processing】语言模型(Language Modeling)
- Natural Language Processing With Python (3)
- 自然语言处理(Natural language processing) 1
- Natural Language Processing With Python (2)
- Natural Language Processing With Python (1)
- 【Natural Language Processing】seq2seq学习笔记
- Dynamic Memory Networks & DMN+
- Java 内存模型
- HAL Stub框架
- 网络测试的window bat脚本分析
- 一些好的网站记录(PART 5 )
- Swift-泛型学习和实例总结
- QA: Dynamic Memory Networks for Natural Language Processing
- 0x80070570 文件或目录损坏且无法读取 CHKDSK 修复
- yum离线安装
- 安卓小本本
- LeetCode.729 My Calendar I
- 霍夫变换(直线和圆)
- Git 使用教程 初级
- 美国韭菜们助推比特币站上一万美元,价值使然还是最后的疯狂?
- GitHub日常使用手册