深度學習入門之PyTorch–廖星宇書中的反向傳播演算法理論

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

反向傳播演算法

前面我們介紹了三個模型,整個處理的基本流程都是定義模型,讀入資料,給出損失函式f” role=”presentation” style=”position: relative;”>fff,通過梯度下降法更新引數。PyTorch 提供了非常簡單的自動求導幫助我們求解導數,對於比較簡單的模型,我們也能手動求出引數的梯度,但是對於非常複雜的模型,比如一個 100 層的網路,我們如何能夠有效地手動求出這個梯度呢?這裡就需要引入反向傳播演算法,自動求導本質是就是一個反向傳播演算法。

反向傳播演算法是一個有效地求解梯度的演算法,本質上其實就是一個鏈式求導法則的應用,然而這個如此簡單而且顯而易見的方法卻是在 Roseblatt 提出感知機演算法後將近 30 年才被髮明和普及的,對此 Bengio 這樣說道:“很多看似顯而易見的想法只有在事後才變得的顯而易見。”

下面我們就來詳細將一講什麼是反向傳播演算法。

鏈式法則

首先來簡單地介紹一下鏈式法則,考慮一個簡單的函式,比如

f(x,y,z)=(x y)z” role=”presentation”>f(x,y,z)=(x y)zf(x,y,z)=(x y)z

f(x, y, z) = (x y)z

我們當然可以直接求出這個函式的微分,但是這裡我們要使用鏈式法則,令

q=x y” role=”presentation”>q=x yq=x y

q=x y

那麼

f=qz” role=”presentation”>f=qzf=qz

f = qz

對於這兩個式子,我們可以分別求出他們的微分

∂f∂q=z,∂f∂z=q” role=”presentation”>∂f∂q=z,∂f∂z=q∂f∂q=z,∂f∂z=q

\frac{\partial f}{\partial q} = z, \frac{\partial f}{\partial z}=q

同時q” role=”presentation” style=”position: relative;”>qqq是x” role=”presentation” style=”position: relative;”>xxx和y” role=”presentation” style=”position: relative;”>yyy的求和,所以我們能夠得到

∂qx=1,∂qy=1″ role=”presentation”>∂qx=1,∂qy=1∂qx=1,∂qy=1

\frac{\partial q}{x} = 1, \frac{\partial q}{y} = 1

我們關心的問題是

∂f∂x,∂f∂y,∂f∂z” role=”presentation”>∂f∂x,∂f∂y,∂f∂z∂f∂x,∂f∂y,∂f∂z

\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}, \frac{\partial f}{\partial z}

鏈式法則告訴我們如何來計算出他們的值

∂f∂x=∂f∂q∂q∂x” role=”presentation”>∂f∂x=∂f∂q∂q∂x∂f∂x=∂f∂q∂q∂x

\frac{\partial f}{\partial x} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial x}

∂f∂y=∂f∂q∂q∂y” role=”presentation”>∂f∂y=∂f∂q∂q∂y∂f∂y=∂f∂q∂q∂y

\frac{\partial f}{\partial y} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial y}

∂f∂z=q” role=”presentation”>∂f∂z=q∂f∂z=q

\frac{\partial f}{\partial z} = q

通過鏈式法則我們知道如果我們需要對其中的元素求導,那麼我們可以一層一層求導然後將結果乘起來,這就是鏈式法則的核心,也是反向傳播演算法的核心,更多關於鏈式法則的演算法,可以訪問這個文件

反向傳播演算法

瞭解了鏈式法則,我們就可以開始介紹反向傳播演算法了,本質上反向傳播演算法只是鏈式法則的一個應用。我們還是使用之前那個相同的例子q=x y,f=qz” role=”presentation” style=”position: relative;”>q=x y,f=qzq=x y,f=qzq=x y, f=qz,通過計算圖可以將這個計算過程表達出來

上面綠色的數字表示其數值,下面紅色的數字表示求出的梯度,我們可以一步一步看看反向傳播演算法的實現。首先從最後開始,梯度當然是1,然後計算

