天天看點

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

上節課我們主要介紹了向量化、矩陣計算的方法和python程式設計的相關技巧。并以邏輯回歸為例,将其算法流程包括梯度下降轉換為向量化的形式,進而大大提高了程式運算速度。本節課我們将從淺層神經網絡入手,開始真正的神經網絡模型的學習。

1Neural Networks Overview

首先,我們從整體結構上來大緻看一下神經網絡模型。

前面的課程中,我們已經使用計算圖的方式介紹了邏輯回歸梯度下降算法的正向傳播和反向傳播兩個過程。如下圖所示。神經網絡的結構與邏輯回歸類似,隻是神經網絡的層數比邏輯回歸多一層,多出來的中間那層稱為隐藏層或中間層。這樣從計算上來說,神經網絡的正向傳播和反向傳播過程隻是比邏輯回歸多了一次重複的計算。正向傳播過程分成兩層,第一層是輸入層到隐藏層,用上标[1]來表示:

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

在寫法上值得注意的是,方括号上标[i]表示目前所處的層數;圓括号上标(i)表示第i個樣本。

同樣,反向傳播過程也分成兩層。第一層是輸出層到隐藏層,第二層是隐藏層到輸入層。其細節部分我們之後再來讨論。

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

2

Neural Network Representation

下面我們以圖示的方式來介紹單隐藏層的神經網絡結構。如下圖所示,單隐藏層神經網絡就是典型的淺層(shallow)神經網絡。

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

結構上,從左到右,可以分成三層:輸入層(Input layer),隐藏層(Hidden layer)和輸出層(Output layer)。輸入層和輸出層,顧名思義,對應着訓練樣本的輸入和輸出,很好了解。隐藏層是抽象的非線性的中間層,這也是其被命名為隐藏層的原因。

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡
吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

3Computing a Neural Network’s Output

接下來我們開始詳細推導神經網絡的計算過程。回顧一下,我們前面講過兩層神經網絡可以看成是邏輯回歸再重複計算一次。如下圖所示,邏輯回歸的正向計算可以分解成計算z和a的兩部分:

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡
吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

上述每個節點的計算都對應着一次邏輯運算的過程,分别由計算z和a兩部分組成。

為了提高程式運算速度,我們引入向量化和矩陣運算的思想,将上述表達式轉換成矩陣運算的形式:

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

4Vectorizing across multiple examples

上一部分我們隻是介紹了單個樣本的神經網絡正向傳播矩陣運算過程。而對于m個訓練樣本,我們也可以使用矩陣相乘的形式來提高計算效率。而且它的形式與上一部分單個樣本的矩陣運算十分相似,比較簡單。

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡
吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

5Explanation for Vectorized Implementation

這部分Andrew用圖示的方式解釋了m個樣本的神經網絡矩陣運算過程。其實内容比較簡單,隻要記住上述四個矩陣的行表示神經元個數,清單示樣本數目m就行了。

6

Activation functions

神經網絡隐藏層和輸出層都需要激活函數(activation function),在之前的課程中我們都預設使用Sigmoid函數σ(x)作為激活函數。其實,還有其它激活函數可供使用,不同的激活函數有各自的優點。下面我們就來介紹幾個不同的激活函數g(x)。

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡
吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡
吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡
吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

如上圖所示,不同激活函數形狀不同,a的取值範圍也有差異。

如何選擇合适的激活函數呢?首先我們來比較sigmoid函數和tanh函數。對于隐藏層的激活函數,一般來說,tanh函數要比sigmoid函數表現更好一些。因為tanh函數的取值範圍在[-1,+1]之間,隐藏層的輸出被限定在[-1,+1]之間,可以看成是在0值附近分布,均值為0。這樣從隐藏層到輸出層,資料起到了歸一化(均值為0)的效果。是以,隐藏層的激活函數,tanh比sigmoid更好一些。而對于輸出層的激活函數,因為二分類問題的輸出取值為{0,+1},是以一般會選擇sigmoid作為激活函數。

觀察sigmoid函數和tanh函數,我們發現有這樣一個問題,就是當|z|很大的時候,激活函數的斜率(梯度)很小。是以,在這個區域内,梯度下降算法會運作得比較慢。在實際應用中,應盡量避免使z落在這個區域,使|z|盡可能限定在零值附近,進而提高梯度下降算法運算速度。

