資料科學從頭學(一)開始.尋找方向

(文章內容皆為記錄本人之學習過程,非以分享為目的)

一、目的::
資料科學家相關要求:1.機器學習基礎, 2.優秀的編程能力,  3.分析和解決實際問題的能力。
實務流程:
收集數據、分析數據,確定學習目標,選擇算法、實現、測試並且改進的完整流程好的編程能力,代碼習慣和對計算效率的分析能力。

基礎知識:
概率/統計/線性代數的知識,數學期望,CLT,Markov Chain,normal/student’s t distribution,或是PCA/SVD這些很基礎的東西。高維空間的一些特性有直覺上的認識,這部分並不是強行要求背公式,要理解。

深度學習:
神經網絡的基礎知識(BP),以及常見的目標函數,激活函數和優化算法。在此基礎上,對于常見的CNN/RNN網絡,我們當然希望面試者能夠理解它們各自的參數代表什麽,比較好的初始參數,BP的計算,以及常見超參數的調整策略。

參考資料:https://www.facebook.com/EmotibotTaipei/posts/1889380767950535


二、需求:
1.快速  2.紮實要快速掌握機器學習的概念,但對於理論還是要適當速度去補上。

Google X領導人 Astro Teller 隨著創新週期變得愈來愈短,學習適應的時間愈來愈少,我們現在面對的是:「不穩定的固定狀態,以及偶爾不穩定狀態的差異。」他說,靜止穩定的時代已經結束了,但這並不是指我們無法獲得新的穩定:「新的穩定狀態必然是動態穩定。就像騎腳踏車一樣,無法停止不動,但如果你雙腳不停地踩,就能夠一直前進。儘管這不是人類的自然狀態,我們還是必須學習在不斷變動的世界中,保持動態穩定。」我們都必須學會「騎腳踏車」的技巧。泰勒說:「說來奇怪,我們可以在這樣的變動下重新獲得平靜,但這必須透過不斷地重新學習才能做到。我們肯定還沒有訓練自己的孩子,告訴他們如何保持動態穩定。」


喬許.考夫曼 (Josh Kaufman)  3 招聰明學習法 + 20 小時 = 學會新技能

1.拆解步驟和任務:目標拆解成小片段,小到目標成果可以具體化,決定你要做到哪個程度,選擇出最重要的部分開始練習。

2.學習到你能自行修正的程度:尋找一些可用資源輔助學習,但別讓資源阻擋你開始練習。例如,你可以找 20 本相關讀物,但別讓自己非得看完 20 本書才開始。學習到能看出自己的錯誤,並能自己修改的程度。

3.移除讓你分心的障礙物:學習時讓自己全神貫注,讓電視、電腦、手機,以及會讓你分心的事物都暫時消音,多一點專注力,確保學習過程不中斷。

4.最少練習20小時:一開始學習都會碰上讓人沮喪的階段,雖然笨手笨腳總讓人覺得自己很蠢,但那是學習的必經之路,只要堅持 20 小時之後你就能突破瓶頸,擺脫困境。



三、原則: 

實作與基礎知識同時進行。

1.實際操作:以實作來達到快速掌握機器學習知識與編程的目的,原則上挑選實作目標後就1.快速瀏覽Paper (只看架構與流程,不求看懂)、2.讀別人的程式碼、3.自己實際寫一遍,完全以速度為主。

2.基礎知識:基本機率、統計、微積分、線性代數...等還是要補足,且以看懂求扎實為主,未來遇到深入機器學習理論部分才不會因為基礎知識不足而受限。


四、實際操作案例:(網路參考資料)

-------------------------------
以下均為引用別人部落格資料(網路搜尋標題可以找到相關文章):

