我的一年AI演算法工程師成長記

2019-09-13 09:27:35


作者 | 張怡

來源 | Datawhale(ID:Datawhale)


【導語】經常有朋友私信問,如何學python?如何敲程式碼?如何進入AI行業?正好回頭看看自己這一年走過的路,進行一次經驗總結。這是一篇關於如何成為一名AI演算法工程師的長文,來看看你距離成為一名AI工程師還有多遠吧。


具體內容:

  • 我是因為什麼開始接觸敲程式碼

  • 人工智慧/機器學習/深度學習

  • 自學如何尋找學習資料

  • 如何選擇程式語言/框架

  • 校招/社招/實習/面試經驗

  • 一碗雞湯


宣告:

  • 本篇內容均屬於個人觀點,建議採納對自己有用的經驗,如有疏漏,歡迎指正,共同進步!

  • 2017年5月開始第一份實習 / 2017年7月開始學敲程式碼 / 2017年11月碩士畢業

  • 擅長的程式語言:R / Python

  • 不花錢報班,全靠自學,最初是因為窮,後來發現“開源”的世界真是太美好了!


我是因為什麼開始接觸敲程式碼?


1、我的第一個模型是什麼?


由於本科是數學,研究生是量化分析,第一份實習是一家金融科技公司,開始接觸所謂的“Fintech”


第一個任務就是做客戶的信用評分卡模型,目的給每個使用者打一個信用分數,類似支付寶的芝麻信用分。這是銀行標配的一個模型,最常見最傳統的演算法用的就是邏輯迴歸。


在課堂上使用的工具是SAS,SPSS,屬於有操作介面的,選單非常齊全,只需要滑鼠點一點就能建模,很好上手。但是SAS這些要付錢的,年費還是相當的貴,所以深圳大部分公司進行資料分析和建模工作都選擇開源免費的R語言或者Python。這就體現了掌握一門程式語言的重要性。


雖然說是建模任務,但是前三個月跟建模基本都扯不上邊。都在做資料清洗,表格整理(攤手),都在library各種包,用的最多的可能是data.table和dplyr。沒辦法,很多模型都有包可以直接呼叫,是最簡單的環節了。其實一開始,我一直在犯很低階的錯誤,各種報錯,沒有library啦,標點符號沒打對啦,各種很low的錯誤犯了一次又一次,而且連報錯的內容都不會看,不知道怎麼去改正。如果你也像我一樣,真的請不要灰心,我就是這樣走過來的。對著錯誤一個個去解決就好了~


當時什麼都不知道的時候,覺得真難呀,每個環節都有那麼多細節要照顧,要學的那麼多,做完一個還有一個,還要理解業務含義。但是當完整的做一遍之後再回頭,就會覺得,其實,也沒那麼難嘛~


2、敲程式碼容易嗎


因為我不是計算機專業的,所以基本上屬於沒怎麼敲過程式碼的那種。


後來發現程式設計師也有好多種類的,前端後端等,因此敲的程式碼種類也很多,才會有幾十種的程式語言,下圖是一些這幾年的主流語言。



實習時我一直被隊友嫌棄很蠢,而且一開始敲的東西怎麼也執行不通,執行出來的都是鬼結果。有n次想放棄的念頭,“我幹嘛一定要敲這玩意兒?”,但也有n+1次想堅持的理由,因為我真的喜歡我正在做的事。為什麼用“堅持”,因為真的不容易。不難,但真的需要有耐心。


一開始我的狀態就是一行行程式碼的執行,一個個命令的熟悉,反覆看,反覆執行。


  • 從敲出第一行程式碼到敲出第一個完整的模型花了3個月
  • 學習XGBoost,光是理論學了3個月,因為前期鋪墊要學的還有adaboost/gbdt和各種機器學習的知識模組
  • 從R切換到python花了1個月
  • 從機器學習(Machine Learning)切換到自動機器學習(Auto Machine Learning)花了2個月
  • 從NLP零基礎到搭建一個智慧問答機器人花了1個月

從一年前的“什麼是過擬合,什麼是交叉檢驗,損失函式有哪些”到後來參加全球人工智慧峰會時都能聽懂的七七八八,會覺得,努力沒有白費呀!


