雲栖号資訊:【 點選檢視更多行業資訊】
在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!
0 - 前言
注:本文預設傳統算法是所有工程師的基礎技能,是以後面提到的算法主要指機器學習以及深度學習等算法。
盡管目前本人求職的重心還是在後端上,但是為了能從現在的人工智能專業碩士順利畢業,也為了讓自己順便拓展算法工程這條路,簡單的規劃一下算法這部分需要補的知識和技能還是有必要的。
本文以拿到2021算法崗Offer為目标,從2020的算法崗面經入手,分析需要點的技能樹都有哪些。
1 - 不同算法崗的差別
首先需要說明的一個地方就是,不同領域的技術崗位,都會按照接觸科研和業務的程度來進行一定的區分。
可以簡單參考知乎上霍華德在問題“學術界科研(research)與工業界研發(R&D)有什麼差別?”的回答[1],算法崗可以大緻分為:
- 業務導向,大部分情況下以Development為主;
- 技術導向,Research和Development兼顧;
- 科研導向,大部分情況下會Research為主;
近幾年這一點在算法崗上表現展現的比較明顯,因為在幾年前大部分算法都還隻在研究階段,而最近随着一些成熟的機器學習封裝庫被開放過後,部分行業裡開始發現這些算法可以産生實際的價值,是以算法崗位也就呈現了近幾年的爆發式增長,尤其是業務導向的算法工程師(因為大部分公司還是希望這些算法能更多更快的産出業務價值)。
當然這話其實說的已經有點晚了,現在已經不是剛開始那樣的時候了,那個時候會使用架構、調調參就可以拿到Offer,現在的算法崗更像是浪潮過後的歸于正常的情況,不僅需要紮實的理論基礎,還需要豐富的項目實踐。
我個人是更傾向于業務導向的算法工程,是以本文以這部分為目标來編寫。
2 - 2020面經讀後感
為了更好地了解各行業公司都比較看重哪些方面的東西(很可能也都是這些公司在用的技術),我選擇直接從算法崗的面經裡去尋找可能的答案,面經貼主要是牛客網上的[3]。
找到的點可以簡單分為以下幾類:
- 純數學相關
- 機器學習
- 深度學習
- NLP相關
- 推薦算法
一些傳統算法相關就不在此列了。我能夠看到的面經是有限的,面經裡提供的内容也是有限的,是以後面的内容不能說能概括到全部,但是至少能提取出很大一部分頻繁出現的關鍵詞(如果真的有需要的話再寫個爬蟲+關鍵詞提取吧)。
内容因為并沒有特别多的先後依賴關系,是以就按照在面經裡出現的順序來列了。
2.1 - 純數學相關
- 事件機率計算
- 狄利克雷分布
-
最大似然估計和貝葉斯估計
...
2.2 - 機器學習
資料清洗、資料平滑
常用的降維方式、PCA
LDA(Linear Discriminant Analysis)
決策樹,ID3、C4.5、CART
XGBoost、LightGBM、随機森林、Adaboost、GBDT
SVM原理、對偶問題
L1、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 學習路線。
3.1 - 數學基礎
高等數學
線性代數
機率論與數理統計
并不是說要把上面三個教材吃的完全透了才開始學習後面的,其實人工智能領域很多方法都隻是用到了其中的一小部分,有一些專門總結了的機器學習中需要使用到的數學知識的書籍和文檔。
有些文章可能會在數學基礎這部分加上一個凸優化,個人了解上,在純粹的學習過程中凸優化可以說是最枯燥的一門課,裡面大部分是一些凸優化的定義和理論公式的證明,是以建議在後期遇到的時候再切入某一個點深入學習。
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等)高效地解決各式各樣的資料分析問題。如果把代碼都運作一次,基本上就能解決資料分析的大部分問題了。
另外還有就是:
資料挖掘中的特征工程
一些資料挖掘的項目
資料挖掘可以幫助我們初步的了解資料各特征之間具有的一些關系,增加或者删除一些特征來幫助後續的學習。資料挖掘可以通過一些導論書籍或者課程進行一些初步系統性的了解,其中的大部分原理都不是很高深。
3.4 - 傳統機器學習
3.4.1 - 入門
如果在入門的時候,一開始就學習數學和理論公式,也不去弄明白這個東西到底有什麼用,就很難去了解到底為什麼需要這些理論。
在學習每個機器學習算法前,可以先籠統的明白這個東西的作用,然後帶着問題“這個是怎麼實作的?”去探究算法的理論,才能比較貫通的了解其中的數學和公式。
3.4.2 - 理論
機器學習的理論部分大概有:
- 機器學習所面向的問題
分類
決策樹
K-近鄰
SVM
Logistic回歸
貝葉斯
随機森林
- 回歸
線性回歸
最小二乘回歸
局部回歸
神經網絡
- 聚類
K-means
EM
- 降維
主成分分析 PCA
線性判别分析 LDA
- 決策樹與随機森林
ID3
C4.5
CART
回歸樹
線性可分
線性不可分
- 最大熵與EM算法
- 多算法組合與模型優化
模型選擇
模型狀态分析
模型優化
模型融合
- 貝葉斯網絡
- 隐馬爾可夫鍊HMM
馬爾可夫鍊
隐馬爾可夫鍊
- 主題模型LDA
内心OS:這總結下來基本上和某些書的目錄差不多了。
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的設計思路主要是兩點:
- 減小資料對記憶體的使用,保證單個機器在不犧牲速度的情況下,盡可能地用上更多的資料;
- 減小通信的代價,提升多機并行時的效率,實作在計算上的線性加速。由此可見,LightGBM的設計初衷就是提供一個快速高效、低記憶體占用、高準确度、支援并行和大規模資料處理的資料科學工具。
然後就可以去Kaggle上和大佬們對線了,如果你有能力也有idea,可以自己開出一個項目來做。
如果你對某些算法有更深程度的了解,你甚至可以嘗試用自己代碼複現這些算法。
3.5 - 深度學習
3.5.1 - 入門
3.5.2 - 理論
深度學習的理論部分大概有:
- 基礎神經網絡
神經元
激活函數
基本結構:輸入層、隐藏層、輸出層
反向傳播算法
- CNN
卷積層
池化層
全連接配接層
CNN的典型網絡結構(LeNet, AlexNet, VGG, ResNet, ...)
- RNN
單向RNN
雙向RNN
深度RNN
LSTM
GRU
你可以從廣度上入手,在都了解的基礎上,選擇一個方向進行深入學習:
計算機視覺(圖像、視訊處理,主要用CNN);
自然語言處理NLP(包括文本、語音處理,序列資料往往需要RNN);
生成模型(GAN、VAE等等);
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學習未必是最優的一條路。我的目标是以後端為主線發展,之是以還沒有完全的放棄這部分的算法,一部分是因為我的專業,更多的原因是我知道在某些問題上隻有這些算法才能有效地解決,會用更多的算法也可以讓程式員解決更多的問題。
【雲栖号線上課堂】每天都有産品技術專家分享!
課程位址:
https://yqh.aliyun.com/zhibo立即加入社群,與專家面對面,及時了解課程最新動态!
【雲栖号線上課堂 社群】
https://c.tb.cn/F3.Z8gvnK
原文釋出時間:2020-04-13
本文作者:Yumiku
本文來自:“
掘金”,了解相關資訊可以關注“掘金”