2021算法崗基礎技能樹怎麼點?

title.jpg

文章創做於2020年4月,大約7000字,預計閱讀時間18分鐘,請坐和放寬。html

0 - 前言

注:本文默認傳統算法是全部工程師的基礎技能,因此後面提到的算法主要指機器學習以及深度學習等算法。python

儘管目前本人求職的重心仍是在後端上,可是爲了能從如今的人工智能專業碩士順利畢業,也爲了讓本身順便拓展算法工程這條路,簡單的規劃一下算法這部分須要補的知識和技能仍是有必要的。git

本文以拿到2021算法崗Offer爲目標,從2020的算法崗面經入手,分析須要點的技能樹都有哪些。程序員

1 - 不一樣算法崗的區別

首先須要說明的一個地方就是,不一樣領域的技術崗位,都會按照接觸科研和業務的程度來進行必定的區分。github

能夠簡單參考知乎上霍華德在問題「學術界科研(research)與工業界研發(R&D)有什麼區別?」的回答[1],算法崗能夠大體分爲:面試

  • 業務導向,大部分狀況下以Development爲主;
  • 技術導向,Research和Development兼顧;
  • 科研導向,大部分狀況下會Research爲主;

近幾年這一點在算法崗上表現體現的比較明顯,由於在幾年前大部分算法都還只在研究階段,而最近隨着一些成熟的機器學習封裝庫被開放事後,部分行業裏開始發現這些算法能夠產生實際的價值,因此算法崗位也就呈現了近幾年的爆發式增加,尤爲是業務導向的算法工程師(由於大部分公司仍是但願這些算法能更多更快的產出業務價值)。算法

固然這話其實說的已經有點晚了,如今已經不是剛開始那樣的時候了,那個時候會使用框架、調調參就能夠拿到Offer,如今的算法崗更像是浪潮事後的歸於正常的狀況,不只須要紮實的理論基礎,還須要豐富的項目實踐。編程

我我的是更傾向於業務導向的算法工程,因此本文以這部分爲目標來編寫,若是你有興趣瞭解三種不一樣崗位的細節,能夠閱讀夕小瑤的一篇公衆號文章《拒絕跟風,談談幾種算法崗的區別和體驗》[2]。後端

2 - 2020面經讀後感

爲了更好地瞭解各行業公司都比較看重哪些方面的東西(極可能也都是這些公司在用的技術),我選擇直接從算法崗的面經裏去尋找可能的答案,面經貼主要是牛客網上的[3]。數組

找到的點能夠簡單分爲如下幾類:

  • 純數學相關
  • 機器學習
  • 深度學習
  • NLP相關
  • 推薦算法

一些傳統算法相關就不在此列了(Leetcode和一些書好比《劍指Offer》整理的也足夠多了)。我可以看到的面經是有限的,面經裏提供的內容也是有限的,因此後面的內容不能說能歸納到所有,可是至少能提取出很大一部分頻繁出現的關鍵詞(若是真的有須要的話再寫個爬蟲+關鍵詞提取吧)。

內容由於並無特別多的前後依賴關係,因此就按照在面經裏出現的順序來列了。

2.1 - 純數學相關

  • 事件機率計算
  • 狄利克雷分佈
  • 最大似然估計和貝葉斯估計
  • ...

2.2 - 機器學習

  • 數據清洗、數據平滑
  • 經常使用的降維方式、PCA
  • LDA(Linear Discriminant Analysis)
  • 決策樹,ID三、C4.五、CART
  • XGBoost、LightGBM、隨機森林、Adaboost、GBDT
  • SVM原理、對偶問題
  • L一、L2正則化
  • 過擬合
  • 特徵選擇方法
  • LR(Logistic Regression)和SVM、Linear SVM 和 LR
  • 聚類方法、K-means、層次聚類
  • 模型的評價指標、ROC
  • 樸素貝葉斯原理
  • scikit-learn、numpy
  • bagging和boosting
  • 集成學習
  • 分類方法
  • 模型上線優化
  • 連續值、離散值,離散化連續特徵的好處
  • 迴歸方法、線性迴歸、嶺迴歸、Lasso迴歸、LR
  • 信息增益,信息增益比,Gini係數的關係
  • One-Hot編碼的原理及意義
  • Optimizers(Gradient Descent、...)
  • 統計學習算法
  • ...

2.3 - 深度學習

  • Feedforward Neural Network
  • Back Propagation
  • Layers,convolutional、pooling、full connected
  • CNN(卷積)、RNN(梯度消失問題)、LSTM、GRU
  • GAN
  • 目標檢測,R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD、...
  • SoftMax、Sigmoid
  • Embedding
  • 注意力機制
  • GCN(Graph Convolutional Network)
  • Optimizers(Gradient Descent、BGD、SGD、Adam、Adagard...)
  • Tensorflow、Keras、PyTorch
  • Activation(sigmoid、softmax、relu...)
  • MobileNet
  • Dropout
  • CPU、GPU加速
  • ...

