深度學習各種網絡其實基礎就是各種基礎知識累積,今天主要想把這三個講清楚:梯度下降、神經網絡、反向傳播算法。
一、神經網絡(一切的基石)
工智能的底層模型是"神經網絡"(neural network)。許多復雜的應用(比如模式識別、自動控制)和高級模型(比如深度學習)都基於它。學習人工智能,一定是從它開始。

什么是神經網絡呢?
1、感知器
歷史上,科學家一直希望模擬人的大腦,造出可以思考的機器。人為什么能夠思考?科學家發現,原因在於人體的神經網絡。

既然思考的基礎是神經元,如果能夠"人造神經元"(artificial neuron),就能組成人工神經網絡,模擬思考。上個世紀六十年代,提出了最早的"人造神經元"模型,叫做"感知器"(perceptron),直到今天還在用。

上圖的圓圈就代表一個感知器。它接受多個輸入(x1,x2,x3...),產生一個輸出(output),好比神經末梢感受各種外部環境的變化,最后產生電信號。
為了簡化模型,我們約定每種輸入只有兩種可能:1 或 0。如果所有輸入都是1,表示各種條件都成立,輸出就是1;如果所有輸入都是0,表示條件都不成立,輸出就是0。
2、感知器的例子
下面來看一個例子。城里正在舉辦一年一度的游戲動漫展覽,小明拿不定主意,周末要不要去參觀。

他決定考慮三個因素。
這就構成一個感知器。上面三個因素就是外部輸入,最后的決定就是感知器的輸出。如果三個因素都是 Yes(使用1表示),輸出就是1(去參觀);如果都是 No(使用0表示),輸出就是0(不去參觀)。
3、權重和閾值
看到這里,你肯定會問:如果某些因素成立,另一些因素不成立,輸出是什么?比如,周末是好天氣,門票也不貴,但是小明找不到同伴,他還要不要去參觀呢?
現實中,各種因素很少具有同等重要性:某些因素是決定性因素,另一些因素是次要因素。因此,可以給這些因素指定權重(weight),代表它們不同的重要性。
上面的權重表示,天氣是決定性因素,同伴和價格都是次要因素。
如果三個因素都為1,它們乘以權重的總和就是 8 + 4 + 4 = 16。如果天氣和價格因素為1,同伴因素為0,總和就變為 8 + 0 + 4 = 12。
這時,還需要指定一個閾值(threshold)。如果總和大於閾值,感知器輸出1,否則輸出0。假定閾值為8,那么 12 > 8,小明決定去參觀。閾值的高低代表了意願的強烈,閾值越低就表示越想去,越高就越不想去。
上面的決策過程,使用數學表達如下。

上面公式中,x表示各種外部因素,w表示對應的權重。
4、決策模型
單個的感知器構成了一個簡單的決策模型,已經可以拿來用了。真實世界中,實際的決策模型則要復雜得多,是由多個感知器組成的多層網絡。

上圖中,底層感知器接收外部輸入,做出判斷以后,再發出信號,作為上層感知器的輸入,直至得到最后的結果。(注意:感知器的輸出依然只有一個,但是可以發送給多個目標。)
這張圖里,信號都是單向的,即下層感知器的輸出總是上層感知器的輸入。現實中,有可能發生循環傳遞,即 A 傳給 B,B 傳給 C,C 又傳給 A,這稱為"遞歸神經網絡"(recurrent neural network),本文不涉及。

5、矢量化
為了方便后面的討論,需要對上面的模型進行一些數學處理。
感知器模型就變成了下面這樣。

6、神經網絡的運作過程
一個神經網絡的搭建,需要滿足三個條件。
也就是說,需要事先畫出上面出現的那張圖。

其中,最困難的部分就是確定權重(w)和閾值(b)。目前為止,這兩個值都是主觀給出的,但現實中很難估計它們的值,必需有一種方法,可以找出答案。
這種方法就是試錯法。其他參數都不變,w(或b)的微小變動,記作Δw(或Δb),然后觀察輸出有什么變化。不斷重復這個過程,直至得到對應最精確輸出的那組w和b,就是我們要的值。這個過程稱為模型的訓練。