AI從頭學(五):
AD and Python高手是這樣學習的,實作Neural Turing Machine的paper,沒用任何可自動微分的套件,實作之後還跑出和paper上一樣的結果。與其花很多時間看很多paper但每篇都看不太懂,不如好好看一篇重要的paper,把它從頭到尾實作出來。Deep Learning是進展快速的領域,新的東西一直出來,舊的paper一個月就被超越了,唯一不變的是最基本的RNN和CNN之類的模型,幾乎每篇paper都是在這些基本架構上的延伸。弄懂這些基礎的,就能貫穿全部。

但並不是每個領域都有個核心模型可貫穿全部,有些領域適合一直看很多paper來學習,例如HCI,HCI是很跨領域的,它需要統計學、心理學甚至社會學的相關知識,需要一直看各種不同的paper來吸收這些領域的知識。這就不像Deep Learning只要搞懂一個核心概念就可以貫穿全部。(其實我不太懂HCI,有錯請指正)LeNet之前要會AD,而且還是手動AD,不是依賴套件。問題是Python的書我雖然不少了,可是還沒真正寫過,所以只好再查一下資料。

AI從頭學(六):
The Net依文章的性質,可以分為六大部分。1. 概論 [1]-[2]。2. AD基礎理論與應用 [3]-[8]。3. Python的AD Tools介紹 [9]-[11]。4. Python如何運用在科學計算 [12]-[16]。5. LeNet-5 [17]。6. Deep Learning的review論文 [18]-[24]。要用Python實作LeNet-5,第一個困難是用Python實做AD,雖然找不到Python,還好找到用Matlab實作AD的文章 [1],裡面講的蠻詳細的,解決了第一個問題。AD既不是數值微分,也不是符號微分 [2]。值得注意的是AD還分為Foward Mode跟Reverse Mode [2], [7]。這裡有個大問題是為什麼LeNet-5,或者說是CNN,會用到AD,也就是Deep Learning的論文裡,會有一堆chain rule的運算式。我苦思兩天,靠著一些殘存的印象,把LeNet文章中相關部分拆開仔細閱讀,終於有點撥雲見日,見圖一 [17] 與圖二 [2]。在此我不說破,因為怕說錯誤導。
剩下來就是用Python [12]-[16] 把LeNet-5 [17] 實作出來

1.概論:
[1] 2010_Introduction to Automatic Differentiation and MATLAB Object-Oriented Programming
[2] 2014_Automatic differentiation of algorithms for machine learning

2. AD基礎理論與應用:
[3] 2016_Mathematical modeling and optimization of complex structures
[4] 2012_Recent advances in algorithmic differentiation
[5] 2008_Advances in automatic differentiation
[6] 2006_Automatic Differentiation, Applications, Theory, and Implementations
[7] 1992_Automatic Differentiation, Overview and Application to Systems of  Parameterized Nonlinear Equations
[8] 1981_Automatic Differentiation, Techniques and Applications

3. Python的AD Tools介紹:
[9] 2016_Benchmarking Python Tools for Automatic Differentiation
[10] 2012_CasADi, A Symbolic Package for Automatic Differentiation and Optimal Control
[11] 2012_Algorithmic Differentiation in Python with AlgoPy

4.Python如何運用在科學計算
[12] 2016_Introduction to Scientific Computing in Python
[13] 2015_Mastering Python Scientific Computing
[14] 2015_Introduction to Python for Computational Science and Engineering
[15] 2014_An introduction to Python for scientific computing
[16] 2014_A Primer on Scientific Programming with Python

5.LeNet-5
[17] 1998_Gradient-Based Learning Applied to Document Recognition

AI從頭學(七):
AD and Python from Jason參考現有的 AD 實作比較容易些
 (此為 Python 實作)https://github.com/tisimst/ad


