- 作者:韓信子@ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/35
- 本文地址:http://www.showmeai.tech/article-detail/215
- 宣告:版權所有,轉載請聯絡平臺與作者並註明出處
收藏ShowMeAI檢視更多精彩內容

本系列為吳恩達老師《深度學習專業課程》學習與總結整理所得,對應的課程視訊可以在這裡檢視。
引言
在ShowMeAI前一篇文章 淺層神經網路 中我們對以下內容進行了介紹:
- 神經網路的基本結構(輸入層,隱藏層和輸出層)。
- 淺層神經網路前向傳播和反向傳播過程。
- 神經網路引數的梯度下降優化。
- 不同的啟用函式的優缺點及非線性的原因。
- 神經網路引數隨機初始化方式
本篇內容我們將討論深層神經網路。
1.深層神經網路

我們在前面提到了淺層神經網路,深層神經網路其實就是包含更多隱層的神經網路。下圖分別列舉了不同深度的神經網路模型結構:

我們會參考「隱層個數」和「輸出層」對齊命名。如上圖邏輯迴歸可以叫做1 layer NN,單隱層神經網路可以叫做2 layer NN,2個隱層的神經網路叫做3 layer NN,以此類推。所以當我們提到L layer NN,指的是包含\(L-1\)個隱層的神經網路。
下面我們來了解一下神經網路的一些標記寫法。以如下圖的4層神經網路為例:

① 總層數用\(L\)表示,\(L=4\)
- 輸入層是第\(0\)層,輸出層是第\(L\)層
② \(n^{[l]}\)表示第\(l\)層包含的單元個數,\(l=0,1,\cdots,L\)
-
下圖模型中,\(n^{[0]}=n_x=3\),表示三個輸入特徵\(x_1\)、\(x_2\)、\(x_3\)
-
下圖模型中\(n^{[1]}=5\),\(n^{[2]}=5\),\(n^{[3]}=3\),\(n^{[4]}=n^{[L]}=1\)
③ 第\(l\)層的啟用函式輸出用\(a^{[l]}\)表示,\(a^{[l]}=g^{[l]}(z^{[l]})\)
④ \(W^{[l]}\)表示第\(l\)層的權重,用於計算\(z^{[l]}\)
⑤ 輸入\(x\)記為\(a^{[0]}\)
⑥ 輸出層\(\hat y\)記為\(a^{[L]}\)
注意,\(a^{[l]}\)和\(W^{[l]}\)中的上標\(l\)都是從1開始的,\(l=1,\cdots,L\)。
2.深層神經網路前向運算

下面我們來推導一下深層神經網路的前向傳播計算過程。依舊是上面提到的4層神經網路,我們以其為例來做講解。
2.1 單個樣本的計算
對於單個樣本,我們有:

2.2 m個樣本的批量計算
對於\(m\)個訓練樣本的情況,我們以向量化矩陣形式來平行計算:

以此類推,對於第\(l\)層,其前向傳播過程的\(Z^{[l]}\)和\(A^{[l]}\)可以表示為:
其中\(l=1,\cdots,L\)
3.向量化形態下的矩陣維度

在單個訓練樣本的場景下,輸入\(x\)的維度是\((n^{[0]},1)\)神經網路的引數\(W^{[l]}\)和\(b^{[l]}\)的維度分別是:
-
\(W^{[l]}: (n^{[l]},n^{[l-1]})\)
-
\(b^{[l]}: (n^{[l]},1)\)
其中,
- \(l=1,\cdots,L\)
- \(n^{[l]}\)和\(n^{[l-1]}\)分別表示第\(l\)層和\(l-1\)層的所含單元個數
- \(n^{[0]}=n_x\),表示輸入層特徵數目
對應的反向傳播過程中的\(dW^{[l]}\)和\(db^{[l]}\)的維度分別是:
-
\(dW^{[l]}:\ (n^{[l]},n^{[l-1]})\)
-
\(db^{[l]}:\ (n^{[l]},1)\)
-
注意到,\(W^{[l]}\)與\(dW^{[l]}\)維度相同,\(b^{[l]}\)與\(db^{[l]}\)維度相同。這很容易理解。
正向傳播過程中的\(z^{[l]}\)和\(a^{[l]}\)的維度分別是:
-
\(z^{[l]}:\ (n^{[l]},1)\)
-
\(a^{[l]}:\ (n^{[l]},1)\)
-
\(z^{[l]}\)和\(a^{[l]}\)的維度是一樣的,且\(dz^{[l]}\)和\(da^{[l]}\)的維度均與\(z^{[l]}\)和\(a^{[l]}\)的維度一致。