可以看出,經過前面的積累,後面會學的越來越快。


慢慢的就從一開始的那種“唉,怎麼又報錯啊,好挫敗”的心態變成現在的“啊?沒error?感覺不對啊,再查驗一遍吧”這種抖M傾向的人。程式碼虐我千百遍,我已經被磨的沒有了脾氣。


已經有幾個朋友說想轉行了,我何曾沒想過,只是不知不覺中堅持了下來而已。因為熱愛,越虐越停不下來


3、小結

  • 設定一個非常清晰的目標


為什麼第一個寫:“我是因為什麼開始敲程式碼的”,因為動機真的非常重要!

所以,很多人在問我“如何學python?”這種問題時,我的第一回答都是“你學python用來幹嘛?”

在學校也敲打過python,做個爬蟲demo什麼的,因為目的性不強沒多久就放一邊了。清晰的目標就比如說你要做NLP,你要知道NLP的應用有智慧問答,機器翻譯,搜尋引擎等等。

然後如果你要做智慧問答你要知道現在最發達的技術是深度學習,使用的演算法有RNN/LSTM/Seq2Seq/等等一系列。而我的清晰目標是在實習的時候給我的任務。當任務很明確的時候,所需要的語言就明確了,所要學習的演算法也就明確了,很多東西就順理成章了不用一頭亂撞了。


  • 從金融到科技


AI的應用範圍很廣,每一個研究方向都是無窮盡的。由於金融公司很少與影象處理,NLP等技術會有交集,而我強大的好奇心讓我決定去純粹的科技公司一探究竟。目前已投身於智慧家居,目標是Javis


人工智慧/機器學習/深度學習


我經常在公交的廣告牌上看見這些詞,好像哪家公司沒有這個技術就落後了似的。更多的還有強化學習,遷移學習,增量學習等各種學習。


1、這些詞兒之間到底什麼關係

機器學習是人工智慧的一種,深度學習是機器學習的一種。學AI先學機器學習。



2、計算機的“演算法” 與 數學的“演算法” 的區別

理論知識對於AI演算法工程師極其重要。敲程式碼只是思路的一個實現過程。這裡的“演算法”和計算機CS的“演算法”還不太一樣,AI演算法是偏數學推導的,所以數學底子還是需要點的,學的越深,要求越高。面試的時候,很少讓手寫程式碼,90%都是在問模型摳演算法細節。

在學校我是一個不愛記筆記的人,甚至是一個不愛上課的人。但是自從入了機器學習的坑後,筆記寫的飛起~

3、機器學習的框架

按照資料集有沒有Y值可以將機器學習分為監督學習、半監督學習和無監督學習。監督學習是分類演算法,無監督學習是聚類演算法。



機器學習的通用流程和相關技術如下圖:



ML這棵樹還可以有更多的分支。先有個整體感受,再一個一個的解決掉。這裡的知識點也是面試最愛問的幾個,是重點呀!面試過的同學應該都不陌生了。


4、機器學習如何入門

機器學習之大,初學者都無從下手。說白了,機器學習就是各種模型做預測,那麼就需要有資料,要想有好的效果,就要把原始的髒資料洗乾淨了才能用。資料內隱藏的資訊有時候是肉眼不可見的,那麼就需要一些相關技巧來把有用資訊挖出來。所有絞盡腦汁使用的技巧,都是為了能預測的更準確。但是誰也沒辦法做到百分百的命中。


這裡簡單介紹下機器學習的三大塊:傳統的機器學習ML、影象處理CV、自然語言處理NLP

再推薦一個入門神器:

  • Kaggle(www.kaggle.com)


這是一個世界級的最權威的機器學習比賽,已被谷歌收購。上面的賽題不僅很有代表性,還有很多免費的優秀的資料集供你使用,要知道收集資料是機器學習的第一大難題,它就幫你解決了。入門不用立馬參加比賽,把資料下載下來,盡情折騰就好了,要是沒有思路,去網上搜別人的解題筆記和程式碼借鑑一下也很美好~因為這是大家都爭相打榜的比賽,所以你並不孤單。


  • ML入門該參加的賽題(Titanic)



  • 影象入門該參加的賽題(數字識別)



  • NLP入門該參加的賽題(情感分析、quora問句語義匹配)



