深度學習教程 | 神經網路基礎

ShowMeAI 發表於 2022-04-15
深度學習 神經網路

深度學習教程 | 神經網路基礎

收藏ShowMeAI檢視更多精彩內容


第1門課 神經網路和深度學習,第2周:神經網路的程式設計基礎

本系列為吳恩達老師《深度學習專項課程(Deep Learning Specialization)》學習與總結整理所得,對應的課程視訊可以在這裡檢視。

引言

ShowMeAI前一篇文章 深度學習概論 中我們對深度學習(Deep Learning)進行了簡單介紹:

  • 我們以房價預測為例,對應講解了神經網路(Neural Network)模型結構和基礎知識。
  • 介紹了針對監督學習的幾類典型神經網路:Standard NN,CNN和RNN。
  • 介紹了「結構化資料」和「非結構化資料」2種不同型別的資料。
  • 分析了近些年來深度學習熱門,及其效能優於傳統機器學習的原因(Data,Computation和Algorithms)。

本節內容我們展開介紹神經網路的基礎:邏輯迴歸(Logistic Regression)。我們將通過對邏輯迴歸模型結構的分析,過渡到後續神經網路模型。(關於邏輯迴歸模型,大家也可以閱讀ShowMeAI的文章 圖解機器學習 | 邏輯迴歸演算法詳解 學習)

1.演算法基礎與邏輯迴歸

邏輯迴歸(Logistic regression) 是一個用於二分類的演算法。

1.1 二分類問題與機器學習基礎

二分類 Binary Classification

二分類就是輸出\(y\)只有 {0,1} 兩個離散值(也有 {-1,1} 的情況)。我們以一個「影像識別」問題為例,判斷圖片是否是貓。識別是否是「貓」,這是一個典型的二分類問題——0代表「非貓(not cat)」,1代表「貓(cat)」。(關於機器學習基礎知識大家也可以檢視ShowMeAI文章 圖解機器學習 | 機器學習基礎知識)。

演算法基礎與邏輯迴歸

從機器學習的角度看,我們的輸入\(x\)此時是一張圖片,彩色圖片包含RGB三個通道,圖片尺寸為\((64,64,3)\)。

資料與向量化格式

有些神經網路的輸入是一維的,我們可以將圖片\(x\)(維度\((64,64,3)\))展平為一維特徵向量(feature vector),得到的特徵向量維度為\((12288,1)\)。我們一般用列向量表示樣本,把維度記為\(n_x\)。

如果訓練樣本有\(m\)張圖片,那麼我們用矩陣儲存資料,此時資料維度變為\((n_x,m)\)。

資料與向量化格式

  • 矩陣\(X\)的行\(n_x\)代表了每個樣本\(x^{(i)}\)特徵個數
  • 矩陣\(X\)的列\(m\)代表了樣本個數。

我們可以對訓練樣本的標籤\(Y\)也做一個規整化,調整為1維的形態,標籤\(Y\)的維度為\((1,m)\)。

1.2 邏輯迴歸演算法

邏輯迴歸 Logistic Regression

邏輯迴歸是最常見的二分類演算法(詳細演算法講解也可閱讀ShowMeAI文章 圖解機器學習 | 邏輯迴歸演算法詳解),它包含以下引數:

  • 輸入的特徵向量:\(x \in R^{n_x}\),其中 \({n_x}\)是特徵數量
  • 用於訓練的標籤:\(y \in 0,1\)
  • 權重:\(w \in R^{n_x}\)
  • 偏置: \(b \in R\)
  • 輸出:\(\hat{y} = \sigma(w^Tx+b)\)

輸出計算用到了Sigmoid函式,它是一種非線性的S型函式,輸出被限定在 \([0,1]\) 之間,通常被用在神經網路中當作啟用函式(Activation Function)使用。

邏輯迴歸做影像分類

Sigmoid函式的表示式如下:

$
s = \sigma(w^Tx+b) = \sigma(z) = \frac{1}{1+e^{-z}}
$

實際上,邏輯迴歸可以看作非常小的一個神經網路。

1.3 邏輯迴歸的損失函式

邏輯迴歸的代價函式 Logistic Regression Cost Function

在機器學習中,損失函式(loss function)用於量化衡量預測結果與真實值之間的差距,我們會通過優化損失函式來不斷調整模型權重,使其最好地擬合樣本資料。