因此,神經網絡的運作過程如下。
- 確定輸入和輸出
- 找到一種或多種算法,可以從輸入得到輸出
- 找到一組已知答案的數據集,用來訓練模型,估算
w和b - 一旦新的數據產生,輸入模型,就可以得到結果,同時對
w和b進行校正
可以看到,整個過程需要海量計算。所以,神經網絡直到最近這幾年才有實用價值,而且一般的 CPU 還不行,要使用專門為機器學習定制的 GPU 來計算。
7、神經網絡的例子
下面通過車牌自動識別的例子,來解釋神經網絡。

所謂"車牌自動識別",就是高速公路的探頭拍下車牌照片,計算機識別出照片里的數字。

這個例子里面,車牌照片就是輸入,車牌號碼就是輸出,照片的清晰度可以設置權重(w)。然后,找到一種或多種圖像比對算法,作為感知器。算法的得到結果是一個概率,比如75%的概率可以確定是數字1。這就需要設置一個閾值(b)(比如85%的可信度),低於這個門檻結果就無效。
一組已經識別好的車牌照片,作為訓練集數據,輸入模型。不斷調整各種參數,直至找到正確率最高的參數組合。以后拿到新照片,就可以直接給出結果了。

8、輸出的連續性
上面的模型有一個問題沒有解決,按照假設,輸出只有兩種結果:0和1。但是,模型要求w或b的微小變化,會引發輸出的變化。如果只輸出0和1,未免也太不敏感了,無法保證訓練的正確性,因此必須將"輸出"改造成一個連續性函數。
這就需要進行一點簡單的數學改造。
首先,將感知器的計算結果wx + b記為z。
然后,計算下面的式子,將結果記為σ(z)。
這是因為如果z趨向正無窮z → +∞(表示感知器強烈匹配),那么σ(z) → 1;如果z趨向負無窮z → -∞(表示感知器強烈不匹配),那么σ(z) → 0。也就是說,只要使用σ(z)當作輸出結果,那么輸出就會變成一個連續性函數。
原來的輸出曲線是下面這樣。

現在變成了這樣。

實際上,還可以證明Δσ滿足下面的公式。

