日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第三周:浅层神经网络

發布時間:2024/7/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第三周:浅层神经网络 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 神經網絡綜述

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

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

第二層是隱藏層到輸出層,用上標[2]來表示:

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

同樣,反向傳播過程也分成兩層。第一層是輸出層到隱藏層,第二層是隱藏層到輸入層。

2. 神經網絡表示

單隱藏層神經網絡就是典型的淺層(shallow)神經網絡如下圖所示。

?結構上,從左到右,可以分成三層:輸入層(Input layer),隱藏層(Hidden layer)和輸出層(Output layer)。輸入層和輸出層,顧名思義,對應著訓練樣本的輸入和輸出,很好理解。隱藏層是抽象的非線性的中間層。

在寫法上,我們通常把輸入矩陣X記為,把隱藏層輸出記為,上標從0開始。用下標表示第幾個神經元,注意下標從1開始。例如表示隱藏層第1個神經元,表示隱藏層第2個神經元。這樣,隱藏層有4個神經元就可以將其輸出寫成矩陣的形式:

?最后,相應的輸出層記為,即y^。這種單隱藏層神經網絡也被稱為兩層神經網絡(2 layer NN)。之所以叫兩層神經網絡是因為,通常我們只會計算隱藏層輸出和輸出層的輸出,輸入層是不用計算的。這也是我們把輸入層層數上標記為0的原因()。

3. 計算神經網絡的輸出


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

對于兩層神經網絡,從輸入層到隱藏層對應一次邏輯回歸運算;從隱藏層到輸出層對應一次邏輯回歸運算。每層計算時,要注意對應的上標和下標,一般我們記上標方括號表示layer,下標表示第幾個神經元。例如表示第l層的第i個神經元。注意,i從1開始,l從0開始。

下面,我們將從輸入層到輸出層的計算公式列出來:

?然后,從隱藏層到輸出層的計算公式為:

?其中a[1]為:

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

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

?之前也介紹過,這里順便提一下,W[1]的維度是(4,3),b[1]的維度是(4,1),W[2]的維度是(1,4),b[2]的維度是(1,1)。這點需要特別注意。

4. 多個變量進行矢量化

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


不使用for循環,利用矩陣運算的思想,輸入矩陣X的維度為(nx,m)。這樣,我們可以把上面的for循環寫成矩陣運算的形式:


其中,的維度是(4,m),4是隱藏層神經元的個數;的維度與相同;和的維度均為(1,m)。

對上面這四個矩陣來說,均可以這樣來理解:行表示神經元個數,列表示樣本數目m。

5. 矢量化實現的解釋

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

值得注意的是輸入矩陣X也可以寫成。

6. 激活函數

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

sigmoid函數

tanh函數

?

ReLU函數


Leaky ReLU函數

?

如上圖所示,不同激活函數形狀不同,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)。

7. 為什么需要非線性激活函數

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

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

我們對上式中a[2]進行化簡計算:

?經過推導我們發現a[2]仍是輸入變量x的線性組合。這表明,使用神經網絡與直接使用線性模型的效果并沒有什么兩樣。即便是包含多層隱藏層的神經網絡,如果使用線性函數作為激活函數,最終的輸出仍然是輸入x的線性模型。這樣的話神經網絡就沒有任何作用了。因此,隱藏層的激活函數必須要是非線性的。

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

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

8. 激活函數的導數-梯度

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

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

對于tanh函數的導數:

對于ReLU函數的導數:


對于Leaky ReLU函數:

9. 神經網絡的梯度下降法

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

該神經網絡正向傳播過程為:


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

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

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

10. 神經網絡反向傳播過程(optional)

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

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

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

11. Random Initialization

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

舉個簡單的例子,一個淺層神經網絡包含兩個輸入,隱藏層包含兩個神經元。如果權重W[1]和W[2]都初始化為零,即:

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

W_1 = np.random.randn((2,2))*0.01 b_1 = np.zero((2,1)) W_2 = np.random.randn((1,2))*0.01 b_2 = 0

這里我們將和乘以0.01的目的是盡量使得權重W初始化比較小的值。之所以讓W比較小,是因為如果使用sigmoid函數或者tanh函數作為激活函數的話,W比較小,得到的|z|也比較小(靠近零點),而零點區域的梯度比較大,這樣能大大提高梯度下降算法的更新速度,盡快找到全局最優解。如果W較大,得到的|z|也比較大,附近曲線平緩,梯度較小,訓練過程會慢很多。

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

12. 總結

本節課主要介紹了淺層神經網絡。

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

總結

以上是生活随笔為你收集整理的第三周:浅层神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。