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了
弃坑前的瞻仰
传统这类问题有两个方法:
文中提到了GNMT(Google Neural Machine Translation) 中的 residual connection
这里还参考了Densenet的思路
大致意思是说,为了解决梯度消失的问题
我们把每一个中间层的输出都和最后一层直接相连,这样最后一层的输入里有了每一层的梯度。
…我不会的地方真多
有两个句子:
其实在词向量中作者下了很大功夫…
简单来说,就是词向量是由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 的一些元素应该是值得借鉴的地方)
模型接下来的架构,是多层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 时刻的神经元的输入和输出:
接着,作者在输入中再次concat进去每层的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层,也就是常规操作了。