即Δσ和Δw和Δb之間是線性關系,變化率是偏導數。這就有利於精確推算出w和b的值了。
這里可以看到Sigmoid 函數是使用深度學習范圍最廣的一類激活函數,具有指數函數形狀 。正式定義為:
在深度學習中,信號從一個神經元傳入到下一層神經元之前是通過線性疊加來計算的,而進入下一層神經元需要經過非線性的激活函數,繼續往下傳遞,如此循環下去。由於這些非線性函數的反復疊加,才使得神經網絡有足夠的capacity來抓取復雜的特征。
為什么要使用非線性激活函數?
答:如果不使用激活函數,這種情況下每一層輸出都是上一層輸入的線性函數。無論神經網絡有多少層,輸出都是輸入的線性函數,這樣就和只有一個隱藏層的效果是一樣的。這種情況相當於多層感知機(MLP)。
具體參考:http://www.360doc.com/content/17/1102/21/1489589_700400500.shtml
二、梯度下降和ANN—人工神經元網絡訓練
ANN網絡:輸入層/輸入神經元,輸出層/輸出神經元,隱層/隱層神經元,權值,偏置,激活函數
ANN網絡訓練過程:
假設ANN網絡已經搭建好了,在所有應用問題中(不管是網絡結構,訓練手段如何變化)我們的目標是不會變的,那就是網絡的權值和偏置最終都變成一個最好的值,這個值可以讓我們由輸入可以得到理想的輸出,於是問題就變成了y=f(x,w,b)(x是輸入,w是權值,b為偏置)
最后的目標就變成了嘗試不同的w,b值,使得最后的y=f(x)無限接近我們希望得到的值t,也就是讓loss最小,loss可以用(y-t)^2的值盡可能的小。於是原先的問題化為了C(w,b)=(f(x,w,b)-t)^2取到一個盡可能小的值。這個問題不是一個困難的問題,不論函數如何復雜,如果C降低到了一個無法再降低的值,那么就取到了最小值(假設我們不考慮局部最小的情況)。
梯度下降方法求解下降最快:
網絡權值偏置更新問題 ==> f(x,w,b)的結果逼近t ==> C(w,b)=(f(x,w,b)-t)^2取極小值問題 ==> C(w,b)按梯度下降問題 ==>取到極小值,網絡達到最優。
推導基於一個前提:我們已經提前知道了當前點的梯度。然而事實是我們不知道。
那么怎么解決呢?
三、反向傳播方法更新權重矩陣求下降梯度
為什么要用反向傳播?
主要是訓練過程中,我們知道了輸入和輸出和groudtruth最后的真實結果,那么我們可以根據真實的結果-output得到誤差值,再反向去推導前一層的誤差,這樣就可以更新我們的W 和B,比單純的梯度下降去慢慢窮舉一個個試試,速度快多了。
所以步驟就是:
step1、前向傳播:
1.輸入層---->隱含層:
計算神經元h1的輸入加權和,神經元h1的輸出o1:(此處用到激活函數為sigmoid函數),同理,可計算出神經元h2的輸出o2。
2.隱含層---->輸出層:
計算輸出層神經元o1和o2的值。
這樣前向傳播的過程就結束了,我們得到輸出值為[0.75136079 , 0.772928465],與實際值[0.01 , 0.99]相差還很遠,現在我們對誤差進行反向傳播,更新權值,重新計算輸出。
Step 2 反向傳播
1.計算總誤差
總誤差:(square error)。真實值-output
2.隱含層---->輸出層的權值更新:
以權重參數w5為例,如果我們想知道w5對整體誤差產生了多少影響,可以用整體誤差對w5求偏導求出:(鏈式法則),算出整體誤差E(total)對w5的偏導值。
最后我們來更新w5的值。同理可更新w6,w7,w8。
3.隱含層---->隱含層的權值更新:
方法其實與上面說的差不多,但是有個地方需要變一下,在上文計算總誤差對w5的偏導時,是從out(o1)---->net(o1)---->w5,但是在隱含層之間的權值更新時,是out(h1)---->net(h1)---->w1,而out(h1)會接受E(o1)和E(o2)兩個地方傳來的誤差,所以這個地方兩個都要計算。
這樣誤差反向傳播法就完成了,最后我們再把更新的權值重新計算,不停地迭代,在這個例子中第一次迭代之后,總誤差E(total)由0.298371109下降至0.291027924。迭代10000次后,總誤差為0.000035085,輸出為[0.015912196,0.984065734](原輸入為[0.01,0.99]),證明效果還是不錯的。
1、反向傳播的原理
首先,需要記住兩點:
1.反向傳播算法告訴我們當我們改變權值(weights)和偏置(biases)的時候,損失函數改變的速度。
2.反向傳播也告訴我們如何改變權值和偏置以改變神經網絡的整體表現。
2.一個很好的例子
假設,你有這樣一個網絡層:

第一層是輸入層,包含兩個神經元i1,i2,和截距項b1;第二層是隱含層,包含兩個神經元h1,h2和截距項b2,第三層是輸出o1,o2,每條線上標的wi是層與層之間連接的權重,激活函數我們默認為sigmoid函數。
現在對他們賦上初值,如下圖:

其中,輸入數據 i1=0.05,i2=0.10;
輸出數據 o1=0.01,o2=0.99;
初始權重 w1=0.15,w2=0.20,w3=0.25,w4=0.30;
w5=0.40,w6=0.45,w7=0.50,w8=0.88
目標:給出輸入數據i1,i2(0.05和0.10),使輸出盡可能與原始輸出o1,o2(0.01和0.99)接近。
Step 1 前向傳播
1.輸入層---->隱含層:
計算神經元h1的輸入加權和:

神經元h1的輸出o1:(此處用到激活函數為sigmoid函數):

同理,可計算出神經元h2的輸出o2:

2.隱含層---->輸出層:
計算輸出層神經元o1和o2的值:


這樣前向傳播的過程就結束了,我們得到輸出值為[0.75136079 , 0.772928465],與實際值[0.01 , 0.99]相差還很遠,現在我們對誤差進行反向傳播,更新權值,重新計算輸出。
Step 2 反向傳播
1.計算總誤差
總誤差:(square error)

