一、引言
二、機器學習的概念
三、機器學習的「三板斧」方法論
四、機器學習的推薦學習路線
學習準備
學習路線(1年)
學習寶典
編程建議
五、機器學習的學習資料
數學知識
編程知識
機器學習資料匯總
本人博客
未來,人工智慧是生產力,是變革社會的主要技術力量之一。 掌握人工智慧技術,需要從基礎的機器學習算法開始學習,逐漸建立機器學習知識體系。
本篇文章 :
1.帶大家克服心理上對於機器學習的敬畏,繞開彎路(本人入過很多坑),進入機器學習領域。
2.從基本概念和機器學習的應用領域入手,幫助大家建立機器學習的概念模型。
3.用最基本的線性回歸和邏輯回歸算法,讓大家掌握機器學習神秘的「三板斧」方法論。
4.通過自身多年的學習經驗,舉一反三,引導大家科學建立機器學習和深度學習的學習路線。
首先,我們看一下在Quora(美國知乎)上的三個問題和專家回答。
1. 我能在沒有計科碩士、博士文憑的情況下找到一份關於機器學習的工作嗎?
"你當然可以,但是想進入這個領域則無比艱難。" --Drac Smith
2. 我是一名軟體工程師,我自學了機器學習,我如何在沒有相關經驗的情況下找到一份關於機器學習的工作?
"我正在為我的團隊招聘機器學習專家,但你的MOOC並不會給你帶來工作機會。事實上,大多數機器學習方向的碩士也並不會得到工作機會,因為他們(與大多數上過MOOC的人一樣)並沒有深入地去理解。他們都沒法幫助我的團隊解決問題。"-- Ross C. Taylor
3. 找一份機器學習相關的工作需要掌握怎樣的技能?
"首先,你得有正兒八經的計科或數學專業背景。ML是一個比較先進的課題,大多數的教材都會直接默認你有以上背景。其次,機器學習是一個集成了許多子專業的奇技淫巧的課題,你甚至會想看看MS的機器學習課程,去看看他們的授課、課程和教材。""統計,假設,分布式計算,然後繼續統計。" --Hydrangea
通過以上三個問題和專業人士的回答,很多機器學習小白可能會望而卻步。
其實,我通過自身的學習經驗,長期堅持和積累,發現機器學習的內在規律,分享出來,讓大家克服心理恐懼,高效的投入的機器學習課程中。
再舉一些機器學習大牛的例子:
說明任何時候學習都不嫌晚!但是一定要有正確的方法和堅毅的態度。
好吧,那麼我們就進入機器學習的世界。
究竟什麼是機器學習?
這個問題回答如果在教科書,可能會很複雜。但是能夠把複雜的問題簡單化,是一件見不太容易的事情(需要足夠的功力)。但是我儘量為大家這樣做。
1.語音識別:輸入一段語音信號,輸出文字:
輸入:
語音信息輸出:"how are you"
2.圖像識別:輸入圖片,輸出圖片的屬性:
輸入:
貓輸出:"cat"
3.智能控制:輸入棋盤局勢,輸出下一步落棋位置
輸入:
棋盤輸出:"5*5"
4.對話系統: 輸入語言,系統回復
輸入:"Hi"
輸出:"Hello"
那麼,找到這個函數f(x)是機器學習者的核心任務。下面的講到的「方法論」核心就是如何去找f(x)。
機器學習的過程和把大象放冰箱一樣,一共分三步:
step_1: 定義一個函數集合(define a function set)
step_2: 判斷函數的好壞(goodness of a function)
step_3: 選擇最好的函數(pick the best one)
首先,進人用「三板斧」解決機器學習中最基本的回歸(預測)、分類問題之前,我們進行一下準備活動。
三板斧中的核心步驟- 步驟3: 選擇最好的函數。
步驟3中,如何選擇好的神經網絡(的呢?
L() 代表判斷函數的好壞(一般為與真實值的差距,差距越小越好)
我們的目標是讓L() 最小化:
這裡我們就引入梯度下降(高等數學中的基本概念):
梯度下降機器學習、深度學習中最重要的概念之一:
梯度下降是目前,最有效的方法之一。
方法:我們舉兩個參數的例子1,2, 損失函數是L。那麼它的梯度是:
那我為了求得最小值,我們有:
參數不斷被梯度乘以學習率η 迭代
那麼上述公示公為什麼是減號,不是加號呢?
我們定義\theta改變的方向是movement的方向, 而gradient的方向是等高線的法線方向
準備活動2:了解Keras
Kearas 是機器學習、深度學習小白代碼入門的最佳工具之一。
如果想提升、練習代碼能力,還是建議算法徒手python實現。 複雜的深度神經網絡項目還是推薦TensorFlow或者Pytorch
簡介:
Keras是一個高級神經網絡API,Keras由純Python編寫而成並基Tensorflow、Theano以及CNTK後端。
Keras 為支持快速實驗而生,能夠把你的idea迅速轉換為結果,如果你有如下需求,請選擇Keras:
簡易和快速的原型設計(keras具有高度模塊化,極簡,和可擴充特性)支持CNN和RNN,或二者的結合無縫CPU和GPU切換。
為了更加生動的讓小白同學克服機器學習、深度學習編程的恐懼心理,我再這裡給出一幅圖:
機器學習,尤其是深度學習編程strong text其實是:搭積木!
介紹完本次代碼演示的工具後,我們就用實際經典的機器學習的代碼,手握「三板斧」,帶大家進入機器學習的世界。
機器學習最重要的問題,主要是在回歸(預測)、和分類,我們的例子包含這兩大類。
問題
給下面一組數據,用一條線來對數據進行擬合,並可以預測新輸入 x 的輸出值。
X = np.linspace(-1, 1, 200)
np.random.shuffle(X)
Y = 0.5 * X + 2 + np.random.normal(0, 0.05, (200, ))
plt.scatter(X, Y)
plt.show()
X_train, Y_train = X[:160], Y[:160]
X_test, Y_test = X[160:], Y[160:]
可視化創建的數據集如下:
下面就是三板斧了:
(1) 線性回歸- 徒手代碼版(推薦)
我們定義函數集合為:, m=160(訓練數據的量)
X = np.c_[np.ones(m), X]
theta = np.zeros(2)
iterations = 1500
alpha = 0.01
cost = np.sum((np.dot(X, theta) - y) ** 2) / (2 * m)
theta = gradient_descent(X_train,Y_train, theta, alpha, iterations, cost)
predict = np.dot(X_test, theta)
註: gradient_descent 函數的實現我們暫時忽略,但是原理大家已經掌握。
我們的預測結果如下:
(2) 線性回歸- Kears 神經網絡版
三板斧1:定義一個函數集合(建立神經網絡模型)
我們定義函數集合為:
我們用 神經網絡來擬合這樣函數。
Sequential 建立 model, 再用 model.add 添加神經層,添加的是 Dense 全連接神經層。
參數有兩個,一個是輸入數據和輸出數據的維度,本代碼的例子中 x 和 y 是一維的。
如果需要添加下一個神經層的時候,不用再定義輸入的緯度,因為它默認就把前一層的輸出作為當前層的輸入。在這個例子裡,只需要一層就夠了。(即使是一層神經網絡可以擬合任何函數)
model = Sequential()
model.add(Dense(output_dim=1, input_dim=1))
三板斧2:判斷函數的好壞
誤差函數是判斷函數好壞的主要方式,本例中用的是MSE 均方誤差;
優化器用的是 sgd 隨機梯度下降法(一種能讓MSE找到最小值的通用方法)
model.compile(loss='mse', optimizer='sgd')
三板斧3:選擇最好的函數(訓練模型)
訓練的時候用 model.train_on_batch 一批一批的訓練 X_train, Y_train。默認的返回值是 cost,每100步輸出一下結果。
print('Training -')
for step in range(301):
cost = model.train_on_batch(X_train, Y_train)
if step % 100 == 0:
print('train cost: ', cost)
"""
Training -
train cost: 4.111329555511475
train cost: 0.08777070790529251
train cost: 0.007415373809635639
train cost: 0.003544030711054802
"""
三板斧過後,我們檢驗一下我們模型:
用到的函數是 model.evaluate,輸入測試集的x和y, 輸出 cost,weights 和 biases。其中 weights(theta0) 和 biases(theta1) 是取在模型的第一層 model.layers[0] 學習到的參數。從學習到的結果你可以看到, weights 比較接近0.5,bias 接近 2。
print('\nTesting --')
cost = model.evaluate(X_test, Y_test, batch_size=40)
print('test cost:', cost)
theta1, theta0 = model.layers[0].get_weights()
print('Weights=', theta1, '\nbiases=', theta0 )
"""
Testing --
40/40 [==============================] - 0s
test cost: 0.004269329831
Weights= [[ 0.54246825]]
biases= [ 2.00056005]
"""
可視化結果 :
Y_pred = model.predict(X_test)
plt.scatter(X_test, Y_test)
plt.plot(X_test, Y_pred)
plt.show()
我們的回歸問題,通過找到函數的參數theta1 =0.5,theta0 =2.0,已經完成:
2. 分類
分類問題中,我們使用深度學習的「Hello World」,手寫數字識別作為例子。
手寫數字識別。用最簡單的DNN神經網絡實現。
Keras 自身就有 MNIST 這個數據包,再分成訓練集和測試集。x 是一張張圖片,y 是每張圖片對應的標籤,即它是哪個數字。
輸入的 x 變成 60,000*784 的數據,然後除以 255 進行標準化,因為每個像素都是在 0 到 255 之間的,標準化之後就變成了 0 到 1 之間。
對於 y,要用到 Keras 改造的 numpy 的一個函數 np_utils.to_categorical,把 y 變成了 one-hot 的形式,即之前 y 是一個數值, 在 0-9 之間,現在是一個大小為 10 的向量,它屬於哪個數字,就在哪個位置為 1,其他位置都是 0。
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], -1) / 255.
X_test = X_test.reshape(X_test.shape[0], -1) / 255.
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)
print(X_train[1].shape)
"""
(784,)
"""
print(y_train[:3])
"""
[[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
[ 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]]
"""
我們的三板斧又可以登場了:
三板斧1:定義一個函數集合(建立神經網絡模型)
在回歸網絡中用到的是 model.add 一層一層添加神經層,以下圖片分類的方法是直接在模型的裡面加多個神經層。好比一個水管,一段一段的,數據是從上面一段掉到下面一段,再掉到下面一段。
第一段就是加入 Dense 神經層。32 是輸出的維度,784 是輸入的維度。 第一層傳出的數據有 32 個 feature,傳給激勵單元,激勵函數用到的是 relu 函數。 經過激勵函數之後,就變成了非線性的數據。 然後再把這個數據傳給下一個神經層,這個 Dense 我們定義它有 10 個輸出的 feature。同樣的,此處不需要再定義輸入的維度,因為它接收的是上一層的輸出。 接下來再輸入給下面的 softmax 函數,用來分類。
model = Sequential([
Dense(32, input_dim=784),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
三板斧2:判斷函數的好壞
損失函數,分類和回歸問題的不一樣,用的是交叉熵(信息學的概念,其實就是兩個組概率分布相似程度)。
用 RMSprop 作為優化器(暫時可以認為是一種讓Loss穩定減少的工具),它的參數包括學習率等,可以通過修改這些參數來看一下模型的效果。
rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)
model.compile(optimizer=rmsprop, loss='categorical_crossentropy', metrics=['accuracy'])
三板斧3:選擇最好的函數(訓練模型)
這裡用到的是 fit 函數,把訓練集的 x 和 y 傳入之後,nb_epoch 表示把整個數據訓練多少次,batch_size 每批處理32個。
model.fit(X_train, y_train, epoch=20, batch_size=100)
"""
Training --
Epoch 1/2
60000/60000 [==============================] - 2s - loss: 0.3506 - acc: 0.9025
Epoch 2/2
60000/60000 [==============================] - 2s - loss: 0.1995 - acc: 0.9421
"""
三板斧過後,我們檢驗一下我們模型:
print('\nTesting --')
loss, accuracy = model.evaluate(X_test, y_test)
print('test loss: ', loss)
print('test accuracy: ', accuracy)
"""
Testing --
9760/10000 [============================>.] - ETA: 0s
test loss: 0.1724540345
test accuracy: 0.9489
"""
我們的回歸問題已經完成:分類準確率已經達到94.89%。
1.學習準備:(1) 數學篇
高等數學: 微分部分即可(掌握微分原理)
線性代數: 掌握矩陣的基本運算、矩陣微分、Jacobian矩陣和Hessian矩陣
(2) 英語篇:
具有大學英語4級水平
(3) 編程篇:
具有使用Python解決基礎數據結構問題的能力
推薦直接學習國外一流大學的高水平視頻課程,同步寫課程作業,學習路線共分4步,
(1) 機器學習基礎算法(3個月)
(2) 深度學習(6個月)
計算機視覺(史丹福大學CS231N)(3個月)
自然語言處理(史丹福大學CS224N)(3個月)
(3) 機器學習編程框架(1個月)
Tensorflow(史丹福大學CS20I)
PyTorch
(4) 強化學習(2個月)
3. 學習寶典:(1) 創建博客
(2) 打AI比賽
(3) 創建Github
(4) 讀高水平英文論文
深度學習經典論文:https://github.com/floodsung/Deep-Learning-Papers-Reading-Roadmap
4. 編程建議:編寫代碼是機器學習、深度學習有力的武器,但是也是需要循序漸進,不能一開始就使用「重武器」(框架),這樣對基本的概念和掌握會很不牢靠,而且容易沾沾自喜,感覺自己都掌握了,其實不然。
建議路線:
python 徒手算法實現
使用sklearn等基礎的機器學習庫
學習Tensorflow或者Pytorch
學習Keras
五、機器學習的學習資料1.數學知識1.線性代數http://web.stanford.edu/class/cs224n/readings/cs229-linalg.pdf
2.概率論 http://web.stanford.edu/class/cs224n/readings/cs229-prob.pdf
3.凸函數優化 http://web.stanford.edu/class/cs224n/readings/cs229-cvxopt.pdf
4.隨機梯度下降算法 http://cs231n.github.io/optimization-1/
5.機器學習中的數學基本知識 https://www.cnblogs.com/steven-yang/p/6348112.html
6.統計學習方法 http://vdisk.weibo.com/s/vfFpMc1YgPOr
1.Python複習
http://web.stanford.edu/class/cs224n/lectures/python-review.pdf
2.廖雪峰python3教程
https://www.liaoxuefeng.com/article/001432619295115c918a094d8954bd493037b03d27bf9a9000
3.github教程
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
4.機器學習代碼修行100天
https://github.com/Avik-Jain/100-Days-Of-ML-Code
3. 機器學習資料匯總1.深度學習經典論文https://github.com/floodsung/Deep-Learning-Papers-Reading-Roadmap.git
2.深度學習斯坦福教程 http://deeplearning.stanford.edu/wiki/index.php/UFLDL教程
3.莫煩機器學習教程 https://morvanzhou.github.io/tutorials
4.吳恩達機器學習新書:machine learning yearning https://github.com/AcceptedDoge/machine-learning-yearning-cn
5.自上而下的學習路線: 軟體工程師的機器學習https://github.com/ZuzooVn/machine-learning-for-software-engineers/blob/master/README-zh-CN.md
1.本人博客(機器學習基礎算法專題) https://blog.csdn.net/dukuku5038/article/details/82253966
2.本人博客(深度學習專題)https://blog.csdn.net/column/details/28693.html
作者介紹
武強,Datawhale核心團隊成員,人工智慧方向博士,中國移動集團IT架構師。科研方向:自然語言處理、計算機視覺、強化學習。已經發表SCI論文3篇,CSDN專欄文章62篇(機器學習專欄、深度學習專欄和強化學習專欄)。
我們是一群願意互促共享、嘗試改善世界的理想青年
期待和同樣渴望改變、渴望更好學習的你共同進步