等做完第一個titanic的比賽應該就有點感覺了。上面4個比賽我都做過,覺得很經典,很適合入門。


5、深度學習的入門演算法有哪些

如今的樣本輸入可以是文字,可以是影象,可以是數字。深度學習是跟著影象處理火起來的。甚至現在這個概念都火過了“機器學習”。

深度學習的演算法主要都是神經網路系列。入門推薦CNN(卷積神經網路)的一系列:

  • LeNet5

  • AlexNet

  • VGG

  • GoogleNet

  • ResNet


自學如何尋找學習資料?


1、開源的世界,美好的世界

“開源”,我的愛!程式碼屆裡開源的中心思想就是,share and free。


對於機器學習,網上的社群氛圍特別好,分享的很多很全面,而且MLer都非常樂於助人。介紹幾個我經常逛的社群,論壇,和網頁:


  • kaggle (www.kaggle.com)


全球最權威的機器學習比賽,已被谷歌收購。賽題覆蓋傳統機器學習、nlp、影象處理等,而且都是很實際的問題,來自各行各業。kaggle是數一數二完善的ML社群了,賽題開放的資料集就很有用,非常適合新手練手。對優秀的kaggler也提供工作機會。


  • github(www.github.com)


全球最大同**友網站,適合搜專案,開源大社群,大家一起看星星,看issue~


  • StackOverFlow(www.stackoverflow.com)


程式碼報錯找它,程式碼不會敲找它!所有與程式碼相關的坑,基本都有人踩過啦。


  • csdn(www.csdn.net)


最接地氣的部落格聚集地,最常看的網頁之一,一般用來搜尋細節知識點或者程式碼報錯時。


  • sklearn(scikit-learn.org/stable)


專業做機器學習100年!各演算法各技巧的例子code應有盡有。


  • medium(medium.com)


創辦人是Twitter的創始人,推崇優質內容,國內很多AI公眾大號的搬運都來自於這裡,medium裡每個作者都有自己獨特的見解,值得學習和開拓眼界,需要科學上網。


  • towards data science(towardsdatascience.com)


與medium很像,需要科學上網。


  • google AI blog(ai.googleblog.com)


谷歌的AI團隊維護的部落格,每天至少更新一篇技術部落格。剛在上海開的谷歌開發者大會宣佈將會免費開放機器學習課程,值得關注一下,畢竟是AI巨頭。


  • 各種大神的技術部落格/個人網站


有很多的網站,會不定期的更新在我的個人部落格裡。


2、有口碑的AI公開課平臺

首先說明我沒有上課,也沒有報班,屬於個人學習習慣問題。但考慮到學習差異性,所以還是總結了口碑排名靠前的課程系列。前提,需要有一定數學基礎,沒有的可以順便補一補。

  • coursera(www.coursera.org/browse)

  • 吳恩達(Andrew Ng)機器學習

  • deeplearning.ai(www.deeplearning.ai)

  • fast.ai(www.fast.ai)


專注於深度學習。Fast.ai的創始人就蠻有意思的,是橫掃kaggle影象處理的高手,不擺架子,也不故弄玄虛。中心思想就是深度學習很簡單,不要怕。fast.ai有部落格和社群。Jeremy和Rachel鼓勵撰寫部落格,構建專案,在會議中進行討論等活動,以實力來代替傳統證書的證明作用。


  • udacity(in.udacity.com)


有中文版,課程覆蓋程式設計基礎,機器學習,深度學習等。


  • 網易雲課堂


3、碎片時間

科技圈也是有潮流要趕的,等你入坑就知道。追最新的論文,最新的演算法,最新的比賽,以及AI圈的網紅是哪些~有條件的開個twitter,平時娛樂看看機器學習板塊還是蠻有意思的,有很多自嘲的漫畫~


推薦幾個我超愛看的AI主題美劇:

  • 矽谷(強推!簡直是我日常生活,太有共鳴了~下飯劇)

  • 西部世界(看的時候不要學我一直在思考如何實現這個那個技術)