對於\(m\)個訓練樣本,輸入矩陣\(X\)的維度是\((n^{[0]},m)\)。需要注意的是\(W^{[l]}\)和\(b^{[l]}\)的維度與只有單個樣本是一致的:
-
\(W^{[l]}:\ (n^{[l]},n^{[l-1]})\)
-
\(b^{[l]}:\ (n^{[l]},1)\)
只不過在運算\(Z^{[l]}=W^{[l]}A^{[l-1]}+b^{[l]}\)中,\(b^{[l]}\)會被當成\((n^{[l]},m)\)矩陣進行運算,這是基於python numpy的廣播特性,且\(b^{[l]}\)每一列向量都是一樣的。\(dW^{[l]}\)和\(db^{[l]}\)的維度分別與\(W^{[l]}\)和\(b^{[l]}\)的相同。
不過,\(Z^{[l]}\)和\(A^{[l]}\)的維度發生了變化:
-
\(Z^{[l]}:\ (n^{[l]},m)\)
-
\(A^{[l]}:\ (n^{[l]},m)\)
-
\(dZ^{[l]}\)和\(dA^{[l]}\)的維度分別與\(Z^{[l]}\)和\(A^{[l]}\)的相同。
4.為什麼需要深度網路

當今大家看到的很多AI智慧場景背後都是巨大的神經網路在支撐,強大能力很大一部分來源於神經網路足夠“深”,也就是說隨著網路層數增多,神經網路就更加複雜引數更多,學習能力也更強。下面是一些典型的場景例子說明。
4.1 人臉識別例子
如下圖所示的人臉識別場景,訓練得到的神經網路,每一層的作用有差別:
- 第一層所做的事就是從原始圖片中提取出人臉的輪廓與邊緣,即邊緣檢測。這樣每個神經元得到的是一些邊緣資訊。
- 第二層所做的事情就是將前一層的邊緣進行組合,組合成人臉一些區域性特徵,比如眼睛、鼻子、嘴巴等。
- 後續層次逐層把這些區域性特徵組合起來,融合成人臉的模樣。

可以看出,隨著層數由淺到深,神經網路提取的特徵也是從邊緣到區域性特徵到整體,由簡單到複雜。隱藏層越多,能夠提取的特徵就越豐富、越複雜,模型的準確率也可能會隨之越高。(詳細的人臉識別原理可以檢視ShowMeAI的文章 CNN應用:人臉識別和神經風格轉換 )
4.2 語音識別例子
語音識別模型也是類似的道理:
- 淺層的神經元能夠檢測一些簡單的音調
- 較深的神經元能夠檢測出基本的音素
- 更深的神經元就能夠檢測出單詞資訊
- 網路足夠深的話,還能對短語、句子進行檢測

神經網路從淺到深,提取的特徵從簡單到複雜。特徵複雜度與神經網路層數成正相關。特徵越來越複雜,表達能力和功能也越強。(詳細的語音識別原理知識可以檢視ShowMeAI的文章 Seq2seq序列模型和注意力機制 )
4.3 深度網路其他優勢
除學習能力與特徵提取強度之外,深層網路還有另外一個優點,就是能夠減少神經元個數,從而減少計算量。
下面有一個例子,使用電路理論,計算邏輯輸出:
- 上面的計算表示式中,\(\oplus\)表示「異或」操作。
對於這個邏輯運算,如果使用深度網路完成,每層將前一層的兩兩單元進行異或,最後到一個輸出,如下圖左邊所示。
這樣,整個深度網路的層數是\(log_2(n)\)(不包含輸入層)。總共使用的神經元個數為:
可見,輸入個數是\(n\),這種深層網路所需的神經元個數僅僅是\(n-1\)個。

如果不用深層網路,僅僅使用單個隱藏層,如上右圖所示,由於包含了所有的邏輯位(0和1),那麼需要的神經元個數\(O(2^n)\)是指數級別的大小。
對於其他場景和問題也一樣,處理同樣的邏輯問題,深層網路所需的神經元個數比淺層網路要少很多。這也是深層神經網路的優點之一。
儘管深度學習有著非常顯著的優勢,吳恩達老師還是建議對實際問題進行建模時,儘量先選擇層數少的神經網路模型,這也符合奧卡姆剃刀定律(Occam’s Razor)。對於比較複雜的問題,再使用較深的神經網路模型。
5.構建深度網路單元塊

下面用流程塊圖來解釋神經網路前向傳播和反向傳播過程。

如圖所示,對於第\(l\)層來說,前向傳播過程中,我們有:
- 輸入:$a^{[l-1]} $
- 輸出:$a^{[l]} $
- 引數:\(W^{[l]}\)、\(b^{[l]}\)
- 快取變數:$z^{[l]} $
反向傳播過程中:
- 輸入:$da^{[l]} $
- 輸出:$da^{[l-1]} \(、\)dW^{[l]} \(、\)db^{[l]}$
- 引數:\(W^{[l]}\)、\(b^{[l]}\)
上面是第\(l\)層的流程塊圖,對於神經網路所有層,整體的流程塊圖前向傳播過程和反向傳播過程如下所示:

