1. 程式人生 > >演算法工程師學習之路

演算法工程師學習之路


之前是通訊行業工程師,作為流水線上的一顆螺絲釘N年,只是耕耘在自己熟悉的領域,視野比較窄。 興趣是最好的老師,興趣引我轉向了這個行業。
最開始 我對資料分析比較感興趣, 後來是資料探勘,再是機器學習,深度學習..  自然走在這條路上。本人資質也只是勉強夠用,學習過程中也有覺得很難想放棄過,還好克服了走過了。分享學習道路如下吧 :)

前些年讀了一些關於大資料的文章,有初步的瞭解。後來在平時相關的運營支撐工作中接觸了一個大資料的產品,學習了大資料分析挖掘的流程及初步瞭解一些演算法知識。後來車品覺老師來(前)我司分享,參加後很是受用。
如果沒有類似條件也沒關係,開始時為了培養對大資料這個行業的興趣,推薦閱讀車品覺老師的"決戰大資料",書中資料運營運維的思想讓我轉到一個新世界。 "大資料時代"中譯者周濤老師的序言比原文作者帶給我的共鳴衝擊更大。 從資料分析到資料探勘,譚磊老師"大資料探勘" 也讓我衝出了那一步,知道資料探勘也沒我想象中那麼難 :)

一路上的第一個目標 轉行成為資料分析師要做的:
https://www.zhihu.com/question/29265587/answer/44010658
我曾經去捯飭那些excel函式,VBA, 補看資料庫教程,看powerBI、資料視覺化等教程。那些日子雖然也只是今年上半年的事但覺得已遠去但覺得沒白過。。 


正傳了:

一:最最基礎要預備的:
1) python      
最開始本人看的菜鳥教程, 推薦 廖雪峰老師的python教程。
2) 數學知識     高數/線代/概率和統計     
    雖然資料探勘/機器學習是統計學的範疇 現在感覺前兩門相對更重要..
   
關於高數:
    其實我也是看到公式就怕的人,直到現在。。palmface 對推導過程不太明白,但現在原理還是能理解一些。以前讀書時數學也很一般,現在幾乎是從頭學起,嗯,對,從三角函式以及排列組合看起。。
    推薦"遇見數學"公眾號, 裡面有高數的專集。 裡面的圖解數學相當不錯。底下很多人留言要是當年學習時有這樣的指導就好了.. 本人看了臺灣單維彰老師的視訊專輯:大學微積分入門合集。看完後過了兩週再又再看了一遍。 而當我花大概四五天看完一本紙質高數書時(圖書館任借一本高數教材即可,無推薦的好書),雖然當時也記了幾十條看不懂的問題,但還是會回想,為啥大學要花一學期或是一學年來學高數呢...好像看一週應該能考 50/60分, 兩週能考70分,一月能考8,90分吧,猜的..:)  鏈式求導,求偏導很重要,搞不懂的不能輕易放過。
關於線代:
    我是從 知乎live課程: 線性代數入門:從方程到對映 開始的。我沒加群拿到最新的膠片,live裡的膠片有幾處小錯誤讓我很費解,不過整體還是不錯的。 有很多是在知乎上找到答案的。除了"遇見數學"公眾號,matongxue314 馬同學看圖學數學 應該也很不錯   
關於概率和統計:
    SSE, MSE, RMSE SSR SST 這些,卡方分佈,T分佈,F分佈,各種檢驗等。置信區間含義等。
可以聽聽知乎大神SimonS的課程 機器學習入門需要哪些數學基礎  https://www.zhihu.com/lives/818124675715600384


這裡我還想分享一些鎖碎的名詞或概念,可以去單獨去搜一搜。能搜到不同的文章,這樣一篇沒看明白時,可能再看看另一種講解的風格就懂了,或者明白了後再多看另一種觀點,又有不同的收穫。  而且這些名詞懂了以後,其他文章也好看一些,不明白的話有可能卡住。 我經常得在讀文章時,跳出來去搜這些概念。

