起源

本來就想把 Deep Learning 學一下, 因緣際會下看到這一篇 Coursera 學習心得 試讀了七天,除了提供 Jupyter Notebook 之外,作業也都相當有趣,就開始繼續學了. 目前進度到 Week2 相當推薦有程式設計一點點基礎就可以來學.裡面的數學應該還好. 學習的過程中還可以學會 Python 裡面的 numpy 如何使用,因為裡面主要就是要教導你如何使用 numpy 來兜出 Neural Network .

課程鏈結: 這裡

學習鏈結:

課程內容:

第一週: Introduction to deep learning

  • 基本上就介紹 Machine Learning 與 Deep Learning 的基本常識. 比如說 (ReLU activation functionReLU activation function
  • 介紹了近幾年 Deep Learning 會如此發展快速的原因 (計算速度的進展..)
  • 最後有採訪 Geoffrey Everest Hinton (也就是將 Backpropagation 導入了 Deep learning 的人,並且發明了 Boltzmann machine ) .
    • 有不少有趣的事情,比如作者認為自己作出的 Boltzmann machine 很美麗,但是無法實作.
    • 所以後來作者加上了一些限制後,衍生出 restricted Boltzmann machine ,該系統就被 Netflix 拿來使用.

第二週: Neural Networks Basics

  • 從頭開始教,一開始就教導你什麼是 binary-classification .
    • 透過簡單的影像判斷是不是貓,來教導.
    • 透過不同的資料(R, G, B) 來判斷是不是貓.
  • 教導一些 Deep Learning 的基本:
    • Logistic Regression
    • Ligistic Regression Cost Function
    • Gradient Descent
    • Dervatives
  • 透過一個 Jupyter Notebook 來教導你如何透過 numpy 來寫一個簡單的二元分類器 (classifier) 來分辨輸入的圖片是不是貓. 實際流程是:
    • 先做一個 sigmoid function
    • 再來實作 propagate function.
      • 拿到 X
      • 做出 forward propagate:
        • 算出 A = sigmoid($$w^TX+b)
        • 再來算出 cost function J = \(-1/m \sum_{i=1}^m y^i * log(a^i) + (1-y^i)log(1-a^i)\)
      • 再來做出 backward propagate:
        • 計算出 dw 與 db.
        • \[dw = 1/m (X (A-Y)^T)\]
        • \[db = 1/m \sum_{i=1}^m (A-y^i)\]
    • 再來要做 optimize function
      • 透過 gradient descent algorithm 來優化 w, b
      • 透過 iteration 的 loop
        • 透過 propagate 來找出新版的 dw, db
        • 透過 dw, db 來修正目前的 w, b
          • \[w = w - learning_rate * dw\]
          • \[b = b - learning_rate * db\]
        • 進行下一回合的 propagate
    • 再來就要透過計算出來的 w, b 來預測 (predict) 是否是貓
      • 透過 \(A = sigmoid( (X * w) + b)\)
      • 如果 A > 0.5 (threshold) 我們就認為這張圖片是貓
    • 整個 Model 的部分,就是做以下的事情:
      • 初始化 w, b (在此是設定為 0, 其實有更好的方式)
      • optimize 找出 w, b
      • 透過 w, b 來跑 predict
      • 作 training accuracy 鑑驗

我必須得說,最後這個 Jupyter Notebook 真的太有趣了…

NN 的常用符號解釋:

  • \(m\): 表示所有的訓練資料個數 (traning set)
  • \(n\): 每一個資料集中所具有的資料量
  • \(X \in \R\) 並且 \(X=(n_x, m)\)
  • \(Y\) 代表是結果 \(Y \in {0, 1}\)
    • (0: 代表不是, 1: 代表是)

關於一些 numpy 的基礎教學

由於這次課程不會用到比較複雜的 NN (Neural Network) 套件,而是直接使用 numpy 來打造一個 NN ,這裡有不少的 numpy 教學部份.有提到一些類似於:

import numpy as np

  • numpy 的 a=np.random.randn(5) 產生出來不是一個具有 transporm matrix 的 array 而是一個 a.shape = (5,)
    • 要正確產生一個 5,1 的 array 需要輸入 a=np.random.randn(5,1)
    • 建議加上 assert(a.shape==(5,1)) 作為檢查,確認沒有漏打.

透過 numpy 與 math 來學 sigmoid

\[sigmoid(x) = \frac{1}{1+e^{-x}}\]
import math

def basic_sigmoid(x):
    sig = 1 / (1 + math.e ** -x)
    return sig

由於 math 不能直接處理 array ,要改成 numpy

import numpy as np

def np_sigmoid(x):
    sig = 1 / (1 + np.exp(-x))
    return sig

usig numpy for norm

x_norm = np.linalg.norm(x, axis=1, keepdims=True)
normalize_x = x/x_norm

Softmax implement by numpy

def softmax(x):
    exp_x = np.exp(x)
    sum = np.sum(exp_x, axis=1, keepdims=True)
    s = exp_x/sum
    return s  
    

numpy 的效能評比

針對 vector 比較大量的時候,其實 numpy 的效能反而比起直接透過 for-loop 來運算快得多.並且整個代碼都清楚多了.

L1, L2 loss implement by numpy

def l1(yhat, y):
    loss= np.sum(np.abs(y-yhat))
    return loss
    
def l2(yhat, y):
    loss2= np.sum(np.dot(y-yhat, y-yhat))
    return loss2

記住 np.dot 是將兩個矩陣相乘,所有要求平方就是自己跟自己相乘.

使用 numpy 來做 propagate

# GRADED FUNCTION: propagate

def propagate(w, b, X, Y):
    m = X.shape[1]
    A = sigmoid( np.dot(np.transpose(w),X) + b )                                   # compute activation
    cost = -1 / m * np.sum( np.multiply(Y, np.log(A)) + np.multiply(1-Y, np.log(1-A)))
    
    dw = 1/m * np.dot(X, np.transpose(A-Y))
    db = 1/m * np.sum(A-Y)

    assert(dw.shape == w.shape)
    assert(db.dtype == float)
    cost = np.squeeze(cost)
    assert(cost.shape == ())
    
    grads = {"dw": dw,
             "db": db}
    
    return grads, cost

Numpy 裡面處理 matrix 需要注意的部分

  • 加法可以直接處理 [3,2] + [3,1]
  • 關於乘法(*) (跟 np.multiply 相同) 第一個維度需要相同
    • [4,3]*[3,1] –> Error
    • [4,3]*[4,1] –> [4,3]
      • 註解: 此狀況會產生 broadcasting
  • np.dot(): 注意第一個的第二維度需要跟第二個的第一維度相同(矩陣相乘)
    • np.dot([4,3], [3,1]) –> [4,1]
    • np.dot([4,3], [4,1]) –> Error

Interview with Pieter Abbeel

Pieter Abbeel 是處理 Deep Reinforcement Learning 的專家,這篇有提到他如何進行相關研究.


Buy Me A Coffee

Evan

Attitude is everything