梯度下降与反向传播
一、梯度下降
1、損失函數可視化
我們在上一篇文章KNN算法與線性分類器中介紹了得分函數與損失函數,這里不在詳細介紹。梯度下降的核心目標就是找到合適的權重參數W,使得損失函數的值達到最小。找權重參數W的過程就是最優化的過程。
在實際應用中損失函數往往定義在非常高維的空間,例如上一篇文章中W是一個10*3073的矩陣,相當于總共有30730個參數,我們的方法就是把高維投射到一維向量或二維平面上,從而能直觀的觀察到一些變化。這就是損失函數可視化。
隨著權重的變化會得到一個損失函數曲線,如上圖所示,我們找到一個方向W1,W1的維度要和W維度一致,然后給不同的a值,計算L(W+aW1)。在一維層面上對應的最小值就是a所對應的值。
如上圖所示,來看二維層面,紅色代表損失函數的值比較高,藍色代表損失函數的值比較低,藍色最深的地方就是去最小值的地方。
我們先來回顧一下損失函數怎么求,假設訓練集里面有3個樣本,都是1維的,同時總共有3個類別,則其SVM損失計算公式如下:
三個樣本的損失函數再求平均值,就是總體的損失函數。
對應函數圖如下:
我們可以看到三個類別的損失函數相加后得到了右邊的圖像,可知SVM損失函數是一個凸函數,而凸函數的正系數加和仍然是一個凸函數。但擴充到神經網絡之后,損失函數將變成一個非凸函數。
2、最優化
2.1 最優化策略
1、隨機搜尋
這是最直接粗暴的方法,我們盡量多的去試參數,然后選出那個讓損失函數值達到最小的參數,作為最后的W 。代碼如下圖所示:
2、隨機局部搜索
在現有的參數W的基礎上,搜尋以下周邊臨近的參數,有沒有比現在參數更好的W,然后我們用新的W替換現在的W,不斷迭代。代碼如下圖所示:
3、順著梯度下滑
這種方法就是梯度下降法。總體思路就是找到最陡的方向,邁一小步,然后再找當前位置最陡的下山方向,再邁一小步。
從上圖中看到會有一個初始值敏感的效果,上述兩張圖的初始值不同,找到的最小值也不同。
邁的步子就是迭代步長,若步子邁的太小,浪費時間,而步子邁的太大又容易摔倒。
3、梯度下降兩種方法
3.1 數值梯度
數值梯度:對每個維度,都在原始值上加上一個很小的h,然后計算這個維度/方向上的偏導,最后組在一起得到梯度grad。
數值梯度直接從梯度的原始定義出發去求梯度。h是偏差。
數值梯度計算方法的復雜度,基本是和我們的參數個數成線性關系的。
3.2 解析梯度
由損失函數計算對應的偏導解析式,再由解析式迭代計算梯度。
這種方法速度非常快,但是容易出錯,我們可以先計算解析梯度和數值梯度,然后比對結果和校正,然后就可以大膽的進行解析法計算了,這個過程稱為梯度檢查。
一個樣本點的SVM損失函數:
求偏導公式:
求完偏導之后就可以用梯度下降來做:
這個簡單的循環就是很多神經網絡庫的核心。
現實中對整個訓練數據集的樣本都算一遍損失函數,以完成參數迭代是非常耗時的一件事情,一個我們通常會用到的替代方法是:采樣出一個子集在其上計算梯度。
二、反向傳播
反向傳播就是在神經網絡情況下怎么去求梯度。
梯度的本意是一個有方向的向量,表示某一函數在該點處的方向導數沿著該方向取得最大值,即函數在該點處沿著該方向(此梯度的方向)變化最快,變化率最大。
1、偏導與梯度的關系
假設有函數Z=f(X,Y),在某一點處,?Z?X\frac {\partial Z}{\partial X}?X?Z?有一個方向即對應一個箭頭,?Z?Y\frac {\partial Z}{\partial Y}?Y?Z?有一個方向即對應另一個箭頭,我們將這兩個箭頭向量相加,就得到了一個新的向量,稱為在這一點處Z的梯度。Z的梯度總是指向Z函數增長最大的方向。所以梯度下降法我們是沿著梯度的反方向。
2、鏈式法則
若函數u=φ(t)\varphi(t)φ(t),v=ψ(t)\psi(t)ψ(t)在點t可導,z=f(u,v),則有
比如函數f(x,y.z)=(x+y)?*?z
計算過程為:
計算路線:
基于輸入x,y,求得中間變量q,在求得輸出,此過程為正向傳播過程。基于f,要求f關于x,y,z的偏導。已知x,y,z還有中間變量q和f。反向傳播的過程就是先求?f?f\frac {\partial f}{\partial f}?f?f?=1,再求?f?q\frac {\partial f}{\partial q}?q?f?=z,進一步求?q?x\frac {\partial q}{\partial x}?x?q?=?q?y\frac {\partial q}{\partial y}?y?q?=1,則?f?x\frac {\partial f}{\partial x}?x?f?=?f?q\frac {\partial f}{\partial q}?q?f??q?x\frac {\partial q}{\partial x}?x?q?=-4,?f?y\frac {\partial f}{\partial y}?y?f?=?f?q\frac {\partial f}{\partial q}?q?f??q?y\frac {\partial q}{\partial y}?y?q?=-4。整個過程就是先通過正向傳播求得中間變量再求得輸出,然后通過反向傳播求得中間變量的偏導最終求得所有輸入的偏導。最后求得的輸入的偏導就是對應梯度。
2.1 Sigmoid例子
這個函數是由多個基本的中間變量組成,具體有如下:
計算路線如下:
首先設置輸入值w0=2,x0=-1,w1=-3,x1=-2,w2=-3,首先正向傳播求得中間變量w0?*?x0=q6=-2,w1?*?x1=q7=6,q5=q6+q7=-2+6=4,q4=1,q3=-1,q2=0.37,q1=1.37,f=0.73。現在開始反向傳播:?f?f\frac {\partial f}{\partial f}?f?f?=1,?f?q1\frac {\partial f}{\partial q1}?q1?f?=-1q12\frac {1}{q1^2}q121?=-11.372\frac {1}{1.37^2}1.3721?=-0.53;?q1?q2\frac {\partial q1}{\partial q2}?q2?q1?=1,所以?f?q2\frac {\partial f}{\partial q2}?q2?f?=?f?q1?\frac {\partial f}{\partial q1}*?q1?f???q1?q2\frac {\partial q1}{\partial q2}?q2?q1?=-0.53;?q3?q2\frac {\partial q3}{\partial q2}?q2?q3?=eq3^{q 3}q3=0.37,所以?f?q3\frac {\partial f}{\partial q3}?q3?f?=?f?q2?\frac {\partial f}{\partial q2}*?q2?f?? ?q2?q3\frac {\partial q2}{\partial q3}?q3?q2?=-0.2;?q3?q4\frac {\partial q3}{\partial q4}?q4?q3?=-1,所以?f?q4\frac {\partial f}{\partial q4}?q4?f?=?f?q3?\frac {\partial f}{\partial q3}*?q3?f?? ?q3?q4\frac {\partial q3}{\partial q4}?q4?q3?=0.2;?f?q5\frac {\partial f}{\partial q5}?q5?f?=?f?q4?\frac {\partial f}{\partial q4}*?q4?f?? ?q4?q5\frac {\partial q4}{\partial q5}?q5?q4?=0.2;?f?q6\frac {\partial f}{\partial q6}?q6?f?=?f?q5?\frac {\partial f}{\partial q5}*?q5?f?? ?q5?q6\frac {\partial q5}{\partial q6}?q6?q5?=0.2;?f?q7\frac {\partial f}{\partial q7}?q7?f?=?f?q5?\frac {\partial f}{\partial q5}*?q5?f?? ?q5?q7\frac {\partial q5}{\partial q7}?q7?q5?=0.2;?f?w0\frac {\partial f}{\partial w0}?w0?f?=?f?q6?\frac {\partial f}{\partial q6}*?q6?f?? ?q6?w0\frac {\partial q6}{\partial w0}?w0?q6?=-0.2;?f?x0\frac {\partial f}{\partial x0}?x0?f?=?f?q6?\frac {\partial f}{\partial q6}*?q6?f?? ?q6?x0\frac {\partial q6}{\partial x0}?x0?q6?=0.4;?f?w1\frac {\partial f}{\partial w1}?w1?f?=?f?q7?\frac {\partial f}{\partial q7}*?q7?f?? ?q7?w1\frac {\partial q7}{\partial w1}?w1?q7?=-0.4;?f?x1\frac {\partial f}{\partial x1}?x1?f?=?f?q7?\frac {\partial f}{\partial q7}*?q7?f?? ?q7?x1\frac {\partial q7}{\partial x1}?x1?q7?=-0.6;?f?w2\frac {\partial f}{\partial w2}?w2?f?=?f?q4?\frac {\partial f}{\partial q4}*?q4?f?? ?q4?w2\frac {\partial q4}{\partial w2}?w2?q4?=0.2。輸入的偏導也已經求得。我們可以發現例如我如我們求得?f?x0\frac {\partial f}{\partial x0}?x0?f?理論上的值為0.4,但實際中是0.39,說明反向傳播的方法求出解析梯度的值與理論上的值可能不同,但是問題不大。因為我們的目的主要是求對于各個權重的偏導。
上述過程我們看到了一個函數操作的長鏈條,鏈條上的中間變量都對w和x的點積結果進行操作。該函數被稱為Sigmoid函數。sigmoid函數關于其輸入的求導是可以簡化的,簡化后的公式如下:
Sigmoid函數的導數可以用自己很簡單的重新表示出來。例如輸入x值為1,不管中間多么復雜,我們根據上面的公式都可以馬上算出局部梯度(1-0.73)*0.73~=0.2。該神經元反向傳播的代碼如下:
2.2 Sigmoid神經網絡的例子
wjkl_{jk}^ljkl?是從第l-1層的第k個神經元到第l層的第j個神經元的連接上的權重。
神經網絡的基本形式輸入、中間層與輸出。其中每個輸入都是向量,中間層是中間變量。
求梯度過程如下:
公式如下:
zjl_j^ljl?表示第l層的第j個單元的輸入加權和,包括偏置單元。
用ajl_j^ljl?表示第 l 層第 j單元的激活值(輸出值)。 當 l=1 時,有aj1_j^1j1?=xi_ii?。
反向傳播四個公式:
總結
- 上一篇: KNN算法与线性分类器
- 下一篇: CNN训练注意事项与框架使用