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