2.4 - NLP相關

  • 關鍵字提取、TF-IDF
  • 命名實體
  • LDA(Latent Dirichlet Allocation)
  • word2vec
  • Bert、Transformer
  • ...

2.5 - 推薦算法

  • 基於內容的推薦
  • 協同過濾推薦、UserCF、ItemCF
  • 如何處理稀疏矩陣
  • ...

2.6 - 面經總結

在大部分算法面試中,面試官的問題都是圍繞着簡歷上的項目來問的,咱們能夠看到上面的不少項目所涉及到的點,面試官都有可能往深了問,好比:

  • SVM原始問題爲何要轉化爲對偶問題,爲何對偶問題就好求解,原始問題不能求解麼?
  • K-means 中我想聚成100類 結果發現只能聚成98類,爲何?
  • LR和SVM這兩個應用起來有什麼不一樣?
  • 對於PCA,會有第一主成分、第二主成分,怎麼爲何第一主成分是第一,緣由是什麼?
  • bagging 和boosting 哪一個可讓結果的方差更小一些,爲何?
  • ...

因此在學習過程當中不光要知道How,仍是要多知道幾個Why,一是爲了能在面試的時候能回答出問題,二是爲了更好地理解手裏的這個工具。

3 - 算法的基礎技能樹

面經總結出來的點也仍是有點亂,因此我又參考了一些算法學習路線的帖子來簡單的歸類梳理一下各個點,主要是參考的機器之心的這篇完備的 AI 學習路線,最詳細的中英文資源整理[4],時效爲2019-04-28,還參考了一個不知道我何時在哪裏找到的知識點總結圖,若是有人知道出處的話能夠在評論裏和我說一下,圖片連接會附在文章末尾(圖片很大,因此放進來會看不清)。

3.1 - 數學基礎

  • 高等數學
  • 線性代數
  • 機率論與數理統計

並非說要把上面三個教材吃的徹底透了纔開始學習後面的,其實人工智能領域不少方法都只是用到了其中的一小部分,有一些專門總結了的機器學習中須要使用到的數學知識的書籍和文檔[4],你能夠在機器之心的公衆號文章找到這些(我在文章末尾也會上一個連接),具備基本的數學基礎的能夠用來複習,沒有數學基礎的仍是建議在看不懂的地方回顧到教材。

有些帖子可能會在數學基礎這部分加上一個凸優化,我的理解上,在純粹的學習過程當中凸優化能夠說是最枯燥的一門課,裏面大部分是一些凸優化的定義和理論公式的證實,因此建議在後期遇到的時候再切入某一個點深刻學習。

3.2 - 編程基礎

在數值分析和人工智能這方面,仍是Python支持的庫比較方便,在入門學習方面已經足夠使用了,版本目前推薦3.5 or 3.6。

Anaconda(or Miniconda)是一個比較方便的Python虛擬環境和包管理軟件,可是在某些時候會遇到麻煩事(好比一些算法框架的奇奇怪怪的環境要求),可是在大部分狀況下的入門階段已經足夠使用了。

Python的IDE大部分人經常使用的就是Pycharm,若是有些能力折騰的,能夠考慮用vscode+插件等等。

3.3 - 數據處理/分析/挖掘

實際使用中,不少機器學習、深度學習方法只有在高質量數據中才能起做用,好比數據的信息量足夠多、噪聲和錯誤信息足夠少。而實際數據收集過程當中,不少狀況下不可能讓數據這麼完美,因此須要進行一些初步的數據處理(採集、清洗、採樣、去噪、降維、...)。

除了Python語言基礎,還須要掌握一些基礎的數據處理庫,好比numpy、pandas、matplotlib等,能夠參考機器之心推薦的《利用python進行數據分析》。

這本書含有大量的實踐案例,你將學會如何利用各類Python庫(包括NumPy,Pandas、Matplotlib以及IPython等)高效地解決各式各樣的數據分析問題。若是把代碼都運行一次,基本上就能解決數據分析的大部分問題了。

另外還有就是[4]:

數據挖掘能夠幫助咱們初步的理解數據各特徵之間具備的一些關係,增長或者刪除一些特徵來幫助後續的學習。數據挖掘能夠經過一些導論書籍或者課程進行一些初步系統性的瞭解,其中的大部分原理都不是很高深。

3.4 - 傳統機器學習

3.4.1 - 入門

若是在入門的時候,一開始就學習數學和理論公式,也不去弄明白這個東西到底有什麼用,就很難去理解到底爲何須要這些理論。

在學習每一個機器學習算法前,能夠先籠統的明白這個東西的做用,而後帶着問題「這個是怎麼實現的?」去探究算法的理論,才能比較貫通的理解其中的數學和公式。

