https://www.zhihu.com/question/51039416/answer/139148508
普通程序員如何正確學習人工智能方向的知識?
“互聯網+”已經發展的差不多了,應有盡有,空間不大,下個浪潮會不會是“AI+”?那麼作為一個普通程序員,如何提前向人工智能(AI)靠攏?
關注者
24,366
被瀏覽
2,021,510
匿名用戶
作為一名正在向人工智能靠攏的程序員也來湊湊熱鬧,幾個高票答案寫得都非常好,頗受教益。受2016年3月阿狗的影響(現在已經成長為二狗子了,並化身Master橫掃圍棋界),開始了機器學習之路。
我的學習之路可能和許多人不太一樣,大部分人都是邊學邊做,用到數學再去補,屬於實戰派。我可能更偏向於理論派,由於之前幾年學了一些數學,之後也決心轉型做人工智能了,所以就狠了狠心,先從基礎打起,先練內功,希望也能看懂高深的論文。
以下是前幾年和這段時間學過的相關課程,大部分還是和機器學習相關的:
一,數學部分
1,數學分析,這是最最基礎的課程了,沒有了這個,後面就沒法繼續了,第一關必須得過。聽的課程是中科大史濟懷老師的公開課,好像222講,三個學期的課。當時聽完相當震撼,有點庖丁解牛的快感!從此成為中科大的粉絲,中科大號稱小清華,中國的MIT一點不為過。其實在此之前買了北大張築生老師的數學分析打算自學,後來發現如果沒有一定的基礎,數學是沒法自學的,第一卷看了一半就看不下去了。數學必須聽課(智商高的除外),而且只有聽課才能發現哪些課堂上有,但課本沒有的東西。
2,複變函數論,這個比實變溫柔多了,花的時間不多。前幾年學的,這個和機器學習貌似關聯度沒那麼大。聽的課是國立交通大學吳培元教授,很Nice的教授!
3,概率論與數理統計,這個相關性就不用多說了。推薦中科大的繆柏其老師的課,至今還記得他關於“九五至尊”,“亢龍有悔”的論述。這門課統計部分講的比較簡略,但概率論部分相當好。
4,線性代數,這個重要性也不消多說。線性代數是一門這輩子不止學一遍的課,我學了至少三遍。
(1)MIT的Gilbert Strang講的極其精彩,老教授每次提問,你在思考後得出答案,然後又得到教授的印證,那感覺真是太棒了!大學時修線性代數的時候完全沒感覺,一路線性方程組,矩陣,行列式過來,過了幾個月就忘光了,也不知道有什麼用。
(2)線性代數還看過國立交通大學莊重老師(又一個超級Nice的老師)的課,這門課從一個比較理論的角度來闡述線性代數,與MIT的課正好互補。這就是為什麼我又學了一遍線性代數,並不是閒得慌。以後如果需要學進階的矩陣分析,泛函分析,是很有必要的。
5,統計學&高等統計學,陳鄰安教授,又是國立交通大學。沒辦法,人家的公開課是拿錢辦實事,感覺我可以拿他們學校的數學本科學位了,這遠不是最後一門。雖然有初等和高等之分,但其實是一門課的兩個部分。
6,微積分,國立交通大學莊重老師。數學分析是幾年前學的,有些忘記了,花點重溫了一下。
7,高等微積分,國立交通大學白啟光老師,這門課用的是rudin的數學分析原理,用這本書自學微積分被虐過的同學,可以來聽聽這門公開課。這是通往實變與泛函的必經之路。
8,實變函數論,國立交通大學吳培元老師。實變函數學十遍,泛函分析心犯寒!這門課兩個字:“抽象”!這門課我學了好幾遍,最新一遍終於有點開竅了!許多證明還是有脈路可尋的,並不是腦洞大開。(為避免暴露智商,幾遍就不提了)
9,泛函分析,國立交通大學吳培元老師。比實變稍微溫柔點,算清單中難度僅次於實變的課吧。學這門課要求有點拓撲的概念,線性代數和實變學的好會有比較大的幫助,要不然也會一臉懵逼!
這裡推薦MIT牛人林達華(研究計算機視覺)的一篇文章,隨著學習的深入,每次看都有不同的理解:麻省理工(MIT)牛人解說數學體系-文章-伯樂在線
二,機器學習部分
1,機器學習基石&機器學習技法,台灣大學林軒田老師。我知道許多人都是先Andrew Ng,再林軒田的,當時自覺數學基礎應該還夠用,所以就跳過大神的課。
2,李航老師的《統計學習方法》,乾貨滿滿的書,全書都是在推理,相當的有數學味。不過我倒是覺得來點水分會更好一點,比如在介紹算法之前,多聊點背景知識,所幸林軒田的課不厭其煩的介紹了這些背景知識。這一課一書是個很好的搭配,建議先聽課!
3,最優化,這方面選的書是《最優化導論》,從一維搜索方法,梯度方法,牛頓方法,擬牛頓方法,共軛方向法,還有線性規劃,拉格然日方法一路下來,算是對最優化有了大概的了解!知友還推薦了兩本好書《Numerical Optimization》和《凸優化》以後有時間再看。
4,《機器學習》,國內大神周志華老師,這本西瓜書目前只看了個大概,也相當推薦!
三,計算機編程部分
這方面就不推薦了,只要有幾年的碼農經歷,編程語言,算法,設計模式,操作系統,計算機體系結構,這些核心的技能,多少都有些了解,應該不會是瓶頸。Python即使以前沒接觸過,幾天時間翻翻書也能上手,當然熟練使用需要時間,Python的語法對C/C++,JAVA程序員來說應該還是比較中意的,比Objective C和JavaScript要優雅一點吧(個人觀點,無意挑起爭端)。
四,深度學習和NLP,計算機視覺等具體方向
至今還沒開始學深度學習,這個以後一定要學。先打好機器學習的基礎吧,慢慢來,一口吃不成一個胖子。
更多回答
本人碼農,從六月開始正式接觸機器學習(其實五年前的本科畢設就是在生物信息領域應用神經網絡的項目,但是非常淺薄),深吸一口氣,先要聲明“人之患在好為人師”,我用的步驟只是適合我,下面的內容僅供參考。
第一步:複習線性代數。(學渣的線代忘了好多-_-||)- 懶得看書就直接用了著名的—— 麻省理工公開課:線性代數,深入淺出效果拔群,以後會用到的SVD、希爾伯特空間等都有介紹;
- 廣告:邊看邊總結了一套筆記GitHub - zlotus/notes-linear-algebra:線性代數筆記。
- 還是因為比較懶,也就直接用了著名的—— 斯坦福大學公開課:機器學習課程,吳恩達教授的老版cs229的視頻,講的非常細(算法的目標->數學推演->偽代碼)。這套教程唯一的缺點在於沒有介紹最近大火的神經網絡,但其實這也算是優點,讓我明白了算法都有各自的應用領域,並不是所有問題都需要用神經網絡來解決;
- 多說一點,這個課程裡詳細介紹的內容有:一般線性模型、高斯系列模型、SVM理論及實現、聚類算法以及EM算法的各種相關應用、PCA/ICA、學習理論、馬爾可夫系列模型。課堂筆記在:CS 229: Machine Learning (Course handouts),同樣非常詳細。
- 廣告:邊看邊總結了一套筆記GitHub - zlotus/notes-LSJU-machine-learning:機器學習筆記
- 依然因為比較懶,繼續直接使用了著名的—— 機器學習| Coursera,還是吳恩達教授的課程,只不過這個是極簡版的cs229,幾乎就是教怎麼在matlab裡快速實現一個模型(這套教程裡有神經網絡基本概念及實現)。這套課程的缺點是難度比較低,推導過程非常簡略,但是這也是它的優點——讓我專注於把理論轉化成代碼。
- 廣告:作業參考GitHub - zlotus/Coursera_Machine_Learning_Exercises: Machine Learning by Andrew Ng from Coursera
- 還是因為比較懶,搜到了cs231n的課程視頻CS231n Winter 2016 - YouTube,李飛飛教授的課,主講還有Andrej Karpathy和Justin Johnson,主要介紹卷積神經網絡在圖像識別/機器視覺領域的應用(前面神經網絡的代碼沒寫夠?這門課包你嗨到爆~到處都是從零手寫~)。這門課程的作業就更貼心了,直接用Jupyter Notebook佈置的,可以本地運行並自己檢查錯誤。主要使用Python以及Python系列的科學計算庫(Scipy/Numpy/Matplotlib)。課堂筆記的翻譯可以參考智能單元-知乎專欄,主要由知友杜客翻譯,寫的非常好~
- 在多說一點,這門課對程序員來說比較走心,因為這個不像上一步中用matlab實現的作業那樣偏向算法和模型,這門課用Python實現的模型同時注重軟件工程,包括常見的封裝layer的forward/backward、自定義組合layer、如何將layer組成網絡、如何在網絡中集成batch-normalization及dropout等功能、如何在復雜模型下做梯度檢查等等;最後一個作業中還有手動實現RNN及其基友LSTM、編寫有助於調試的CNN可視化功能、Google的DeepDream等等。(做完作業基本就可以看懂現在流行的各種圖片風格變換程序了,如cysmith/neural-style-tf)另外,這門課的作業實現非常推崇computational graph,不知道是不是我的幻覺… …要注意的是講師AK的語速奇快無比,好在YouTube有自動生成解說詞的功能,準確率還不錯,可以當字幕看。
- 廣告:作業參考GitHub - zlotus/cs231n: CS231n Convolutional Neural Networks for Visual Recognition (winter 2016)(我的在作業的notebook上加了一些推導演算哦~可以用來參考:D)
因為最近手頭有論文要撕,時間比較緊,第四步做完就先告一段落。後面打算做繼續業界傳奇Geoffrey Hinton教授的Neural Networks for Machine Learning | Coursera,再看看NLP的課程Stanford University CS224d: Deep Learning for Natural Language Processing,先把基礎補完,然後在東瞅瞅西逛逛看看有什麼好玩的……
PS:一直沒提諸如TensorFlow之類的神器,早就裝了一個(可以直接在conda中為Tensorflow新建一個env,然後再裝上Jupyter、sklearn等常用的庫,把這些在學習和實踐ML時所用到的庫都放在一個環境下管理,會方便很多),然而一直沒時間學習使用,還是打算先忍著把基礎部分看完,抖M總是喜歡把最好的留在最後一個人偷偷享受2333333(手動奸笑
PS**2:關於用到的系統性知識,主要有:- 線性代數,非常重要,模型計算全靠它~一定要復習紮實,如果平常不用可能忘的比較多;
- 高數+概率,這倆只要掌握基礎就行了,比如積分和求導、各種分佈、參數估計等等。(評論中有知友提到概率與數理統計的重要性,我舉四肢贊成,因為cs229中幾乎所有算法的推演都是從參數估計及其在概率模型中的意義起手的,參數的更新規則具有概率上的可解釋性。對於算法的設計和改進工作,概統是核心課程,沒有之一。答主這裡想要說的是,當拿到現成的算法時,僅需要概率基礎知識就能看懂,然後需要比較多的線代知識才能讓模型高效的跑起來。比如最近做卷積的作業, 我手寫的比作業裡給出的帶各種trick的fast函數慢幾個數量級,作業還安慰我不要在意效率,豈可修!)
需要用到的編程知識也就是Matlab和Numpy了吧,Matlab是可以現學現賣的;至於Python,就看題主想用來做什麼了,如果就是用來做機器學習,完全可以一天入門,如果想要做更多好玩的事,一天不行那就兩天。(貼一個Python/Numpy的簡要教程:Python Numpy Tutorial,是cs231n的課堂福利。)
我感覺機器學習的先修就這麼點,記得Adobe的馮東大神也說過機器學習簡直是21世界的黑科技——因為理論非常簡單但是效果驚人的好。
====
既然提到好玩的,牆裂推薦Kaggle: Your Home for Data Science,引用維基上的介紹:Kaggle是一個數據建模和數據分析競賽平台。企業和研究者可在其上發布數據,統計學者和數據挖掘專家可在其上進行競賽以產生最好的模型。這一眾包模式依賴於這一事實,即有眾多策略可以用於解決幾乎所有預測建模的問題,而研究者不可能在一開始就了解什麼方法對於特定問題是最為有效的。Kaggle的目標則是試圖通過眾包的形式來解決這一難題,進而使數據科學成為一場運動。
知乎用戶
說說我學習深度學習的經歷吧,從開始學習到現在大概有4個月,只能算新手,剛好可以回答新手問題。
先說編程:自認會用C++, 熟悉Python
英語水平:中等,能很快讀懂英文科學文獻
最開始對人工智能/深度學習感興趣是因為想用它試一試自然語言生成,後來想到一個物理方面的題目,預計可以用深度學習技術解決,開始接觸深度神經網絡。記錄一下學習歷程,
1. 安裝Tensorflow(google 開源的深度學習程序), 嘗試裡面最簡單的例子MNIST 獲得激勵。
2. 之後嘗試通過讀書(看視頻)理解最簡單的全連接神經網絡
先搜索找到答案:為什麼要Go Deep?
(1)神經網絡中輸入層,隱藏層,輸出層之間矩陣乘積的維度變化。
(2)Weight, Bias 這些是什麼,改變它們有什麼結果。
(3)激勵函數是什麼,有什麼作用,有哪些常用的激勵函數
(4)誤差如何向後傳遞,網絡如何通過最小化誤差函數更新,有哪些常用的優化方法
以上這些在一本交互式電子書中可以找到答案:
(5) 如何對權重正規化,L1, L2, BatchNormalization, (這些在以後真正應用的時候再看)
Deep Learning chapter 7 for L1, L2 regulation.
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift (2015) original paper for BN
Layer normalization (2016) Replace Batch Normalization in RNN
3. 選擇一種比較比較底層的神經網絡開源庫,tensorflow 或theano,
(2)看周莫凡的網絡教程https://www. youtube.com/user/Morvan Zhou
(3) 重複敲代碼,重複實現例子程序
4. 開始理解各種不同神經網絡架構所能處理的問題
(1) CNN 圖像識別,圖像處理,語音處理
(2) RNN,LSTM 自然語言理解與生成
(3) 增強學習,玩遊戲:)
5. 嘗試各種開源的有意思的神經網絡項目,新手可以從下面這個列表開始
6. 如果能翻牆,註冊twitter, facebook 賬號,follow 那些文章中經常出現的大牛的名字。他們每天提供很多新動向及最新技術,很多時候有很Fancy的應用。試試從這個大牛follow的人開始follow
當你對這些都很熟悉的時候,開始閱讀艱深的文獻:
1. CNN 的原始文獻
2. RNN 和LSTM 的原始文獻
3. Reinforcement Learning 的原始文獻
4. Google DeepMind 發表在Nature 上的幾篇經典
最後推荐一個高級點的庫:Keras Documentation
雖然這個庫還在發展階段,裡面仍有不少bug,但前途不可限量,可以很容易實現你之前讀文章時候見到的那些複雜的構架。作為例子,這裡有個教程:
Deep learning book in ipython-notebook and Keras Many example code in Keras.
這些學習歷程中遇到的資料都記錄在了我的個人note裡,希望大家共勉:
最後強調一個最最重要的事情:要有自己的想法,有將這種新技術用到自己項目中的強烈願望,從開始就要Coding,不斷嘗試才能不斷進步。
(看了很多其他的回答,在這裡想補充一段)
說實話,作為一個其他行業(物理,工程,化學,醫學,農業,衛星地圖識別,網絡安全領域,社會科學)的普通程序員,在本行業有比較深的理論和實驗背景,能接觸到海量數據(無論是傳感器數據,互聯網數據還是蒙特卡洛模擬數據),想做處一些創新性,交叉性的工作,這一輪人工智能的風絕對是要跟的。
作為一個計算機專業的人,可能覺得機器學習,人工智能,深度學習已經炒的過熱了。但是對於其他領域,可能大部分人還沒有想到把最基本的機器學習算法如:PCA,SVM,k-means...運用到本行業積累的大數據上, 更不要說最近的深度學習。
作為其他行業的普通程序員(除了數學與理論物理),我們不要指望從理論上徹底解決深度學習現存的問題。我們的優勢不在這裡,我們的優勢是計算機專業的人所沒有的專業知識,行業大數據。我們需要做的是把機器學習,深度神經網絡當作工具,知道它們能做什麼,如何去做。參考Andrew Ng 的機器學習筆記,
舉幾個簡單的例子:
1. 使用深度學習中生成風格化圖片的技術,製備具有特定功能的抗癌藥物
2.使用反常探測,尋找網絡攻擊Cyber-attacks prediction
3. 對於國家來說,更加聰明的互聯網關鍵詞過濾
4. 自動探測衛星地圖上道路,建築,車輛,河流。。。
5. 環境科學中尋找霧霾與眾多可能因素的非線性關聯
我們用卷積神經網絡來區分量子色動力學相變是crossover還是一階相變。(1年之後回來修改)回答這個問題的時候,文章剛剛寫好,最近文章已經在《自然-通訊》Nature Communications雜誌發表,網上公開鏈接是An equation-of-state-meter of quantum chromodynamics transition from deep learning,希望能給堅持在這個方向,做AI + X交叉學科應用的同學帶來精神上的激勵。