為了彌補sigmoid函數和tanh函數的這個缺陷,就出現了ReLU激活函數。ReLU激活函數在z大于零時梯度始終為1;在z小于零時梯度始終為0;z等于零時的梯度可以當成1也可以當成0,實際應用中并不影響。對于隐藏層,選擇ReLU作為激活函數能夠保證z大于零時梯度始終為1,進而提高神經網絡梯度下降算法運算速度。但當z小于零時,存在梯度為0的缺點,實際應用中,這個缺點影響不是很大。為了彌補這個缺點,出現了Leaky ReLU激活函數,能夠保證z小于零是梯度不為0。

最後總結一下,如果是分類問題,輸出層的激活函數一般會選擇sigmoid函數。但是隐藏層的激活函數通常不會選擇sigmoid函數,tanh函數的表現會比sigmoid函數好一些。實際應用中,通常會會選擇使用ReLU或者Leaky ReLU函數,保證梯度下降速度不會太小。其實,具體選擇哪個函數作為激活函數沒有一個固定的準确的答案,應該要根據具體實際問題進行驗證(validation)。

7Why do you need non-linear activation functions

我們知道上一部分講的四種激活函數都是非線性(non-linear)的。那是否可以使用線性激活函數呢?答案是不行!下面我們就來進行簡要的解釋和說明。

假設所有的激活函數都是線性的,為了簡化計算,我們直接令激活函數g(z)=z,即a=z。那麼,淺層神經網絡的各層輸出為:

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

另外,如果所有的隐藏層全部使用線性激活函數,隻有輸出層使用非線性激活函數,那麼整個神經網絡的結構就類似于一個簡單的邏輯回歸模型,而失去了神經網絡模型本身的優勢和價值。

值得一提的是,如果是預測問題而不是分類問題,輸出y是連續的情況下,輸出層的激活函數可以使用線性函數。如果輸出y恒為正值,則也可以使用ReLU激活函數,具體情況,具體分析。

8Derivatives of activation functions

在梯度下降反向計算過程中少不了計算激活函數的導數即梯度。

我們先來看一下sigmoid函數的導數:

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

9Gradient descent for neural networks

接下來看一下在神經網絡中如何進行梯度計算。

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

其中,g(⋅)表示激活函數。

反向傳播是計算導數(梯度)的過程,這裡先列出來Cost function對各個參數的梯度:

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

反向傳播的具體推導過程我們下一部分再進行詳細說明。

10Backpropagation intuition(optional)

我們仍然使用計算圖的方式來推導神經網絡反向傳播過程。記得之前介紹邏輯回歸時,我們就引入了計算圖來推導正向傳播和反向傳播,其過程如下圖所示:

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

由于多了一個隐藏層,神經網絡的計算圖要比邏輯回歸的複雜一些,如下圖所示。對于單個訓練樣本,正向過程很容易,反向過程可以根據梯度計算方法逐一推導。

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

總結一下,淺層神經網絡(包含一個隐藏層),m個訓練樣本的正向傳播過程和反向傳播過程分别包含了6個表達式,其向量化矩陣形式如下圖所示:

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

11Random Initialization

神經網絡模型中的參數權重W是不能全部初始化為零的,接下來我們分析一下原因。

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

我們把這種權重W全部初始化為零帶來的問題稱為symmetry breaking problem。解決方法也很簡單,就是将W進行随機初始化(b可初始化為零)。python裡可以使用如下語句進行W和b的初始化:

吳恩達《神經網絡與深度學習》精煉筆記(4)-- 淺層神經網絡

當然,如果激活函數是ReLU或者Leaky ReLU函數,則不需要考慮這個問題。但是,如果輸出層是sigmoid函數,則對應的權重W最好初始化到比較小的值。

12Summary

本節課主要介紹了淺層神經網絡。首先,我們簡單概述了神經網絡的結構:包括輸入層,隐藏層和輸出層。然後,我們以計算圖的方式推導了神經網絡的正向輸出,并以向量化的形式歸納出來。接着,介紹了不同的激活函數并做了比較,實際應用中根據不同需要選擇合适的激活函數。激活函數必須是非線性的,不然神經網絡模型起不了任何作用。然後,我們重點介紹了神經網絡的反向傳播過程以及各個參數的導數推導,并以矩陣形式表示出來。最後,介紹了權重随機初始化的重要性,必須對權重W進行随機初始化操作。