1. 程式人生 > >2017CS231n李飛飛深度視覺識別筆記(四)——神經網路

2017CS231n李飛飛深度視覺識別筆記(四)——神經網路

第四講 神經網路

課時1 反向傳播

    目前,我們已經講了怎麼定義一個分類器、怎麼定義一個損失函式以及它的正則化,也討論了用梯度下降的方法找到最小化的損失函式。

    接下來,將討論如何計算任意複雜函式的解析梯度,用到一個叫計算圖的框架。大體上說,計算圖就是用這類圖來表示任意函式,其中圖的節點表示要執行的每一步計算,比如下圖中的例子:

    這個線性分類器輸入x和W,輸出得分向量,另外一個計算節點表示hinge loss,計算資料損失項Li,同時有一個正則化項,最後輸入的總的損失函式L就是正則化項與資料項的和;利用這樣的計算圖的好處就是能夠用反向傳播技術,遞迴地用鏈式法則來計算每個變數的梯度。

    那麼反向傳播是如何工作的呢?

    簡單的例子:(1)假設有一個函式,要找到函式輸出對應任意變數的梯度,第一步是利用計算圖來表示整個函式,例如:

    現在要做的是這個網路的前向傳播,這裡給定了每個變數對應的值,寫入計算圖中,最後得到的值為-12;計算對應的梯度如下:

    而反向傳播是鏈式法則的遞迴呼叫,從後往前計算出所有的梯度。

    最後一個變數f的梯度為,接下來變數z的梯度為,變數q

    的梯度為,變數y的梯度為,變數x的梯度為

    這裡使用的鏈式法則是為了在有更復雜的計算的時候,用這種方式可以更方便的計算梯度,而在本例中比較簡單的時候也可以直接計算不需要鏈式相乘。

    主要的操作是在每個結點上計算需要的本地梯度,然後跟蹤這個梯度,在反向傳播過程中,接收從上游傳回來的這個梯度值,直接用這個值乘以本地梯度就能得到想要傳回連線點的值。

    複雜的例子:(2)假設有函式,同樣的把它轉換成

一個計算圖:

    圖中標出就是前向傳播的對應的梯度值,而現在要對它們進行反向傳播,看一下它的反向計算過程:

    接著把剩餘的梯度也給填充上去:

    所以如果利用這樣的計算圖,然後應用反向傳播和鏈式法則,就能很快的計算出所需要的梯度。

    問題:對於這max運算,它的梯度值是多少?

    答:z的梯度是2,w的梯度是0。其中的一個變數將會得到剛傳遞回來的梯度完整值,並且再傳遞給那個變數,然後另一個變數的梯度會取0。

    另一個需要說明的情況是上圖所示,當有一個節點連線到多個節點時,梯度會在這個節點累加。在這些分支上,根據多元鏈式法則,只會獲取每個節點的返回的上游梯度值,然後將它們加起來獲得這個節點總的上游梯度。

    可以這樣思考,如果要改變這個節點一點點,當通過這個圖進行前向傳遞時,它會影響在前向傳遞中影響到所有連線這個節點的節點,然後當進行反向傳播時,所有傳回的梯度都會影響到這個節點,這就是為什麼將這些加起來得到迴流到這個點的總上游梯度值。

    接下來,討論變數是高維的情況:

    例如有一個向量作為輸入,其中有4096個元素,在卷積神經網路中,這種資料尺寸是比較常見的,中間的運算節點是對每個元素求最大值的運算,最後的輸出也是一個包含4096個元素的向量。

    問題:這個例子中的雅克比矩陣是尺寸是幾乘幾的?(雅克比矩陣的每一行都是偏導數,矩陣的每個元素是輸出向量的每個元素,是對輸入向量每個元素分別求導的結果)

    答:矩陣的尺寸是4096*4096。實際中還會遇到更大的矩陣,所以實際運算時,多數情況下並不會計算如此大的矩陣。

    問題:這個雅克比矩陣的特點?

    答:對角矩陣。

    一個向量的例子如下圖:

    同樣的,用相同的方法計算出。記住一個重要的事情:檢查變數梯度的向量大小,應該和變數向量大小一致。

    所以,我們可以將上述的前向傳播和後向傳播的方法模組化成一個API,如下所示:

    總結:

    (1)神經網路都將會是非常龐大和複雜,所以將所有引數的梯度公式寫下來是不現實的;

    (2)為了得到這些梯度,應該使用反向傳播——神經網路中的一個核心技術就是使用反向傳播來計算梯度,我們利用計算圖和鏈式法則,從後開始計算出所有中間變數的梯度;

    (3)正向:希望得到計算結果,並存儲所有將會在後面的梯度計算中用到的中間值;

    (4)反向:使用鏈式法則、上游梯度將它與本地梯度相乘,計算在輸出節點方向上的梯度,然後將它傳遞給下一個連線的節點。

課時2 神經網路

    在此前我們已經使用了很多這種計分函式:

    現在使用一個2層的神經網路:

    或者使用一個3層的神經網路:

    一般來說,神經網路就是由簡單函式構成的一組函式,使用一種層次化的方式將它們堆疊起來,形成一個更復雜的非線性函式;這也正是深度神經網路的由來,可以堆積很多層形成深度網路。

    有很多人在談論神經網路如何從生物學中獲得靈感;說起神經元,每個神經元有很多樹突用來接收脈衝訊號,然後通過細胞體處理這些訊號,接著通過軸突將處理後的訊號輸出;所以和神經元很類似,神經網路的結構和流程也是這樣。

    計算圖裡的節點相互連線,我們需要輸入“訊號x”,所有x的輸入量比如x0、x1、x2等,採用比如賦予權重W的方法,疊加匯合到一起,將結果整合起來後得到一個啟用函式,將啟用函式應用在神經元的端部,得到的值作為輸出。

    注意:在進行這種類比時要特別小心,因為生物學上的神經元實際上比我們描述的要複雜的多,它們的樹突會比表現出異常複雜的非線性,而並非像我們描述的那樣只有簡單的權重。

    另外,提到啟用函式,我們已經討論過了多種不同的啟用函式,之後我們會對所有的啟用函式進行更加詳細的討論。

    並且,接下來我們也將討論神經元的不同架構形式,比如剛剛提到的2層和3層神經網路結構:

    總結:

    (1)本節中討論瞭如何將神經元組織起來進行運算;

    (2)神經元抽象的好處使我們可以採用非常高效的向量化程式碼進行運算;

    我們已經大致瞭解了神經網路的一個工作的流程,類似於神經元的訊號傳遞過程,下一章中我們將繼續討論卷積神經網路的相關內容。