二元分類與 Logistic 迴歸從屬於筆者的Deep Learning Specialization 課程筆記系列文章,本文主要記述了筆者學習 Andrew NG Deep Learning Specialization 系列課程的筆記與程式碼實現。注意,本篇有大量的數學符號與表示式,部分網頁並不支援;可以前往原始檔檢視較好的排版或者在自己的編輯器中開啟。
本部分將會介紹神經網格構建與訓練的基礎知識;一般來說,網路的計算過程由正向傳播(Forward Propagation)與反向傳播(Back Propagation)兩部分組成。這裡我們將會以簡單的 Logistic 迴歸為例,講解如何解決常見的二元分類(Binary Classification)問題。這裡我們將會嘗試訓練出簡單的神經網路以自動識別某個圖片是否為貓,為貓則輸出 1,否則輸出 0。計算機中的圖片往往表示為紅、綠、藍三個通道的畫素值;如果我們的影像是 64 64 畫素值大小,我們的單張圖片的特徵維度即為 64 64 * 3 = 12288,即可以使用 $n_x = 12288$ 來表示特徵向量的維度。
深度學習的標準術語約定
神經網路的符號
上標 $^{(i)}$ 表示第 $i$ 個訓練用例,而上標 $^{[l]}$ 則表示第 $l$ 層。
尺寸
- $m$:資料集中用例的數目。
- $n_x$:輸入的單個用例的特徵向量維度。
- $n_y$:輸出的維度(待分類的數目)。
- $n_h^{[l]}$:第 $l$ 個隱層的單元數目,在迴圈中,我們可能定義 $n_x = n_h^{[0]}$ 以及 $n_y = n_h^{number , of , layers + 1}$。
- $L$:神經網路的層數。
物件
- $X in R^{n_x imes m}$:輸入的矩陣,即包含了 $m$ 個用例,每個用例的特徵向量維度為 $n_x$。
- $x^{(i)} in R^{n_x}$:第 $i$ 個用例的特徵向量,表示為列向量。
- $Y in R^{n_y imes m}$:標籤矩陣。
- $y^{(i)} in R^{n_y}$:第 $i$ 個用例的輸出標籤。
- $W^{[l]} in R^{number , of , units , in , next , layer imes number , of , unites , in , the , previous , layer}$:第 $l$ 層與第 $l+1$ 層之間的權重矩陣,在簡單的二元分類且僅有輸入層與輸出層的情況下,其維度就是 $ 1 imes n_x$。
- $b^{[l]} in R^{number , of , units , in , next , layer}$:第 $l$ 層的偏差矩陣。
- $hat{y} in R^{n_y}$:輸出的預測向量,也可以表示為 $a^{[L]}$,其中 $L$ 表示網路中的總層數。
通用前向傳播等式
- $ a = g^{[l]}(W_xx^{(i)} + b_1) = g^{[l]}(z_1) $,其中 $g^{[l]}$ 表示第 $l$ 層的啟用函式。
- $hat{y}^{(i)} = softmax(W_hh + b_2)$。
- 通用啟用公式:$a_j^{[l]} = g^{[l]}(sumkw{jk}^{[l]}a_k^{[l-1]} + b_j^{[l]}) = g^{[l]}(z_j^{[l]})$。
- $J(x, W, b, y)$ 或者 $J(hat{y}, y)$ 表示損失函式。
損失函式
- $J{CE(hat{y},y)} = – sum{i=0}^m y^{(i)}log hat{y}^{(i)}$
- $J{1(hat{y},y)} = sum{i=0}^m | y^{(i)} – hat{y}^{(i)} |$
深度學習的表示
在深度學習中,使用結點代表輸入、啟用函式或者資料,邊代表權重或者偏差,下圖即是兩個典型的神經網路:
Logistic 迴歸
基礎模型
在貓咪識別問題中,我們給定了未知的圖片,可以將其表示為 $X in R^{n_x}$ 的特徵向量;我們的任務就是尋找合適的演算法,來根據特徵向量推匯出該圖片是貓咪的概率。在上面的介紹中我們假設了 Logistic 函式的引數為 $w in R^{n_x} $ 以及 $b in R$,則輸出的計算公式可以表示為:
$$
hat{y} = sigma(w^Tx + b)
$$
這裡的 $sigma$ 表示 Sigmoid 函式,該函式的表示式與線型如下:
上圖中可以發現,當 $t$ 非常大時,$e^{-t}$ 趨近於 0,整體的函式值趨近於 1;反之,如果 $t$ 非常小的時候,整體的函式值趨近於 0。
損失函式與代價函式
我們的訓練目標是在給定訓練資料 ${(x^{(1)}, y^{(1)}),…,(x^{(m)},y^{(m)})}$ 的情況下使得 $hat{y}^{(i)}$ 儘可能接近 $y^{(i)}$,而所謂的損失函式即是用於衡量預測結果與真實值之間的誤差。最簡單的損失函式定義方式為平方差損失:
$$
L(hat{y},y) = frac{1}{2} (hat{y} – y)^2
$$
不過 Logistic 迴歸中我們並不傾向於使用這樣的損失函式,因為其對於梯度下降並不友好,很多情況下會陷入非凸狀態而只能得到區域性最優解。這裡我們將會使用如下的損失函式:
$$
L(hat{y},y) = -(yloghat{y} + (1-y)log(1-hat{y}))
$$
我們的優化目標是希望損失函式值越小越好,這裡我們考慮兩個極端情況,當 $y = 1$ 時,損失函式值為 $-loghat{y}$;此時如果 $hat{y} = 1$,則損失函式為 0。反之如果 $hat{y} = 0$,則損失函式值趨近於無窮大。當 $y = 0$ 時,損失函式值為 $-log(1-hat{y})$;如果 $hat{y} = 1$,則損失函式值也變得無窮大。這樣我們可以將 Logistic 迴歸中總的代價函式定義為:
$$
J(w,b) =
frac{1}{m}sum{i=1}^mL(hat{y}^{(i)} – y^{(i)}) =
-frac{1}{m} sum{i=1}^m [y^{(i)}loghat{y}^{(i)} + (1-y^{(i)})log(1-hat{y}^{(i)})]
$$
在深度學習的模型訓練中我們常常會接觸到損失函式(Loss Function)與代價函式(Cost Function)的概念,其中損失函式代指單個訓練用例的錯誤程度,而代價函式往往是整個訓練集中所有訓練用例的損失函式值的平均。