Logistic Regression as a Neural Network
Last updated
Last updated
一開始,我們想將一張 64x64 的圖片餵進 nn 中,來辨識是否是貓
1 代表是,0 代表不是
怎麼餵呢,我們將圖片中 RGB 三種 channel 的各 64x64 個 pixel 存到一個非常長的向量 x
共有 個 features
我們會使用 來表達 feature x 的維度,所以
我們的 training sets 為 分別表示為
共有 m 個 training sets
並且我們會壓縮所有的 training sets 和 y 成為一個大矩陣
這邊跟 machine learning 學的有點不一樣
我們會定義一個 Loss function 來當作 single training set 的誤差
以下是一個 intuition 為什麼這個 loss function 可以這樣定義
cost function is the average of the loss functions of the entire training set
裡面的 superscript i 代表第 i 個 training set
這邊的 gradient descent 和 machine learning 時學的大同小異
只是現在我們連 b 也要一起進行更新
這邊講一下 gradient descent 需要用到的微分技巧
其實就只是要求出 x 在對應的 cost function 當下的 slope 而已
做任何的移動都可以算出 slope = 3
Changing Derivatives
在不同的 function 上可以有不斷變動的 slope
當 a = 2 時
當 a = 5 時
可以看到不同地方的三角形所產生的斜率都不同
這其實就是一次微分的意義
常見的有 :
在講解 backpropogation 前,我們用一個簡單方法來解釋一下流程
這個函式需要用到三個計算
可以畫成像這樣的 computation graph
而 backpropogation 就像是由右往左取每一個數對 J 的導數一樣
求完就可以對每個數做 gradient descent
為什麼要由右往左取呢,是因為需要用到 chain rule 的關係
其中 var 是任何一個變數
這是 python 在定義這些變數時的常見寫法
因為當 v 進行微調的時候,J 就會改變三倍
因為當 a 進行微調時,J 一樣也改變三倍
但我們要從 a 改變 v 而 v 改變 J 這樣算
基於這點,我們再找出 a 進行微調時 v 會維持一倍
我們用這個 chain rule 方法計算出 u 然後再計算出 b, c
就可以得到所有數字對 J 的 slope 是多少
我們將 logistic regression 計算 cost function 轉換成 computation graph
然後對這三個數做 gradient descent
接著我們把上面所有東西統整一起,對 m 筆 training sets 做一次 gradient descent
pseudo code 如下 :
這個做法可能會用到兩個迴圈,一個是對 m 筆資料,一個是對 n 個 input features (dw1, dw2, ..., dwn)
所以我們需要學習 vectorization 的精神來解決問題
在 矩陣中
每個 columns i 為不同個 training set
每個 rows j 表示所有 的第 j 個 feature
在 矩陣中
每個 columns i 為不同個 result label
定義好 和
以及 parameter 和
這個 其實就是之前的 是一個 vector
而 就是 bias 的 是一個實數
然後我們要求 output 就是之前的
其中的 就是之前的 sigmoid function
就是說當 時,我的 也要越大越好
我的 越大,代表越接近 ,我的 loss 就越小,所以
當 , 要越小越好
所以 就會接近 0
於是我們可以將作用在每一筆 training sets 的 loss function 集合形成 cost function
slope 的算法就是
所以一個 的 linear function 中
例如在 的圖形中
假設我們想要最小化
以下會將 標示為
例如 ,
現在我們就可以往前求得
再來我們再往前求得
我們已經知道
所以
計算 a 的導數為
計算 z 的導數為
其中已知
而新的
接著就可以算出 對 的導數