∂f∂q=z=−4, ∂f∂z=q=3″ role=”presentation”>∂f∂q=z=−4, ∂f∂z=q=3∂f∂q=z=−4, ∂f∂z=q=3

\frac{\partial f}{\partial q} = z = -4,\ \frac{\partial f}{\partial z} = q = 3

接著我們計算

∂f∂x=∂f∂q∂q∂x=−4×1=−4, ∂f∂y=∂f∂q∂q∂y=−4×1=−4″ role=”presentation”>∂f∂x=∂f∂q∂q∂x=−4×1=−4, ∂f∂y=∂f∂q∂q∂y=−4×1=−4∂f∂x=∂f∂q∂q∂x=−4×1=−4, ∂f∂y=∂f∂q∂q∂y=−4×1=−4

\frac{\partial f}{\partial x} = \frac{\partial f}{\partial q} \frac{\partial q}{\partial x} = -4 \times 1 = -4,\ \frac{\partial f}{\partial y} = \frac{\partial f}{\partial q} \frac{\partial q}{\partial y} = -4 \times 1 = -4

這樣一步一步我們就求出了∇f(x,y,z)” role=”presentation” style=”position: relative;”>∇f(x,y,z)∇f(x,y,z)\nabla f(x, y, z)。

直觀上看反向傳播演算法是一個優雅的區域性過程,每次求導只是對當前的運算求導,求解每層網路的引數都是通過鏈式法則將前面的結果求出不斷迭代到這一層,所以說這是一個傳播過程

Sigmoid函式舉例

下面我們通過Sigmoid函式來演示反向傳播過程在一個複雜的函式上是如何進行的。

f(w,x)=11 e−(w0x0 w1x1 w2)” role=”presentation”>f(w,x)=11 e−(w0x0 w1x1 w2)f(w,x)=11 e−(w0x0 w1x1 w2)

f(w, x) = \frac{1}{1 e^{-(w_0 x_0 w_1 x_1 w_2)}}

我們需要求解出

∂f∂w0,∂f∂w1,∂f∂w2″ role=”presentation”>∂f∂w0,∂f∂w1,∂f∂w2∂f∂w0,∂f∂w1,∂f∂w2

\frac{\partial f}{\partial w_0}, \frac{\partial f}{\partial w_1}, \frac{\partial f}{\partial w_2}

首先我們將這個函式抽象成一個計算圖來表示,即

f(x)=1xfc(x)=1 xfe(x)=exfw(x)=−(w0x0 w1x1 w2)” role=”presentation” style=”position: relative;”>f(x)=1xfc(x)=1 xfe(x)=exfw(x)=−(w0x0 w1x1 w2)f(x)=1xfc(x)=1 xfe(x)=exfw(x)=−(w0x0 w1x1 w2)

f(x) = \frac{1}{x} \\
f_c(x) = 1 x \\
f_e(x) = e^x \\
f_w(x) = -(w_0 x_0 w_1 x_1 w_2)

這樣我們就能夠畫出下面的計算圖

同樣上面綠色的數子表示數值,下面紅色的數字表示梯度,我們從後往前計算一下各個引數的梯度。首先最後面的梯度是1,,然後經過1x” role=”presentation” style=”position: relative;”>1x1x\frac{1}{x}這個函式,這個函式的梯度是−1×2″ role=”presentation” style=”position: relative;”>−1×2−1×2-\frac{1}{x^2},所以往前傳播的梯度是1×−11.372=−0.53″ role=”presentation” style=”position: relative;”>1×−11.372=−0.531×−11.372=−0.531 \times -\frac{1}{1.37^2} = -0.53,然後是 1″ role=”presentation” style=”position: relative;”> 1 1 1這個操作,梯度不變,接著是ex” role=”presentation” style=”position: relative;”>exexe^x這個運算,它的梯度就是−0.53×e−1=−0.2″ role=”presentation” style=”position: relative;”>−0.53×e−1=−0.2−0.53×e−1=−0.2-0.53 \times e^{-1} = -0.2,這樣不斷往後傳播就能夠求得每個引數的梯度。

程式語言 最新文章