Kaggle 大師訪談:我的 ML 競賽之旅
Kaggle 大師訪談:我的 ML 競賽之旅
https://mp.weixin.qq.com/s/E7Vsz2WpR8f7NhO0gNxBCw
編者按:早在90年代中期,國外一些論壇上就出現了一種另類訪談活動:Ask Me Anything(AMA)。發起AMA後,任何網友都能在留言中寫出自己想要對方回答的一個問題,之後接受採訪的物件會視情況作出解答。近日,Reddit、Kaggle和science.d3.ru三個論壇的網友對獲得Kaggle Grandmaster頭銜的Lyft計算機視覺工程師Vladimir Iglovikov發起了AMA,讓我們一起去探尋他是怎麼馳騁機器學習競賽的。
Vladimir Iglovikov
大家好,我是Vladimir Iglovikov。
自從在大學拿到理論物理學的學位後,我就輾轉到矽谷想成為一名資料科學家。我現在任職於Lyft的自動駕駛汽車部門,主要從事計算機視覺方面的相關應用。
在過去的幾年裡,我在機器學習競賽中投入了大量時間。一方面,它非常有趣;另一方面,它也是提高個人資料科學水平的一種非常有效的方式。我不會說所有競賽都很簡單,也不會吹噓自己在所有競賽裡都取得了不錯的成績。但有時候我也能觸及巔峰,這是我最終能得到“Kaggle Grandmaster”這個頭銜的原因。
在這裡,我想感謝@Lasteg發起了這個AMA,並收集了Reddit、Kaggle和science.d3.ru(俄語)上的提問。大家的問題有很多,在下面,我會選擇性地盡力做一些回答。
以下是我(本人和團隊)曾參與過的一些名次還不錯的深度學習競賽:
- 第10名:Ultrasound Nerve Segmentation(超聲神經分割)
- 第3名:Dstl Satellite Imagery Feature Detection(Dstl衛星影象特徵檢測)
- 第2名:Safe passage: Detecting and classifying vehicles in aerial imagery(安全通道:航空影像中的車輛檢測與分類)
- 第7名:Kaggle: Planet: Understanding the Amazon from Space(Planet:從太空了解亞馬遜)
- 第1名:MICCAI 2017: Gastrointestinal Image ANAlysis (GIANA)(胃腸內窺鏡影象分析)
- 第1名:MICCAI 2017: Robotic Instrument Segmentation(內窺鏡視野內機器人儀器分割)
- 第1名:Kaggle: Carvana Image Masking Challenge(自動識別影象中汽車的邊界)
- 第9名:Kaggle: IEEE’s Signal Processing Society — Camera Model Identification(IEEE訊號處理學會 - 相機模型識別)
- 第2名:CVPR 2018 Deepglobe. Road Extraction(道路提取)
- 第2名:CVPR 2018 Deepglobe. Building Detection(建築提取)
- 第3名:CVPR 2018 Deepglobe. Land Cover Classification(土地覆被提取)
- 第3名:MICCAI 2018: Gastrointestinal Image ANAlysis (GIANA)(胃腸內窺鏡影象分析)
問:除了資料,你有其他的生活嗎?
是的,我有。
我喜歡當揹包客和攀巖。如果你早晨也去舊金山的Mission Cliffs室內攀巖館攀巖,下次見面時我們可以打個招呼。我也喜歡和人一起跳舞伴舞,特別是Blues Fusion舞曲,我經常光顧舊金山的Mission Fusion和South Bay Fusion。
旅遊也是我生活中很重要的一部分。今年春天,我去了白俄羅斯、摩洛哥和約旦。9月,我又在芬蘭、德國和奧地利度過了三個星期。當然,今年最好的體驗還是黑石城的2018火人節。
問:你的身高和體重是多少?
6英尺(1米8),185磅(84公斤)。
我覺得這個問題的答案可能和鍛鍊有關,下面是我在校期間的一些力量舉重資料:
- 最大臥推:225磅
- 最大深蹲:315磅
- 最大硬拉:405磅
問:你是怎麼做到既擁有全職工作,又全天候參加Kaggle競賽的?
在我眼裡,參加Kaggle競賽就是我的第二份全職工作(無償),這麼做的理由很充分——Kaggle上的活躍使用者通常都在尋求轉變,我也不例外。當我從學術界轉向工業界時,我就開始參加競賽。我需要一種有效的方法來測試ML演算法是否適合解決一些潛在問題,需要用它來提升自己的工具使用熟練度,需要把我的思維方式擴充套件到機器學習的新世界。
後來,當我在Bidgely找到第一份工作後,我更加註重Kaggle競賽的參與。那時我白天在做訊號處理任務,晚上則徹夜沉迷在表格資料的競爭中。我其實沒有很好地平衡工作和生活,但每分每秒獲得知識量告訴我:這麼做是值得的。
等到某個時間點,我知道自己已經準備好迎接新階段了,我就跳槽到了TrueAccord,在那裡,我可以做很多傳統機器學習工作。但停止參加Kaggle還是不明智的。於是我把白天用來做傳統機器學習,把夜間和週末用來做深度學習,工作與生活的平衡更糟糕了。儘管如此,我還是學到了很多東西,也順勢成了Kaggle Master。當我能在Lyft獲得一份Level5的工作時,所有努力都得到了回報——對於深度學習而言,自動駕駛是一個非常重要的應用領域。
最後,現在的我並沒有全天候參加Kaggle競賽,但我還在努力學習。我的工作中有許多令人興奮的計算機視覺問題,我正試圖在Kaggle未涵蓋的領域獲得更多知識。當然,我還是會向各種競賽提交自己的作品,但這主要是為了更好地理解參與者面臨的問題和挑戰。只有理解參賽者,我才能更深刻地從論壇分享的資訊中汲取經驗。
問:你覺得哪些日常安排可以幫你提升效率?你是怎麼安排自己的一天的?
首先,我不確定自己是不是很有效率。:)我一直在尋找一種新的方法來優化我的日程。
在日常生活中,一個人需要做的事總比他想做的事多得多,而且它們還不一定是有用的、令人愉快的。這意味著我總要先考慮該做什麼。有幾本書對這個問題進行了很好的討論,這裡我把它們推薦給想提高自己效率的人:
- So Good They Can’t Ignore You: Why Skills Trump Passion in the Quest for Work You Love
- Deep Work: Rules for Focused Success in a Distracted World
在工作日,我會在早上6點起床,然後去攀巖館攀巖,這有助於我保持身材和清醒頭腦。攀完巖我就開車去上班。公司的自動駕駛工程中心在Palo Alto,這讓喜歡住在城裡的我有點憂傷。開車很有趣,但通勤很無聊。為了更有成效地度過通勤時間,我會在車上聽有聲讀物。這不是說我在上下班途中可以專注於閱讀,這些讀物往往包含有用的非技術技能和商業導向,非常適合開車時聽。
我也很想在工作和生活之間保持平衡,但目前還沒做到這點——儘管我還是會花很多時間和朋友聚會或參加其他活動,不過幸好它們中的大多數是在舊金山舉行的。與此同時,我還需要學習,需要保持在機器學習領域的競爭力。這不僅涉及我在辦公室的前途,也影響著更長遠的東西。所以我會在晚上花些時間閱讀技術論文,編寫競賽、業餘專案和開源專案的程式碼。
談到開源專案,我想借此機會推廣一個影象增強庫。這是我和Alexander Buslaev、Alex Parinov、Eugene Khvedchenia從計算機視覺挑戰工作中總結出來的。
最後,為了回答這個問題,我想我還是得提供一些具體的技巧:
- 比起MacBook,我更喜歡Ubuntu + i3——個人表現加成10%。
- 我不常用Jupyter Notebook,只會在做EDA和視覺化時偶爾用用。模型的幾乎所有程式碼都是我自己編寫的,寫程式碼工具是PyCharm,檢查程式碼的工具是flake8,完成後再把程式碼託管到GitHub上。很多機器學習問題其實很相似,所以投資一個沒有太多重複內容、更優質的程式碼庫會有助於加快專案進度,讓你贏在起點。
- 我會盡量手動編寫單元測試。很多人都認可單元測試在資料科學中的重要性,但並不是每個人都會花時間來編寫它們。關於這方面的內容,Alex Parinov寫了一篇很好的文件,詳細介紹了從簡單到複雜的入門方法。如果你準備參加Kaggle競賽,你可以先參考他的做法,在管道里新增更多測試。
- 目前我正在嘗試用DVC進行模型的版本控制,我希望這能讓模型管道和程式碼更具重複利用性。
- 我會避免過多地使用滑鼠,有時候,這也意味著我得把設定好的熱鍵寫在紙上,把紙放在面前,然後儘可能多地使用它們。
- 我不用社交網路。
- 我每天只會檢視幾次電子郵件。
- 每天早上,我都會用Trello為自己建立這一天裡可以完成的任務列表,然後嘗試去完成它們。
- 我會避免讓自己的一天過於碎片化,因為許多工需要專注投入,過於頻繁地轉換焦點沒有益處。
這些建議都很常規,但我實在想不起來自己有什麼“獨門”技巧:)
問:你是怎麼追趕當前領域的技術前沿的?
我並不覺得自己趕上了前沿。如今機器學習領域正值蓬勃發展,我們有讀不盡的論文、競賽、部落格文章和書籍。每當我遇到一個新問題,我就會專注於檢視它的最新進展並進行深入研究。讀懂解答後,我就會切換到下一個。因此,我在自己沒有上手經驗的東西上反而更貼近前沿,我個人覺得這一點倒是可以接受的。
與此同時,對於那些需要深厚專業背景且我有實踐經驗的地方,我也有一張問題清單,只是這份清單太長了,而且正在變得越來越長。這個事實讓我感到安心,因為我的私人repo就像一個程式碼“百寶箱”,能讓我在開始任何新機器學習任務時輕鬆上手。而且這也意味著對於許多問題,我已經實現了非常強大的管道,可以在下次遇到類似問題時加快進度。
我也參加NIPS、CVPR等會議,大會上展示的結果是對我們現在可以做什麼、不可以做什麼的風向指引。
問:幾年前(比如4-5年前),非ML領域的Ph.D(如物理、機械工程等)在求職市場上可能有很大優勢,但現在情況好像不一樣了,如果一個ML工程/開發崗同時有兩個人來應聘,一個是非ML方向的Ph.D,一個是ML方向的碩士,IT/ML行業似乎都更喜歡後者。你本人是物理學的Ph.D,之後轉行到了機器學習,也許在這個問題上有更深刻的認識。
所以你對非ML方向的Ph.D轉行機器學習這件事怎麼看?他的學位有助於求職嗎?和ML方向的碩士相比,這些Ph.D在求職中會有哪些優勢?
這是個難題,我並不知道具體答案,但我會盡力說出自己的想法。
物理學是一門偉大的專業。即便我現在可以回到過去,在物理和CS之間重新做出選擇,我還是會在明知自己會轉行CS的情況下繼續選擇讀物理。
當然,這麼做的主要原因是我對物理學和自然科學很感興趣。機器學習能告訴你我們身邊這個浩瀚無垠、豐富多彩、趣味無窮的宇宙是怎麼運轉的嗎?顯然不行,但物理可以!而且它能做的不止於此!我從物理學轉行機器學習的一個理由是門檻不高,因為物理作為一門專業,它教授的不只是量子力學、相對論、量子場論和其他高度專業化的知識,它也涉及數學、統計學和程式設計技能。這些知識是我輕鬆轉到其他領域的重要橋樑。
物理能教會你以有條理的方式在嚴謹的理論和實驗之間進行操作,這也應該是機器學習從業者的基本素養。如果一個人上不了大學,他是幾乎不可能以自學的方式學會物理和高等數學的。這也使我堅信,深度學習的下一個重大突破將是機器學習與高等數學、物理、化學及其他前沿領域高度融合後的產物。畢竟現在計算機視覺任務要用到的數學只是大一水平。
以上這些都說明,數學並不是入門機器學習的門檻,從業者的過分“偏科”也正是數學、物理、化學和其他STEM學科的知識幾乎無法被用於解決業務問題的原因,是這些專業的畢業生感到自己被背叛了的原因。他們都具備很多專業知識,甚至有博士學位,他們在學術界度過了很多年,但是都得不到一份有意義的高薪工作。
另一方面,現在程式設計技能在任何地方都必不可少,這也是當一個精通數學的人和一個會寫程式碼的人同時求職時,僱主更喜歡選第二個人的原因。
但我相信情況會發生變化。不是現在,而在未來的某個時間點。重要的是大家需要先認清一個現實,就是你在大學裡讀的論文、上的課和你在工作中會用到技能可能不會直接相關。但這不會是一個大問題。通常情況下,你需要先了解工業界資料科學家/軟體開發者的工作內容,如果實在沒法在大學進修,你可以自學。很多從業者其實都是在工作後才學到那麼多東西的。
就我個人經歷而言,當我在研究資料科學的同時準備理論物理學論文時,找工作確實給了我不小的壓力。我沒有資料科學家這個崗位所必需的知識,也不懂矽谷的工作流程,更不瞭解企業對我的期望。就是這樣一個一無所知的我,堅持不停把自己的簡歷一次次投遞給不同的公司,經歷了一輪又一輪的面試失敗,並從每一次失敗中學習經驗,直至通過面試。
我記得有一次被問到論文寫了什麼,當時我用到了量子蒙特卡洛方法,於是試圖向面試官解釋它是什麼、為什麼要用它。聽完我的敘述,面試官看著我問道:“這種技術能怎麼幫助我們提高客戶參與度呢?”
所以對於那些非CS專業人士來說,最有希望的方法是去旁聽計算機系的資料科學課程,並在空閒時間自學資料科學和機器學習。幸運的是,現在有很多這方面的優秀資源。比如你可以在自己專業內找一個想在研究裡採用機器學習方法的教授,或是去科技公司申請ML相關的實習崗,獲得實習機會比直接拿到全職offer容易多了,也更容易轉正。
一般來說,你不應該高估專業、大學對自己就業的影響。當一家公司僱用你時,他們的設想就是付給你錢讓你幫他們解決所面臨的問題。你的學位和專業只是評估你個人能力的一個指標。當然,如果HR沒能從你的簡歷裡看到想要的東西,你就很容易被篩掉,你可能建立的人脈網路——對求職很重要——也會出現斷裂。但是,這不應該影響你選擇什麼專業。
也許我還是太天真了,但是一個人之所以會選擇這個專業,不是因為它有高薪就業前景,而是因為你對這個領域充滿激情。
問:你覺得資料科學/機器學習領域最有趣的問題在哪一方面?我已經完成了近半碩士學習,但卻發現自己還沒想好要深入哪一個子領域。我之前和人聊過這個問題,他斷言未來最有前景的會是演算法開發和scaling(剛好和資料科學/機器學習這種呼叫庫的不同)。你對此有什麼看法?或者你有什麼關於靈活就業的建議?
我想說資料科學/機器學習領域中最有趣的問題遠不是今天的主流問題。主流問題研究現在已經人滿為患了——把機器學習用於信用評分、推薦系統、零售和其他任務——我們已經受夠了把資料對映到資金。試想一下,如果你能把機器學習用於數學、物理學、生物學、化學、歷史、考古學、地質學或任何其他人沒有嘗試過的領域,那麼你可能就會發現自己的那一頭Purple Cow(Yahoo前營銷總監Seth Godin提出的概念)。
關於職業選擇,和生物學、物理學不同,你在資料科學/機器學習領域學到的技能允許你輕鬆從一個領域轉移到另一個領域。當然,開發銀行/對衝基金的交易演算法和開發自動駕駛汽車的演算法不一樣,但它們的差別也不是很大,只要基礎過硬,你就能很快掌握必需技巧。
問:30歲非數學/CS背景的人搞機器學習是不是太晚了?還是剛好能趕上末班車?如果能趕上,你覺得最低要求是什麼?
當然為時不晚。機器學習裡有近90%的技術只要求大一的數學知識,所以你不需要多精通數學。資料科學中使用最廣泛的語言是Python和R,它們都是高階語言,可以輕鬆上手。
我建議你可以適當上一些線上課程,並開始研究Kaggle競賽。雖然很多概念聽上去很陌生,但只要你有足夠的恆心和決心,一切都會水到渠成。
和年齡相關的兩個典例:
- Kaggle Grandmaster Evgeny Patekha:四十歲才開始資料科學生涯
- Kaggle Grandmaster Alexander Larko:五十五歲才開始參加Kaggle競賽
問:你覺得技術領域的正規基礎教育對於在資料科學和Kaggle競賽裡取得成功很重要嗎?你有沒有遇到過反例?
有用是肯定有用的,但也有很多人雖然沒怎麼接受過基礎教育,在競賽裡仍然取得了好成績。一個典型的例子是Mikel Bober-Irizar,他是Kaggle Grandmaster,但還在念高中。
另一個值得關注的點是,你在Kaggle上學到的技能只是你在工業界、學術界工作時所需技能的一小部分。對於那些沒有涉及的知識,基礎教育可以為你提供。
總而言之,即便你高中肄業,你也可以橫行Kaggle。
問:在不租用雲伺服器的情況下,我能用家裡的電腦訓練出高分競賽模型嗎?
我從不在競賽裡用雲服務,但我家裡確實有兩臺效能相對較好的電腦。其中一臺裝了4塊GPU,另一臺裝了2塊。雖然沒有好的硬體條件也能在Kaggle上取得好成績,但缺乏算力會限制你檢驗想法的次數。檢驗的想法越多,最終成績可能會越好。所以如果你得用每週7天、每天24小時訓練模型,我還是建議你投資一下硬體。
同時,擁有一臺功能強大的機器是不夠的,你也需要會編寫可以充分利用它的程式碼。
- 我從Keras換到Pytorch的原因之一是PyTorch中的DataLoader在當時更好用
- 由於imgaug(影象增強Python庫)太慢了,我們寫了albumentations,把CPU利用率提到了100%,同時GPU還有富餘空間
- 為了加快硬碟上jpeg影象的I/O,我沒有用PIL、skimage和OpenCV,而是用了libjpeg-turbo和PyVips
問:你對資料科學新手參加Kaggle有什麼建議嗎?你覺得哪種競賽更適合他們?
參加Kaggle的入門教程有很多,但據我所知,其中最有效的應該遵循以下流程:
- 觀看一些涵蓋python程式設計和機器學習基礎知識的線上課程。
- 在Kaggle上挑選一個競賽,如果你能寫一個端到端的管道進行資料對映,那再好不過。但這對新手來說可能有點難,所以你也可以照搬別人共享的kernel。
- 在PC上執行模型,生成提交,並在Kaggle排行榜上找到自己的排名。在進行這些步驟時,你可能會第一次感受到作業系統、驅動程式、庫版本、I/O問題給你造成的困擾,你得儘早開始習慣它。如果這時你還不瞭解kernel是什麼,沒關係。
- 調參(盲目也行),重新訓練模型並提交預測結果。不要擔心,你的競爭者們都在對模型進行反覆優化,期望得到更好的結果。
- 接著就是學會有技巧地調參,在這個階段,你就要開始掌握機器學習的工作原理和基礎知識,把研究新增進實驗中。學習的方向有很多,其中第一種是上mlcourse.ai、CS231n這樣的線上免費課程,閱讀書籍,學習高等數學、統計學,學會如何編寫更好的程式碼。第二種是儘快掌握和你想要解決的問題相關的術語,專注於它們,更高的Kaggle排名就是你最好的動力。但是切記不要在研究與實驗之間做出選擇——它們必須同步進行。機器學習是一門應用學科,不要把它當成純粹的課本知識:沒有實踐的理論是愚蠢的,沒有理論的實踐是盲目的。
- 比賽結束後,儘管你付出了很多努力,但最終結果可能並不好。不要氣餒,這是意料之中的。你應該多看看論壇,閱讀獲獎者分享的解決方案,嘗試著讓自己有所提到。等下次再遇到相似問題時,你的起點會更高。
- 在其它競賽中重複上述過程,你就可以獲得高分,更重要的是,你積累到了任務、競賽經驗和大量程式碼和管道。
問:你對Kaggle有些競賽發生資料洩漏有何看法?你覺得利用這個漏洞合乎道德嗎?
我得承認,組織比賽是一件非常困難的事,所以當洩漏被發現時,我不會苛責組織者。而且對於參賽者利用資料洩露這種行為,我覺得可以接受。雖然資料洩露會有損競賽的公平性,但它對我個人的影響只是我不能把這個競賽中學到的東西放到類似問題中。我認為Kaggle的管理人員需要建立一個可能會發生資料洩漏的競賽清單,並在競賽開始前認真檢查資料,防止同樣的問題一次又一次地發生,我相信他們正在努力解決這個問題。
問:作為資料科學工程師,你覺得參加Kaggle競賽有多大用處?
這很難說。參加Kaggle競賽能在一些關鍵但非常狹窄的領域提升你的技術水平。它往往考量多種技術的組合使用,所以對一些崗位可能是非常有益的。但它不是萬金油,就我現在從事的自動駕駛汽車領域而言,我從Kaggle上學到的東西只能作為從其他渠道學到的技能的一種有力補充。
同樣的,也許你的競賽技術水平紮實,但那還遠遠不夠。很多東西你需要在行業內實踐過才會懂。
成為Kaggle Master並不是必要的,這個頭銜也沒法證明你會在工作中表現出色。但與此同時,我相信如果一個人是Kaggle Master,他應該能通過HR篩選,得到一個面試機會。
問:如果一個人沒有數學/CS或其他涉及高等數學學科的教育背景,他在Kaggle競賽中的上限是多少(以及更廣泛的資料科學領域)?激情和慾望能讓一個人走多遠?
如果你目標明確而且有很強的學習意識,那無論是Kaggle競賽還是資料科學領域,你一定會到達頂尖水平。最艱難的一步始終是第一步,今天,現在,馬上去做!不要說明天,因為明日復明日,那意味著永遠不會行動。
我看了所有問題,沒有人問我該怎麼找到一個可以幫助自己取得更高排名的人,但我認為這一點很重要。解決這個問題最常見的方法是找一些同樣對這個競賽感興趣的朋友/同事,大家一起討論、開會、分享問題甚至組成團隊。然後有些人要忙這個,有些人得忙那個,雖然團隊成績也許還挺好,但它肯定也就止步於此了。
我有一種更有效、更好的辦法:
- 編寫自己的管道,或是直接複製貼上論壇上共享的管道
- 讓管道以適當的格式把輸入資料對映到提交的檔案中,並生成交叉驗證得分
- 驗證交叉驗證帶來的得分變化是否和排行榜上的排名變化一致
- 進行探索性資料分析,閱讀論壇帖子、論文、書籍和以前類似競賽的解決方案,所有這些工作都要獨立完成
- 在某個時間點,比如競賽結束前的2-4周,這時你會被卡住。你嘗試了所有可以想到的辦法,但始終提高不了排行榜名次。你需要一個新的想法來源
- 這時你可以在自己的“分段”找一些比較活躍的參賽者,和他們交流
- 首先,哪怕只是上漲了一點點預測平均得分,那都可能帶來名次上的顯著提升;其次,你和別人用的方法可能不一樣,分享一些已經嘗試的、未曾嘗試的方法很有幫助;第三,因為競爭最初是針對每個人單獨進行的,所有人都看了資料、編寫了管道,所有人都把競賽置於其他活動之上,此時大家的競爭意識更強,也更可能重新整理排行榜。
但更重要的是,人們往往會高估他們在競賽上的付出,低估他們在擁有穩定的管道前會出現的問題數。排行榜就是一個篩選同伴的過濾器,能讓你和你的潛在隊友處於同一位置。
在一些競賽中,特定領域的知識也對良好結果有很大作用,比如有時如果團隊裡有一個不太懂資料科學,但是能看懂醫學成像的人,他也能發揮很大作用。但這種情況相當罕見。
在這裡,我想感謝所有我有幸結識併成為隊友的人們,你們在競賽中讓我領悟頗多:
Artem Sanakoeu,Alexander Buslaev,Sergey Mushinskiy, Evgeny Nizhibitsky,Konstantin Lopuhin,Alexey Noskov,Artur Kuzin,Ruslan Baikulov,Pavel Nesterov,Arseny Kravchenko,Eugene Babakhin,Dmitry Pranchuk,Artur Fattakhov,Ilya Kibardin,Liam Damewood,Alexey Shvets,Anton Dobrenkii ,Selim Seferbekov,Alexandr Kalinin,Alexander Rakhlin。
如果你還有其他問題,歡迎在原文下留言評論(需翻牆)。
原文地址:
towardsdatascience.com/ask-me-anything-session-with-a-kaggle-grandmaster-vladimir-i-iglovikov-942ad6a06acd(已刪減部分不重要的內容)