1. 程式人生 > >斯坦福cs231n計算機視覺——神經網路初步

斯坦福cs231n計算機視覺——神經網路初步

week 3  10/22-10/28

筆記

反向傳播的直觀理解

反向傳播是一個優美的區域性過程。在整個計算線路圖中,每個門單元都會得到一些輸入並立即計算兩個東西:1. 這個門的輸出值,和2.其輸出值關於輸入值的區域性梯度。門單元完成這兩件事是完全獨立的,它不需要知道計算線路中的其他細節。然而,一旦前向傳播完畢,在反向傳播的過程中,門單元門將最終獲得整個網路的最終輸出值在自己的輸出值上的梯度。鏈式法則指出,門單元應該將回傳的梯度乘以它對其的輸入的區域性梯度,從而得到整個網路的輸出對該門單元的每個輸入值的梯度。

這裡對於每個輸入的乘法操作是基於鏈式法則的。該操作讓一個相對獨立的門單元變成複雜計算線路中不可或缺的一部分,這個複雜計算線路可以是神經網路等。

模組化:Sigmoid例子

上面介紹的門是相對隨意的。任何可微分的函式都可以看做門。可以將多個門組合成一個門,也可以根據需要將一個函式分拆成多個門。現在看看一個表示式:

\displaystyle f(w,x)=\frac{1}{1+e^{-(w_0x_0+w_1x_1+w_2)}}

在後面的課程中可以看到,這個表示式描述了一個含輸入x和權重w的2維的神經元,該神經元使用了sigmoid啟用函式。但是現在只是看做是一個簡單的輸入為x和w,輸出為一個數字的函式。這個函式是由多個門組成的。除了上文介紹的加法門,乘法門,取最大值門,還有下面這4種:

\displaystyle f(x)=\frac{1}{x} \to \frac{df}{dx}=-1/x^2\displaystyle f_c(x)=c+x \to \frac{df}{dx}=1\displaystyle f(x)=e^x \to \frac{df}{dx}=e^x\displaystyle f_a(x)=ax \to \frac{df}{dx}=a

其中,函式f_c使用對輸入值進行了常量c的平移,f_a將輸入值擴大了常量a倍。它們是加法和乘法的特例,但是這裡將其看做一元門單元,因為確實需要計算常量c,a的梯度。整個計算線路如下:

在上面的例子中可以看見一個函式操作的長鏈條,鏈條上的門都對wx的點積結果進行操作。該函式被稱為sigmoid函式\sigma (x)。sigmoid函式關於其輸入的求導是可以簡化的(使用了在分子上先加後減1的技巧):

\displaystyle\sigma(x)=\frac{1}{1+e^{-x}}\displaystyle\to\frac{d\sigma(x)}{dx}=\frac{e^{-x}}{(1+e^{-x})^2}=(\frac{1+e^{-x}-1}{1+e^{-x}})(\frac{1}{1+e^{-x}})=(1-\sigma(x))\sigma(x)

可以看到梯度計算簡單了很多。舉個例子,sigmoid表示式輸入為1.0,則在前向傳播中計算出輸出為0.73。根據上面的公式,區域性梯度為(1-0.73)*0.73~=0.2,和之前的計算流程比起來,現在的計算使用一個單獨的簡單表示式即可。

實現提示:分段反向傳播。上面的程式碼展示了在實際操作中,為了使反向傳播過程更加簡潔,把向前傳播分成不同的階段將是很有幫助的。比如我們建立了一箇中間變數dot

,它裝著wx的點乘結果。在反向傳播的時,就可以(反向地)計算出裝著wx等的梯度的對應的變數(比如ddotdxdw)。

本節的要點就是展示反向傳播的細節過程,以及前向傳播過程中,哪些函式可以被組合成門,從而可以進行簡化。知道表示式中哪部分的區域性梯度計算比較簡潔非常有用,這樣他們可以“鏈”在一起,讓程式碼量更少,效率更高。

反向傳播實踐:分段計算

看另一個例子。假設有如下函式:

\displaystyle f(x,y)=\frac{x+\sigma(y)}{\sigma(x)+(x+y)^2}

