文本匹配泛读系列(一)—— LSTM-BASED DEEP LEARNING MODELS FOR NON- FACTOID ANSWER SELECTION论文笔记

一、写在前面的话

这篇论文主要探索了深度学习在答案选择任务的应用,本质上是做了文本相似的任务。该论文提出了好几个模型,baseline是使用双向LSTM模型对问题和答案的嵌入进行编码,并用余弦相似性度量它们的紧密性。在baseline的基础上,从两个方向进行了改进,一种是将卷积神经网络与基本框架相结合,定义一种更为复合的问题和答案表示,另一种是利用一种简单而有效的注意机制,根据问题的上下文生成答案表示。


二、论文模型

2.1 Basic Model: QA-LSTM

整体结构较为简单,question和answer通过双向LSTM进行编码(共享权值结构),再分别经过mean pooling或max pooling后使用余弦相似性度量相关性,计算hinge loss:

2.2 QA-LSTM/CNN

基于Basic Model加入了CNN对经过双向LSTM编码后的特征进行进一步的编码,最后使用max-k pooling得到向量表征。

2.3 ATTENTION-BASED QA-LSTM

将question经过双向LSTM和pooling之后的向量表征引入answer的双向LSTM的计算中,引入的方式采用attention:


三、实验结果

可以看到引入CNN和attention都对该任务有不错的提高,CNN通过对双向LSTM编码后的特征进行再次地提取,得到更丰富的特征表示,attention则是将question信息引入answer表征过程中,使用answer能得到更合理的表征。这里个人考虑如果将answer信息引入question是否有助于整体任务的提高,另外,引入self-attention是否能比CNN的特征提取取得更好的效果。


四、代码实验

在GitHub上找了一圈,最后选用了https://github.com/Chiang97912/QA_LSTM_ATTENTION的代码学习,比较遗憾的是没有测试代码。实验数据使用的是insuranceQA数据集,代码中已经提供了必要的词向量和代码处理。

# 整体结构
with tf.name_scope("embedding_layer"):
    # Map the word index to the word embedding
    embeddings = tf.Variable(tf.to_float(self.embeddings), trainable=True, name="W")
    q_embed = tf.nn.embedding_lookup(embeddings, self.q)
    ap_embed = tf.nn.embedding_lookup(embeddings, self.ap)
    an_embed = tf.nn.embedding_lookup(embeddings, self.an)

with tf.variable_scope("bilstm", reuse=tf.AUTO_REUSE):
    q_lstm = self.biLSTMCell(q_embed, self.rnn_size)
    ap_lstm = self.biLSTMCell(ap_embed, self.rnn_size)
    an_lstm = self.biLSTMCell(an_embed, self.rnn_size)

with tf.variable_scope("attention_wrapper", reuse=tf.AUTO_REUSE):
    qp_atted, ap_atted = self.attention_wrapper(q_lstm, ap_lstm)
    qn_atted, an_atted = self.attention_wrapper(q_lstm, an_lstm)

self.poscosine = self.calc_cosine(qp_atted, ap_atted)
self.negcosine = self.calc_cosine(qn_atted, an_atted)
self.loss, self.acc = self.calc_loss_and_acc(self.poscosine, self.negcosine)
self.train_op = tf.train.AdamOptimizer(self.lr).minimize(self.loss)
# attention部分
def attention_wrapper(self, input_q, input_a):
    # h_q = int(input_q.get_shape()[1])  # length of question
    w = int(input_q.get_shape()[2])  # length of input for one step
    h_a = int(input_a.get_shape()[1])  # length of answer

    output_q = self.max_pooling(input_q)  # (b,w)

    reshape_q = tf.expand_dims(output_q, 1)  # (b,1,w)  b:batch size
    reshape_q = tf.tile(reshape_q, [1, h_a, 1])  # (b,h_a,w)
    reshape_q = tf.reshape(reshape_q, [-1, w])  # (b*h_a, w)
    reshape_a = tf.reshape(input_a, [-1, w])  # (b*h_a,w)

    Wam = tf.get_variable(initializer=tf.truncated_normal([2 * self.rnn_size, self.attention_matrix_size], stddev=0.1), name='Wam')
    Wqm = tf.get_variable(initializer=tf.truncated_normal([2 * self.rnn_size, self.attention_matrix_size], stddev=0.1), name='Wqm')
    Wms = tf.get_variable(initializer=tf.truncated_normal([self.attention_matrix_size, 1], stddev=0.1), name='Wms')

    M = tf.tanh(tf.add(tf.matmul(reshape_q, Wqm), tf.matmul(reshape_a, Wam)))
    M = tf.matmul(M, Wms)  # (b*h_a,1)

    S = tf.reshape(M, [-1, h_a])  # (b,h_a)
    S = tf.nn.softmax(S)  # (b,h_a)

    S_diag = tf.matrix_diag(S)  # (b,h_a,h_a)
    attention_a = tf.matmul(S_diag, input_a)  # (b,h_a,w)

    output_a = self.max_pooling(attention_a)  # (b,w)

    return tf.tanh(output_q), tf.tanh(output_a)
# 损失部分
def calc_loss_and_acc(self, poscosine, negcosine):
    # the target function
    zero = tf.fill(tf.shape(poscosine), 0.0)
    margin = tf.fill(tf.shape(poscosine), self.margin)
    with tf.name_scope("loss"):
        losses = tf.maximum(zero, tf.subtract(margin, tf.subtract(poscosine, negcosine)))
        loss = tf.reduce_sum(losses)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 本文另两篇系列 NLP的巨人肩膀(上) NLP的巨人肩膀(下) 3. 梯子的一级半 除了在word级别的embed...
    weizier阅读 6,551评论 0 18
  • Abstract 这是华中科技大学的一篇关于行人重识别的文章,去年挂在arxiv上,今年更新了第二版。文章表示目前...
    luuuyi阅读 2,267评论 0 0
  • 简介 抽取式QA是要在文档中定位问题的答案。模型输入是【Passage,Question】,模型输出是【start...
    冰源阅读 7,090评论 0 4
  • 背景:在NLP中,对于两个文本比较和分析的任务,比如文本相似度或者问答模型,因为涉及到两个输入源,如果使用单一的神...
    AxsPlayer阅读 27,493评论 0 8
  • 强大的内心 当全职妈妈意味着失去经济来源,面临依赖他人而被嫌弃,可能面对孩子小粘人,没人帮忙看管,想找份在家工作的...
    小纯说阅读 520评论 11 5