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:
有两个句子:
其实文中提到了一点就是,对于词向量的选取:
其实在词向量中作者下了很大功夫…
简单来说,就是词向量是由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在一起:
(其实这里我觉得,在词向量上加上task-specific 的一些元素应该是值得借鉴的地方)
DeepRNN & DenseNet & Attention::
模型接下来的架构,是多层RNN的一些改动
通常的多层RNN(DeepRNN)是如下的架构:
公式应当是这样:
然而作者在收到DenseNet的影响,在 Hl() H l ( ) 的输入中,将 hl−1t,xl−1t h t l − 1 , x t l − 1 concat起来,也就是结合了第 l−1 l − 1 层 t t <script type="math/tex" id="MathJax-Element-12">t</script> 时刻的神经元的输入和输出:
接着,作者在输入中再次concat进去每层的attention信息:
attention信息还是传统的计算方法:
这里的每层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层,也就是常规操作了。