4、實用的小技巧

  • 瀏覽器首推 chrome

  • 當閱讀英文網頁呼吸困難時,右擊選擇“翻成中文(簡體)”

    考過雅思和GMAT,曾經我也是一個熱愛英文的孩子,如今跪倒在海量技術文件和文獻裡苟活
  • 搜尋問題一定用google,如果沒解決是你的問題不是google的鍋

baidu???ummm......別為難我......很少用
  • 學會提問很重要,搜尋格式推薦

    語言+問題,例如:python how to convert a list to a dataframe
    直接複製錯誤資訊,例如:ValueError: No variables to save...
    請把所有的問題往上拋,網上查比問人快!總是問別人會引起關係破裂的~
  • 學會順藤摸瓜

    當你讀到一個非常不錯的技術文件時,看完別急著關掉。這可能是一個個人網站,去觀察選單欄裡有沒有【About】選項。或者這也可能是一個優秀的社群,看看有沒有【Home】選項,去看看po的其它的文章。
  • 很多優秀網站都是英文,科學上網必不可少

  • 學習費用不來自課程,可能來自於硬體要求,學生黨要利用好學校資源


5、小結

雖然說了那麼多,但還是要說請放棄海量資料!用多少,找多少就好了!(別把這句話當耳旁風)

資料不在量多而在於內容是有質量保證的。很多課程或者公眾號只管塞知識,你有疑問它也解答不了的時候,這樣出來的效果不好,就像一個模型只管訓練,卻不驗證,就是耍流氓。


如何選擇程式語言/框架


1、首選英語!!!(咳咳,我認真的)

說到底,語言只是工具,不去盲目的追求任何一種技術。根據任務來選擇語言,不一樣的程式設計師選擇不一樣的程式語言。很多人最後不是把重點放在能力而是炫工具,那就有點走偏了。


據觀察,在機器學習組裡R和Python是使用率最高的兩門語言,一般你哪個用的順就用哪個,只要能達到效果就行,除非強制規定。我使用之後的感受是,人生苦短,我用python。


2、用python建個模型到底多難?

演算法任務大致分為兩種,一種是普通演算法工程師做的“調包、調參”,另一種是高階演算法工程師做的,可以自己建立一個演算法或者能靈活修改別人的演算法。


先說說建個模到底有多簡單吧。

  • 有優秀的演算法封裝框架

    tensorflow / caffe / keras /... 

  • Auto ML 是不可阻擋的一個方向

    Auto ML(auto machine learning),自動機器學習。就是你只管丟進去資料,坐等跑出結果來就行了。前一陣子谷歌的CloudML炒的很火,願景是讓每個人都能建模,但畢竟這種服務是要錢的。所以我研究了下開源的auto sklearn框架的程式碼,發現了什麼呢?建模到底有多簡單呢?就,簡單到4行程式碼就可能打敗10年工作經驗的建模師。


再說回來,如果你自己根本不知道自己在做什麼,只能跑出來一個你不能負責的結果,就是很糟糕的,那還不是一個合格的演算法工程師。你的模型必須像你親生的那樣。但是,只要你想,絕對能做到的!


3、學習python電腦上要裝哪些東西

  • Anaconda

    對,就是這麼簡單粗暴,裝這個就ok了。學python的應該都會面臨到底是python2還是python3的抉擇吧。語言版本和環境真的很讓人頭疼,但是Anaconda驚豔到我了,就是可以自定義python環境,你可以左手py2右手py3。


3、推薦幾個python的IDE

  • Spyder

Anaconda自帶的ide。介面排版與Rstudio和Matlab很相似。輸入什麼就輸出什麼結果,適合分析工作,我寫小功能的時候很喜歡用。

  • Jupyter Notebook

Anaconda自帶的ide,屬於web介面的。當你程式跑在虛擬機器,想調程式碼的時候適合用。

  • PyCharm

對於寫專案的,或者程式碼走讀的比較友好。當你需要寫好多python檔案互相import時,特別好用。


5、我的筆記本配置

