雷锋网 AI 研习社按:今天要介绍的比赛是 Quora Question Pairs,该比赛的目的是将具有相同意图的问题正确配对。最近本次竞赛的冠军在 Kaggle 社区分享了竞赛经验,雷锋网 AI 研习社进行了编译。
Quora 是一个获取和分享知识的问答平台,它能够促进人们互相学习,以更好地认识这个世界。每个月有超过 1 亿的人访问 Quora,所以有许多人可能提出相似的问题。然而这些具有相似意图的问题可能会使得寻求者需要花费更多的时间,才能找到所需的最佳答案,而答题者可能也会觉得很多问题存在重复。
为了更好地发掘那些具有相似意图的问题,以帮助用户更快地找到问题的高质量答案,提高用户使用体验,Quora 在 Kaggle 上举办了本次竞赛: Quora Question Pairs。下文是比赛冠军的经验分享,正文如下。
1、特征
我们将特征区分为三种:嵌入特征(Embedding features)、经典文本挖掘特征(Classical text mining features)和结构化特征(Structural features)。
嵌入特征
词嵌入(Word embeddings),例如 Word2Vec
句子嵌入(Sentence embeddings),例如 Doc2Vec、Sent2Vec
使用在 SNLI 上训练的 ESIM 模型的密集层来编码问题对(Question pair)
备注:与 Word2Vec 相比,句子嵌入的挑战更为艰巨,因为它拥有更少的有效信息。
经典文本挖掘特征
LDA 和 LSI 嵌入的相似性度量
字符袋 n 元模型(Bag of character n-grams,n 取 1 到 8)的相似性度量(TFIDF 重加权或者不重加权)
网友 Abhishek 和 owl 分享的特征
当问题的开始或结束相同时,编辑和排序匹配距离
问题长度各异
大写字母、标签等的数量
以 "Are"、"Can"、"How"等开头的句子占问题的 1/2,所有相应的数学工程
我们还使用斯坦福大学的 corenlp 来标记词汇,利用 postagger 和 ner 来预处理一些深度学习模型的文本输入。
结构化特征
我们从训练数据和测试数据集串起的多个问题对的边(edge)来构建图,进而构建密度特征。当切割主边时,我们会统计附件的问题 1、问题 2、最小、最大、交叉、联合、最短路径长度。
我们进一步建立了密度特征,一次又一次计算邻问题的邻问题......(嵌套循环)。我们还计算了前面的问题,它也挨着后面的问题(循环)。
我们尝试了不同的图结构:我们构建了无向图和有向图(边从问题 1 指向问题 2),我们也试图将问题 1 的密度特征从问题 2 的特征中分离出来,除了可交换的特征之外还产生了不可交换特征。
我们还建立了描述问题对连通子图的特征:边数、节点数、训练的边的百分比。
我们还计算了问题对的链接子图中的相同特征,这些子图来自于出现超过一次的问题对。我们想要做的是通过改变结构来消除那些我们认为会破坏图特征的捏造问题。
最后,和其它团队一样,我们使用一些初始模型对图进行加权。我们尝试了 logit ,重新调整了预测,但是原始预测效果最好。我们还使用相似特征之一对图进行加权。
2、模型
我们的 NNets 主要在两个架构上进行工作:孪生神经网络(Siamese neural networks)和注意力神经网络(Attention neural networks)。
带有预训练 Glove 嵌入的孪生 LSTM
具有预训练 FastText 嵌入的可分解注意力机制(https://arxiv.org/abs/1606.01933),这个模型在 cv 上取得了 ~0.3 。
具有预训练 FastText 嵌入的 ESIM(https://arxiv.org/abs/1609.06038),这是我们最好的纯深度学习的 NLP 模型,它在 cv 上取得了 ~0.27。但是这个模型运行时间太长,我们只在第一个堆叠层中使用过一次。
我们注意到深度学习(DL) 在第一个堆叠层中具有很好的效果,但是在第二层上却不如简单的多层感知机(MLP)。
其中一个关键问题是选择我们的一些传统特征并将其纳入这些网络。我们使用预训练的 FastText 和 Glove 嵌入,并设置 trainable=False,因为我们曾经尝试过微调模型参数,但并没有获得任何性能提高。
最终,我们证明了在文本序列和我们的图/文本挖掘特征上训练的神经网络是性能最好的单一模型。我们还尝试在字符层级上训练孪生模型,以进一步提高堆叠的多样性,但是很难判断它是否真的有用。
然后我们尝试了更多的经典算法以利用图结构特征,比如像常用算法 XGB/LGBM。
3、再缩放(Rescaling)
为了平衡训练和测试数据之间目标分布(Target distribution)的差异,我们在 sweezyjeezy 分析(再次感谢他的贡献,它几乎帮助了所有的参赛者)的基础上做了更细致的研究,链接是:
https://www.kaggle.com/c/quora-question-pairs/discussion/31179
我们意识到可以通过优化再缩放来减少 Log loss。虽然我们没有找到一个更好的假设来模拟测试数据集中数据的分布,但是通过在数据的本地子样本上使用该方案,成功增加了算法的准确性。
我们发现训练/测试数据偏差在三个方面非常不同:
qid1_count = qid2_count = 1
min_qid_count = 1 & max_qid_count > 1
min_qid_count > 1
我们尝试了公共缩放(Public rescale)和外围缩放(Perimeter rescale)。对于第一层模型来说两者的效果都非常好,但是随着堆叠的深入,我们发现公共缩放不够强大,而外围缩放却有点过头。我们优化了缩放,使它的效果在这两种方法之间,与公共缩放相比,最终提高了 ~0.001。
4、堆叠(Stacking)
我们采用了四层的堆叠:
层 1:大约 300 个模型,Paul 和 Lam 的神经网络,以及像 XGB、LGBM 这样效果出众的经典算法,以及大量的 Scikit-learn 分类算法(ET、RF、KNN等等)
层 2:大约使用了 150 个模型:
所有输入特征
以上所有算法的预测结果
我们添加了最好的 L1 纯文本 ESIM 模型的隐藏层
层 3:2 个线性模型
以最小的 3 个 Spearman 相关性 L2 预测为基础进行岭回归(Ridge)(基于最大/最小值,创建了 3 个边界)
采用 LASSO(回归模型)对所有的 L1 和 L2 预测进行 logit 预处理
层 4:混合
55/45,基于公共 LB 得分(最佳的提交成绩)
Via Quora Question Pairs,由雷锋网 AI 研习社进行编译。