1. 程式人生 > >螞蟻金服nlp大賽經驗分享

螞蟻金服nlp大賽經驗分享

      有幸與師兄組隊參加了2018年6月份由螞蟻金服主辦的NLP大賽,最終複賽b榜成績f1值為0.7416,以萬分點的優勢僥倖獲得第一。這是我參加的第二個正式的演算法比賽,也是我師兄參加的第一個比賽,下面從幾個方面與大家分享下比賽經驗。

     組隊與隊伍配合

這次比賽只有我與師兄兩個人,師兄在頂會期刊中發表過文章,學術能力與研究能力一流,我由於參加過類似的比賽所以熟悉一些比賽的技巧與手段。比賽期間我們基本是同時並行,各自採用自己熟悉的框架進行實驗,互相分享看的paper以及效果好的idea,每天大概花5個小時左右的時間,配合非常完美。所以大家在組隊時候最好找老司機帶路,每個成員要有一技之長,互相取長補短,而且不用每天24小時加班加點,勞逸結合才會有新的idea。

    賽題分析與模型設計

   比賽第一步肯定是粗略的分析資料,如果時間充裕可做詳細的EDA,但文字方面的比賽做EDA價值不大,我們主要分析了句子的平均長度,正負樣本的比例情況,然後肉眼隨機查看了部分資料,可對任務難度做一個初步的評估。

   這次比賽任務簡單點來說就是二分類任務,對於兩個問句判斷相似還是不相似,這是一個很fundamental但是工業價值很大的任務,類似於NLI(natural language inference)和sentence match。任務確定了下一步就是nlp按部就班的操作,建立詞彙表-->獲取每個詞的Embedding-->用LSTM或者CNN進行Encoder特徵提取-->對提取特徵進行互動操作如進行點乘和做減法-->過全連線層進行二分類。這就是我們比賽初期的Baseline框架,意外的是這個baseline成績就已經差不多Top50,極大的帶動了我們比賽的熱情。

   接下來的任務就是看paper做實驗了,我們初期的計劃很暴力,嘗試17年到18年幾乎所有和這個任務相關的paper的模型,直接略過了以往的經典模型如孿生網路。Paper模型的復現部分主要由我來負責,師兄負責設計新的模型,在這塊我們花了大量的時間來調研和實驗,爭取不放過任何一個可能帶來提高的component。大家可大膽嘗試各種最新的“奇淫技巧”,但也不是隨意的排列組合的實驗,先要想想這樣做的原因和背後的原理,再去有的放矢。

    賽後總結與遺憾

    比賽階段我犯了一個很大的錯誤,盲目的去追求完美的復現Paper的模型,但是效果往往與預期相距甚遠,所以做了很多無用功,複賽期間也沒有發揮出應有的作用,給了師兄很大的壓力,所以還是要具體任務具體對待。總的來講整個比賽還算進行的順利,中途也遇到過一週甚至半個月也提高不了成績的情況,但我和師兄都比較佛系,一步步慢慢來總會有收穫。

    另外比賽也留下了不少遺憾,一是沒有花心思去弄特徵,比如postag,semantic parser等都是看起來很有效的特徵,其次是對CNN相關的模型嘗試一直不太成功,具體原因也沒有找到,另外我們也嘗試過對抗學習,在簡單模型上有不錯的提升,但是無法套用複雜模型,以及未來得及嘗試其他大大小小的idea。

    比賽常用工具和技巧

這個不用多說大家應該都知道,最常用的資料處理庫pandas一定要熟練掌握,文字處理方面的nltk以及gensim,以及機器學習的sklearn框架,另外深度學習框架至少要熟練使用一種,比如簡潔高效的keras或者pytorch。除了各種框架,理論知識也要掌握透徹,這是設計演算法的根基所在。其次要弄懂比賽的評測方式,是ACC還是F1,亦或是AUC,針對不同的指標可以有不同的優化方法,效果提升往往比直接改演算法來的直接。

    其次就是比賽的大殺器ensemble,只要是有差別的模型都能整合,具體的方法有很多種,比如最簡單但也很有效的直接平均,此次比賽由於平臺限制我們僅僅採用了這種方式,另外還有複雜一點的blending和stacking,具體細節網上有很多參考。Ensemble需要注意的一點是模型差別越大,效果才會越好,不要擔心太簡單模型會影響整體效果,甚至最簡單的TF-IDF都能整合,結果好不好試了才知道。另外針對差別比較小的模型,我們可以採用sigmoid反函式的方式進行ensemble,具體原理大家可自行搜尋。