(不考慮經濟約束的請忽略這條)
  • 牌子+型號:ThinkPad X1 Carbon

  • 推薦配置:i7+16G記憶體+256G(或更多)硬碟

  • 系統推薦:Linux,因為開源,有空可以玩玩


校招/社招/實習/面試經驗


1、如何安排校招

大廠的開放時間會比較早,密切關注網申時間節點:

  • 2019屆的秋招:2019年7月 - 2019年11月

  • 2020屆的春招:2020年2月 - 2020年4月

  • 2020屆的暑期實習:2020年3月 - 2020年5月

  • 2020屆的秋招:2020年7月 - 2020年11月

(以此類推)


2、手撕程式碼能力

建議提早半年開始準備。我的程式碼也是從實習開始敲起,敲了半年才覺得下手如有神哈哈。不要做沒實際意義的課後題,也不要照著書本例題敲,敲完你就忘了,書本這些都是已經排除萬難的東西,得不到什麼成長。

入門修煉:全國大學生數學建模競賽、全美大學生數學建模競賽、kaggle、天池…


3、專案經歷/實習經歷

如果明確自己的職業方向為人工智慧/資料探勘類的,請不要浪費時間去申請其他與技術無關的實習。端茶送水,外賣跑腿,列印紙並不能幫你。當時由於身邊同學都斷斷續續出去實習,面前有一份大廠行政的實習,我…竟然猶豫了一下,好在也還是拒絕了。


儘量選擇大廠的技術實習,畢竟以後想進去會更難。但是不要因為一個月拿3000塊就只幹3000塊的活。把整個專案跟下來,瞭解框架的架構,優化的方向,多去嘗試,就算加班(加班在深圳很正常)也是你賺到,思考如何簡化重複性工作,去嘗試瞭解自己部門和其他部門的工作內容與方向,瞭解的越多你對自己想做的事情瞭解的也越多。

我實習做的評分卡模型,除了傳統邏輯迴歸,也嘗試新的XGB等等,而且雖然別人也在做,但是私下自己會把整個模型寫一遍,包含資料清洗和模型調優等,這樣對業務的瞭解也更透徹,面試起來所有的細節都是親手做過的,也就比較順了。


如果沒有實習在手,世界給我們資料探勘選手的大門還是敞開著的。kaggle上有專門給資料探勘入門者的練習場。相關的比賽還有很多,包括騰訊、阿里等大廠也時不時會發布算法大賽,目測這樣的演算法大賽只會越來越多,你堅持做完一個專案,你在平臺上還可以得到相關名次,名次越靠前越有利哈哈哈這是廢話。


4、BAT常見的面試題(不分先後)

  • 自我介紹/專案介紹

  • 類別不均衡如何處理

  • 資料標準化有哪些方法/正則化如何實現/onehot原理

  • 為什麼XGB比GBDT好

  • 資料清洗的方法有哪些/資料清洗步驟

  • 缺失值填充方式有哪些

  • 變數篩選有哪些方法

  • 資訊增益的計算公式

  • 樣本量很少情況下如何建模

  • 交叉檢驗的實現

  • 決策樹如何剪枝

  • WOE/IV值計算公式

  • 分箱有哪些方法/分箱原理是什麼

  • 手推SVM:目標函式,計算邏輯,公式都寫出來,平面與非平面

  • 核函式有哪些

  • XGB原理介紹/引數介紹/決策樹原理介紹/決策樹的優點

  • Linux/C/Java熟悉程度

  • 過擬合如何解決

  • 平時通過什麼渠道學習機器學習(好問題值得好好準備)

  • 決策樹先剪枝還是後剪枝好

  • 損失函式有哪些

  • 偏向做資料探勘還是演算法研究(好問題)

  • bagging與boosting的區別

  • 模型評估指標有哪些

  • 解釋模型複雜度/模型複雜度與什麼有關

  • 說出一個聚類演算法

  • ROC計算邏輯

  • 如何判斷一個模型中的變數太多

  • 決策樹與其他模型的損失函式、複雜度的比較

  • 決策樹能否有非數值型變數

  • 決策樹與神經網路的區別與優缺點對比

  • 資料結構有哪些

  • model ensembling的方法有哪些


