神經網絡及卷積神經網絡的訓練——反向傳播算法

神經網絡的訓練過程,就是通過已有的樣本,求取使代價函數最小化時所對應的參數。代價函數測量的是模型對樣本的預測值與其真實值之間的誤差,最小化的求解一般使用梯度下降法(Gradient Decent)或其他與梯度有關的方法。其中的步驟包括:

  1. 初始化參數。
  2. 求代價函數關於參數的梯度。
  3. 根據梯度更新參數的值。
  4. 經過迭代以後取得最佳參數,從而完成神經網絡的訓練。 
    其中最重要的步驟就是求梯度,這可以通過反向傳播算法(back propagation)來實現。

單個神經元的訓練

單個神經元的結構如下圖。假設一個訓練樣本爲(x,y)(x,y)。在下圖中,xx是輸入向量,通過一個激勵函數hw,b(x)hw,b(x)得到一個輸出aaaa再通過代價函數得到JJ

f(W,b,x)=a=sigmoid(ixiwi+b)f(W,b,x)=a=sigmoid(∑ixiwi+b) (公式1) 
J(W,b,x,y)=12yhw,b(x)2J(W,b,x,y)=12‖y−hw,b(x)‖2 (公式2)

這裏激勵函數以使用sigmoid爲例,當然也可以使用其他的比如tanh或者rectived linear unit函數。要求的參數爲WWbb

通過定義變量z=ixiwi+bz=∑ixiwi+b可以將激勵函數看做是兩部分,如下圖右圖所示。第一部分是仿射求和得到zz, 第二部分是通過sigmoid得到aa。 
這裏寫圖片描述

訓練過程中,要求代價函數JJ關於WWbb的偏導數。先求JJ關於中間變量aazz的偏導:

δ(a)=aJ(W,b,x,y)=(ya)δ(a)=∂∂aJ(W,b,x,y)=−(y−a) (公式3) 
δ(z)=zJ(W,b,x,y)=Jaaz=δ(a)a(1a)δ(z)=∂∂zJ(W,b,x,y)=∂J∂a∂a∂z=δ(a)a(1−a) (公式4)

公式(4)中根據sigmoid函數的定義σ(z)=11+ezσ(z)=11+e−z可得az=a(1a)∂a∂z=a(1−a)

再根據鏈導法則,可以求得JJ關於WWbb的偏導數,即得WWbb的梯度。

WJ(W,b,x,y)=WJ=JzzW=δ(z)xT∇WJ(W,b,x,y)=∂∂WJ=∂J∂z∂z∂W=δ(z)xT (公式5)

bJ(W,b,x,y)=bJ=Jzzb=δ(z)∇bJ(W,b,x,y)=∂∂bJ=∂J∂z∂z∂b=δ(z) (公式6)

在這個過程中,先求J/a∂J/∂a,進一步求J/z∂J/∂z,最後求得J/W∂J/∂WJ/b∂J/∂b。結合上圖及鏈導法則,可以看出這是一個將代價函數的增量J∂J自後向前傳播的過程,因此稱爲反向傳播(back propagation)。

多層神經網絡的訓練

多層網絡的一個例子如下圖。 
這裏寫圖片描述
假設第l+1l+1層的輸入和輸出分別是alalal+1al+1, 參數爲WlWlblbl,仿射結果爲中間變量zlzl。注意第一層的輸出a1=xa1=x,爲整個網絡的輸入,最後一層的輸出aLaL是代價函數的輸入。

zl+1=WlxTl+blzl+1=WlxlT+bl (公式7) 
al+1=sigmoid(zl+1)al+1=sigmoid(zl+1) (公式8)

對多層網絡的訓練需要求代價函數JJ對每一層的參數求偏導。後向傳播過程變爲:

1,第一步,根據代價函數的定義,求JJaLaL的偏導δ(a)LδL(a)。 
2,在第l+1l+1層,將誤差信號從al+1al+1傳遞到zl+1zl+1

a(l+1)z(l+1)=a(l+1)(1a(l+1))∂a(l+1)∂z(l+1)=a(l+1)(1−a(l+1)) (公式9)

3,第三步,將誤差信號從第l+1l+1層向第ll層傳播。

z(l+1)a(l)=W(l),z(l+1)W(l)=a(l),z(l+1)b(l)=I∂z(l+1)∂a(l)=W(l),∂z(l+1)∂W(l)=a(l),∂z(l+1)∂b(l)=I (公式10)