在迴歸類問題中,我們會使用均方差損失(MSE):

$$ L(\hat{y},y) = \frac{1}{2}(\hat{y}-y)^2 $$

邏輯迴歸的損失函式

但是在邏輯迴歸中,我們並不傾向於使用這樣的損失函式。邏輯迴歸使用平方差損失會得到非凸的損失函式,它會有很多個區域性最優解。梯度下降法可能找不到全域性最優值,從而給優化帶來困難。

因此我們調整成使用對數損失(二元交叉熵損失):

$$ L(\hat{y},y) = -(y\log\hat{y})+(1-y)\log(1-\hat{y}) $$

邏輯迴歸的損失函式

剛才我們給到的是單個訓練樣本中定義的損失函式,它衡量了在單個訓練樣本上的表現。我們定義代價函式(Cost Function,或者稱作成本函式)為全體訓練樣本上的表現,即\(m\)個樣本的損失函式的平均值,反映了\(m\)個樣本的預測輸出與真實樣本輸出\(y\)的平均接近程度。

成本函式的計算公式如下:

$$ J(w,b) = \frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)}) $$

2.梯度下降法(Gradient Descent)

梯度下降 Gradient Descent

剛才我們瞭解了損失函式(Loss Function)與成本函式定義,下一步我們就要找到最優的\(w\)和\(b\)值,最小化\(m\)個訓練樣本的Cost Function。這裡用到的方法就叫做梯度下降(Gradient Descent)演算法。

在數學上,1個函式的梯度(gradient)指出了它的最陡增長方向。也就是說,沿著梯度的方向走,函式增長得就最快。那麼沿著梯度的負方向走,函式值就下降得最快。

(更詳細的最優化數學知識可以閱讀ShowMeAI文章 圖解AI數學基礎 | 微積分與最優化

模型的訓練目標是尋找合適的\(w\)與\(b\)以最小化代價函式值。我們先假設\(w\)與\(b\)都是一維實數,則代價函式\(J\)關於\(w\)與\(b\)的圖如下所示:

梯度下降法

上圖中的代價函式\(J\)是一個凸函式,只有一個全域性最低點,它能保證無論我們初始化模型引數如何(在曲面上任何位置),都能夠尋找到合適的最優解。

基於梯度下降演算法,得到以下引數\(w\)的更新公式:

$$ w := w - \alpha\frac{dJ(w, b)}{dw} $$

公式中\(\alpha\)為學習率,即每次更新的\(w\)的步長。

成本函式\(J(w, b)\)中對應的引數\(b\)更新公式為:

$$ b := b - \alpha\frac{dJ(w, b)}{db} $$

3.計算圖(Computation Graph)

計算圖 Computation Graph

對於神經網路而言,訓練過程包含了兩個階段:前向傳播(Forward Propagation)和反向傳播(Back Propagation)。

  • 前向傳播是從輸入到輸出,由神經網路前推計算得到預測輸出的過程
  • 反向傳播是從輸出到輸入,基於Cost Function對引數\(w\)和\(b\)計算梯度的過程。

下面,我們結合一個例子用計算圖(Computation graph)的形式來理解這兩個階段。

3.1 前向傳播(Forward Propagation)

假如我們的Cost Function為\(J(a,b,c)=3(a+bc)\),包含\(a\)、\(b\)、\(c\)三個變數。

我們新增一些中間變數,用\(u\)表示\(bc\),\(v\)表示\(a+u\),則\(J=3v\)。

整個過程可以用計算圖表示:

計算圖

在上圖中,我們讓\(a=5\),\(b=3\),\(c=2\),則\(u=bc=6\),\(v=a+u=11\),\(J=3v=33\)。

計算圖中,這種從左到右,從輸入到輸出的過程,就對應著神經網路基於\(x\)和\(w\)計算得到Cost Function的前向計算過程。

3.2 反向傳播(Back Propagation)

計算圖導數 Derivatives with a Computation Graph

我們接著上個例子中的計算圖講解反向傳播,我們的輸入引數有\(a\)、\(b\)、\(c\)三個。

先計算\(J\)對引數\(a\)的偏導數

計算圖

從計算圖上來看,從右到左,\(J\)是\(v\)的函式,\(v\)是\(a\)的函式。基於求導鏈式法則得到:

$$ \frac{\partial J}{\partial a}=\frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial a}=3\cdot 1=3 $$