這裏推薦一個網站,產品經理的人工智能學習庫

人工智能領域的百科全書,很是適合小白和新手入門 AI 領域。如今市面上你們看到的絕大部分 AI 資料都是追求嚴謹的「理工科天書」,這個世界不缺乏嚴謹真確晦澀難懂的 AI 資料,可是很缺容易理解的內容。咱們但願拋開復雜的公式,複雜的邏輯,複雜的專用名詞。作一套文科生也能看懂的 AI 知識庫。

3.4.2 - 理論

機器學習的理論部分大概有:

  • 機器學習所面向的問題

    • 分類

      • 決策樹
      • K-近鄰
      • SVM
      • Logistic迴歸
      • 貝葉斯
      • 隨機森林
      • ...
    • 迴歸

      • 線性迴歸
      • 最小二乘迴歸
      • 局部迴歸
      • 神經網絡
      • ...
    • 聚類

      • K-means
      • EM
      • ...
    • 降維

      • 主成分分析 PCA
      • 線性判別分析 LDA
      • ...
    • ...
  • 迴歸

    • 線性迴歸
    • Logistic迴歸
    • ...
  • 決策樹與隨機森林

    • ID3
    • C4.5
    • CART
    • 迴歸樹
    • 隨機森林
    • ...
  • SVM

    • 線性可分
    • 線性不可分
  • 最大熵與EM算法
  • 多算法組合與模型優化

    • 模型選擇
    • 模型狀態分析
    • 模型優化
    • 模型融合
  • 貝葉斯網絡
  • 隱馬爾可夫鏈HMM

    • 馬爾可夫鏈
    • 隱馬爾可夫鏈
  • 主題模型LDA
  • 集成學習
  • ...

心裏OS:這總結下來基本上和某些書的目錄差很少了。

推薦課程[4]:

推薦書籍[4]:

  • 西瓜書《機器學習》- 周志華,主要是機器學習的核心數學理論和算法。
  • 《統計學習方法》- 李航,更加完備和專業的機器學習理論知識,做爲夯實理論很是不錯。
  • 《Pattern Recognition and Machine Learning》,中文譯名《模式識別與機器學習》,簡稱PRML,出自微軟劍橋研究院實驗室主任 克里斯托弗·畢曉普(Christopher Bishop)之手,豆瓣評分9.5,目前這本書已經被微軟開源,地址:https://www.microsoft.com/en-...,書是英文的,網上能夠找到一些第三方的中文翻譯,不過仍是建議讀英文,再次也是中英對照着來。

3.4.3 - 實踐

在初步入門和學習理論後,爲了活學活用學到的算法,能夠嘗試進行實踐。

首先是一些能夠拓展能力的經常使用工具(省得本身造輪子):

  • scikit-learn:一個Python第三方提供的很是強力的機器學習庫,它包含了從數據預處理到訓練模型的各個方面。在實戰使用scikit-learn中能夠極大的節省咱們編寫代碼的時間以及減小咱們的代碼量,使咱們有更多的精力去分析數據分佈,調整模型和修改超參。
  • XGBoost:xgboost是大規模並行boosted tree的工具,它是目前最快最好的開源boosted tree工具包,比常見的工具包快10倍以上。在數據科學方面,有大量kaggle選手選用它進行數據挖掘比賽,其中包括兩個以上kaggle比賽的奪冠方案。在工業界規模方面,xgboost的分佈式版本有普遍的可移植性,支持在YARN, MPI, Sungrid Engine等各個平臺上面運行,而且保留了單機並行版本的各類優化,使得它能夠很好地解決於工業界規模的問題。
  • LightBGM:​ LightGBM(Light Gradient Boosting Machine)一樣是一款基於決策樹算法的分佈式梯度提高框架。爲了知足工業界縮短模型計算時間的需求,LightGBM的設計思路主要是兩點:1. 減少數據對內存的使用,保證單個機器在不犧牲速度的狀況下,儘量地用上更多的數據;2. 減少通訊的代價,提高多機並行時的效率,實如今計算上的線性加速。因而可知,LightGBM的設計初衷就是提供一個快速高效、低內存佔用、高準確度、支持並行和大規模數據處理的數據科學工具。
  • ...

而後就能夠去Kaggle上和大佬們對線了,若是你有能力也有idea,能夠本身開出一個項目來作。

若是你對某些算法有更深程度的理解,你甚至能夠嘗試用本身代碼復現這些算法。

推薦書籍:

  • 《Scikit-Learn 與 TensorFlow 機器學習使用指南》:這本書分爲兩大部分,第一部分介紹機器學習基礎算法,每章都配備 Scikit-Learn 實操項目;第二部分介紹神經網絡與深度學習,每章配備 TensorFlow 實操項目。若是隻是機器學習,可先看第一部分的內容。

