大資料文摘出品
編譯:zeroInfinity、笪潔瓊
Kaggle比賽應該是資料競賽中公認含金量最高的那個。每場比賽,參加的隊伍至少上千人,也並非每次都次都能脫引而出,一不小心就要陪跑。
一位剛剛參加了kaggle孟加拉語手寫字位分類比賽的小哥就剛剛“陪跑”了一場,但是從這次的失敗經歷中,他總結了一套“失敗方法論”。文摘菌編譯了這篇文章,希望各位也能從這位Kaggle失敗者的經驗裡,就像梯度下降模型一樣,不斷從錯誤中學習如何更正。
enjoy!
幾個星期前,Kaggle的孟加拉語手寫字位分類比賽結束了。
孟加拉語是世界上排名第五的語言。這項挑戰希望能在孟加拉語識別方法上有所改進。孟加拉語的字母有49個字母和18個變音符號,這意味著有很多可能的字素。
在本次比賽中,我們要能夠做到分類這些字素的三個獨立部分的類別-字素根,母音變音符號和子音變音符號。
比賽超過兩千只隊伍參加,起初我是個人參賽,但過了一段時間,就成功組了一個五人團隊。我以及團隊在這項比賽上花費了大量的時間和資源,結果最後只得到了第254位,沒有獎牌。
我對這個結果感到很沮喪,在家裡消沉了很長一段時間。
在這段消沉的時間裡,我認真反思了自己的所作所為以及思考方式,大量閱讀頂尖團隊的解決方案,並吸取了一些經驗教訓。
我認為這些方法是通用的,可以應用於任何比賽。它們可以大致分為幾個主題:思維模式和常用方法,編碼實踐,以及為比賽做好準備。
搭建工作環境
訓練模型是kaggle比賽的主要部分,因此有必要為此做準備。
Kaggle的標準配置很好,但是GPU的時間限制很嚴格-每週只有30小時。 所以跑模型,通常都在我自己的電腦上或在雲伺服器中執行。
首先,必須設定一個工作環境,可以使用pip,conda或其他方式完成。
最好在kaggle上檢查庫的版本,並在您的環境中安裝相同的版本:不同的版本可能會有不同的API介面或者不同的邏輯。
硬體配置
圖來自whatech
當然,另一個重要的事情是硬體本身。如果擁有大量資料,則在單個顯示卡上訓練單個模型,就可能需要一天甚至更長的時間。
值得一提的是,執行實驗通常比訓練最終模型要花費更多的時間,因為需要嘗試很多不同的方式。
我的電腦上有2塊1080ti,但也不夠用。 我已經在Google Cloud上多次租用了GPU,但價格昂貴,因此我開始尋找其他方法。
後來聽說最近Hostkey,他們提供租賃網路服務。並且有一個促銷計劃:
在大型比賽的場地為獲獎者提供免費的GPU伺服器,以供他們在進一步的比賽,訓練或與資料科學相關的個人專案中使用。
作為交換,參與者應在社交媒體上分享他們的使用心得。
起初,我有一臺4x1080ti的伺服器。環境設定沒有問題,很快我就開始訓練模型。
模型在單個GPU上的執行效果很好,我就開始逐漸增加所用顯示卡的數量, 2個,3個GPU都運作良好,但是同時使用4個GPU的實驗失敗了,沒有任何反應。
技術支援迅速做出反應,並在幾天之內調查清楚了該問題。事實證明,伺服器本身存在一些問題-處理器無法跟上4x1080ti的全部利用率。於是,我切換到另一臺伺服器:2x2080ti。起初有一個小問題,因為動力不足,但是當工程師又添加了另一個電源,問題就解決了。
從那時起,我在這個伺服器上運行了許多模型,並且一直執行良好。它的使用者體驗很合我的胃口,因此我決定將來繼續使用Hostkey的伺服器。
擁有一個有效的工作流水線
圖來自qiita
擁有一個有效率的工作流水線非常重要。這裡的流水線是指用於準備訓練資料,訓練本身和推理的整體指令流程。使用一些搭建好的高階框架固然值得,但是從頭開始編寫自己的程式碼更好。主要好處是可以快速更改引數,並確保所有基本程式碼都能正常工作,就可以專注於更多思考。
在這次比賽開始,我在Catalyst中使用Jupyter API,但由於它存在一些問題而很快停止了。一段時間後,經我的隊友推薦,我開始自己配置在Catalyst上的API。它雖然更適合我,但是的確花了很多時間來適應它。
而我的一個隊友使用fast ai,可惜由於fast ai的風格獨特,我很難理解它。
因此,我認為最好選擇專注一種方法並堅持下去。
程式碼最佳化
有人評論,kaggle競賽的程式碼不太好。實際上,大家瘋狂迭代,人們通常會花時間嘗試一些新想法,而不是編寫更好的程式碼。但這樣做也不是好選擇。
有時,小的程式碼最佳化會產生巨大的影響。如您在螢幕截圖中所見,最佳化後處理速度可能提高30倍。訓練模型速度將更快,因此做事使用正確的方法也很重要。
另一方面……
不要盲目相信論壇的其它程式碼和想法
Kaggle很棒,也有很多很棒的notebook可供參考,還有一些論壇可以找到很棒的思路,對嗎? 不一定。
儘管論壇上有很多高質量的notebook和思路,但也會存在一些問題:
有些notebook裡的程式碼語法有錯誤,會導致程式碼跑的時候報錯,某些思路復現會報錯以及其它的問題;
最令人憂桑的是,論壇中的某些思路可能會誤導人。
這一切並不是因為人們故意幹壞事,而是很多思路無法獨立發揮作用,有些思路必須搭配特定的模型才能成功,有些需要高評分的模型,等等;
因此,如果您想使用一些程式碼或想法,請首先檢查並驗證它們。
作為這一點的延續:
持續尋找並嘗試新的想法
參加kaggle比賽的最好最酷的事情之一就是它會促使人們得到新的SOTA結果。
為了獲得最佳成績,必須嘗試新事物,比如在arxiv查閱論文,尋找好的部落格文章等等。 但是,僅僅瞭解新方法還不夠,需要嘗試一下。為某個新想法編寫程式碼可能很困難,但這是學習新事物的一種極其有效的方法。即使有些想法行不通,您也會獲得有益的經驗。
不要沉迷調參
圖來自xkcd
這是一個常見的陷阱,有人認為調參可以幫他們獲得優異的結果。這個想法是對的,但也不完全正確。
在競賽中,有必要對引數進行兩次調整:在開始時和結束時。
開始的調整很重要,因為必須針對不同的問題來調整梯度增強和其他模型。不同的目標,不同的深度,葉子的數量和其他因素可能會導致模型在不同問題的分析的得分截然不同。但是,找到一些好的引數後,請固定引數設定,直到比賽快要結束時再更改。
當您新增新功能或嘗試新想法時,請保持引數相同,比較方便進行調參前後結果對比。
當嘗試完所有想法時,就可以再次進行調整會使得分略有增加。
對於深度學習而言,情況則有所不同。
引數的可調節範圍很大:可以調整架構、損失函式、擴充套件、預處理和後處理等。因此,不可避免的是,需要花費更多的時間進行最佳化。但是仍然值得記住的是,一個好的思路比調引數更容易獲得好的結果。
總的來說,只有不斷的吸取教訓以及學習,才能改變陪跑的命運,拿到第一名。
相關報道
https://towardsdatascience.com/what-to-do-when-you-dont-get-any-medal-in-a-kaggle-competition-b54cc433da3