深度學習教程 | 深層神經網路

ShowMeAI發表於2022-04-14

收藏ShowMeAI檢視更多精彩內容


第1門課 神經網路和深度學習,第4周:深層神經網路

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

引言

ShowMeAI前一篇文章 淺層神經網路 中我們對以下內容進行了介紹:

  • 神經網路的基本結構(輸入層,隱藏層和輸出層)。
  • 淺層神經網路前向傳播和反向傳播過程。
  • 神經網路引數的梯度下降優化。
  • 不同的啟用函式的優缺點及非線性的原因。
  • 神經網路引數隨機初始化方式

本篇內容我們將討論深層神經網路

1.深層神經網路

深層神經網路 Deep Layer Neural Network

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

深層神經網路

我們會參考「隱層個數」和「輸出層」對齊命名。如上圖邏輯迴歸可以叫做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.深層神經網路前向運算

深層網路中的前向和反向傳播 Forward Propagation in a Deep Network

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

2.1 單個樣本的計算

對於單個樣本,我們有:

深層神經網路前向運算

2.2 m個樣本的批量計算

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

深層神經網路前向運算

以此類推,對於第\(l\)層,其前向傳播過程的\(Z^{[l]}\)\(A^{[l]}\)可以表示為:

\[Z^{[l]}=W^{[l]}A^{[l-1]}+b^{[l]} \]

\[A^{[l]}=g^{[l]}(Z^{[l]}) \]

其中\(l=1,\cdots,L\)

3.向量化形態下的矩陣維度

核對矩陣的維數 Getting Your Matrix Dimensions Right