4, 對第ll層可得JJa(l)a(l)z(l)z(l)的偏導數。

δ(a)l=Ja(l)={(ya(l)),Jz(l+1)z(l+1)a(l)=(W(l))Tδ(z)l+1,if l=Lotherwiseδl(a)=∂J∂a(l)={−(y−a(l)),if l=L∂J∂z(l+1)∂z(l+1)∂a(l)=(W(l))Tδl+1(z),otherwise (公式11)

δ(z)l=Jz(l)=Ja(l)a(l)z(l)=δ(a)la(l)(1a(l))δl(z)=∂J∂z(l)=∂J∂a(l)∂a(l)∂z(l)=δl(a)a(l)(1−a(l)) (公式12)

5, 最後可得JJ對第ll層的參數WlWlblbl的梯度:

W(l)J(W,b,x,y)=W(l)J=Jz(l+1)z(l+1)W(l)=δ(z)l+1(a(l))T∇W(l)J(W,b,x,y)=∂∂W(l)J=∂J∂z(l+1)∂z(l+1)∂W(l)=δl+1(z)(a(l))T (公式13)

b(l)J(W,b,x,y)=b(l)J=Jz(l+1)z(l+1)b(l)=δ(z)l+1∇b(l)J(W,b,x,y)=∂∂b(l)J=∂J∂z(l+1)∂z(l+1)∂b(l)=δl+1(z) (公式14)

後向傳播的一般形式

1,將整個神經網絡加上代價函數的結構看做是一串函數(每一層對應一個函數)級聯而成的一個函數,其中的每一個函數的導數都可通過數學表達式解析求得:

hθ(x)=(f(L+1)...f(l)θl...f(2)θ2f(1))(x)hθ(x)=(f(L+1)∘...∘fθl(l)∘...∘fθ2(2)f(1))(x) (公式15)

其中θθ是該神經網絡的參數。f(1)=xf(1)=xf(L+1)=hθ(x)f(L+1)=hθ(x),並且對任何一個ll,相鄰兩層間函數的導數f(l+1)f(l)∂f(l+1)∂f(l)都是已知的。

2,根據鏈導法則,求代價函數對任何一個llJJ關於f(l)f(l)的導數,即通過數值計算將誤差信號後向傳遞到第ll層。

δl=f(l)J(θ,x,y)=Jf(l+1)f(l+1)f(l)=δl+1f(l+1)f(l)δl=∂∂f(l)J(θ,x,y)=∂J∂f(l+1)∂f(l+1)∂f(l)=δl+1∂f(l+1)∂f(l) (公式16)

3,在第ll層求JJ關於該層參數θ(l)θ(l)的梯度。

θ(l)J(θ,x,y)=θ(l)J=Jf(l)f(l)θ(l)=δlf(l)θ(l)∇θ(l)J(θ,x,y)=∂∂θ(l)J=∂J∂f(l)∂f(l)∂θ(l)=δl∂f(l)∂θ(l)。(公式17)

其中第ll層對應的函數關於該層的參數的導數f(l)θ(l)∂f(l)∂θ(l)是已知的。

4,將所有樣本的梯度相加得到總梯度。

θ(l)J(θ)=mi=1θ(l)J(θ,x(i),y(i))∇θ(l)J(θ)=∑i=1m∇θ(l)J(θ,x(i),y(i)) (公式17)

對於不同的網絡結構,在第2步和第3步中根據具體的f(l+1)f(l)∂f(l+1)∂f(l)f(l)θ(l)∂f(l)∂θ(l)就可以求得所有參數的梯度。

卷積神經網絡的訓練

卷積神經網絡(CNN)的結構可閱讀上一篇博文。CNN的基本層包括卷積層和池化層,二者通常一起使用,一個池化層緊跟一個卷積層之後。這兩層包括三個級聯的函數:卷積,求sigmoid函數(或使用其他激勵函數),池化。其前向傳播和後向傳播的示意圖如下: 
這裏寫圖片描述
後向傳播需要求得這三個函數的導數。sigmoid函數前面已經討論過,這裏講一講其他兩個函數的處理:

卷積函數的導數及後向傳播

假設一個卷積層的輸入向量是xx,輸出向量是yy, 參數向量(卷積算子)是ww。從輸入到輸出的過程爲:

y=xwy=x∗w(公式18)

yy的長度爲|y|=|x||w|+1|y|=|x|−|w|+1yy中每一個元素的計算方法爲:

yn=(xw)[n]=|w|i=1xn+i1wi=wTxn:n+|w|1yn=(x∗w)[n]=∑i=1|w|xn+i−1wi=wTxn:n+|w|−1 (公式19)

卷積過程的示意圖如下: 
這裏寫圖片描述
yy中的元素與xx中的元素有如下導數關係:

yni+1xn=wi∂yn−i+1∂xn=wiynwi=xni+1,for1i|w|.∂yn∂wi=xn−i+1,for1≤i≤|w|. (公式20)

進一步可以得到JJ關於wwxx的導數:

δ(x)n=Jyyxn=|w|i=1Jyni+1yni+1xn=|w|i=1δ(y)ni+1wi=(δ(y)flip(w))[n]δn(x)=∂J∂y∂y∂xn=∑i=1|w|∂J∂yn−i+1∂yn−i+1∂xn=∑i=1|w|δn−i+1(y)wi=(δ(y)∗flip(w))[n] (公式21)

δ(x)=δ(y)flip(w)δ(x)=δ(y)∗flip(w) (公式22)

wiJ=Jyywi=|x||w|+1n=1Jynynwi=|x||w|+1n=1δ(y)nxn+i1=(δ(y)x)[i]∂∂wiJ=∂J∂y∂y∂wi=∑n=1|x|−|w|+1∂J∂yn∂yn∂wi=∑n=1|x|−|w|+1δn(y)xn+i−1=(δ(y)∗x)[i] (公式23)

wJ=δ(y)x∂∂wJ=δ(y)∗x (公式24)

因此,通過δ(y)δ(y)與flip(ww)的卷積就可得到JJ關於xx的導數δ(x)δ(x),通過δ(y)δ(y)xx的卷積就可計算出ww的梯度wJ∂∂wJ

池化函數的導數及後向傳播

池化函數是一個下采樣函數,對於大小爲mm的池化區域,池化函數及其導數可以定義爲: 
均值池化: g(x)=mk=1xkmg(x)=∑k=1mxkm, 導數爲 gxi={10if xi=max(x)otherwise∂g∂xi={1if xi=max(x)0otherwise

p範數池化 g(x)=xp=(mk=1|xk|p)1/pg(x)=‖x‖p=(∑k=1m|xk|p)1/p, 導數爲gxi=(mk=1|xk|p)1/p1|xi|p1∂g∂xi=(∑k=1m|xk|p)1/p−1|xi|p−1

下采樣的後向傳播過程爲上採樣,其示意圖爲: 
這裏寫圖片描述
該後向傳播過程就是利用gg的導數將誤差信號傳遞到gg的輸入。

δ(x)(n1)m+1:nm=x(n1)m+1:nmJ=Jynynx(n1)m+1:nm=δ(y)ngnδ(n−1)m+1:nm(x)=∂∂x(n−1)m+1:nmJ=∂J∂yn∂yn∂x(n−1)m+1:nm=δn(y)gn′ (公式25)

δ(x)=upsample(δ(y),g)=[δ(x)(n1)m+1:nm]δ(x)=upsample(δ(y),g′)=[δ(n−1)m+1:nm(x)]. (公式26)

有了上述求導公式,就能夠將誤差信號傳遞到每一層的輸出,再通過每一層的函數對參數的導數,可求得參數的梯度。有了計算梯度的方法,再通過基於梯度的最優化,就能尋得最優值,完成訓練過程。

PPT及參考資料: 
1,http://www.slideshare.net/kuwajima/cnnbp 
2,http://ufldl.stanford.edu/tutorial/

神經網絡的訓練過程,就是通過已有的樣本,求取使代價函數最小化時所對應的參數。代價函數測量的是模型對樣本的預測值與其真實值之間的誤差,最小化的求解一般使用梯度下降法(Gradient Decent)或其他與梯度有關的方法。其中的步驟包括:

  1. 初始化參數。
  2. 求代價函數關於參數的梯度。
  3. 根據梯度更新參數的值。
  4. 經過迭代以後取得最佳參數,從而完成神經網絡的訓練。 
    其中最重要的步驟就是求梯度,這可以通過反向傳播算法(back propagation)來實現。

單個神經元的訓練

單個神經元的結構如下圖。假設一個訓練樣本爲(x,y)(x,y)。在下圖中,xx是輸入向量,通過一個激勵函數hw,b(x)hw,b(x)得到一個輸出aaaa再通過代價函數得到JJ

f(W,b,x)=a=sigmoid(ixiwi+b)f(W,b,x)=a=sigmoid(∑ixiwi+b) (公式1) 
J(W,b,x,y)=12yhw,b(x)2J(W,b,x,y)=12‖y−hw,b(x)‖2 (公式2)

這裏激勵函數以使用sigmoid爲例,當然也可以使用其他的比如tanh或者rectived linear unit函數。要求的參數爲WWbb

通過定義變量z=ixiwi+bz=∑ixiwi+b可以將激勵函數看做是兩部分,如下圖右圖所示。第一部分是仿射求和得到zz, 第二部分是通過sigmoid得到aa。 
這裏寫圖片描述

訓練過程中,要求代價函數JJ關於WWbb的偏導數。先求JJ關於中間變量aazz的偏導:

δ(a)=aJ(W,b,x,y)=(ya)δ(a)=∂∂aJ(W,b,x,y)=−(y−a) (公式3) 
δ(z)=zJ(W,b,x,y)=Jaaz=δ(a)a(1a)δ(z)=∂∂zJ(W,b,x,y)=∂J∂a∂a∂z=δ(a)a(1−a) (公式4)

公式(4)中根據sigmoid函數的定義σ(z)=11+ezσ(z)=11+e−z可得az=a(1a)∂a∂z=a(1−a)

再根據鏈導法則,可以求得JJ關於WWbb的偏導數,即得WWbb的梯度。

WJ(W,b,x,y)=WJ=JzzW=δ(z)xT∇WJ(W,b,x,y)=∂∂WJ=∂J∂z∂z∂W=δ(z)xT (公式5)

bJ(W,b,x,y)=bJ=Jzzb=δ(z)∇bJ(W,b,x,y)=∂∂bJ=∂J∂z∂z∂b=δ(z) (公式6)

在這個過程中,先求J/a∂J/∂a,進一步求J/z∂J/∂z,最後求得J/W∂J/∂WJ/b∂J/∂b。結合上圖及鏈導法則,可以看出這是一個將代價函數的增量J∂J自後向前傳播的過程,因此稱爲反向傳播(back propagation)。

多層神經網絡的訓練

多層網絡的一個例子如下圖。 
這裏寫圖片描述
假設第l+1l+1層的輸入和輸出分別是alalal+1al+1, 參數爲WlWlblbl,仿射結果爲中間變量zlzl。注意第一層的輸出a1=xa1=x,爲整個網絡的輸入,最後一層的輸出aLaL是代價函數的輸入。

zl+1=WlxTl+blzl+1=WlxlT+bl (公式7) 
al+1=sigmoid(zl+1)al+1=sigmoid(zl+1) (公式8)

對多層網絡的訓練需要求代價函數JJ對每一層的參數求偏導。後向傳播過程變爲:

1,第一步,根據代價函數的定義,求JJaLaL的偏導δ(a)LδL(a)。 
2,在第l+1l+1層,將誤差信號從al+1al+1傳遞到zl+1zl+1

a(l+1)z(l+1)=a(l+1)(1a(l+1))∂a(l+1)∂z(l+1)=a(l+1)(1−a(l+1)) (公式9)

3,第三步,將誤差信號從第l+1l+1層向第ll層傳播。

z(l+1)a(l)=W(l),z(l+1)W(l)=a(l),z(l+1)b(l)=I∂z(l+1)∂a(l)=W(l),∂z(l+1)∂W(l)=a(l),∂z(l+1)∂b(l)=I (公式10)

4, 對第ll層可得JJa(l)a(l)z(l)z(l)的偏導數。

δ(a)l=Ja(l)={(ya(l)),Jz(l+1)z(l+1)a(l)=(W(l))Tδ(z)l+1,if l=Lotherwiseδl(a)=∂J∂a(l)={−(y−a(l)),if l=L∂J∂z(l+1)∂z(l+1)∂a(l)=(W(l))Tδl+1(z),otherwise (公式11)

δ(z)l=Jz(l)=Ja(l)a(l)z(l)=δ(a)la(l)(1a(l))δl(z)=∂J∂z(l)=∂J∂a(l)∂a(l)∂z(l)=δl(a)a(l)(1−a(l)) (公式12)

5, 最後可得JJ對第ll層的參數WlWlblbl的梯度:

W(l)J(W,b,x,y)=W(l)

相關文章
相關標籤/搜索