計算\(J\)對引數\(b\)的偏導數

計算圖

從計算圖上來看,從右到左,\(J\)是\(v\)的函式,\(v\)是\(u\)的函式,\(u\)是\(b\)的函式。同樣可得:

$$ \frac{\partial J}{\partial b}=\frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial u}\cdot \frac{\partial u}{\partial b}=3\cdot 1\cdot c=3\cdot 1\cdot 2=6 $$

計算\(J\)對引數\(c\)的偏導數

計算圖

此時從右到左,\(J\)是\(v\)的函式,\(v\)是\(u\)的函式,\(u\)是\(c\)的函式。可得:

$$ \frac{\partial J}{\partial c}=\frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial u}\cdot \frac{\partial u}{\partial c}=3\cdot 1\cdot b=3\cdot 1\cdot 3=9 $$

這樣就完成了從右往左的反向傳播與梯度(偏導)計算過程。

4.邏輯迴歸中的梯度下降法

邏輯迴歸的梯度下降 Logistic Regression Gradient Descent

回到我們前面提到的邏輯迴歸問題,我們假設輸入的特徵向量維度為2(即\([x_1, x_2]\)),對應權重引數\(w_1\)、\(w_2\)、\(b\)得到如下的計算圖:

邏輯迴歸中的梯度下降法

反向傳播計算梯度

求出\(L\)對於\(a\)的導數

邏輯迴歸中的梯度下降法

求出\(L\)對於\(z\)的導數

邏輯迴歸中的梯度下降法

繼續前推計算

邏輯迴歸中的梯度下降法

基於梯度下降可以得到引數更新公式

邏輯迴歸中的梯度下降法

梯度下降的例子 Gradient Descent on m Examples

邏輯迴歸中的梯度下降法

前面提到的是對單個樣本求偏導和應用梯度下降演算法的過程。對於有\(m\)個樣本的資料集,Cost Function \(J(w,b)\)、\(a^{(i)}\) 和 權重引數\(w_1\) 的計算如圖所示。

完整的Logistic迴歸中某次訓練的流程如下,這裡僅假設特徵向量的維度為2:

J=0; dw1=0; dw2=0; db=0;
for i = 1 to m
    z(i) = wx(i)+b;
    a(i) = sigmoid(z(i));
    J += -[y(i)log(a(i))+(1-y(i))log(1-a(i));
    dz(i) = a(i)-y(i);
    dw1 += x1(i)dz(i);
    dw2 += x2(i)dz(i);
    db += dz(i);
J /= m;
dw1 /= m;
dw2 /= m;
db /= m;

接著再對\(w_1\)、\(w_2\)、\(b\)進行迭代。

上述計算過程有一個缺點:整個流程包含兩個for迴圈。其中:

  • 第一個for迴圈遍歷\(m\)個樣本
  • 第二個for迴圈遍歷所有特徵

如果有大量特徵,在程式碼中顯示使用for迴圈會使演算法很低效。向量化可以用於解決顯式使用for迴圈的問題。

5.向量化(Vectorization)

向量化 Vectorization

繼續以邏輯迴歸為例,如果以非向量化的迴圈方式計算\(z=w^Tx+b\),程式碼如下:

z = 0;
for i in range(n_x):
    z += w[i] * x[i]
z += b

基於向量化的操作,可以平行計算,極大提升效率,同時程式碼也更為簡潔:
(這裡使用到python中的numpy工具庫,想了解更多的同學可以檢視ShowMeAI圖解資料分析 系列中的numpy教程,也可以通過ShowMeAI製作的 numpy速查手冊 快速瞭解其使用方法)

z = np.dot(w, x) + b

不用顯式for迴圈,實現邏輯迴歸的梯度下降的迭代虛擬碼如下:

$$Z=w^TX+b=np.dot(w.T, x) + b$$

$$A=\sigma(Z)$$

$$dZ=A-Y$$

$$dw=\frac{1}{m}XdZ^T$$

$$db=\frac{1}{m}np.sum(dZ)$$

$$w:=w-\sigma dw$$

$$b:=b-\sigma db$$

參考資料

ShowMeAI系列教程推薦

推薦文章

\深度學習教程 | 神經網路基礎