0
| 本文作者: 汪思穎 | 2018-06-08 09:50 |
雷鋒網 AI 研習社按,本文作者 dawnbreaker,首發于知乎,雷鋒網 AI 研習社獲其授權轉載。
我從 2017 年年初開始接觸 Kaggle。曾翻閱知乎上很多關于 Kaggle 的回答和文章,然而逐漸發現大部分文章中提到的經驗和技巧是針對傳統 machine learning 類比賽的,對計算機視覺類的比賽并不適用。此刻已是 2018 年 6 月,我也參加過了多次比賽,或多或少有了一些自己的觀點和感想。因此我寫這一篇文章希望對現存文章進行一定程度的補充,以供剛剛接觸 Kaggle 計算機視覺(CV)類比賽的同學參考。盡管此文會充斥個人觀點和猜測,我會盡量提供論據并淡化感情色彩。這是我在知乎的第一篇文章,希望大家能夠多多鼓勵和批評。
一、我的成績
第一次 The Nature Conservancy Fisheries Monitoring
排名: 16th of 2,293 ? Top 1% ? 角色:隊長。另一個隊員叫孫鵬,是同一實驗室的同學
第二次 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% ? 擔任角色:單刷
并列第五次 Google Landmark Retrieval Challenge
排名: 22th of 218 ? Top 11% ? 角色:單刷。基本上只用 landmark recognition 比賽的代碼跑了一下,沒有進行調參等嘗試,完全是投機取巧。
這六次比賽皆為計算機視覺類的任務。我還曾試圖參加 TensorFlow Speech Recognition Challenge 這個語音識別類的比賽,最終因為自己過于外行和精力不足知難而退。
以上就是我的全部比賽經歷。
二、Kaggle上的兩個世界
Kaggle 的比賽任務大致都是根據已知信息,對測試集里的數據進行某種預測。按照主流方法是否涉及到 deep learning 來分,大概有兩種比賽:
A. 一種比賽比較適合傳統的 machine learning 方法,要想取得好成績,可能要在 feature engineering 和 ensemble 方面大做文章。但基本用不上 deep learning,因此有沒有好的 GPU 無關緊要。這類比賽的例子有房價預測等:
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. 另一種比賽現階段主流的解決方案是各種深度神經網絡,主要以計算機視覺類為主,任務包括 image/video classification, object detection, image masking。偶爾也有語音識別類任務。迄今為止我參加過的比賽都是這一種。參加此類比賽對硬件有一定程度的要求。比如說有一個臺式機和一塊或多塊 Titan X/1080ti 會對模型的迭代幫助很大。但用筆記本 GPU 甚至完全不用 GPU 并且排名靠前的人也是有的:
例1:我的同學孫鵬,用筆記本上的 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 對這兩類比賽之一表現出了明顯的偏好。如砍手豪因為缺少用來訓練神經網絡的硬件,而傾向于參加 A 類比賽(參見:《零基礎自學兩月后三月三次輕松進入kaggle比賽top20小結》)。而我自己迄今參加的都是 B 類的比賽,原因是自己習慣于處理計算機視覺類的任務,而對傳統 machine learning 任務尤其是時序預測方面了解比較少,不想進去墊底。如此一來 Kaggle 上仿佛存在著兩個不同的世界。A、B 類比賽都很投入地去參加的人當然也是存在的,只是據我所見大部分人都傾向于參加其中一類。
我在此強調這兩類比賽的區別,一個重要原因是,我發現迄今為止知乎上大部分的 Kaggle 入門指南大都是針對 A 類比賽的。例:
參加 Kaggle 競賽是怎樣一種體驗? - Naiyan Wang 的回答 - 知乎
參加 Kaggle 競賽是怎樣一種體驗? - Alex Hsu 的回答 - 知乎
零基礎自學兩月后三月三次輕松進入 Kaggle 比賽top20
B類比賽的文章/回答則少得多,例:
參加 Kaggle 競賽是怎樣一種體驗? - AI 研習社的回答 - 知乎
Kaggle 的比賽在 Machine Learning 領域中屬于什么地位? - 幻云羽音的回答 - 知乎
我希望本文可以對關注 B 類比賽的 Kaggler 提供一些參考。
三、靠套路而豪無創新究竟能得到怎樣的成績?
有人說 Kaggle 比賽全靠套路。這句話隱含的意味是要想在 Kaggle 上獲得好成績,靠的是套路而不是智慧和靈感,或者靠的不是真正的技術。如果去杠的話,我們也可以說發 paper 也是靠套路。但我想,即使真的是靠套路,也未必是一件完全的壞事,套路中也能體現高下之分,套路中也能體現出能力的強弱吧。很多 Kaggler 的成績都是比較穩定的。比如 bestfitting 連續在 6 個比賽中得了 Top 3。比如 Fangzhou Liao 四次參加比賽全部都是冠軍。而我大部分時間都進不去 Top10,也從未出過 Top30,大概是因為我總也沒參透 Top10 選手的套路,而排名 30+ 的參賽者總也沒參透我的套路吧。
那么靠套路而豪無創新究竟能得到怎樣的成績?我來試圖給出一個下界出來:
1. 在Carvana Image Masking Challenge 中我的第一個 baseline 模型是 Unet,而且圖省事用的是 pytorch-CycleGAN-and-pix2pix 中的 Unet。為了趕快跑出個結果我把圖片從大約 1000x700 縮小成了 256x256 大小。沒有經過任何調參的第一次提交結果是(Private Leaderboard) Dice coefficent = 0.985517,比賽結束時這個成績可以排到 top 72%。把圖片大小改成 768x512 之后,未經任何其他修改,成績是 coefficent = 0.995050,比賽結束時可以排到 top 53%。
2. 在 Cdiscount’s Image Classification Challenge 中我的第一個 baseline 模型是 Pytorch 的 Resnet101,第一次提交的成績是 Accuracy = 0.71929,比賽結束時這個成績可以排進 Top 12%。
3. 在 Google Landmark Recognition Challenge 中我的第一個 baseline 模型是 ResNet50,第一次提交的成績是 GAP = 0.115。我后來在討論區把這個模型的訓練公開了,即便如此,這個成績在比賽結束時居然也可以排到 Top 14%。我的第二個 baseline 模型 DELF 成績是 GAP = 0.203,比賽結束時可以排進 top 4%!
4. 在 Google Landmark Retrieval Challenge 中我套用了 Recognition 中使用的 DELF 代碼,第一個模型即是最后一個模型,沒有調優過程,排名 11%.
5. The Nature Conservancy Fisheries Monitoring 是個 two-stage 比賽,兩個 stage 用的測試集不同,并且 stage 1 的成績已被主辦方清空所以我無法判斷我們第一個 baseline 模型可以在最終的 leaderboard 上排第幾。
6. Statoil/C-CORE Iceberg Classifier Challenge 這個比賽我是打醬油的,前期的實驗細節我手頭暫時缺失。
以上經驗表明,只要選擇了與任務相對應的 state-of-art 模型,在代碼無 bug,沒有實驗設置錯誤的情況下,排進 Top 50% 甚至 Top 15% 難度很小。那么另外的 50%~85% 的參賽者出了什么問題呢?我猜可能原因有如下幾種:
1. 根本不知道 state-of-art 模型是什么,也不知道怎么檢索或者沒有檢索的意識。
例:想強行套用mnist分類的方法來解決 image retrieval 問題。
2. 不想離開心理舒適區,而選擇自己相對比較熟悉或容易上手的工具、庫和模型。
譬如說因為喜歡用 Keras 或者 Keras 剛入門而只用網上找得到源碼的基于 Keras 的模型。
3. 或多或少知道 state-of-art 模型的存在,但硬件條件有限,而選擇對計算資源要求不高的模型。
例:因為硬盤小或網速慢而下載縮小幾倍的圖片代替原圖來進行訓練的。
4. 代碼有 bug,debug 苦手。
5. 實驗設置有問題。比如存在邏輯錯誤或者參數有嚴重問題。
四、參加比賽有什么好處
至于說為什么有 50%~85% 之多,如果說不是向來如此,也許是最近幾年 Kaggle 更火了,入門者也更多了吧。我去年(2017)在國內已經發現很多人在求職簡歷里寫 Kaggle 比賽經歷。至于 Kaggle 比賽經歷對求職有多大好處我還不能確定。值得一提的是,我在參加第一次比賽感覺堅持不下去的時候,是看了 @lau phunter 的帖子堅持下去的:
2017-8-22 更新:兩年過去了大家參加 Kaggle 熱情高漲標準也水漲船高,以下標準請浮動一級。
原答案:
獲獎的都是有真本事的人,在上面練幾個題目得個好名次,十分能證明你對數據科學這個領域的實踐和理解。我現在招人的時候幾乎是這個標準:
寫上參加過 Kaggle 比賽,我會看簡歷。
得過一次 10%,我會給電話面試。
得過 2 次或者以上 10%,我會給 on site 面試。
得過一次前 10,我們會談笑風生。
樓主加油。
雖然水漲船高,總歸有人認可是好事。
我想從一個平常人的角度來討論 Kaggle 比賽能給我們帶來什么。我先來舉幾個不適合平常人的角度:
1. 一個網上經常被討論的話題,就是“paper 重要還是比賽成績重要”。我想,能考慮這個問題的人并不適用那種很極端的情況:例如 ILSVRC(Imagenet) 如果能得第一自然也能把方法發到頂會上去。——ILSVRC 能得冠軍的人根本不會疑惑這種問題吧。
2. “如果進了前幾名還可以獲得獎金。”如果不是 Grandmaster 的級別(例:Vladimir Iglovikov 一年內獲得獎金 $28k),平常人的收益風險比恐怕還不如去搬磚。
而平常人真正容易面對的情況是,發頂會 paper 被拒或者根本寫不出來,參加比賽成績不算拔尖或者被吊打。我認為一個人如果花時間可以換來頂會一作,那么不參加 Kaggle 也沒有什么遺憾。
Kaggle 常年都有各種比賽,有整理好的數據集,有各種 kernel 和帖子教你怎樣下載和使用數據集,甚至會給出一些 baseline 代碼。獲勝者也會分享他們的 solution。這些特點對于那些想要嘗試一些曾經沒做過計算機視覺任務的人來說是十分新手友好的。這里的新手指代的不一定是計算機視覺方面完全的新手,比如說如果你本來只熟悉物體識別,想嘗試一下語義分割,那么 Kaggle 也可能很適合你。
Kaggle 還有一大特色就是實時的 leaderboard,非常殘酷。如果你什么都不做,你的比賽名次只會下降。這會造成一種心理的刺激,給你壓力/動力讓你改善模型——當然這也是一種精神折磨。
我還有一個感想是:Kaggle 比賽給了每個 AI 愛好者被考驗的免費機會。可以讓一些喜歡空想和嘴炮的人檢查一下自己是不是如同想象的那般厲害。但這個感想的詭異之處在于,由于我上文中提到的,只要正常跑通一個 ResNet101 就可能進 Top 15%,而或許有人覺得 Top 15% 很了不起,這樣一些喜歡空想和嘴炮的人參加 Kaggle 之后或許真的覺得自己很厲害了。So paradoxical……!
還有就是會認識很多志同道合的網友,這一點不展開討論了。
五、陷阱和一些技巧
1. 每場比賽會有多少人參與?
計算機視覺類比賽用到的數據通常是圖片和視頻,無論是空間占用還是計算量都比較大,大到很多人不得不因為硬件資源,或處理大規模數據的經驗和能力問題,而不愿意參與數據集較大的比賽。這導致了一場比賽的參與人數和數據量強相關。小數據集的例子如 2018 Data Science Bowl 訓練集只有 80M 左右,參與隊數高達 3634,Statoil/C-CORE Iceberg Classifier Challenge 訓練集只有 43M,參與隊數高達 3343。數據集比較大的如 Cdiscount’s Image Classification Challenge 訓練集 60G,參與隊數為 627。而 Google Landmark Recognition Challenge 的訓練集要 170G 左右,參與隊數為 483。
另一個決定參與人數的主要因素是任務的復雜程度和生僻程度。純分類任務比較受歡迎,其次是語義分割等任務。這些比較受歡迎的任務特點是門檻比較低,網上找得到大量現成的代碼和模型(如 VGG、ResNet、Unet、SegNet),會調庫無需深入了解原理甚至可能不用調參就能跑出像模像樣的結果。(因為諸如圖片分類等任務門檻特別低,以至于被某些人當做 AI 從業者的黑點。對此類黑點的態度不在本文的討論范圍。)Google Landmark Recognition Challenge 和 Google Landmark Retrieval Challenge 數據集大小幾乎一樣,因為 retrieval 問題的門檻相對比較高,后者的參與隊伍數不到前者的一半。而 NIPS 2017: Targeted Adversarial Attack 這個對抗攻擊任務,只有 65 隊參加。
硬件條件好,經驗豐富,能力強的人不太在乎如上兩點因素,并且排名靠前經常霸榜的人大都是這樣的人,因此一個人的期望排名和參與總隊伍數并非是線性關系。——譬如說,我在兩千隊參與的比賽中得了第 16,那么同樣的水平和發揮,我在六七百隊參與比賽中就能進前 10 嗎?沒那么容易,事實證明我在六七百隊參與的比賽中依然是第十幾名。當然這里沒有考慮到運氣成分,只是個粗略的例子。
由于我抱以上述觀點,顯而易見我個人看重絕對排名勝于 Top 百分比。但會有很多人偏好于追求一個漂亮的 Top 百分比。我的建議是,想要 Top 百分比好看,或者目標是銅牌和銀牌的同學應該多參加人多的比賽。人再多,Top 10% 都保證有銅牌,Top 5% 都保證有銀牌;而人多的情況下進 Top 10% 甚至 Top 5% 的幾率也大。(金牌的規則不一樣,隊伍總數 1000+ 的情況下金牌數只有 10+0.2%*隊伍總數。參見 Kaggle Progression System)
2. Public Leaderboard 陷阱
數據集小的比賽雖然門檻低,卻并不真的簡單容易。較小的樣本量會導致驗證集和測試集的樣本分布差異較大。加上由于計算量小,模型迭代(這里指更新換代,不是訓練一個 iteration)速度快,很容易導致一種后果:overfit 到驗證集上,這種后果導致的常見悲慘結局是比賽結束的時候發現 Public leaderboard 成績還不錯,但是 Private Leaderboard 上的排名一落千丈(通常 Public Leaderboard 會被當成是某種意義上的驗證集)。例如 Statoil/C-CORE Iceberg Classifier Challenge 的兩個 leaderboard 上有很多人有一百多甚至兩百多的排名變化,相比較而言,數據量大了的三個數量級的 Cdiscount’s Image Classification Challenge 絕大部分人排名都沒有變化,少數有 1~2 名的浮動。
對此我只有一句空洞的建議:合理的 evaluation 策略至關重要。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
這些大佬們每次在比賽結束公布 Private Leaderboard 的時候排名都比較穩定,不太容易下降很多。可見看似是取決于運氣的排名大震蕩,在大佬手里是有辦法控制的。這大概就是真功夫吧。
3. 馬甲和私享代碼
在數據集小的比賽中,由于迭代速度比較快,每天提交的次數又有限制(大部分比賽是 5 次),所以經常會有人注冊小號來提交結果。在數據集較大的比賽中,后期也偶有這樣的現象。有的人在排名比較好的時候會私下里把代碼分享給別人(比如同學),以求一人得道雞犬升天……。我在比賽中見過幾次別人注冊馬甲或私享代碼。譬如說一夜之間就冒出了一堆三無賬號,成績還都差不多。或者在成績對參數極其敏感的任務中一次提交就飛進 Top5%,一發入魂。一人多號和私享代碼是違背比賽精神的,也是 Kaggle 明令禁止的,并且也是 Kaggle 會探測和封殺的。可悲的是,經常會有中國人這樣做。為什么我這么確定?因為有些賬號的 ID 用的是拼音,或者地址選了 China。真是又壞又蠢,作弊本已可恥,卻還要披著中國人的形象。大概是覺得自己聰明,占了便宜卻無人知曉吧……然而最終這些賬號都被主辦方踢出了比賽或者刪號處理。
4. 刷全站排名
全站排名取決于你在過往比賽中取得的總積分,積分公式如下圖:

截圖來源:Improved Kaggle Rankings(圖侵刪)
積分是隨著時間呈指數衰減的。這意味著,如果要刷高自己的排名最高紀錄,那么參加幾次間隔很久的比賽,不如參加幾次間隔很短的比賽。
另外參加任何的比賽都不會減分,所以片面地追求全站排名不太在乎提高自身水平的,可以考慮在海量的比賽中打醬油。這是一個病態無聊但可行的策略。
5. 更多的 supervision
在絕大部分的比賽當中,在訓練集上做額外的標記都是不違反規則的,只要在規定的時間(有些比賽是 deadline 的兩周以前)以前上傳到討論區和其他參賽者分享。譬如說,在魚類識別的任務中,你可以用 bounding box 標記出魚的位置。在海獅計數的任務中你可以用 mask 來標記出每一個屬于海獅的像素。這些額外的標記通常都能幫助訓練出更好的模型。但開銷也不小。另外要注意的是,在測試集上做標記是明令禁止的作弊行為。
六、其它
1.參加計算機視覺類的比賽需要多少 GPU
一兩塊 Titan X, 1080 或 1080Ti 就夠了。一塊 980 也勉強可以。四塊以上的 GPU 當然更好,但 GPU 多了其實很難充分利用到。運算速度快到一定程度,人腦 debug、分析問題、想 idea 的時間就成了主要的速度瓶頸。如果不怎么分析問題,不怎么想 idea,走無腦窮舉試錯的路線,以圖速度或圖省事,很容易走偏。高手們會根據自己的經驗和直覺來快速嘗試不同的模型,所以駕馭得了更多 GPU。如果你有“只要給我更多的 GPU 我肯定能大幅提高排名”這樣的自信,不妨試試 aws 上的 spot instance,如果確實如此,那就可以攢錢或求贊助來入手 GPU 了。
誠然,小數據集的比賽對 GPU 要求很低,甚至 750M 這樣的 GPU 也可以用。但是因為迭代速度太快,以及 leaderboard 每天都有大浮動,這樣的比賽參加起來特別費肝……
2. 什么樣的排名算是一個好的排名
Jeremy Howard 在 2017 年年初或 2016 年年末(記不清了)的 fast.ai 的教學視頻里(出處懶得求證了)說:排進 Top 50%,說明你的模型還 OK;排進 Top 10%,說明你是這個領域的專家;排進 Top 1說明你是世界上最頂尖的專家。他的這段話過于樂觀了。很多時候排名看起來還可以,只是因為真正的(訴諸純潔:P)專家們和大佬們大多沒有時間參加 Kaggle 而已。但這么想似乎也是有失公允的,因為菜鳥和外行們也大都沒有參加 Kaggle。所以誰知道呢……?
雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知。