5、小結

問題是散的,知識是有關聯的,學習的時候要從大框架學到小細節。


沒事多逛逛招聘網站看看招聘需求,瞭解市場的需求到底是什麼樣的。時代變化很快,捕捉資訊的能力要鍛煉出來。你可以關注的點有:職業名/職業方向/需要會什麼程式語言/需要會什麼演算法/薪資/...


每個面試的結尾,面試官會問你有沒有什麼想問的,請注意這個問題也很關鍵。

比如:這個小組目前在做什麼專案/實現專案主要用什麼語言和演算法/…
儘量不要問加不加班,有沒有加班費之類的,別問我為什麼這麼說(攤手)


在面試中遇到不理解的,比如C++語法不懂,可以問這個C++具體在專案中實現什麼功能。如果你提出好問題,能再次引起面試官對你的興趣,那就能增加面試成功率。

應屆生就好好準備校招,別懶,別怕輸,別怕被拒,從哪裡跌倒從哪裡起來。社招不是你能招呼的,會更挫敗,因為你什麼也沒做過。


雖然是做技術的,但是日常social一下還是收益很大的。實習的時候,也要與周圍同事和平相處,尤其是老大哥們,也許哪天他就幫你內推大廠去了。內推你能知道意想不到的資訊,面試官,崗位需求,最近在做什麼專案之類的。


挑選給你機會的公司,不要浪費自己的時間。不要每家都去,去之前瞭解這家公司與你的匹配度。

尤其社招,你一改動簡歷就很多人給你打電話,你要有策略的去進行面試,把握總結每個機會。像我就是東一榔頭西一榔頭的,好多都是止步於第一面,就沒回信兒了,因為每次面完沒有好好反思總結,等下次再遇到這問題還是抓瞎,十分消耗自己的時間和信心。


一碗雞湯


1、一切才剛剛開始,彆著急

AI才剛剛起步,為什麼呢?因為上數學課的時候,課本上都是柯西,牛頓,高斯等等,感覺他們活在遙遠的時代,很有陌生感。但是現在,我每天用的模型是比我沒大幾歲的陳天奇創造出來的,我甚至follow他的社交賬號,他就鮮活在我的世界裡,這種感覺,很奇妙。每次查論文查文獻的時候,看2017年出來的都覺得晚了,懊悔自己怎麼學的這麼慢,看2018年2月出來的才心裡有點安慰。這個證明,你在時代發展的浪潮上,也是一切剛剛起步的證明。機遇與挑戰並肩出現的時候,是你離創造歷史最近的時候。而所謂的風口所謂的浪尖都不重要,重要的是,因為你喜歡。


2、找一件可以堅持的事,不要停止去尋找的腳步

當人做喜歡的事情時,會發光呀!

當你因為真的熱愛某件事,而不斷接近它的時候,你的靈魂像是被上帝指點了迷津,受到了指示,受到了召喚。你會很自然的知道該做什麼,你想做什麼,好像生而為了這件事而來。你有時候自己都想不明白為什麼做這件事。看過月亮與六便士的應該懂這種使命感~


我不是屬於聰明的那類人,我是屬於比較倔的那種。就是隻要我認定的,我認定到底。天知道我有多少次懷疑過自己,有多少次想放棄,但我還是選擇咬牙向前,選擇相信自己。堅持的意義就在這裡。

(*本文為AI科技大本營轉載文章,轉載請聯絡作者)


推薦閱讀

六大主題報告,四大技術專題,AI開發者大會首日精華內容全回顧

AI ProCon圓滿落幕,五大技術專場精彩瞬間不容錯過

CSDN“2019 優秀AI、IoT應用案例TOP 30+”正式發

如何打造高質量的機器學習資料集?

從模型到應用,一文讀懂因子分解機

用Python爬取淘寶2000款套套

7段程式碼帶你玩轉Python條件語句

高階軟體工程師教會小白的那些事!

誰說 C++ 的強制型別轉換很難懂?


你點的每個“在看”,我都認真當成了喜歡
已同步到看一看



熱點新聞