6.前向傳播與反向傳播

我們繼續接著上一部分流程塊圖的內容,推導神經網路正向傳播過程和反向傳播過程的具體表示式。
6.1 前向傳播過程
令層數為第\(l\)層,輸入是\(a^{[l-1]}\),輸出是\(a^{[l]}\),快取變數是\(z^{[l]}\)。其表示式如下:
\(m\)個訓練樣本的形態下,向量化形式為:
6.2 反向傳播過程
輸入是\(da^{[l]}\),輸出是\(da^{[l-1]}\)、\(dW^{[l]}\)、\(db^{[l]}\)。其表示式如下:
由上述第四個表示式可得\(da^{[l]}=W^{[l+1]T}\cdot dz^{[l+1]}\),將\(da^{[l]}\)代入第一個表示式中可以得到:
該式非常重要,反映了\(dz^{[l+1]}\)與\(dz^{[l]}\)的遞推關係。
\(m\)個訓練樣本的形態下,向量化形式為:
7.引數與超引數

神經網路中有兩個大家要重點區分的概念:引數(parameters)和超引數(hyperparameters)。
- 神經網路中的引數就是我們熟悉的\(W^{[l]}\)和\(b^{[l]}\)。
- 神經網路的超引數是例如學習率\(\alpha\),訓練迭代次數\(N\),神經網路層數\(L\),各層神經元個數\(n^{[l]}\),啟用函式\(g(z)\)等。
- 之所以叫做超引數,是因為它們需要提前敲定,而且它們會決定引數\(W^{[l]}\)和\(b^{[l]}\)的值。

如何設定最優的超引數是一個比較困難的、需要經驗知識的問題。通常的做法是選擇超引數一定範圍內的值,分別代入神經網路進行訓練,測試cost function隨著迭代次數增加的變化,根據結果選擇cost function最小時對應的超引數值。這類似於機器學習中的實驗驗證的方法。(關於機器學習的模型評估詳見 ShowMeAI文章圖解機器學習 | 模型評估方法與準則)
8.神經網路vs人腦

神經網路跟人腦機制到底有什麼聯絡呢?究竟有多少的相似程度?

我們前面看到神經網路實際上可以分成兩個部分:前向傳播過程和反向傳播過程。神經網路的每個神經元採用啟用函式的方式,類似於感知機模型。這種模型與人腦神經元是類似的,但是一種非常簡化的人腦神經元模型。
人腦神經元可分為樹突、細胞體、軸突三部分。樹突接收外界電刺激訊號(類比神經網路中神經元輸入),傳遞給細胞體進行處理(類比神經網路中神經元啟用函式運算),最後由軸突傳遞給下一個神經元(類比神經網路中神經元輸出)。

人腦神經元的結構和處理方式要複雜的多,神經網路模型只是非常簡化的模型。
人腦如何進行學習?是否也是通過反向傳播和梯度下降演算法現在還不清楚,可能會更加複雜。這是值得生物學家探索的事情。
參考資料
ShowMeAI系列教程推薦
- 圖解Python程式設計:從入門到精通系列教程
- 圖解資料分析:從入門到精通系列教程
- 圖解AI數學基礎:從入門到精通系列教程
- 圖解大資料技術:從入門到精通系列教程
- 圖解機器學習演算法:從入門到精通系列教程
- 機器學習實戰:手把手教你玩轉機器學習系列
- 深度學習教程 | 吳恩達專項課程 · 全套筆記解讀
推薦文章
- 深度學習教程 | 深度學習概論
- 深度學習教程 | 神經網路基礎
- 深度學習教程 | 淺層神經網路
- 深度學習教程 | 深層神經網路
- 深度學習教程 | 深度學習的實用層面
- 深度學習教程 | 神經網路優化演算法
- 深度學習教程 | 網路優化:超引數調優、正則化、批歸一化和程式框架
- 深度學習教程 | AI應用實踐策略(上)
- 深度學習教程 | AI應用實踐策略(下)
- 深度學習教程 | 卷積神經網路解讀
- 深度學習教程 | 經典CNN網路例項詳解
- 深度學習教程 | CNN應用:目標檢測
- 深度學習教程 | CNN應用:人臉識別和神經風格轉換
- 深度學習教程 | 序列模型與RNN網路
- 深度學習教程 | 自然語言處理與詞嵌入
- 深度學習教程 | Seq2seq序列模型和注意力機制