全概率公式和貝葉斯公式 正態分佈 高斯分佈 二項分佈 beta分佈 共軛分佈  Dirichlet分佈  可以順便了解Gamma分佈,泊松分佈  共軛分佈 Dirichlet分佈等在NLP中有使用,beta分佈看到知乎這條解釋(答主小杰)就比較容易理解了:https://www.zhihu.com/question/30269898
頻率派與貝葉斯派各自不同的思考方式:
什麼是無偏估計 有偏估計    概率和似然的區別
ROC曲線,lift曲線 分別適合於什麼場景等,搞清TPR,TFR,召回率和準確率等指標的含義。F1分數。
什麼是凸函式, 什麼是對偶問題?  拉格朗日對偶問題  kkt條件
機器學習常見的損失函式有哪幾種。 對於0-1損失  平方損失  絕對值損失來度量損失是好理解的,而對數為什麼能度量這個損失,要繞個彎從其他角度想想,我也繞了好一圈才習慣。
什麼是熵,什麼是資訊熵,基尼指數,基尼不純度。(注意基尼指數常用來收入平衡狀態,理想情況是要比較大即比較均勻。而資料探勘機器學習裡的基尼不純度是要越小越好,兩者是從不同的角度看問題!我剛開始搜尋基尼時是糊塗的..)

什麼是歸一化(normalization),標準化(standardization)?
白化,這個在看完劉建平老師的PCA後,可繼續瞭解。因為PCA後的目的可能就是要做白化,為資料進一步處理做準備。
什麼是範數  有助於處理。。情況?  什麼是condition number
搞清楚矩陣乘法是怎麼乘的。
矩陣的行列式,意義 (順便了解下跡:行列式是特徵值的乘積,跡是特徵值的加和)
特徵值和特徵向量  先從公式和計算上入手 A* V = λ * V   (A矩陣* V向量 =  λ常數 * V向量)  再瞭解在資料探勘 機器學習中特徵值和特徵向量的意義,這個一搜就一大把了。
關注資料探勘的話還需要多去了解特徵工程。
矩陣對角化的意義。相似矩陣的意義。 矩陣左乘,變換基。逆矩陣。 這幾個話題知乎上有很多很好的解答,令人茅塞頓開。
什麼是協方差,相關係數。協方差矩陣 格拉姆矩陣 的意義?
雅可比矩陣 海森矩陣  牛頓法迭代求解
各種距離 餘弦相似度
張量的含義和性質?
什麼是超引數
瞭解什麼是P問題:NP問題:NP-Hard:NP-Complete
瞭解廣義線性模型(GLM)。這種模型是把自變數的線性預測函式當作因變數的估計值,
什麼hadoop, map reduce方法,spark,hive,hbase,這些,以及大資料分析挖掘流程 也需要了解

二:資料探勘基本的常用演算法  
   強烈推薦劉建平pinad老師的blog。http://www.cnblogs.com/pinard/   我從第一篇文章看起的。從感知機開始一直講到DNN,CNN。(當然到最後的CNN,還有很多很好的文章需要看,僅看劉老師這一篇是不夠的。) 隱馬模型看完後,我心裡覺得對演算法工程師這個職位要做的事和方法 有個大概的譜了。 感謝劉老師的無私分享!
   在學習正則化,範數,EM演算法時,包括後面的影象卷積時卷積核的含義和效果時 zouxy老師的blog也讓我受益匪淺:http://blog.csdn.net/zouxy09/article/details/24971995
   在學習各種組合方法時,要了解bagging/boosting各適用於什麼場景,誰的基模型為強模型及目標是降什麼,誰的基模型為弱模型及目標是降什麼。
   看劉老師的KNN演算法時,仍是不能很好的理解。 關於KNN,這個很不錯: https://zhuanlan.zhihu.com/p/22345658?refer=hgjjsms
   這些演算法在學習時就邊看邊動手,後面可以去參加一下天池的新人離線賽,實際操作感受一下資料清洗/處理過程,尋找特徵工程等資料探勘的過程,熟悉dataframe的各種操作,熟悉sklearn等這些庫的使用。

