上節課我們主要介紹了淺層神經網路。首先介紹神經網路的基本結構,包括輸入層,隱藏層和輸出層。然後以簡單的2 layer NN為例,詳細推導了其正向傳播過程和反向傳播過程,使用梯度下降的方法優化神經網路引數。同時,我們還介紹了不同的啟用函式,比較各自優缺點,討論了啟用函式必須是非線性的原因。最後介紹了神經網路引數隨機初始化的必要性,特別是權重W,不同神經元的W不能初始化為同一零值。本節課是對上節課的延伸和擴充套件,討論更深層的神經網路。
1. Deep L-layer neural network
深層神經網路其實就是包含更多的隱藏層神經網路。如下圖所示,分別列舉了邏輯迴歸、1個隱藏層的神經網路、2個隱藏層的神經網路和5個隱藏層的神經網路它們的模型結構。
命名規則上,一般只參考隱藏層個數和輸出層。例如,上圖中的邏輯迴歸又叫1 layer NN,1個隱藏層的神經網路叫做2 layer NN,2個隱藏層的神經網路叫做3 layer NN,以此類推。如果是L-layer NN,則包含了L-1個隱藏層,最後的L層是輸出層。
下面以一個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層神經網路為例,對於單個樣本:
第1層,l=1:
z^{[1]}=W^{[1]}x+b^{[1]}=W^{[1]}a^{[0]}+b^{[1]}
a^{[1]}=g^{[1]}(z^{[1]})
第2層,l=2:
z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}
a^{[2]}=g^{[2]}(z^{[2]})
第3層,l=3:
z^{[3]}=W^{[3]}a^{[2]}+b^{[3]}
a^{[3]}=g^{[3]}(z^{[3]})
第4層,l=4:
z^{[4]}=W^{[4]}a^{[3]}+b^{[4]}
a^{[4]}=g^{[4]}(z^{[4]})
如果有m個訓練樣本,其向量化矩陣形式為:
第1層,l=1:
Z^{[1]}=W^{[1]}X+b^{[1]}=W^{[1]}A^{[0]}+b^{[1]}
A^{[1]}=g^{[1]}(Z^{[1]})
第2層,l=2:
Z^{[2]}=W^{[2]}A^{[1]}+b^{[2]}
A^{[2]}=g^{[2]}(Z^{[2]})
第3層,l=3:
Z^{[3]}=W^{[3]}A^{[2]}+b^{[3]}
A^{[3]}=g^{[3]}(Z^{[3]})
第4層,l=4:
Z^{[4]}=W^{[4]}A^{[3]}+b^{[4]}
A^{[4]}=g^{[4]}(Z^{[4]})
綜上所述,對於第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的廣播性質,且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?
我們都知道神經網路能處理很多問題,而且效果顯著。其強大能力主要源自神經網路足夠“深”,也就是說網路層數越多,神經網路就更加複雜和深入,學習也更加準確。接下來,我們從幾個例子入手,看一下為什麼深度網路能夠如此強大。
先來看人臉識別的例子,如下圖所示。經過訓練,神經網路第一層所做的事就是從原始圖片中提取出人臉的輪廓與邊緣,即邊緣檢測。這樣每個神經元得到的是一些邊緣資訊。神經網路第二層所做的事情就是將前一層的邊緣進行組合,組合成人臉一些區域性特徵,比如眼睛、鼻子、嘴巴等。再往後面,就將這些區域性特徵組合起來,融合成人臉的模樣。可以看出,隨著層數由淺到深,神經網路提取的特徵也是從邊緣到區域性特徵到整體,由簡單到複雜。可見,如果隱藏層足夠多,那麼能夠提取的特徵就越豐富、越複雜,模型的準確率就會越高。
語音識別模型也是這個道理。淺層的神經元能夠檢測一些簡單的音調,然後較深的神經元能夠檢測出基本的音素,更深的神經元就能夠檢測出單詞資訊。如果網路夠深,還能對短語、句子進行檢測。記住一點,神經網路從左到右,神經元提取的特徵從簡單到複雜。特徵複雜度與神經網路層數成正相關。特徵越來越複雜,功能也越來越強大。
除了從提取特徵複雜度的角度來說明深層網路的優勢之外,深層網路還有另外一個優點,就是能夠減少神經元個數,從而減少計算量。例如下面這個例子,使用電路理論,計算邏輯輸出:
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個。
如果不用深層網路,僅僅使用單個隱藏層,那麼需要的神經元個數將是指數級別那麼大。Andrew指出,由於包含了所有的邏輯位(0和1),則需要2^{n-1}個神經元。這裡筆者推導的是2^n個神經元,為啥是2^{n-1}請哪位高手解釋下。
比較下來,處理同一邏輯問題,深層網路所需的神經元個數比淺層網路要少很多。這也是深層神經網路的優點之一。
儘管深度學習有著非常顯著的優勢,Andrew還是建議對實際問題進行建模時,儘量先選擇層數少的神經網路模型,這也符合奧卡姆剃刀定律(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
我們繼續接著上一部分流程塊圖的內容,推導神經網路正向傳播過程和反向傳播過程的具體表示式。
首先是正向傳播過程,令層數為第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]})
然後是反向傳播過程,輸入是da^{[l]},輸出是da^{[l-1]},dw^{[l]},db^{[l]}。其表示式如下:
dz^{[l]}=da^{[l]}\ast g^{[l]’}(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]’}(z^{[l]})
該式非常重要,反映了dz^{[l+1]}與dz^{[l]}的遞推關係。
m個訓練樣本,向量化形式為:
dZ^{[l]}=dA^{[l]}\ast g^{[l]’}(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]’}(Z^{[l]})
7. Parameters vs Hyperparameters
該部分介紹神經網路中的引數(parameters)和超引數(hyperparameters)的概念。
神經網路中的引數就是我們熟悉的W^{[l]}和b^{[l]}。而超引數則是例如學習速率\alpha,訓練迭代次數N,神經網路層數L,各層神經元個數n^{[l]},啟用函式g(z)等。之所以叫做超引數的原因是它們決定了引數W^{[l]}和b^{[l]}的值。在後面的第二門課我們還將學習其它的超引數,這裡先不討論。
如何設定最優的超引數是一個比較困難的、需要經驗知識的問題。通常的做法是選擇超引數一定範圍內的值,分別代入神經網路進行訓練,測試cost function隨著迭代次數增加的變化,根據結果選擇cost function最小時對應的超引數值。這類似於validation的方法。
8. What does this have to do with the brain?
那麼,神經網路跟人腦機制到底有什麼聯絡呢?究竟有多少的相似程度?神經網路實際上可以分成兩個部分:正向傳播過程和反向傳播過程。神經網路的每個神經元採用啟用函式的方式,類似於感知機模型。這種模型與人腦神經元是類似的,可以說是一種非常簡化的人腦神經元模型。如下圖所示,人腦神經元可分為樹突、細胞體、軸突三部分。樹突接收外界電刺激訊號(類比神經網路中神經元輸入),傳遞給細胞體進行處理(類比神經網路中神經元啟用函式運算),最後由軸突傳遞給下一個神經元(類比神經網路中神經元輸出)。
值得一提的是,人腦神經元的結構和處理方式要複雜的多,神經網路模型只是非常簡化的模型。人腦如何進行學習?是否也是通過反向傳播和梯度下降演算法現在還不清楚,可能會更加複雜。這是值得生物學家探索的事情。也許發現重要的新的人腦學習機制後,讓我們的神經網路模型拋棄反向傳播和梯度下降演算法,能夠實現更加準確和強大的神經網路模型!
9. Summary
本節課主要介紹了深層神經網路,是上一節淺層神經網路的擴充和歸納。首先,我們介紹了建立神經網路模型一些常用的標準的標記符號。然後,用流程塊圖的方式詳細推導正向傳播過程和反向傳播過程的輸入輸出和參數列達式。我們也從提取特徵複雜性和計算量的角度分別解釋了深層神經網路為什麼優於淺層神經網路。接著,我們介紹了超引數的概念,解釋了超引數與引數的區別。最後,我們將神經網路與人腦做了類別,人工神經網路是簡化的人腦模型。
至此,Andew深度學習專項課程第一門課《神經網路與深度學習》結束。
更多AI資源請關注公眾號:AI有道(ID:redstonewill)