我的機器學習算法之路

2021-03-02 Datawhale

一、引言

二、機器學習的概念

三、機器學習的「三板斧」方法論

四、機器學習的推薦學習路線

學習準備

學習路線(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:判斷函數的好壞

損失函數,分類和回歸問題的不一樣,用的是交叉熵(信息學的概念,其實就是兩個組概率分布相似程度)。

enter image description here

用 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個。

enter image description here

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解決基礎數據結構問題的能力

2.學習路線(1年):

推薦直接學習國外一流大學的高水平視頻課程,同步寫課程作業,學習路線共分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

2.編程知識

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

4. 本人博客

1.本人博客(機器學習基礎算法專題)  https://blog.csdn.net/dukuku5038/article/details/82253966
2.本人博客(深度學習專題)https://blog.csdn.net/column/details/28693.html


作者介紹

武強,Datawhale核心團隊成員,人工智慧方向博士,中國移動集團IT架構師。科研方向:自然語言處理、計算機視覺、強化學習。已經發表SCI論文3篇,CSDN專欄文章62篇(機器學習專欄、深度學習專欄和強化學習專欄)。



我們是一群願意互促共享、嘗試改善世界的理想青年

期待和同樣渴望改變、渴望更好學習的你共同進步

相關焦點

  • 機器學習算法一覽
    尷尬的是,按理說,機器學習介紹與算法一覽應該放在最前面寫,詳細的應用建議應該在講完機器學習常用算法之後寫,突然莫名奇妙在中間插播這麼一篇,好像有點打亂主線。 老話說『亡羊補牢,為時未晚』,前面開頭忘講的東西,咱在這塊兒補上。我們先帶著大家過一遍傳統機器學習算法,基本思想和用途。
  • 【機器學習】監督式和非監督式機器學習算法
    本文中你將了解到監督式學習,非監督式學習和半監督式學習在閱讀本文之後你將知道如下知識:有關分類和回歸的監督式學習問題關於聚類和關聯非監督式學習問題用於監督式和非監督式問題的Example算法案例半監督式學習介於監督式和非監督式學習之間讓我們開始吧。
  • 終極算法:機器學習裡的「牛頓三定律」
    然後,我們會將所有觀點集中,一步步地變成解決方案——這個解決方案可能還不是終極算法,但已是我們能找到的最接近終極算法的方案。希望它能解放你的大腦,讓你大膽想像。當你閱讀本書時,如果覺得某些章節讀起來困難,可以隨意略讀甚至跳過它們。本書的概要才是重中之重,當明白所有學派的觀點之後,如果你重讀那些困難的章節,收穫可能會比之前更多。我研究機器學習已經有20 餘年了。
  • 新手必看的十種機器學習算法
    雷鋒網 AI 科技評論按:在神經網絡的成功的帶動下,越來越多的研究人員和開發人員都開始重新審視機器學習,開始嘗試用某些機器學習方法自動解決可以輕鬆採集數據的問題。然而,在眾多的機器學習算法中,哪些是又上手快捷又功能強大、適合新手學習的呢?Towards Data Science 上一篇文章就介紹了十種新手必看的機器學習算法,雷鋒網 AI 科技評論全文編譯如下。
  • 小白python機器學習之路(一)
    對於機器學習從聽說到真正開始學習,雖然課也上了,而且還有了一段時間的操作經驗,但機器學習是什麼,為什麼這麼做,要怎麼做,能夠回答這三個問題才是最終的目標。為了不淺嘗輒止,一定要勇敢走起來,我選擇的方式還是要用自己的語言表達出來。能夠用自己的話把知識講出來,和茶壺裡煮餃子,兩者是有天壤之別的,這也是我多年家教經驗證實的。
  • 圖解機器學習的常見算法
    ,大家總是被其中的各種各樣的算法和方法搞暈,覺得無從下手。確實,機器學習的各種套路確實不少,但是如果掌握了正確的路徑和方法,其實還是有跡可循的,這裡我推薦SAS的Li Hui的這篇博客,講述了如何選擇機器學習的各種方法。另外,Scikit-learn 也提供了一幅清晰的路線圖給大家選擇:其實機器學習的基本算法都很簡單,下面我們就利用二維數據和交互圖形來看看機器學習中的一些基本算法以及它們的原理。
  • 算法應用|機器學習python應用,初識機器學習是怎樣滴感受?
    本系列文章主要介紹機器學習在實踐中的應用,介紹利用 Python 的生態環境,使用機器學習的算法來解決工程實踐中的問題,而不是介紹算法本身。本系列文章參考了《機器學習Python實踐》,會通過例子一步一步地引導大家使用機器學習來處理和分類與回歸模型相關的問題。
  • 機器學習十大算法都是何方神聖?
    這門課程我上了三個學期,最後我做了一個簡單的基於搜索的智能系統,這個系統可以完成虛擬環境下的傳輸任務。通過這門課程我學到了很多知識,在將來我還要繼續學習。最近幾周,我有幸在舊金山的舉辦的機器學習大會上與眾多機器學習大牛交談,我和他們聊了很多關於深度學習雷鋒網(公眾號:雷鋒網)按:機器學習與人工智慧變得越來越熱。
  • 淺談機器學習分類算法
    目前隨著人工智慧的發展,機器學習的應用領域日益寬泛,各種機器學習適應不同的應用場景,而機器學習差別的關鍵點之一就在於所使用算法的不同,
  • 如何選擇正確的機器學習算法
    機器學習通用方法1 - 將問題分類按輸入分類:如果是標記數據,則是監督學習問題。如果它是用於查找結構的未標記數據,那麼這是一個無監督機器學習學習問題。如果解決方案是通過與環境交互來優化目標函數,那麼這就是強化學習問題。
  • 機器學習實戰(15.2):Apriori算法示例
    我是MPIG2018級研究生高鴻宇。在前一章我們了解了Apriori算法。它可以通過尋找物品的不同組合,找到頻繁項以及頻繁項之間的關聯,今天為大家帶來的是Apriori算法的實際應用示例。我們會通過一個從毒蘑菇中尋找相似特徵的示例來看Apriori算法是如何發現頻繁項以及找到他們的關聯關係的。
  • 機器學習最主流的算法庫sklearn
    「 scikit-learn,簡稱sklearn,是用Python語言開發的機器學習模塊庫,其包含大量的機器學習算法和測試數據集
  • 五分鐘了解機器學習十大算法
    本文為有志於成為數據科學家或對此感興趣的讀者們介紹最流行的機器學習算法。機器學習是該行業的一個創新且重要的領域。我們為機器學習程序選擇的算法類型,取決於我們想要實現的目標。現在,機器學習有很多算法。因此,如此多的算法,可能對於初學者來說,是相當不堪重負的。
  • 機器學習基礎圖表:概念、原理、歷史、趨勢和算法
    機器學習和人工智慧的關係機器學習是一種重在尋找數據中的模式並使用這些模式來做出預測的研究和算法的門類。機器學習是人工智慧領域的一部分,並且和知識發現與數據挖掘有所交集。他們也可能不得不這樣做,因為合作和算法融合是實現真正通用人工智慧(AGI)的唯一方式。這裡給出了機器學習方法的演化之路以及未來的可能模樣。1.
  • 機器學習常見算法分類匯總
    機器
  • 機器學習入門篇|面向初學者的十大機器學習算法
    當這種情況發生時,我覺得人們有義務將機器視為具有智能。」為了舉例說明機器學習的影響,Man group的AHL Dimension計劃是一個51億美元的對衝基金,部分由AI管理。 該基金開始運作後,到2015年,儘管其管理的資產遠遠少於該基金,但其機器學習算法卻貢獻了該基金一半以上的利潤。
  • 機器學習中常用優化算法介紹
    作者 | Walker編輯 | 磐石出品 | 磐創AI技術團隊【磐創AI導讀】:本文主要介紹了常用的一些機器學習中常用的優化算法
  • 算法應用|機器學習python應用,簡單機器學習項目實踐
    可以說這並不是一個正式的項目,只是用來做一個簡單的展示,用於給初次接觸機器學習的讀者快速了解機器學習的過程和結果。1 機器學習中的Hello World頂目學習編程時,往往我們的第一句代碼就是print(「Hello World」),而接下來的這個數據集,可以說得上是機器學習中的Hello World頂目,入門學習機器學習的過程中最常見的一個數據集。
  • 機器學習算法之LASSO算法
    算法名稱:LASSO的全稱Least Absolute Shrinkage
  • 等你在2118:探索機器學習算法生命周期
    你認為哪個機器學習算法會在2118年繼續使用? 你的腦海會浮現什麼答案呢? 隨機森林(Random forest),SVM,K-means,KNN甚至深度學習的其他變種? 回歸仍然是廣泛使用的機器學習算法。 人們正在使用回歸或繼續使用回歸,因為 ▌「它有效」的方面很多不同領域的人們都在使用回歸,因為它在它們工作中起到重要作用。 通過使用回歸,人們可以計算投資回報。