深度學習理之理解反向傳播[1] — 簡單全連線網路(BP)

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

寫在前面

一開始看的是cs231n的min-char-rnn.py,無奈怎麼都看不懂反向傳播那一塊的內容。後也是不斷搜尋,發現那不是普通的bp,也不是正規的bptt,所以要理解karpathy的程式碼我還需要更深地理解反向傳播,從頭開始。

最早看了這麼一篇 初學者——從NN到RNN,深刻理解以softmax為啟用函式的反向傳播,有程式碼 ,還頗以為詳盡明白,但是套到min-char-rnn裡一點也講不通,後來明白了,這篇博文講的是bptt的一部分,甚至還不全,其參考的是 Recurrent Neural Networks Tutorial, Part 2 – Implementing a RNN with Python, Numpy and Theano但卻缺斤少兩,不過後一篇在推導上也是很有不足,不談了,大家不必去看這兩篇,甚至cs231n-optimization2ufldl的bp也不必先看(這個都是亂花眼的公式,雖然其表達的意思很準確,但是過於抽象,不利於我們從實現程式碼的細節角度上理解),經過我的實踐,我認為我們應該先從講的最好最清楚的BP開始,從How the backpropagation algorithm works開始,如果你聽從我的建議,你應該會少走很多的彎路。

so,let’s begin.

正文

整體介紹一下

How the backpropagation algorithm works 是 Neural Networks and Deep Learning 這本書的第二章,大家要是不習慣英文也可以去找翻譯版。下面我不完全按照書裡來,但是我會解釋的很清楚的。

首先要反向傳播,我們需要有向前傳播。
向前傳播很簡單,畫個圖,圖上每個點都需要做個線性計算,一層一層傳遞,這就是前向傳播。

圖片描述(圖一)

layer1當成輸入層,layer2是hidden_layer(隱含層),layer3是輸出層,這個要記住了,其實深度網路有一點很難理解的就是圖的抽象思維。上面這張圖如果是在rnn中,變成了下面這樣。

圖片描述(圖二)

圖中的s看上去是一個點,其實裡面就是上上圖拆解開來的全連線,因為我們是矩陣與向量操作!!所以這點先明白清楚。

那麼回到圖一。

w是一個權值矩陣,同樣的還需要b偏置向量,再看下圖。

圖片描述(圖三)

a是輸出層的每個神經元的輸出。

圖片描述

這就是輸出,l代表的是第幾層,j,k都是來代表第幾個神經元。這裡用的是sigmoid函式,也就是括號外的sigma符號,現在我們可以暫時不管這個函式是什麼,因為我們還可以用relus,tanh等等,其實sigmoid現在已經很少用了,但是為了讀者不那麼麻煩去查,我還是把這個公式貼出來。

圖片描述

好了,這個就是一個簡單的全連線的網路的公式解釋。為了我們後面更方便地使用公式,我們在這裡許澄清一點,以上的都是element-wise也就是單元素操作,如下。

圖片描述

我們可以把公式美化成下面這個版本。

圖片描述

在這裡我需要提一點,書中講到一個quirk就是w的角標j,k的設定為什麼是這樣的,因為這樣我們不用把上面這個公式中的w轉置了,但其實現實程式碼中還是轉置了,所以當你們看到現實程式碼中有轉置就不用那麼疑惑了。

一般來講,我們往下走之前還需定義幾個公式。

$$z^l≡w^la^{l−1} b^l$$
$$z^l_j=\sum{kw^l_{jk}a^{l−1}_k b^l_j}$$
$$a^l=σ(z^l)$$

以上就是簡單的前向傳播。但是我們有個最重要的損失函式才是我們需要擬合的函式,這個函式就是利用輸出層的輸出作為損失函式的輸入。下面我們介紹損失函式。

介紹下損失函式

損失函式是幹什麼用的?我們就是利用損失函式求∂C/∂w 和 ∂C/∂b進行反向傳播來更新w矩陣和b向量。我們可以先定義一個最簡單的損失函式如下(類似於方差)

圖片描述

圖片描述

好清楚明白的,我就不過多廢話了。

四個最最關鍵的公式

現在開始是核心部分,BP的核心。

先介紹一箇中間量,殘差。殘差不等於誤差。

$$δ^l_j$$

代表著第l層第j個神經元的殘差。

圖片描述

如上圖,一個形象可愛的說法是每個神經元的地方都有一個惡魔,這個惡魔會給輸入帶來一點偏差,
$$Δz^l_j$$
這樣會造成輸出
$$σ(z^l_j Δz^l_j)$$
總的損失會改變
$$\frac{∂C}{∂z^l_j}Δz^l_j$$

現在呢,這個惡魔成為了一個好的惡魔,能夠幫助我們減少損失。那麼怎麼去減少損失呢?下面就用數學來說明。

圖片描述

這代表著第l層的第j個神經元所獲得的殘差。
我們的模型比較簡單,我們需要的bp公式只有四個,我先不討論怎麼證明這四個公式的正確性,我們先來看看這四個公式,證明留在後面。

圖片描述

bp1在成為上圖中的bp1之前不長這樣,

圖片描述

這是個十分自然的表示式,左邊的偏導代表第j個神經元的cost的改變速率,這麼來理解,如果很小的話,說明這個點的誤差不大。右邊的表示sigma函式在其輸入z上的改變速率。

為了方便點,假設我們的C是

$$C=\frac{1}{2}∑_j(y_j−a^L_j)^2$$

那求導後就很簡單了。

$$\frac{∂C}{∂a^L_j}=(a^L_j−y_j)$$

由於這個初始的bp1是分量計算的方式,我們可以重寫成

圖片描述

$$∇_aC=(a^L−y)$$

這個公式計算的是最後一層反向傳播的公式,因為只有最後一層才有loss_function,而中間的隱含層的反向傳播利用的公式則是下面的bp2,這個很重要,我一開始都沒理解,最後一層和中間的隱含層是不一樣的。

圖片描述

理解這個公式如同理解第一個公式一樣,只是這裡利用了前面的殘差作為輸入。

後兩個就不講了,只要有了這四個公式作為工具,我們就可以輕鬆反向傳播。

證明

從bp1開始,首先我們先定義什麼是殘差,

圖片描述

根據鏈式法則我們能得到

圖片描述

這裡我們需要結合一下圖來解釋更清楚

圖片描述

比如這張圖,L=3,也就是我們在輸出層,z是這層的神經元的輸入,所以當j!=k時,偏導是為0的,因此,我們可以簡化公式

圖片描述

下面證明bp2,因為這個是隱藏層的傳播,我在之前已經有提醒過了,所以這裡的神經元的輸出a其實是下一個連線到的神經元的輸入z,不過是層數加1。所以,

圖片描述

圖片描述

圖片描述

圖片描述

以上證明了bp2。

bp3證明其實就是

圖片描述再乘偏z偏b

偏z偏b等於1,所以證得。bp4證略。

在下一篇[深度學習原理之理解反向傳播[2] — 簡單全連線網路(BP)]()我會來介紹程式碼,不僅僅是這個簡單版的程式碼,主要講講min-char-rnn.py的程式碼,很多的疑問。

相關文章

人工智慧 最新文章