6次Kaggle計算機視覺類比賽賽後感

貪心科技發表於2019-02-27

連結:https://zhuanlan.zhihu.com/p/37663895

我從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的回答 - 知乎 @Naiyan Wang
參加kaggle競賽是怎樣一種體驗? - Alex Hsu的回答 - 知乎 @Alex Hsu

零基礎自學兩月後三月三次輕鬆進入kaggle比賽top20 -- @砍手豪

分分鐘帶你殺入Kaggle Top 1% -- @吳曉暉

Kaggle 入門指南 -- @Linghao Zhang

Kaggle 首戰拿銀總結 | 入門指導 (長文、乾貨) -- @Scarlet Pan

隨機森林——實現Kaggle排名Top2%的利器 -- @胡阿白

Kaggle實戰(2)—房價預測:高階迴歸技術應用 -- @Datacruiser

B類比賽的文章/回答則少得多,例:

參加kaggle競賽是怎樣一種體驗? - AI研習社的回答 - 知乎 -- @AI研習社@鄭華濱@蔣禮斌

我在Kaggle數海獅 -- @outrunner

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,我們會談笑風生。
樓主加油。

作者:lau phunter
連結:zhihu.com/question/3203
來源:知乎

雖然水漲船高,總歸有人認可是好事。

我想從一個平常人的角度來討論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+的情況下金牌數只有 。參見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.刷全站排名

全站排名取決於你在過往比賽中取得的總積分,積分公式如下圖:

6次Kaggle計算機視覺類比賽賽後感

截圖來源: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 10說明你是世界上最頂尖的專家。他的這段話過於樂觀了。很多時候排名看起來還可以,只是因為真正的(訴諸純潔:P)專家們和大佬們大多沒有時間參加kaggle而已。但這麼想似乎也是有失公允的,因為菜鳥和外行們也大都沒有參加kaggle。所以誰知道呢……?

相關文章