DRCN Model

Kim S, Hong J H, Kang I, et al. Semantic Sentence Matching with Densely-connected Recurrent and Co-attentive Information[J]. arXiv preprint arXiv:1805.11360, 2018.

这个问题可能就被这篇paper终结了…
Qoura数据集已经刷到91.3的acc了
弃坑前的瞻仰

Introduction

传统这类问题有两个方法:

  • 将每句话转换为fixed length vector, 然后在高维的向量空间作比较
  • 允许句子之间的交互(like attention)

文中提到了GNMT(Google Neural Machine Translation) 中的 residual connection
这里还参考了Densenet的思路
大致意思是说,为了解决梯度消失的问题
我们把每一个中间层的输出都和最后一层直接相连,这样最后一层的输入里有了每一层的梯度。

…我不会的地方真多

Model

Input:

有两个句子:

P={p1,p2,...pI}Q={q1,q2,...qJ} P = { p 1 , p 2 , . . . p I } Q = { q 1 , q 2 , . . . q J }

其实文中提到了一点就是,对于词向量的选取:
image_1cjv6bik31tg1pk7etg1oeklvh9.png-74.2kB

其实在词向量中作者下了很大功夫…
image_1cjv6hvbm1v56t6m1vblj6nmkb1m.png-184.1kB
简单来说,就是词向量是由4个部分组成:
- etrpi e p i t r : 带梯度的词向量(这里的初始化应该可以用pre_trained,不过影响应该不大)
- efixpi e p i f i x : 固定的pre_trained 词向量
- cpi c p i : 随机初始化的词向量,过了一个CNN(Maxpooling)
- fpi f p i : 一个flag, 含义为是否另一个句子 (Q) ( Q ) 中也包含这个词
(各个部分的dimention暂时先不管,实现的时候再具体确定)
然后最终的词向量就是把这四部分concat在一起:

pwi=[etrpi;efixpi;cpi;fpi] p i w = [ e p i t r ; e p i f i x ; c p i ; f p i ]

(其实这里我觉得,在词向量上加上task-specific 的一些元素应该是值得借鉴的地方)

DeepRNN & DenseNet & Attention::

模型接下来的架构,是多层RNN的一些改动
通常的多层RNN(DeepRNN)是如下的架构:
image_1ck6k4t4e9ukpoqt1124b1jdc1m.png-30.9kB

公式应当是这样:

hlt=Hl(xlt,hlt1),  xlt=ht1t h t l = H l ( x t l , h t − 1 l ) ,     x t l = h t t − 1

然而作者在收到DenseNet的影响,在 Hl() H l ( ) 的输入中,将 hl1t,xl1t h t l − 1 , x t l − 1 concat起来,也就是结合了第 l1 l − 1 t t <script type="math/tex" id="MathJax-Element-12">t</script> 时刻的神经元的输入和输出:

image_1ck7a4euh14g4kat1kkg1s2110i8m.png-34.8kB

接着,作者在输入中再次concat进去每层的attention信息:
image_1ck72db531i131ck31fao1oqp106223.png-11.6kB

attention信息还是传统的计算方法:
image_1ck72ganq2ir1o8447vhbqeop9.png-30.7kB

这里的每层attention确是之前没有见过,不过倒是利用了层次信息
考虑到deepRNN的出现是希望RNN拥有像CNN的层次特征信息,那么如果可以的话,CNN+层级Attention也不失为一种可能;只是多层的CNN,不知是否有解释性,或者说如何去设计一种结构让其拥有可解释性。

模型用了每一个layer的所有时刻的output输入到下一个layer中
如果按照上述concat的方法,RNN的输入将会逐层增长,并在最后的Dense layers中变得巨大,所以作者在layer之间其实用了一个AutoEncoder来压缩维度。

到达最后一层RNN时,假设输出的hidden states是 100维的,每个句子被padding成30个词(这里也是要把整个数据集的sentences padding成一个长度的)
那么最后一层的输出就是一个30*100的矩阵,在这个矩阵上再columnwised max-pooling
就可以得到 一个100d的向量,就是最终模型对于一句话的表示。

那么最后再对这个向量各种interaction然后过dense层,也就是常规操作了。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值