首先要說的是,這個函式完全沒用,讀者是不會用到它來進行梯度計算的,這裡只是用來作為實踐反向傳播的一個例子,需要強調的是,如果對xy進行微分運算,運算結束後會得到一個巨大而複雜的表示式。然而做如此複雜的運算實際上並無必要,因為我們不需要一個明確的函式來計算梯度,只需知道如何使用反向傳播計算梯度即可。

回傳流中的模式

一個有趣的現象是在多數情況下,反向傳播中的梯度可以被很直觀地解釋。例如神經網路中最常用的加法、乘法和取最大值這三個門單元,它們在反向傳播過程中的行為都有非常簡單的解釋。先看下面這個例子:

——————————————————————————————————————————

一個展示反向傳播的例子。加法操作將梯度相等地分發給它的輸入。取最大操作將梯度路由給更大的輸入。乘法門拿取輸入啟用資料,對它們進行交換,然後乘以梯度。

——————————————————————————————————————————

從上例可知:

加法門單元把輸出的梯度相等地分發給它所有的輸入,這一行為與輸入值在前向傳播時的值無關。這是因為加法操作的區域性梯度都是簡單的+1,所以所有輸入的梯度實際上就等於輸出的梯度,因為乘以1.0保持不變。上例中,加法門把梯度2.00不變且相等地路由給了兩個輸入。

取最大值門單元對梯度做路由。和加法門不同,取最大值門將梯度轉給其中一個輸入,這個輸入是在前向傳播中值最大的那個輸入。這是因為在取最大值門中,最高值的區域性梯度是1.0,其餘的是0。上例中,取最大值門將梯度2.00轉給了z變數,因為z的值比w高,於是w的梯度保持為0。

乘法門單元相對不容易解釋。它的區域性梯度就是輸入值,但是是相互交換之後的,然後根據鏈式法則乘以輸出值的梯度。上例中,x的梯度是-4.00x2.00=-8.00。

非直觀影響及其結果。注意一種比較特殊的情況,如果乘法門單元的其中一個輸入非常小,而另一個輸入非常大,那麼乘法門的操作將會不是那麼直觀:它將會把大的梯度分配給小的輸入,把小的梯度分配給大的輸入。線上性分類器中,權重和輸入是進行點積w^Tx_i,這說明輸入資料的大小對於權重梯度的大小有影響。例如,在計算過程中對所有輸入資料樣本x_i乘以1000,那麼權重的梯度將會增大1000倍,這樣就必須降低學習率來彌補。這就是為什麼資料預處理關係重大,它即使只是有微小變化,也會產生巨大影響。對於梯度在計算線路中是如何流動的有一個直觀的理解,可以幫助讀者除錯網路。

反向傳播演算法的數學補充

1.3 雅克比:輸入向量,輸出向量

f: N維向量輸入,M維輸出。f在x處的導數,稱為Jacobian,是一個M*N偏導數矩陣,寫法如下:

其中x維度:N*1;dy/dx維度:M*N;y維度:M*1。dy/dx*△x 維度為:(M*N)*(N*1) = (M*1)。

2. Backpropagation with Tensors

以具體例子為例,f是一個線性層,輸入是a minibatch of N vectors, each of dimension D;輸出a minibatch of N vectors, each of dimension M。

x矩陣維度:N*D,w是D*M,y = f(x,w) = x*w,維度為(N*D)*(D*M) = (N*M)

Jacobian dy/dx矩陣是維度是:(N*M)*(N*D)。即使y的維度乘以x的維度。在神經網路中,這將會非常大,因此它幾乎不可能被儲存或計算

然而,證明大多數神經網路,我們計算(dy/dx)(dL/dy)不需要明確的計算雅克比dy/dx。

我們知道,dL/dx裡面的買個元素是個標量,x的部分導數如下:

Thinking one element at a time, the chain rule tells us that

其中:

即:

最終dL/dx為:

-->這個公式應該是筆誤了,應該是dl/dy*wT??

最終的結果是有趣的,因為它允許我們有效的計算dL/dx,而沒有使用雅可比dy/dx。

例子