在單個訓練樣本的場景下,輸入\(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.為什麼需要深度網路

為什麼使用深層表示? Why Deep Representations?

當今大家看到的很多AI智慧場景背後都是巨大的神經網路在支撐,強大能力很大一部分來源於神經網路足夠“深”,也就是說隨著網路層數增多,神經網路就更加複雜引數更多,學習能力也更強。下面是一些典型的場景例子說明。

4.1 人臉識別例子

如下圖所示的人臉識別場景,訓練得到的神經網路,每一層的作用有差別:

  • 第一層所做的事就是從原始圖片中提取出人臉的輪廓與邊緣,即邊緣檢測。這樣每個神經元得到的是一些邊緣資訊。
  • 第二層所做的事情就是將前一層的邊緣進行組合,組合成人臉一些區域性特徵,比如眼睛、鼻子、嘴巴等。
  • 後續層次逐層把這些區域性特徵組合起來,融合成人臉的模樣。
為什麼需要深度網路

可以看出,隨著層數由淺到深,神經網路提取的特徵也是從邊緣到區域性特徵到整體,由簡單到複雜。隱藏層越多,能夠提取的特徵就越豐富、越複雜,模型的準確率也可能會隨之越高。(詳細的人臉識別原理可以檢視ShowMeAI的文章 CNN應用:人臉識別和神經風格轉換

4.2 語音識別例子

語音識別模型也是類似的道理:

  • 淺層的神經元能夠檢測一些簡單的音調
  • 較深的神經元能夠檢測出基本的音素
  • 更深的神經元就能夠檢測出單詞資訊
  • 網路足夠深的話,還能對短語、句子進行檢測
為什麼需要深度網路

神經網路從淺到深,提取的特徵從簡單到複雜。特徵複雜度與神經網路層數成正相關。特徵越來越複雜,表達能力和功能也越強。(詳細的語音識別原理知識可以檢視ShowMeAI的文章 Seq2seq序列模型和注意力機制

4.3 深度網路其他優勢

除學習能力與特徵提取強度之外,深層網路還有另外一個優點,就是能夠減少神經元個數,從而減少計算量。

下面有一個例子,使用電路理論,計算邏輯輸出:

\[y=x_1\oplus x_2\oplus x_3\oplus\cdots\oplus x_n \]

  • 上面的計算表示式中,\(\oplus\)表示「異或」操作。

對於這個邏輯運算,如果使用深度網路完成,每層將前一層的兩兩單元進行異或,最後到一個輸出,如下圖左邊所示。

這樣,整個深度網路的層數是\(log_2(n)\)(不包含輸入層)。總共使用的神經元個數為:

\[1+2+\cdots+2^{log_2(n)-1}=1\cdot\frac{1-2^{log_2(n)}}{1-2}=2^{log_2(n)}-1=n-1 \]

可見,輸入個數是\(n\),這種深層網路所需的神經元個數僅僅是\(n-1\)個。

為什麼需要深度網路

如果不用深層網路,僅僅使用單個隱藏層,如上右圖所示,由於包含了所有的邏輯位(0和1),那麼需要的神經元個數\(O(2^n)\)是指數級別的大小。

對於其他場景和問題也一樣,處理同樣的邏輯問題,深層網路所需的神經元個數比淺層網路要少很多。這也是深層神經網路的優點之一。

儘管深度學習有著非常顯著的優勢,吳恩達老師還是建議對實際問題進行建模時,儘量先選擇層數少的神經網路模型,這也符合奧卡姆剃刀定律(Occam’s Razor)。對於比較複雜的問題,再使用較深的神經網路模型。

5.構建深度網路單元塊

搭建神經網路塊 Building Blocks of Deep Neural Networks

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

構建深度網路單元塊

如圖所示,對於第\(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.前向傳播與反向傳播

前向傳播和反向傳播 Forward and Backward Propagation

我們繼續接著上一部分流程塊圖的內容,推導神經網路正向傳播過程和反向傳播過程的具體表示式。

6.1 前向傳播過程

令層數為第\(l\)層,輸入是\(a^{[l-1]}\),輸出是\(a^{[l]}\),快取變數是\(z^{[l]}\)。其表示式如下:

\[z^{[l]}=W^{[l]}a^{[l-1]}+b^{[l]} \]

\[a^{[l]}=g^{[l]}(z^{[l]}) \]

\(m\)個訓練樣本的形態下,向量化形式為:

\[Z^{[l]}=W^{[l]}A^{[l-1]}+b^{[l]} \]

\[A^{[l]}=g^{[l]}(Z^{[l]}) \]

6.2 反向傳播過程

輸入是\(da^{[l]}\),輸出是\(da^{[l-1]}\)\(dW^{[l]}\)\(db^{[l]}\)。其表示式如下:

\[dz^{[l]}=da^{[l]}\ast g^{[l]\prime}(z^{[l]}) \]

\[dW^{[l]}=dz^{[l]}\cdot a^{[l-1]} \]

\[db^{[l]}=dz^{[l]} \]

\[da^{[l-1]}=W^{[l]T}\cdot dz^{[l]} \]

由上述第四個表示式可得\(da^{[l]}=W^{[l+1]T}\cdot dz^{[l+1]}\),將\(da^{[l]}\)代入第一個表示式中可以得到:

\[dz^{[l]}=W^{[l+1]T}\cdot dz^{[l+1]}\ast g^{[l]\prime}(z^{[l]}) \]

該式非常重要,反映了\(dz^{[l+1]}\)\(dz^{[l]}\)的遞推關係。

\(m\)個訓練樣本的形態下,向量化形式為:

\[d Z^{[l]}=d A^{[l]}\ast g^{[l]\prime} (Z^{[l]}) \]

\[dW^{[l]}=\frac1mdZ^{[l]}\cdot A^{[l-1]T} \]

\[db^{[l]}=\frac1mnp.sum(dZ^{[l]},axis=1,keepdim=True) \]

\[dA^{[l-1]}=W^{[l]T}\cdot dZ^{[l]} \]

\[dZ^{[l]}=W^{[l+1]T}\cdot dZ^{[l+1]}\ast g^{[l]\prime}(Z^{[l]}) \]

7.引數與超引數

引數 VS 超引數 Parameters vs Hyperparameters

神經網路中有兩個大家要重點區分的概念:引數(parameters)和超引數(hyperparameters)。

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

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

8.神經網路vs人腦

深度學習和大腦的關聯性 What Does this Have to Do with the Brain?

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

深度網路 VS 大腦

我們前面看到神經網路實際上可以分成兩個部分:前向傳播過程和反向傳播過程。神經網路的每個神經元採用啟用函式的方式,類似於感知機模型。這種模型與人腦神經元是類似的,但是一種非常簡化的人腦神經元模型。

人腦神經元可分為樹突、細胞體、軸突三部分。樹突接收外界電刺激訊號(類比神經網路中神經元輸入),傳遞給細胞體進行處理(類比神經網路中神經元啟用函式運算),最後由軸突傳遞給下一個神經元(類比神經網路中神經元輸出)。

深度網路 VS 大腦

人腦神經元的結構和處理方式要複雜的多,神經網路模型只是非常簡化的模型

人腦如何進行學習?是否也是通過反向傳播和梯度下降演算法現在還不清楚,可能會更加複雜。這是值得生物學家探索的事情。

參考資料

ShowMeAI系列教程推薦

推薦文章

相關文章