0
本文作者: 汪思穎 | 2018-06-08 09:50 |
雷鋒網(wǎng) AI 研習(xí)社按,本文作者 dawnbreaker,首發(fā)于知乎,雷鋒網(wǎng) AI 研習(xí)社獲其授權(quán)轉(zhuǎn)載。
我從 2017 年年初開始接觸 Kaggle。曾翻閱知乎上很多關(guān)于 Kaggle 的回答和文章,然而逐漸發(fā)現(xiàn)大部分文章中提到的經(jīng)驗和技巧是針對傳統(tǒng) machine learning 類比賽的,對計算機視覺類的比賽并不適用。此刻已是 2018 年 6 月,我也參加過了多次比賽,或多或少有了一些自己的觀點和感想。因此我寫這一篇文章希望對現(xiàn)存文章進行一定程度的補充,以供剛剛接觸 Kaggle 計算機視覺(CV)類比賽的同學(xué)參考。盡管此文會充斥個人觀點和猜測,我會盡量提供論據(jù)并淡化感情色彩。這是我在知乎的第一篇文章,希望大家能夠多多鼓勵和批評。
一、我的成績
第一次 The Nature Conservancy Fisheries Monitoring
排名: 16th of 2,293 ? Top 1% ? 角色:隊長。另一個隊員叫孫鵬,是同一實驗室的同學(xué)
第二次 Carvana Image Masking Challenge
排名: 12th of 735 ? Top 2% ? 角色:前期單刷,后來基本上由女朋友完成。
第三次 Cdiscount’s Image Classification Challenge
排名: 15th of 627 ? Top 3% ? 角色:基本是單刷。偶爾和女友以及朋友討論一下。
第四次 Statoil/C-CORE Iceberg Classifier Challenge
排名: 28th of 3,343 ? Top 1% ? 角色:打醬油。隊長是孫鵬。
第五次 Google Landmark Recognition Challenge
排名: 9th of 483 ? Top 2% ? 擔(dān)任角色:單刷
并列第五次 Google Landmark Retrieval Challenge
排名: 22th of 218 ? Top 11% ? 角色:單刷。基本上只用 landmark recognition 比賽的代碼跑了一下,沒有進行調(diào)參等嘗試,完全是投機取巧。
這六次比賽皆為計算機視覺類的任務(wù)。我還曾試圖參加 TensorFlow Speech Recognition Challenge 這個語音識別類的比賽,最終因為自己過于外行和精力不足知難而退。
以上就是我的全部比賽經(jīng)歷。
二、Kaggle上的兩個世界
Kaggle 的比賽任務(wù)大致都是根據(jù)已知信息,對測試集里的數(shù)據(jù)進行某種預(yù)測。按照主流方法是否涉及到 deep learning 來分,大概有兩種比賽:
A. 一種比賽比較適合傳統(tǒng)的 machine learning 方法,要想取得好成績,可能要在 feature engineering 和 ensemble 方面大做文章。但基本用不上 deep learning,因此有沒有好的 GPU 無關(guān)緊要。這類比賽的例子有房價預(yù)測等:
House Prices: Advanced Regression Techniques
Zillow Prize: Zillow’s Home Value Prediction (Zestimate)
Two Sigma Financial Modeling Challenge
Sberbank Russian Housing Market
Instacart Market Basket Analysis
Web Traffic Time Series Forecasting
Mercedes-Benz Greener Manufacturing
B. 另一種比賽現(xiàn)階段主流的解決方案是各種深度神經(jīng)網(wǎng)絡(luò),主要以計算機視覺類為主,任務(wù)包括 image/video classification, object detection, image masking。偶爾也有語音識別類任務(wù)。迄今為止我參加過的比賽都是這一種。參加此類比賽對硬件有一定程度的要求。比如說有一個臺式機和一塊或多塊 Titan X/1080ti 會對模型的迭代幫助很大。但用筆記本 GPU 甚至完全不用 GPU 并且排名靠前的人也是有的:
例1:我的同學(xué)孫鵬,用筆記本上的 980M。
例2:一個叫 Eric 的 Kaggler,用 5 個無 GPU 的電腦跑 PyTorch,Google Landmark Recognition Challenge 中獲得 28th/483 排名。參見 I enjoyed this competition: Feedback from a newbie!
例3:一個 ID 為 ImageRecog 的 Kaggler,聲稱用筆記本打比賽,在 Google Landmark Retrieval Challenge 中贏得季軍。(不確定后期有沒上更強大的硬件。)
但總歸會痛苦很多。
很多 Kagglers 對這兩類比賽之一表現(xiàn)出了明顯的偏好。如砍手豪因為缺少用來訓(xùn)練神經(jīng)網(wǎng)絡(luò)的硬件,而傾向于參加 A 類比賽(參見:《零基礎(chǔ)自學(xué)兩月后三月三次輕松進入kaggle比賽top20小結(jié)》)。而我自己迄今參加的都是 B 類的比賽,原因是自己習(xí)慣于處理計算機視覺類的任務(wù),而對傳統(tǒng) machine learning 任務(wù)尤其是時序預(yù)測方面了解比較少,不想進去墊底。如此一來 Kaggle 上仿佛存在著兩個不同的世界。A、B 類比賽都很投入地去參加的人當然也是存在的,只是據(jù)我所見大部分人都傾向于參加其中一類。
我在此強調(diào)這兩類比賽的區(qū)別,一個重要原因是,我發(fā)現(xiàn)迄今為止知乎上大部分的 Kaggle 入門指南大都是針對 A 類比賽的。例:
參加 Kaggle 競賽是怎樣一種體驗? - Naiyan Wang 的回答 - 知乎
參加 Kaggle 競賽是怎樣一種體驗? - Alex Hsu 的回答 - 知乎
零基礎(chǔ)自學(xué)兩月后三月三次輕松進入 Kaggle 比賽top20
Kaggle 首戰(zhàn)拿銀總結(jié) | 入門指導(dǎo) (長文、干貨)
隨機森林——實現(xiàn) Kaggle 排名 Top2% 的利器
Kaggle 實戰(zhàn)(2)—房價預(yù)測:高階回歸技術(shù)應(yīng)用
B類比賽的文章/回答則少得多,例:
參加 Kaggle 競賽是怎樣一種體驗? - AI 研習(xí)社的回答 - 知乎
Kaggle 的比賽在 Machine Learning 領(lǐng)域中屬于什么地位? - 幻云羽音的回答 - 知乎
我希望本文可以對關(guān)注 B 類比賽的 Kaggler 提供一些參考。
三、靠套路而豪無創(chuàng)新究竟能得到怎樣的成績?
有人說 Kaggle 比賽全靠套路。這句話隱含的意味是要想在 Kaggle 上獲得好成績,靠的是套路而不是智慧和靈感,或者靠的不是真正的技術(shù)。如果去杠的話,我們也可以說發(fā) paper 也是靠套路。但我想,即使真的是靠套路,也未必是一件完全的壞事,套路中也能體現(xiàn)高下之分,套路中也能體現(xiàn)出能力的強弱吧。很多 Kaggler 的成績都是比較穩(wěn)定的。比如 bestfitting 連續(xù)在 6 個比賽中得了 Top 3。比如 Fangzhou Liao 四次參加比賽全部都是冠軍。而我大部分時間都進不去 Top10,也從未出過 Top30,大概是因為我總也沒參透 Top10 選手的套路,而排名 30+ 的參賽者總也沒參透我的套路吧。
那么靠套路而豪無創(chuàng)新究竟能得到怎樣的成績?我來試圖給出一個下界出來:
1. 在Carvana Image Masking Challenge 中我的第一個 baseline 模型是 Unet,而且圖省事用的是 pytorch-CycleGAN-and-pix2pix 中的 Unet。為了趕快跑出個結(jié)果我把圖片從大約 1000x700 縮小成了 256x256 大小。沒有經(jīng)過任何調(diào)參的第一次提交結(jié)果是(Private Leaderboard) Dice coefficent = 0.985517,比賽結(jié)束時這個成績可以排到 top 72%。把圖片大小改成 768x512 之后,未經(jīng)任何其他修改,成績是 coefficent = 0.995050,比賽結(jié)束時可以排到 top 53%。
2. 在 Cdiscount’s Image Classification Challenge 中我的第一個 baseline 模型是 Pytorch 的 Resnet101,第一次提交的成績是 Accuracy = 0.71929,比賽結(jié)束時這個成績可以排進 Top 12%。
3. 在 Google Landmark Recognition Challenge 中我的第一個 baseline 模型是 ResNet50,第一次提交的成績是 GAP = 0.115。我后來在討論區(qū)把這個模型的訓(xùn)練公開了,即便如此,這個成績在比賽結(jié)束時居然也可以排到 Top 14%。我的第二個 baseline 模型 DELF 成績是 GAP = 0.203,比賽結(jié)束時可以排進 top 4%!
4. 在 Google Landmark Retrieval Challenge 中我套用了 Recognition 中使用的 DELF 代碼,第一個模型即是最后一個模型,沒有調(diào)優(yōu)過程,排名 11%.
5. The Nature Conservancy Fisheries Monitoring 是個 two-stage 比賽,兩個 stage 用的測試集不同,并且 stage 1 的成績已被主辦方清空所以我無法判斷我們第一個 baseline 模型可以在最終的 leaderboard 上排第幾。
6. Statoil/C-CORE Iceberg Classifier Challenge 這個比賽我是打醬油的,前期的實驗細節(jié)我手頭暫時缺失。
以上經(jīng)驗表明,只要選擇了與任務(wù)相對應(yīng)的 state-of-art 模型,在代碼無 bug,沒有實驗設(shè)置錯誤的情況下,排進 Top 50% 甚至 Top 15% 難度很小。那么另外的 50%~85% 的參賽者出了什么問題呢?我猜可能原因有如下幾種:
1. 根本不知道 state-of-art 模型是什么,也不知道怎么檢索或者沒有檢索的意識。
例:想強行套用mnist分類的方法來解決 image retrieval 問題。
2. 不想離開心理舒適區(qū),而選擇自己相對比較熟悉或容易上手的工具、庫和模型。
譬如說因為喜歡用 Keras 或者 Keras 剛?cè)腴T而只用網(wǎng)上找得到源碼的基于 Keras 的模型。
3. 或多或少知道 state-of-art 模型的存在,但硬件條件有限,而選擇對計算資源要求不高的模型。
例:因為硬盤小或網(wǎng)速慢而下載縮小幾倍的圖片代替原圖來進行訓(xùn)練的。
4. 代碼有 bug,debug 苦手。
5. 實驗設(shè)置有問題。比如存在邏輯錯誤或者參數(shù)有嚴重問題。
四、參加比賽有什么好處
至于說為什么有 50%~85% 之多,如果說不是向來如此,也許是最近幾年 Kaggle 更火了,入門者也更多了吧。我去年(2017)在國內(nèi)已經(jīng)發(fā)現(xiàn)很多人在求職簡歷里寫 Kaggle 比賽經(jīng)歷。至于 Kaggle 比賽經(jīng)歷對求職有多大好處我還不能確定。值得一提的是,我在參加第一次比賽感覺堅持不下去的時候,是看了 @lau phunter 的帖子堅持下去的:
2017-8-22 更新:兩年過去了大家參加 Kaggle 熱情高漲標準也水漲船高,以下標準請浮動一級。
原答案:
獲獎的都是有真本事的人,在上面練幾個題目得個好名次,十分能證明你對數(shù)據(jù)科學(xué)這個領(lǐng)域的實踐和理解。我現(xiàn)在招人的時候幾乎是這個標準:
寫上參加過 Kaggle 比賽,我會看簡歷。
得過一次 10%,我會給電話面試。
得過 2 次或者以上 10%,我會給 on site 面試。
得過一次前 10,我們會談笑風(fēng)生。
樓主加油。
雖然水漲船高,總歸有人認可是好事。
我想從一個平常人的角度來討論 Kaggle 比賽能給我們帶來什么。我先來舉幾個不適合平常人的角度:
1. 一個網(wǎng)上經(jīng)常被討論的話題,就是“paper 重要還是比賽成績重要”。我想,能考慮這個問題的人并不適用那種很極端的情況:例如 ILSVRC(Imagenet) 如果能得第一自然也能把方法發(fā)到頂會上去?!狪LSVRC 能得冠軍的人根本不會疑惑這種問題吧。
2. “如果進了前幾名還可以獲得獎金?!比绻皇?Grandmaster 的級別(例:Vladimir Iglovikov 一年內(nèi)獲得獎金 $28k),平常人的收益風(fēng)險比恐怕還不如去搬磚。
而平常人真正容易面對的情況是,發(fā)頂會 paper 被拒或者根本寫不出來,參加比賽成績不算拔尖或者被吊打。我認為一個人如果花時間可以換來頂會一作,那么不參加 Kaggle 也沒有什么遺憾。
Kaggle 常年都有各種比賽,有整理好的數(shù)據(jù)集,有各種 kernel 和帖子教你怎樣下載和使用數(shù)據(jù)集,甚至?xí)o出一些 baseline 代碼。獲勝者也會分享他們的 solution。這些特點對于那些想要嘗試一些曾經(jīng)沒做過計算機視覺任務(wù)的人來說是十分新手友好的。這里的新手指代的不一定是計算機視覺方面完全的新手,比如說如果你本來只熟悉物體識別,想嘗試一下語義分割,那么 Kaggle 也可能很適合你。
Kaggle 還有一大特色就是實時的 leaderboard,非常殘酷。如果你什么都不做,你的比賽名次只會下降。這會造成一種心理的刺激,給你壓力/動力讓你改善模型——當然這也是一種精神折磨。
我還有一個感想是:Kaggle 比賽給了每個 AI 愛好者被考驗的免費機會??梢宰屢恍┫矚g空想和嘴炮的人檢查一下自己是不是如同想象的那般厲害。但這個感想的詭異之處在于,由于我上文中提到的,只要正常跑通一個 ResNet101 就可能進 Top 15%,而或許有人覺得 Top 15% 很了不起,這樣一些喜歡空想和嘴炮的人參加 Kaggle 之后或許真的覺得自己很厲害了。So paradoxical……!
還有就是會認識很多志同道合的網(wǎng)友,這一點不展開討論了。
五、陷阱和一些技巧
1. 每場比賽會有多少人參與?
計算機視覺類比賽用到的數(shù)據(jù)通常是圖片和視頻,無論是空間占用還是計算量都比較大,大到很多人不得不因為硬件資源,或處理大規(guī)模數(shù)據(jù)的經(jīng)驗和能力問題,而不愿意參與數(shù)據(jù)集較大的比賽。這導(dǎo)致了一場比賽的參與人數(shù)和數(shù)據(jù)量強相關(guān)。小數(shù)據(jù)集的例子如 2018 Data Science Bowl 訓(xùn)練集只有 80M 左右,參與隊數(shù)高達 3634,Statoil/C-CORE Iceberg Classifier Challenge 訓(xùn)練集只有 43M,參與隊數(shù)高達 3343。數(shù)據(jù)集比較大的如 Cdiscount’s Image Classification Challenge 訓(xùn)練集 60G,參與隊數(shù)為 627。而 Google Landmark Recognition Challenge 的訓(xùn)練集要 170G 左右,參與隊數(shù)為 483。
另一個決定參與人數(shù)的主要因素是任務(wù)的復(fù)雜程度和生僻程度。純分類任務(wù)比較受歡迎,其次是語義分割等任務(wù)。這些比較受歡迎的任務(wù)特點是門檻比較低,網(wǎng)上找得到大量現(xiàn)成的代碼和模型(如 VGG、ResNet、Unet、SegNet),會調(diào)庫無需深入了解原理甚至可能不用調(diào)參就能跑出像模像樣的結(jié)果。(因為諸如圖片分類等任務(wù)門檻特別低,以至于被某些人當做 AI 從業(yè)者的黑點。對此類黑點的態(tài)度不在本文的討論范圍。)Google Landmark Recognition Challenge 和 Google Landmark Retrieval Challenge 數(shù)據(jù)集大小幾乎一樣,因為 retrieval 問題的門檻相對比較高,后者的參與隊伍數(shù)不到前者的一半。而 NIPS 2017: Targeted Adversarial Attack 這個對抗攻擊任務(wù),只有 65 隊參加。
硬件條件好,經(jīng)驗豐富,能力強的人不太在乎如上兩點因素,并且排名靠前經(jīng)常霸榜的人大都是這樣的人,因此一個人的期望排名和參與總隊伍數(shù)并非是線性關(guān)系。——譬如說,我在兩千隊參與的比賽中得了第 16,那么同樣的水平和發(fā)揮,我在六七百隊參與比賽中就能進前 10 嗎?沒那么容易,事實證明我在六七百隊參與的比賽中依然是第十幾名。當然這里沒有考慮到運氣成分,只是個粗略的例子。
由于我抱以上述觀點,顯而易見我個人看重絕對排名勝于 Top 百分比。但會有很多人偏好于追求一個漂亮的 Top 百分比。我的建議是,想要 Top 百分比好看,或者目標是銅牌和銀牌的同學(xué)應(yīng)該多參加人多的比賽。人再多,Top 10% 都保證有銅牌,Top 5% 都保證有銀牌;而人多的情況下進 Top 10% 甚至 Top 5% 的幾率也大。(金牌的規(guī)則不一樣,隊伍總數(shù) 1000+ 的情況下金牌數(shù)只有 10+0.2%*隊伍總數(shù)。參見 Kaggle Progression System)
2. Public Leaderboard 陷阱
數(shù)據(jù)集小的比賽雖然門檻低,卻并不真的簡單容易。較小的樣本量會導(dǎo)致驗證集和測試集的樣本分布差異較大。加上由于計算量小,模型迭代(這里指更新?lián)Q代,不是訓(xùn)練一個 iteration)速度快,很容易導(dǎo)致一種后果:overfit 到驗證集上,這種后果導(dǎo)致的常見悲慘結(jié)局是比賽結(jié)束的時候發(fā)現(xiàn) Public leaderboard 成績還不錯,但是 Private Leaderboard 上的排名一落千丈(通常 Public Leaderboard 會被當成是某種意義上的驗證集)。例如 Statoil/C-CORE Iceberg Classifier Challenge 的兩個 leaderboard 上有很多人有一百多甚至兩百多的排名變化,相比較而言,數(shù)據(jù)量大了的三個數(shù)量級的 Cdiscount’s Image Classification Challenge 絕大部分人排名都沒有變化,少數(shù)有 1~2 名的浮動。
對此我只有一句空洞的建議:合理的 evaluation 策略至關(guān)重要。Kaggle 排名第一位的 bestfitting(真名 Shubin Dai,中國人)稱:
A good CV is half of success. I won’t go to the next step if I can’t find a good way to evaluate my model.
———鏈接:Profiling Top Kagglers: Bestfitting, Currently #1 in the World
這些大佬們每次在比賽結(jié)束公布 Private Leaderboard 的時候排名都比較穩(wěn)定,不太容易下降很多。可見看似是取決于運氣的排名大震蕩,在大佬手里是有辦法控制的。這大概就是真功夫吧。
3. 馬甲和私享代碼
在數(shù)據(jù)集小的比賽中,由于迭代速度比較快,每天提交的次數(shù)又有限制(大部分比賽是 5 次),所以經(jīng)常會有人注冊小號來提交結(jié)果。在數(shù)據(jù)集較大的比賽中,后期也偶有這樣的現(xiàn)象。有的人在排名比較好的時候會私下里把代碼分享給別人(比如同學(xué)),以求一人得道雞犬升天……。我在比賽中見過幾次別人注冊馬甲或私享代碼。譬如說一夜之間就冒出了一堆三無賬號,成績還都差不多?;蛘咴诔煽儗?shù)極其敏感的任務(wù)中一次提交就飛進 Top5%,一發(fā)入魂。一人多號和私享代碼是違背比賽精神的,也是 Kaggle 明令禁止的,并且也是 Kaggle 會探測和封殺的??杀氖?,經(jīng)常會有中國人這樣做。為什么我這么確定?因為有些賬號的 ID 用的是拼音,或者地址選了 China。真是又壞又蠢,作弊本已可恥,卻還要披著中國人的形象。大概是覺得自己聰明,占了便宜卻無人知曉吧……然而最終這些賬號都被主辦方踢出了比賽或者刪號處理。
4. 刷全站排名
全站排名取決于你在過往比賽中取得的總積分,積分公式如下圖:
截圖來源:Improved Kaggle Rankings(圖侵刪)
積分是隨著時間呈指數(shù)衰減的。這意味著,如果要刷高自己的排名最高紀錄,那么參加幾次間隔很久的比賽,不如參加幾次間隔很短的比賽。
另外參加任何的比賽都不會減分,所以片面地追求全站排名不太在乎提高自身水平的,可以考慮在海量的比賽中打醬油。這是一個病態(tài)無聊但可行的策略。
5. 更多的 supervision
在絕大部分的比賽當中,在訓(xùn)練集上做額外的標記都是不違反規(guī)則的,只要在規(guī)定的時間(有些比賽是 deadline 的兩周以前)以前上傳到討論區(qū)和其他參賽者分享。譬如說,在魚類識別的任務(wù)中,你可以用 bounding box 標記出魚的位置。在海獅計數(shù)的任務(wù)中你可以用 mask 來標記出每一個屬于海獅的像素。這些額外的標記通常都能幫助訓(xùn)練出更好的模型。但開銷也不小。另外要注意的是,在測試集上做標記是明令禁止的作弊行為。
六、其它
1.參加計算機視覺類的比賽需要多少 GPU
一兩塊 Titan X, 1080 或 1080Ti 就夠了。一塊 980 也勉強可以。四塊以上的 GPU 當然更好,但 GPU 多了其實很難充分利用到。運算速度快到一定程度,人腦 debug、分析問題、想 idea 的時間就成了主要的速度瓶頸。如果不怎么分析問題,不怎么想 idea,走無腦窮舉試錯的路線,以圖速度或圖省事,很容易走偏。高手們會根據(jù)自己的經(jīng)驗和直覺來快速嘗試不同的模型,所以駕馭得了更多 GPU。如果你有“只要給我更多的 GPU 我肯定能大幅提高排名”這樣的自信,不妨試試 aws 上的 spot instance,如果確實如此,那就可以攢錢或求贊助來入手 GPU 了。
誠然,小數(shù)據(jù)集的比賽對 GPU 要求很低,甚至 750M 這樣的 GPU 也可以用。但是因為迭代速度太快,以及 leaderboard 每天都有大浮動,這樣的比賽參加起來特別費肝……
2. 什么樣的排名算是一個好的排名
Jeremy Howard 在 2017 年年初或 2016 年年末(記不清了)的 fast.ai 的教學(xué)視頻里(出處懶得求證了)說:排進 Top 50%,說明你的模型還 OK;排進 Top 10%,說明你是這個領(lǐng)域的專家;排進 Top 1說明你是世界上最頂尖的專家。他的這段話過于樂觀了。很多時候排名看起來還可以,只是因為真正的(訴諸純潔:P)專家們和大佬們大多沒有時間參加 Kaggle 而已。但這么想似乎也是有失公允的,因為菜鳥和外行們也大都沒有參加 Kaggle。所以誰知道呢……?
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。