三: 真正到機器學習、深度學習,影象領域了
    有很多tensorflow的介紹入門文章。動手嘗試。
    另外 opencv也可以瞭解 https://docs.opencv.org/3.3.0/index.html
    我看過幾集莫煩的深度學習視訊。其實還有很多視訊推薦,還有很多英文的,我覺得看視訊比較費時間,打算後面再多看一點。
    對於影象:先了解什麼是通道數。
    瞭解batch_size epoch_size等
    理解BN
    理解triplet loss,centor loss
    理解embedding (知乎上word embedding和解答更多) 
    瞭解DeepID DeepID2  人臉識別/人臉比對的區別
    再去多搜搜CNN的卷積,多一點卷積意義上理解,而不是隻瞭解到 卷積計算過程的GIF動圖。
    多通道的多個卷積核過程。卷積核有通道的概念嗎? 還是隻是二維的? 使用1*1的卷積核為什麼能達到降維的效果?
    卷積與全連線相比,是如何減小引數個數的?
    需要理解 卷積神經網路各層的引數和連線個數是多少?   http://blog.csdn.net/dcxhun3/article/details/46878999
    Feature Map/輸出通道/神經元/感受野/padding等概念
    全連線層的意義?
    http://blog.csdn.net/zouxy09/article/details/49080029
    這篇文章裡提到了 時域上的卷積等於頻域上的乘積,這樣就需要了解傅立葉變換了。知乎上有很受歡迎的"掐死我"文章,我也是它的受益者。
    另外我看有一些文章裡提到了人臉識別的haar特徵,haar小波變換我也順便看了一下,但暫時好像還沒用上
    高斯卷積 高斯模糊。 模糊是怎麼來的? 把清楚的照片(畫素之間大差距) 縮小差距,使得數字從整體看更平均,照片就模糊了。

    瞭解一下卷積網路架構的發展歷史
    Inception v1 v2  v3  v4 模型
    NIN  (Network in Network)
    resnet網路
    有很多很好的文章,這裡推薦幾個:  比如上面的inception模型和殘差網路,下面這篇文章就比較容易理解。
    https://zhuanlan.zhihu.com/p/27642620
    https://zhuanlan.zhihu.com/p/27857399
    我之前只知道調參時可以增加CNN層數和每層的神經元個數來,也看過很多的文章關於cnn的結構。但增加層數和神經元數意味著什麼? 這篇文章讓我通了很多。
    http://www.eepw.com.cn/article/201706/360625.htm
    這裡有影象的知乎live,後面這個串講了神經網路
    計算機視覺從入門到放肆  https://www.zhihu.com/lives/848170558016356352
    深度學習中的常見名詞術語(影象方向) https://www.zhihu.com/lives/904295186979508224
  
    可以學習下SIFT演算法,雖然現在不如CNN
    mtcnn:

    人臉識別的論文: 
      FaceNet: A Unified Embedding for Face Recognition and Clustering
    Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
    Deep Residual Learning for Image Recognition
    Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
    Densely Connected Convolutional Networks

上面總結的東西難免有錯誤和遺漏,也有不太重要的,歡迎各位告知我修改補充,權當各位學習路上的小小的參考。

上面列的東西,我也沒有全部掌握,後面的論文也沒看多少。書單還有一大串。。(最基本的有統計學習方法  西瓜書等等...)
路還挺長。曾有個朋友說:學習使我快樂。 我覺得他說出了我心裡的話。 如果沒有這種快樂滿足的感覺,挺難堅持的; 有的話,好像都不用用堅持這樣的字眼。
看到知乎上說 阿里後來面試都不太在乎在天池賽中取得的好名次了,想想熟悉了那些套路,解這些賽題應該也比較簡單。我剛轉行,很想在新領域中再成為這樣的骨幹,但這需要時間精力還要點機遇。  一年來潛水看了好多大俠的精彩分享,我也來分享點淺薄的東西吧。