https://www.leiphone.com/news/202003/PlC1Y1sb36jlBpz1.htmlhtml
Anna Vander Stel 發佈在 Unsplash 上的照片git
近日,由 Google 舉辦的 Quest 問答標籤大賽結果出爐,由 Dmitry Danevskiy、Yury Kashnitsky、Oleg Yaroshevskiy 和 Dmitry Abulkhanov 組成的四人團隊「Bibimorph」斬獲冠軍。github
在 QUEST 問答標籤大賽中,參與者被要求爲不一樣的問答構建預測算法。比賽提供的數據集包含數千個問答對,大部分來自 StackExchange。問答對被貼上了標籤,以反映問題好壞以及答案是否相關。大賽的結果將有助於促進問答系統的發展。面試
在獲獎者訪談中,Bibimorph 團隊公佈了他們解決這一挑戰的獨特方法。算法
Q1:請分享一下你的背景,包括你是如何開始 Kaggle 之旅的?數據庫
Dmitriy Danevskiy編程
我擁有應用數學和物理學背景。4 年前,我開始主攻工業應用方面的機器學習。兩年來,我一直在一家小型人工智能服務公司工做,負責分割時間序列、人臉識別、語音處理及實現複雜的深度學習解決方案。如今我在一家名爲 Respeecher 的初創公司工做,是從事音頻合成前沿研究的首席工程師之一。網絡
我參加不一樣的 Kaggle 競賽不少年了,我認爲現代的深度學習方法很是廣泛,幾乎能夠應用於任何非結構化和結構化的數據。這聽起來可能有爭議,但我用經驗證實它可以在圖像、文本、音頻和表格數據比賽中得到金牌。在 Google Quest 問答標籤競賽中獲勝對我來講尤其重要——我成功地得到了 Grandmaster 頭銜。iphone
Yury Kashnitsky機器學習
我是物理和應用數學博士。小時候,我熱衷於航空技術,因而進入莫斯科物理技術學院航空專業學習。那時,我開始編程,並學習用 Python 處理 VR 應用程序的數據庫。在從事數據庫和商業智能相關的工做幾年後,我回到學校,開始應用數學的全日制博士課程。後來我去了俄羅斯 IT 巨頭 Mail.Ru 集團擔任該公司第一個數據科學家,目前在荷蘭生活和工做,主要在荷蘭國家實驗室從事研發工做。在過去的 3 年裏,我一直在領導 ML course.ai,這是一個開放的 ML 課程,很是關注 Kaggle 比賽。
談到 Kaggle,我經歷了長期的學習、掙扎、再學習的過程。直到兩年前我纔開始認真參加 NLP 比賽。很長一段時間裏,當我在 mlcourse.ai 的學生一次又一次斬獲金牌時,我只幸運地爬上了銀牌區的頂端。在 Google Quest 問答標籤比賽中獲勝,終於給我帶來了期待已久的 Master 頭銜。
這是拿着 Nvidia Quadro P6000 卡的 Elmo:
Oleg Yaroshevskiy
我有應用統計學和計算機科學的背景。做爲一名學生,我對技術對社會的影響很感興趣。在 Andrej Karpathy 的著名文章「The Unreasonable Effectiveness of Recurrent Neural Networks」的鼓勵下,我決定從軟件工程轉向機器學習。
做爲一名研究工程師,我從一開始就爲語音處理、機器翻譯、機器理解和其餘 NLP 任務設計深度模型。2017 年 7 月,我瞭解了 transformers,這改變了個人職業生涯。我對文學和文字藝術充滿熱情,但願有一天能看到人工智能創做的戲劇。
今天我是一名研究工程顧問和積極的 Kaggler。我相信 Kaggle 有助於在訓練深度神經網絡和模式識別背後創建深度直覺。我鼓勵其餘人嘗試數據科學競賽,並加入這個快速增加的 Kaggle 愛好者社區。
Dmitriy Abulkhanov
我在莫斯科物理技術學院和 Yandex 數據分析學院學習,擁有數學和物理學背景。做爲一名學生,我參加了許多數據科學黑客競賽。從這些比賽中,我得出一個結論:只要時間足夠,沒有沒法解決的問題。我相信參加比賽可以提供有用的專業知識,以解決數據科學中的各類問題。
目前,我在華爲擔任 NLP 研究員。
Q2:大家團隊是如何組建、如何協做的?
在 TensorFlow 2.0 問答挑戰賽中,咱們與冠軍失之交臂。爲了證實本身,咱們參加了 Google QUEST 問答標籤比賽。
幸運的是,此次比賽的形式和咱們以前參加的兩次編碼比賽同樣!所以,在Google QUEST 問答標籤比賽的前 2-3 周裏,雖然出現了不少讓其餘參與者抓狂的問題,但這些對咱們來講都很容易。
咱們四我的進行了合併,Dmitriy A 提出了一種使用 StackExchange 數據進行語言模型預訓練的強大技術。
Oleg 從一個基於一個公共 notebook 的簡單 PyTorch 基線(https://www.kaggle.com/phoenix9032/pytorch-bert-plain)開始,他還訓練了 BART 模型。Dmitriy A. 和 Yury 主要研究預訓練語言模型。Dmitriy D. 領導團隊訓練模型,制定驗證方案和模型混合方案。
咱們認爲團隊協做是一份寶貴的經歷,奪冠是你們一塊兒努力的結果。
Q3:大家團隊最重要的發現是什麼?
簡而言之:遷移學習。考慮到咱們在這場競賽中擁有一個很是小的公共數據集,利用好大量未標記的數據是關鍵。
但實際上,咱們有三個主要的祕訣:
語言模型預訓練
僞標籤
後處理預測
祕訣 1:語言模型預訓練
咱們使用了大約 700 萬個 StackExchange 問題,經過一個屏蔽語言模型任務(MLM)和一個額外的句子順序預測任務來微調 BERT 語言模型。
除此以外,咱們還創建了額外的輔助目標:在微調 LM 的同時,咱們還預測了 5 個指標——問題得分、問題查看數、問題最喜好計數、答案得分、答案計數,這些目標是咱們基於 StackExchange 數據設計的。
咱們使用定製的擴展詞彙表的緣由很簡單:StackExchange 問題一般不只包含純口語,還包含數學和代碼。用 LaTeX 符號、數學公式和部分代碼片斷擴展詞彙表有助於捕捉這一事實。
通常來講,LM 預訓練在改進咱們的模型方面起到了關鍵做用:
遷移學習。咱們的模型在使用競賽數據訓練以前已經「看到」了10倍以上的數據。
領域適應。因爲 LM 微調的自定義詞彙表和輔助目標,使咱們的預訓練模型更好地適應手頭的數據。
祕訣 2:僞標籤
僞標籤曾經是 Kaggle 的一個熱門話題,但如今它已經成爲一種衆所周知的經常使用技術。
圖片來源:Vinko Kodžoman的「Pseudo-labeling a simple semi-supervised learning method」教程
這個想法總結在上圖中。有關詳細信息,請參閱上面提到的教程。簡而言之,對於某些未標記的數據集,可使用模型預測做爲「僞標籤」來擴展已標記的訓練數據集。
咱們使用來自 StackExchange 問題轉儲的 20k 和 100k 樣本的僞標籤來改進四分之三的訓練模型。
祕訣 3:後處理預測
爲比賽選擇的標準是 Spearman 關聯。對於 30 個目標標籤中的每個,計算預測和真實值之間的 Spearman 相關性。而後平均 30 個 Spearman 相關係數產生最終度量。
正如在這篇關於 Kaggle 文章(https://www.kaggle.com/c/google-quest-challenge/discussion/118724)中所觀察到的,Spearman 關聯對某些預測的相等與否至關敏感:
上面的示例代表,預測向量 b 能夠「閾值化」生成 b2,從而將其與 a(真值)的 Spearman 關聯從 0.89 增長到 1。
實際上,這是整個競賽的缺點之一——目標指標對閾值預測等黑客攻擊有點過於敏感。許多團隊將各類閾值啓發式方法應用於後期處理,一般對每個目標都這樣操做。咱們清楚地認識到這是過度的。可是,咱們仍然對模型預測採起了一些後處理。
咱們沒有對預測進行閾值化,而是根據訓練集中的分佈將預測離散。其思想是使特定目標列的預測分佈與訓練數據集中相應列的相應分佈相匹配。有關其餘詳細信息,請參閱咱們共享的解決方案代碼:https://github.com/oleg-yaroshevskiy/quest_qa_labeling/blob/yorko/step11_final/blending_n_postprocessing.py#L48。
Q4:大家的最終解決方案是什麼樣的?
基線模型
咱們的基線模型幾乎是 vanilla BERT 與平均池隱藏狀態之上的線性層。至於輸入,咱們只傳遞了用特殊標記分隔的問題標題、問題正文和答案正文。
除了上面描述的三個「祕密」以外,還有一些技巧,包括全部 BERT 層中隱藏狀態的 softmax 規範化權重和多樣本丟失。
最終融合
最後的解決方案是將四個模型(兩個 BERT 基模型、一個 RoBERTa 基模型和一個大的 BART)的摺疊預測與上述三個「祕密」相結合:預訓練語言模型、僞標籤和後處理預測。
Q5:大家從此次比賽中學到了什麼?
咱們學到了不少!
不要過早參加比賽。先打好技術基礎。
對於小的訓練數據集,重點是以適當的方式利用額外的大數據集。
遷移學習不只適用於計算機視覺任務,在天然語言處理中也一樣重要。
若是是小型訓練數據集,請特別注意驗證。
尋找可以在技能、方法、模型等方面爲最終解決方案引入多樣性的隊友。
你對那些剛開始學數據科學的人有什麼建議嗎?
咱們能夠從視頻「How to jump into Data Science」中總結 Yury 的建議(視頻網址:https://www.youtube.com/watch?v=FGuGg9F2VUs)。
有 8 個主要步驟:
Python。經過 Kaggle Learn、Dataquest、codearcademy 或相似工具學習這種編程語言的基礎知識。初級數據科學家幾乎不須要高級 Python 技巧,可是在工做中使用 Python 是很好的。
SQL 語言。學習基本知識,Kaggle Learn 也能作到,在面試前更新你的 SQL 技能,剩下的你將在工做中學習。
數學。微積分、線性代數、統計學等基礎知識對於理解將要使用的工具集是必不可少的。開放的麻省理工課程多是最好的資源。
算法。在多大程度上須要算法,這是一個有爭議的問題,但你能夠學習 R. Sedgewick 和 T. Roughgarden 的經典課程,leetcode 也會有幫助。
開發技巧。有軟件工程背景者優先考慮。「ML工程師」這個詞如今實際上比「數據科學家」要熱門得多,由於這項業務不是在 Jupyter notebook 上運行的,你必須將其部署到生產中。不管如何,你最好至少知道如何使用 git 和 Docker。
機器學習。mlcourse.ai 中包含基本的 ML課程。一些 Coursera 專業也將是一個很好的切入點。至於深度學習,斯坦福大學的 cs231n 或 fast.ai 是兩個不錯的選擇。
項目或比賽。這是很好的證實,你作了一個最低限度的可行的產品。經過練手項目,你能夠學到不少。比賽是一個很好的選擇,但不要抱着遊戲的心態,要最大限度地利用你在 Kaggle 得到的知識。
面試。不要只是坐在家裏學習,作些面試練習,嘗試、失敗、學習、迭代,總有一天你會成功的。
資源
在 GitHub 上共享的解決方案:https://github.com/oleg-yaroshevskiy/quest_qa_labeling/tree/yorko
Kaggle Notebook 再現瞭解決方案的推理部分:https://www.kaggle.com/ddanevskyi/1st-place-solution
Kaggle 上的冠軍解決方案:https://www.kaggle.com/c/google-quest-challenge/discussion/129840
雷鋒網雷鋒網(公衆號:雷鋒網)雷鋒網
雷鋒網版權文章,未經受權禁止轉載。詳情見轉載須知。