AI從頭學(八):
The Net from Mark 關於「如何做到直接在白紙上用python且不用任何可自動微分的套件 來寫LeNet,寫出來的code直接輸入電腦後可以訓練且跑出應有的結果。」不需要一直查資料,只要去看以下兩個東西就可達成。1.理論部分:看youtube 的 Neural Networks Hugo Larochelle ,總共有10堂課,但只要看lecture1, lecture 2, lecture 9 就可以學會CNN的理論了。中間那些CRF, RBM什麼的都可以跳過2.實作部分:看Torch 的 SpatialConvolution和SpatialMaxPooling的源碼。我覺得Torch相較於Tensorflow是很輕量化的,它的源碼比較簡潔易懂。而且與其看一堆有的沒的AD書籍,不如直接看這兩個比較快。這兩個看完後自己先在電腦上用python寫幾遍,把以上概念都理解以後,要在白紙上寫出能跑的就很容易了。此處要注意的是: 1. 越早實作越好,可先從簡單的one layer network開始實作,再來做multilayer,再來做CNN,以此類推。盡量不要查一直查資料而不實作,除非你真的有搞不懂的地方,再去查。2.每次在電腦上實作完後,看看能不能在白紙上寫出來,但這並不是要你把所有東西都死背下來,如果你真的有透徹理解,隨時都可以信手拈來,就不需要去死背了。

◎ Neural Networks by Hugo Larochelle
精簡版:
https://www.youtube.com/watch?v=SGZ6BttHMPw&list=PL5suWBuBcTTwBotGhOK4vM1kCFnn8TZug 
完整版:
https://www.youtube.com/watch?v=SGZ6BttHMPw&list=PL6Xpj9I5qXYEcOhn7TqghAJ6NAPrNmUBHThe Deep End of Deep Learning | Hugo Larochelle | TEDxBoston https://www.youtube.com/watch?v=dz_jeuWx3j0


◎ TorchWiki:
Torch is an open source machine learning library, a scientific computing framework, and a script language based on the Lua programming language.

https://en.wikipedia.org/wiki/Torch_%28machine_learning%292011_Torch7, A Matlab-like Environment for Machine Learning

◎ SpatialConvolution2002_Tutorial on Convolutions - Torch https://github.com/torch/nn/blob/master/SpatialConvolution.lua difference between SpatialConvolution and SpatialConvolutionMMhttps://groups.google.com/forum/#!topic/torch7/VKU7FwvxVJQ 

 ◎ SpatialMaxPooling
https://github.com/torch/nn/blob/master/SpatialMaxPooling.lua ◎ Lua Wiki:Lua is a lightweight multi-paradigm programming language designed primarily for embedded systems and clients. Lua is cross-platform since it is written in ANSI C, and has a relatively simple C API.

https://en.wikipedia.org/wiki/Lua_%28programming_language%292013_Programming in Lua2007_Beginning Lua Programming2006_Programming in Lua2006_Lua 5_1 Reference Manua

l-------------------------


五、理論基礎:

1.微積分:103年高三增能「微積分先修課程」
https://www.youtube.com/playlist?list=PLLc_VmyS2EKnoNqkd_1EkHVDK9TM8IrSX

2.機率: 機率 (Probability) by Prof. 葉丙成 MOOChttps://www.youtube.com/playlist?list=PLw9fh2FrjAqu1Gj_WznO-humCJT-OB2zF

3.線性代數:
參考資料
Linear Algebra Review and Reference Zico Kolter (updated by Chuong Do) September 30, 2015 http://cs229.stanford.edu/section/cs229-linalg.pdf

4.統計:
Think Stats: Probability and Statistics for Programmershttp://www.greenteapress.com/thinkstats/

5.其他:

Pre-Programming: Everything you need to know before you code
https://softnshare.wordpress.com/2016/11/22/preprogramming/

10 Free Must-Read Books for Machine Learning and Data Science
http://www.kdnuggets.com/2017/04/10-free-must-read-books-machine-learning-data-science.html?utm_content=buffer040fb&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer

小結: 時間寶貴

留言

這個網誌中的熱門文章

統計從頭學(二) 假設檢定入門

資料科學從頭學(五) Linear Regression

資料科學從頭學(四) SVM(線性)