- 作者:韓信子@ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/35
- 本文地址:http://www.showmeai.tech/article-detail/213
- 宣告:版權所有,轉載請聯絡平臺與作者並註明出處
收藏ShowMeAI檢視更多精彩內容
本系列為吳恩達老師《深度學習專項課程(Deep Learning Specialization)》學習與總結整理所得,對應的課程視訊可以在這裡檢視。
引言
在ShowMeAI前一篇文章 深度學習概論 中我們對深度學習(Deep Learning)進行了簡單介紹:
- 我們以房價預測為例,對應講解了神經網路(Neural Network)模型結構和基礎知識。
- 介紹了針對監督學習的幾類典型神經網路:Standard NN,CNN和RNN。
- 介紹了「結構化資料」和「非結構化資料」2種不同型別的資料。
- 分析了近些年來深度學習熱門,及其效能優於傳統機器學習的原因(Data,Computation和Algorithms)。
本節內容我們展開介紹神經網路的基礎:邏輯迴歸(Logistic Regression)。我們將通過對邏輯迴歸模型結構的分析,過渡到後續神經網路模型。(關於邏輯迴歸模型,大家也可以閱讀ShowMeAI的文章 圖解機器學習 | 邏輯迴歸演算法詳解 學習)
1.演算法基礎與邏輯迴歸
邏輯迴歸(Logistic regression) 是一個用於二分類的演算法。
1.1 二分類問題與機器學習基礎
二分類就是輸出\(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 邏輯迴歸演算法
邏輯迴歸是最常見的二分類演算法(詳細演算法講解也可閱讀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 邏輯迴歸的損失函式
在機器學習中,損失函式(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)
剛才我們瞭解了損失函式(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)
對於神經網路而言,訓練過程包含了兩個階段:前向傳播(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)
我們接著上個例子中的計算圖講解反向傳播,我們的輸入引數有\(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.邏輯迴歸中的梯度下降法
回到我們前面提到的邏輯迴歸問題,我們假設輸入的特徵向量維度為2(即\([x_1, x_2]\)),對應權重引數\(w_1\)、\(w_2\)、\(b\)得到如下的計算圖:
反向傳播計算梯度
① 求出\(L\)對於\(a\)的導數
② 求出\(L\)對於\(z\)的導數
③ 繼續前推計算
④ 基於梯度下降可以得到引數更新公式
前面提到的是對單個樣本求偏導和應用梯度下降演算法的過程。對於有\(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)
繼續以邏輯迴歸為例,如果以非向量化的迴圈方式計算\(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系列教程推薦
- 圖解Python程式設計:從入門到精通系列教程
- 圖解資料分析:從入門到精通系列教程
- 圖解AI數學基礎:從入門到精通系列教程
- 圖解大資料技術:從入門到精通系列教程
- 圖解機器學習演算法:從入門到精通系列教程
- 機器學習實戰:手把手教你玩轉機器學習系列
- 深度學習教程 | 吳恩達專項課程 · 全套筆記解讀
推薦文章
- 深度學習教程 | 深度學習概論
- 深度學習教程 | 神經網路基礎
- 深度學習教程 | 淺層神經網路
- 深度學習教程 | 深層神經網路
- 深度學習教程 | 深度學習的實用層面
- 深度學習教程 | 神經網路優化演算法
- 深度學習教程 | 網路優化:超引數調優、正則化、批歸一化和程式框架
- 深度學習教程 | AI應用實踐策略(上)
- 深度學習教程 | AI應用實踐策略(下)
- 深度學習教程 | 卷積神經網路解讀
- 深度學習教程 | 經典CNN網路例項詳解
- 深度學習教程 | CNN應用:目標檢測
- 深度學習教程 | CNN應用:人臉識別和神經風格轉換
- 深度學習教程 | 序列模型與RNN網路
- 深度學習教程 | 自然語言處理與詞嵌入
- 深度學習教程 | Seq2seq序列模型和注意力機制
\