文章創做於2020年4月,大約7000字,預計閱讀時間18分鐘,請坐和放寬。html
注:本文默認傳統算法是全部工程師的基礎技能,因此後面提到的算法主要指機器學習以及深度學習等算法。python
儘管目前本人求職的重心仍是在後端上,可是爲了能從如今的人工智能專業碩士順利畢業,也爲了讓本身順便拓展算法工程這條路,簡單的規劃一下算法這部分須要補的知識和技能仍是有必要的。git
本文以拿到2021算法崗Offer爲目標,從2020的算法崗面經入手,分析須要點的技能樹都有哪些。程序員
首先須要說明的一個地方就是,不一樣領域的技術崗位,都會按照接觸科研和業務的程度來進行必定的區分。github
能夠簡單參考知乎上霍華德在問題「學術界科研(research)與工業界研發(R&D)有什麼區別?」的回答[1],算法崗能夠大體分爲:面試
近幾年這一點在算法崗上表現體現的比較明顯,由於在幾年前大部分算法都還只在研究階段,而最近隨着一些成熟的機器學習封裝庫被開放事後,部分行業裏開始發現這些算法能夠產生實際的價值,因此算法崗位也就呈現了近幾年的爆發式增加,尤爲是業務導向的算法工程師(由於大部分公司仍是但願這些算法能更多更快的產出業務價值)。算法
固然這話其實說的已經有點晚了,如今已經不是剛開始那樣的時候了,那個時候會使用框架、調調參就能夠拿到Offer,如今的算法崗更像是浪潮事後的歸於正常的狀況,不只須要紮實的理論基礎,還須要豐富的項目實踐。編程
我我的是更傾向於業務導向的算法工程,因此本文以這部分爲目標來編寫,若是你有興趣瞭解三種不一樣崗位的細節,能夠閱讀夕小瑤的一篇公衆號文章《拒絕跟風,談談幾種算法崗的區別和體驗》[2]。後端
爲了更好地瞭解各行業公司都比較看重哪些方面的東西(極可能也都是這些公司在用的技術),我選擇直接從算法崗的面經裏去尋找可能的答案,面經貼主要是牛客網上的[3]。數組
找到的點能夠簡單分爲如下幾類:
一些傳統算法相關就不在此列了(Leetcode和一些書好比《劍指Offer》整理的也足夠多了)。我可以看到的面經是有限的,面經裏提供的內容也是有限的,因此後面的內容不能說能歸納到所有,可是至少能提取出很大一部分頻繁出現的關鍵詞(若是真的有須要的話再寫個爬蟲+關鍵詞提取吧)。
內容由於並無特別多的前後依賴關係,因此就按照在面經裏出現的順序來列了。
在大部分算法面試中,面試官的問題都是圍繞着簡歷上的項目來問的,咱們能夠看到上面的不少項目所涉及到的點,面試官都有可能往深了問,好比:
因此在學習過程當中不光要知道How,仍是要多知道幾個Why,一是爲了能在面試的時候能回答出問題,二是爲了更好地理解手裏的這個工具。
面經總結出來的點也仍是有點亂,因此我又參考了一些算法學習路線的帖子來簡單的歸類梳理一下各個點,主要是參考的機器之心的這篇完備的 AI 學習路線,最詳細的中英文資源整理[4],時效爲2019-04-28,還參考了一個不知道我何時在哪裏找到的知識點總結圖,若是有人知道出處的話能夠在評論裏和我說一下,圖片連接會附在文章末尾(圖片很大,因此放進來會看不清)。
並非說要把上面三個教材吃的徹底透了纔開始學習後面的,其實人工智能領域不少方法都只是用到了其中的一小部分,有一些專門總結了的機器學習中須要使用到的數學知識的書籍和文檔[4],你能夠在機器之心的公衆號文章找到這些(我在文章末尾也會上一個連接),具備基本的數學基礎的能夠用來複習,沒有數學基礎的仍是建議在看不懂的地方回顧到教材。
有些帖子可能會在數學基礎這部分加上一個凸優化,我的理解上,在純粹的學習過程當中凸優化能夠說是最枯燥的一門課,裏面大部分是一些凸優化的定義和理論公式的證實,因此建議在後期遇到的時候再切入某一個點深刻學習。
在數值分析和人工智能這方面,仍是Python支持的庫比較方便,在入門學習方面已經足夠使用了,版本目前推薦3.5 or 3.6。
Anaconda(or Miniconda)是一個比較方便的Python虛擬環境和包管理軟件,可是在某些時候會遇到麻煩事(好比一些算法框架的奇奇怪怪的環境要求),可是在大部分狀況下的入門階段已經足夠使用了。
Python的IDE大部分人經常使用的就是Pycharm,若是有些能力折騰的,能夠考慮用vscode+插件等等。
實際使用中,不少機器學習、深度學習方法只有在高質量數據中才能起做用,好比數據的信息量足夠多、噪聲和錯誤信息足夠少。而實際數據收集過程當中,不少狀況下不可能讓數據這麼完美,因此須要進行一些初步的數據處理(採集、清洗、採樣、去噪、降維、...)。
除了Python語言基礎,還須要掌握一些基礎的數據處理庫,好比numpy、pandas、matplotlib等,能夠參考機器之心推薦的《利用python進行數據分析》。
這本書含有大量的實踐案例,你將學會如何利用各類Python庫(包括NumPy,Pandas、Matplotlib以及IPython等)高效地解決各式各樣的數據分析問題。若是把代碼都運行一次,基本上就能解決數據分析的大部分問題了。
另外還有就是[4]:
數據挖掘能夠幫助咱們初步的理解數據各特徵之間具備的一些關係,增長或者刪除一些特徵來幫助後續的學習。數據挖掘能夠經過一些導論書籍或者課程進行一些初步系統性的瞭解,其中的大部分原理都不是很高深。
若是在入門的時候,一開始就學習數學和理論公式,也不去弄明白這個東西到底有什麼用,就很難去理解到底爲何須要這些理論。
在學習每一個機器學習算法前,能夠先籠統的明白這個東西的做用,而後帶着問題「這個是怎麼實現的?」去探究算法的理論,才能比較貫通的理解其中的數學和公式。
這裏推薦一個網站,產品經理的人工智能學習庫。
人工智能領域的百科全書,很是適合小白和新手入門 AI 領域。如今市面上你們看到的絕大部分 AI 資料都是追求嚴謹的「理工科天書」,這個世界不缺乏嚴謹真確晦澀難懂的 AI 資料,可是很缺容易理解的內容。咱們但願拋開復雜的公式,複雜的邏輯,複雜的專用名詞。作一套文科生也能看懂的 AI 知識庫。
機器學習的理論部分大概有:
機器學習所面向的問題
分類
迴歸
聚類
降維
迴歸
決策樹與隨機森林
SVM
多算法組合與模型優化
隱馬爾可夫鏈HMM
心裏OS:這總結下來基本上和某些書的目錄差很少了。
推薦課程[4]:
推薦書籍[4]:
在初步入門和學習理論後,爲了活學活用學到的算法,能夠嘗試進行實踐。
首先是一些能夠拓展能力的經常使用工具(省得本身造輪子):
而後就能夠去Kaggle上和大佬們對線了,若是你有能力也有idea,能夠本身開出一個項目來作。
若是你對某些算法有更深程度的理解,你甚至能夠嘗試用本身代碼復現這些算法。
推薦書籍:
在這裏一樣推薦產品經理的人工智能學習庫。
深度學習的理論部分大概有[4]:
基礎神經網絡
CNN
RNN
你能夠從廣度上入手,在都瞭解的基礎上,選擇一個方向進行深刻學習:
推薦課程[4]:
推薦書籍[4]:
在初步入門和學習理論後,爲了活學活用學到的深度學習算法,能夠嘗試進行實踐。
首先是一些能夠拓展能力的經常使用工具(省得本身造輪子):
關於哪一個工具更好的問題,"支持者"之間也是爭議不斷,其實也不用糾結到底應該選哪個,都試試不就知道了(逃。
選擇一個工具學會後,就能夠去Kaggle上和大佬們對線了,若是你有能力也有idea,能夠本身開出一個項目來作。
至於強化學習、遷移學習、計算機視覺、NLP、推薦系統、知識圖譜等內容,限於文章篇幅,就不在這裏介紹了,不過你能夠在機器之心的那篇文章中找到和他們有關的內容。
機器學習、深度學習大部分理論內容都來自計算機科研領域發表的論文,當下的前沿技術也都在近幾年發表的論文中。
做爲入門、理論、實踐的以後一個拓展階段,能夠經過閱讀前沿論文來增長知識面。
因爲前沿論文閱讀並不能算是一個業務導向的算法工程師所必須具備的能力,因此在這就不作過多的介紹了,一樣,你能夠在機器之心的那篇文章中找到關於閱讀前沿Paper的相關介紹。
不久前,某404網站給我推送了一個視頻,名字看起來很是標題黨,Don't learn machine learning - Daniel Bourke,源:Youtube,其中做者核心的內容是不要爲了只是學習算法而學習算法,要爲了創造產品(或者說應用、或者說解決問題)而學習算法,有條件的同窗能夠看看(暫時尚未看到國內的翻譯搬運,若是有時間有機會的話我就翻譯搬運一下吧)。
面向Offer學習未必是最優的一條路。個人目標是之後端爲主線發展,之因此尚未徹底的放棄這部分的算法,一部分是由於個人專業,更多的緣由是我知道在某些問題上只有這些算法纔能有效地解決,會用更多的算法也可讓程序員解決更多的問題。