從Kaggle賽題: Quora Question Pairs 看文本相似性/相關性
從Kaggle賽題: Quora Question Pairs 看文本相似性/相關性
今天來複盤一下9個月前的Kaggle: Quora Question Pairs, 也算是對文本相似性工作的一點總結,Quora賽題是我接觸數據競賽的第一次比賽,正值大四的下學期開學,在實驗室做一些NLP方面的橫向課題,學弟找我來說要不要玩比賽,我們就把當時kaggle上當時的比賽羅列了一下,最後挑了這個NLP的賽題,當時對調參,特徵工程,模型融合,pipeline沒有深刻的理解。誤打誤撞的拿了銀牌,現在讓我再打一次的話,還是比較有信心衝擊金區的。
這篇文章想發散開來講,從傳統方法到深度模型,結合賽題的數據特點對文本相似性匹配的方法做一個梳理。以及針對比賽中的技巧做一個總結。
Quora給的題就給定兩個quora中的提問。提問數據是類似知乎上的提問標題,判斷兩個問題是不是一個問題。比如:A.如何學習NLP? B.怎樣學習自然語言處理?這就明顯是一個問題。這個題屬於NLP中的文本相似性匹配,由於quora構建數據的方式存在圖的特徵,後來發現其圖模型方面也值得研究。以下部分圖片來自於Quora第四名YesOfCourse團隊的ppt,在此註明版權。
文本相似性/相關性度量是NLP和信息檢索中非常基礎的任務,在搜索引擎,QA系統中有舉足輕重的地位,一般的文本相似性匹配,從大的方法來講,傳統方法和深度學習方法。
特徵工程方法
傳統方法不外乎各種角度的特徵工程,我把常用的特徵羅列如下,比如
- 編輯距離
編輯距離(Edit Distance),又稱Levenshtein距離,是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。一般來說,編輯距離越小,兩個串的相似度越大。
例如: 我們有兩個字元串: kitten 和 sitting: 現在我們要將kitten轉換成sitting 我們可以做如下的一些操作;k i t t e n –> s i t t e n 將K替換成Ssitten –> sittin 將 e 替換成isittin –> sitting 添加g在這裡我們設置每經過一次編輯,也就是變化(插入,刪除,替換)我們花費的代價都是1。FuzzyWuzzy這個python包提供了比較齊全的編輯距離度量方法。
- 集合度量特徵
集合度量方式就是把兩個句子看成 BOW (bag of words)。然後使用集合相似性度量方法比如Jaccard等。這種方法有一個嚴重問題就是丟失語序。當然基於集合算重合度的度量方法不止Jaccard,也有很多別的,感興趣的同學可以了解下。
- 統計特徵
比如句子長度,詞長度,標點數量,標點種類,以及詞性序列上的度量,這也是最直觀的度量方法,大家可以發揮自己的想像力把這一部分做豐富一點
- 使用預訓練的詞向量得到句子表示進行度量
詞向量是深度學習進入NLP的非常代表性的工作,谷歌的詞向量論文引用了3000+次,可謂影響深遠了。
使用詞向量的一種簡單的方法是,BOW求平均,得到兩個句子的表示,然後利用餘弦相似度度量或者Minkowski,歐幾里得距離等等。這是一種非常簡單而直觀的方法。在比賽中我們這篇參考了論文, From Word Embeddings To Document Distances 這篇論文提出的一種叫做WMD的度量方法,七級本原理是利用word2vec的特性,將文本文檔表示為一個weighted point cloud of embedded words。兩個文檔A和B之間的距離定義為A中所有的詞移動精確匹配到文檔B中點雲的最小累積距離。這個思路也非常直覺,實際表現也非常良好『
- 使用傳統方法如tfidf,LDA等topic model等拿到句子表示進行度量
對於LDA和tfidf的句子表示原理在此不做細講,在實踐中我們發現,使用tfidf值對詞向量做一個加權,得到的句子表示也是一種不錯的表示。
深度模型
深度模型有兩種思路,一種是基於表示,一種是基於交互。不過基於交互的模型大多也是先要拿到文本表示,從文本表示構建交互,從交互到特徵抽取的思路。其基本的模型如下所示
這是一個非常直觀的思路,最後一層的matching score建模方法甚至可以用一個簡單的FC代替,或者做一次element-wise 乘之後接FC。下面有在IR中用表示方法做這個問題的幾篇論文。
- DSSM: LearningDeep Structured Semantic Models for
- WebSearchusing Click-through Data (Huanget al., CIKM』13)
- CDSSM: Alatentsemanticmodelwith convolutional- poolingstructureforinformationretrieval (ShenY,HeX, Gao J,etal.CIKM』14)
- ARC I: ConvolutionalNeural NetworkArchitecturesfor MatchingNaturalLanguageSentences(Huet al., NIPS』14)
- LSTM-RNN:Deep Sentence Embedding Using the Long Short Term MemoryNetwork:Analysis and Application toInformation Retrieval (Palangietal.,TASLP』2016)
基於交互的方法是通過Interaction來對文本相似性建模,其模型基本的原理是。
有一篇非常有意思的文章Text Matching as Image Recognition. (Liang Pang, Yanyan Lan, Jiafeng Guo, Jun Xu, and Xueqi Cheng. AAAI 2016)這也是龐亮學長在AAAI 2016上的工作,所以他們打這個比賽,完全就是把中科院的模型拉出來遛遛。這個模型也很直覺,就是把兩個文本的相似性建模成一張圖片,再用CNN做特徵抽取器。
- 拿到每個詞的embedding。 (embedding)
- 構建兩個文本的相似矩陣。 (Interaction)
- 把相似矩陣放入兩層CNN中。 (Feature extract)
- 把CNN的結果放入兩層的全連接中。 (FC)
- 獲得二分類的score。 (distribution)
後來的一些工作都大同小異,比如不直接使用詞向量,利用RNN的隱層向量去構建交互等等。具體的文章如下,感興趣的同學可以看一下。
- DeepMatch: A Deep Architecture for Matching Short Texts (Lu and Li, NIPS』13)ARC II: Convolutional Neural Network Architectures for Matching Natural Language Sentences (Hu et al., NIPS』14)
- MatchPyramid: Text Matching as Image Recognition. (Liang Pang, Yanyan Lan, Jiafeng Guo, Jun Xu, and Xueqi Cheng. AAAI 2016)
- Match-SRNN: Modeling the Recursive Matching Structure with Spatial RNN. (Shengxian Wan, Yanyan Lan, Jiafeng Guo, Jun Xu, and Xueqi Cheng. IJCAI 2016)
下面回到這個比賽中,具體結合數據談一談。
在比賽中發現,訓練集和測試集的正負樣本比有明顯差異,分布上的差異最後體現在logloss指標上的gap,在比賽中大家推導出一個後處理的公式,然後可以拉平分布帶來的分數異動。使用貝葉斯公司能推導出這個後處理,前提是可以測出分布的情況下。有論文對這個做了詳細的講解。"Adjusting the Outputs of a Classifier to New a Priori Probabilities: A Simple Procedure"https://pdfs.semanticscholar.org/d6d2/2681ee7e40a1817d03c730d5c2098ef031ae.pdf
比賽中一些預處理方法有
- 詞元化/詞幹花
- 停止詞刪除
- 標點符號清洗
- 特殊符號替換
- 詞向量擴充句子得到另一份句子(這個直覺的思路是,利用詞向量找相關詞的特性,增加傳統特徵方法的容錯性。比如集合度量方法,開心和高興雖然是一個意思,但是不擴充近義詞的話,其容錯性很低)
不得不提的是,這個比賽中有一個非常關鍵的leak信息。一個問題如果出現頻繁的話,就很可能是一個重複的問題。後來發現前幾名在這個leak上做了很多文章,取得了非常好的效果。後來CPMP給的解釋是:
A question that is asked often has more chances to be redundant. Thanks for sharing.
以第一名的解法為例,他的特徵工程中含有大量的來自圖的Structural features 。我感覺這部分也是最關鍵的。
https://www.kaggle.com/c/quora-question-pairs/discussion/34355第一名的解法有300多個模型做了stacking。簡直爆炸。
第四名HouJP學長的,https://www.kaggle.com/c/quora-question-pairs/discussion/34349,亮點就是深度模型的分數很高,不愧是中科院IR大佬。
第五名的解法也是在圖的建模上挖掘了大量的特徵。
第七名亮點就是這個人比較懶,花了大量的時間在深度模型上。和第一名都用了一個叫 decomposable attention 的東西。https://www.kaggle.com/c/quora-question-pairs/discussion/34697
後來總結一下這個賽題,由於基於圖的特徵的存在,使得這部分的特徵工程尤為重要,這也是我們做的不好的地方。前幾名在圖上都做了充分的挖掘,體現了強大的特徵工程能力。不過這部分東西,單純的文本相似性/相關性的工作沒什麼貢獻,如果抱著研究目的的同學可以忽略這部分。
HouJP和龐亮學長把他們的方案開源了,鏈接如下:https://github.com/HouJP/kaggle-quora-question-pairs。他們的自動化框架很厲害,值得學習。
我們也把代碼開源了,不過在大佬面前就是班門弄斧了:https://github.com/SpongebBob/Quora-Kaggle
由於這是我參加的第一次比賽,所以印象十分深刻。學到了一些對比賽使用的流程性的東西,體會到pipeline的重要性,不過教訓也很多,也算一種成長吧。
推薦閱讀:
※Facebook如何利用機器演算法人工智慧教計算機閱讀
※重磅乾貨-Richard S. Sutton-2018年強化學習教程免費下載
※【乾貨】我是怎麼用四個月時間速成全棧機器學習的
※引領深度學習革命--CNN架構全解析
※鋼鐵直男的救世主來了!讓AI告訴你妹子到底是啥意思