3.5 - 深度學習

3.5.1 - 入門

在這裏一樣推薦產品經理的人工智能學習庫

3.5.2 - 理論

深度學習的理論部分大概有[4]:

  • 基礎神經網絡

    • 神經元
    • 激活函數
    • 基本結構:輸入層、隱藏層、輸出層
    • 反向傳播算法
  • CNN

    • 卷積層
    • 池化層
    • 全鏈接層
    • CNN的典型網絡結構(LeNet, AlexNet, VGG, ResNet, ...)
  • RNN

    • 單向RNN
    • 雙向RNN
    • 深度RNN
    • LSTM
    • GRU
  • GAN
  • ...

你能夠從廣度上入手,在都瞭解的基礎上,選擇一個方向進行深刻學習:

  • 計算機視覺(圖像、視頻處理,主要用CNN);
  • 天然語言處理NLP(包括文本、語音處理,序列數據每每須要RNN);
  • 生成模型(GAN、VAE等等);

推薦課程[4]:

推薦書籍[4]:

  • 開源書籍《神經網絡與深度學習》 - 復旦邱錫鵬,這本書花費了邱老師三年的時間,將本身的研究,平常的教學和實踐結合梳理出這個深度學習知識體系。該書主要介紹神經網絡與深度學習中的基礎知識、主要模型(前饋網絡、卷積網絡、循環網絡等)以及在計算機視覺、天然語言處理等領域的應用[5]。
  • 花書《深度學習》,源:Github網友翻譯,該書從淺入深介紹了基礎數學知識、機器學習經驗以及現階段深度學習的理論和發展,它能幫助人工智能技術愛好者和從業人員在三位專家學者的思惟帶領下全方位瞭解深度學習。
  • 神貼《深度學習 500 問》,做者是川大的一名優秀畢業生談繼勇。該項目以深度學習面試問答形式,收集了 500 個問題和答案。內容涉及了經常使用的機率知識、線性代數、機器學習、深度學習、計算機視覺等熱點問題,該書目前還沒有完結,卻已經收穫了Github 2.4w stars(如今已經3.7w star了)。

3.5.3 - 實踐

在初步入門和學習理論後,爲了活學活用學到的深度學習算法,能夠嘗試進行實踐。

首先是一些能夠拓展能力的經常使用工具(省得本身造輪子):

  • TensorFlow,Google開源的深度學習框架,不過接口都比較底層,可能入門級稍難。
  • Keras,一個用 Python 編寫的高級神經網絡 API,它可以以 TensorFlow, CNTK, 或者 Theano 做爲後端運行。Keras對入門友好,不過其中過多的封裝可能會致使須要自定義修改比較麻煩,因此他們主要面向的是快速實驗、快速驗證的任務。
  • PyTorch,Facebook發佈的一套深度學習框架,PyTorch專一於直接處理數組表達式的較低級別 API。去年它受到了大量關注,成爲學術研究和須要優化自定義表達式的深度學習應用偏好的解決方案。

關於哪一個工具更好的問題,"支持者"之間也是爭議不斷,其實也不用糾結到底應該選哪個,都試試不就知道了(逃。

選擇一個工具學會後,就能夠去Kaggle上和大佬們對線了,若是你有能力也有idea,能夠本身開出一個項目來作。

3.6 - 其餘

至於強化學習、遷移學習、計算機視覺、NLP、推薦系統、知識圖譜等內容,限於文章篇幅,就不在這裏介紹了,不過你能夠在機器之心的那篇文章中找到和他們有關的內容。

3.7 - 論文閱讀

機器學習、深度學習大部分理論內容都來自計算機科研領域發表的論文,當下的前沿技術也都在近幾年發表的論文中。

做爲入門、理論、實踐的以後一個拓展階段,能夠經過閱讀前沿論文來增長知識面。

因爲前沿論文閱讀並不能算是一個業務導向的算法工程師所必須具備的能力,因此在這就不作過多的介紹了,一樣,你能夠在機器之心的那篇文章中找到關於閱讀前沿Paper的相關介紹。

4 - 總結

不久前,某404網站給我推送了一個視頻,名字看起來很是標題黨,Don't learn machine learning - Daniel Bourke,源:Youtube,其中做者核心的內容是不要爲了只是學習算法而學習算法,要爲了創造產品(或者說應用、或者說解決問題)而學習算法,有條件的同窗能夠看看(暫時尚未看到國內的翻譯搬運,若是有時間有機會的話我就翻譯搬運一下吧)。

面向Offer學習未必是最優的一條路。個人目標是之後端爲主線發展,之因此尚未徹底的放棄這部分的算法,一部分是由於個人專業,更多的緣由是我知道在某些問題上只有這些算法纔能有效地解決,會用更多的算法也可讓程序員解決更多的問題。

5 - 參考文章

相關文章
相關標籤/搜索