但是有兩個輸出,所以分別計算o1和o2的誤差,總誤差為兩者之和:


2.隱含層---->輸出層的權值更新:
以權重參數w5為例,如果我們想知道w5對整體誤差產生了多少影響,可以用整體誤差對w5求偏導求出:(鏈式法則)
下面的圖可以更直觀的看清楚誤差是怎樣反向傳播的:
現在我們來分別計算每個式子的值:
計算
:

計算
:

(這一步實際上就是對sigmoid函數求導,比較簡單,可以自己推導一下)
計算
:

最后三者相乘:

這樣我們就計算出整體誤差E(total)對w5的偏導值。
回過頭來再看看上面的公式,我們發現:

為了表達方便,用
來表示輸出層的誤差:

因此,整體誤差E(total)對w5的偏導公式可以寫成:

如果輸出層誤差計為負的話,也可以寫成:

最后我們來更新w5的值:

(其中,
是學習速率,這里我們取0.5)
同理,可更新w6,w7,w8:

3.隱含層---->隱含層的權值更新:
方法其實與上面說的差不多,但是有個地方需要變一下,在上文計算總誤差對w5的偏導時,是從out(o1)---->net(o1)---->w5,但是在隱含層之間的權值更新時,是out(h1)---->net(h1)---->w1,而out(h1)會接受E(o1)和E(o2)兩個地方傳來的誤差,所以這個地方兩個都要計算。

計算
:

先計算
:




同理,計算出:

兩者相加得到總值:

再計算
:

再計算
:

最后,三者相乘:

為了簡化公式,用sigma(h1)表示隱含層單元h1的誤差:

最后,更新w1的權值:

同理,額可更新w2,w3,w4的權值:

這樣誤差反向傳播法就完成了,最后我們再把更新的權值重新計算,不停地迭代,在這個例子中第一次迭代之后,總誤差E(total)由0.298371109下降至0.291027924。迭代10000次后,總誤差為0.000035085,輸出為[0.015912196,0.984065734](原輸入為[0.01,0.99]),證明效果還是不錯的
3、算法步驟
前向傳遞輸入信號直至輸出產生誤差,反向傳播誤差信息更新權重矩陣。
后向傳播算法是深度學習中一種訓練與學習方法,用來調整深度網絡中各個節點之間的權重,使得網絡輸出的樣本標簽與實際標簽相一致。本文將對后向傳播算法的實現細節進行總結。
后向傳播算法是將輸出層的誤差向后進行傳播來實現權重的調整。如圖1所示,一個含有1個隱藏層的網絡,輸入層有2個節點,隱藏層有3個節點,輸出層有2個節點。
則后向傳播的實現細節如下:
下面給出一個計算示例:
如圖2為一個簡單的網絡
假設目標輸出為0.5,即target=0.5,則按照以上的方法計算如下:
1.計算各節點的值與激活值
a.隱藏層最頂端節點:(0.35×0.1)+(0.9×0.8)=0.755;
節點輸出:out=sigmoid(0.755)=0.68;
b.隱藏層最低端節點:(0.9×0.6)+(0.35×0.4)=0.68;
節點輸出:out=sigmoid(0.68)=0.6637;
c.輸出層節點:(0.3×0.68)+(0.9×0.6637)=0.80133
節點輸出:sigmoid(0.80133)=0.69
2.后向傳播更新權重
a.輸出誤差:δ=(t-o)(1-o)o=(0.5-0.69)(1-0.69)0.69=-0.0406;
b.更新輸出層權重:
W1+=W1+(δ×input)=0.3+(-0.0406×0.68)=0.272392
W2+=W2+(δ×input)=0.9+(-0.0406×0.6637)=0.87305
c.隱藏層誤差與權重更新
誤差計算:
δ1=δ×W1=-0.0406×0.272392×(1-o)o=-2.406×10−3
δ2=δ×W2=-0.0406×0.87305×(1-o)o=-7.916×10−3
權重更新:
W3+=0.1+(−2.406×10−3×0.35)=0.09916
W4+=0.8+(−2.406×10−3×0.9)=0.7978
W5+=0.4+(−7.916×10−3×0.35)=0.3972
W6+=0.6+(−7.916×10−3×0.9)=0.5928

