Quora Question Pairs 競賽冠軍經驗分享:採用 4 層堆疊,經典模型比較給力

 2018-02-24 10:16:00.0

前言:今天要介紹的比賽是 Quora Question Pairs,該比賽的目的是將具有相同意圖的問題正確配對。最近本次競賽的冠軍在 Kaggle 社區分享了競賽經驗,我們進行了編譯。

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。雖然我們沒有找到一個更好的假設來模擬測試數據集中數據的分佈,但是通過在數據的本地子樣本上使用該方案,成功增加了算法的準確性。

我們發現訓練/測試數據偏差在三個方面非常不同:

  1. qid1_count = qid2_count = 1

  2. min_qid_count = 1 & max_qid_count > 1

  3. 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

文章來源:雷鋒網