日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

梯度下降与反向传播

發布時間:2024/9/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 梯度下降与反向传播 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、梯度下降

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?
反向傳播四個公式:

總結

以上是生活随笔為你收集整理的梯度下降与反向传播的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。