Loading [MathJax]/jax/output/HTML-CSS/jax.js

Convolutional Neural Networks(CNN) #4 卷積核的Back propagation

Convolutional Neural Networks卷積神經網路的參數最終仍會以倒傳遞演算法(Backpropagation)優化,本文將由淺而深的從原理到可程式化的計算方法向各位介紹Kernel的偏微分計算方法。而本文採用的範例是包含padding的卷積層,這種設定也將更趨近於現實,希望透過這種方式讓各位完全理解。

本篇內容中卷積神經網路的功能,同步存放於Github:https://github.com/PoLun-Wang/DL_practice_convolutional_neural_networks
此外,想要了解卷積神經網路的基本運算過程可以參考這3篇文章:CNN #1(Kernel, Stride, Padding)CNN #2(Pooling layer)CNN #3(計算參數量)

本文所使用的範例是1層卷積層來講解與推導Backpropagation的過程,如下圖(1)。

表(1):符號對照表

符號 說明
x 非第0層的Feature map。(第0層指的就是input images)
w 卷積核,形狀為(2×2)
z  為xw經過卷積運算出來的結果,形狀為(4×4)
L()  指的是Loss function,導傳遞法就是要計算參數對於Loss function的影響力。

CNN 卷積神經網路 backward pass 反向傳遞圖(1):推導用簡易架構圖

由於Backpropagation的反向傳遞階段(Backward pass)會使用到各層神經網路的輸出計算偏微分,藉此來反推該層神經網路的參數對於Loss function的偏微分量。不太了解導傳遞法原理的話可以來讀一讀這一篇文章:Backpropatation
先列出每一個z的組成,以此釐清對xw進行偏微分的時候該怎麼推導。

下列分析z的組成是很重要的過程,推導LwLx都會用到。
z11=0w11+0w12+0w21+x11w22
z12=0w11+0w12+x11w21+x12w22
z13=0w11+0w12+x12w21+x13w22
z14=0w11+0w12+x13w21+0w22
– – – – –
z21=0w11+x11w12+0w21+x21w22
z22=x11w11+x12w12+x21w21+x22w22
z23=x12w11+x13w12+x22w21+x23w22
z24=x13w11+0w12+x23w21+0w22
– – – – –
z31=0w11+x21w12+0w21+x31w22
z32=x21w11+x22w12+x31w21+x32w22
z33=x22w11+x23w12+x32w21+x33w22
z34=x23w11+0w12+x33w21+0w22
– – – – –
z41=0w11+x31w12+0w21+0w22
z42=x31w11+x32w12+0w21+0w22
z43=x32w11+x33w12+0w21+0w22
z44=x33w11+0w12+0w21+0w22

CNN 卷積神經網路 backward pass backpropagation圖(2):從Lz反向傳遞至卷積核(w)與前一層的Feature map(x)

 

卷積核導數的計算原理Lw

這需要透過Chain rule來達成我們的目的,不是很了解的話建議來看看這篇文章Backpropatation
前面已經將每一個z的組成都分析過了,現在我們可以用傳統的方法來推導Lw11

Step-1

首先,從剛才用來分析z的式子中找出w11的係數不為0zz22,z23,z24,z32,z33,z34,z42,z43,z44

z11=0w11+0w12+0w21+x11w22
z12=0w11+0w12+x11w21+x12w22
z13=0w11+0w12+x12w21+x13w22
z14=0w11+0w12+x13w21+0w22
– – – – –
z21=0w11+x11w12+0w21+x21w22
z22=x11w11+x12w12+x21w21+x22w22
z23=x12w11+x13w12+x22w21+x23w22
z24=x13w11+0w12+x23w21+0w22
– – – – –
z31=0w11+x21w12+0w21+x31w22
z32=x21w11+x22w12+x31w21+x32w22
z33=x22w11+x23w12+x32w21+x33w22
z34=x23w11+0w12+x33w21+0w22
– – – – –
z41=0w11+x31w12+0w21+0w22
z42=x31w11+x32w12+0w21+0w22
z43=x32w11+x33w12+0w21+0w22
z44=x33w11+0w12+0w21+0w22

Step-2

透過連鎖率計算個別的Lzzw,最後將這些偏微分值加總,就會得到Lw剩下的w12w21w22依照Step-1、Step-2的方法就可以算出卷積核對L的影響力囉。

Lw11=Lz22z22w11+Lz23z23w11+Lz24z24w11+Lz32z32w11+Lz33z33w11+Lz34z34w11+Lz42z42w11+Lz43z43w11+Lz44z44w11=Lz22x11+Lz23x12+Lz24x13+Lz32x21+Lz33x22+Lz34x23+Lz42x31+Lz43x32+Lz44x33

Lw12=Lz21x11+Lz22x12+Lz23x13+Lz31x21+Lz32x22+Lz33x23+Lz41x31+Lz42x32+Lz43x33

Lw21=Lz12x11+Lz13x12+Lz14x13+Lz22x21+Lz23x22+Lz24x23+Lz32x31+Lz33x32+Lz34x33

Lw22=Lz11x11+Lz12x12+Lz13x13+Lz21x21+Lz22x22+Lz23x23+Lz31x31+Lz32x32+Lz33x33

看到這裡,有沒有覺得很複雜且不易程式化?但這就是基礎原理,希望各位可以了解。
接下來要說明的就更快、更容易程式化的做法。

更好的計算方法

這個方法是從Coursera的課程學習到的,此方法套用至具有padding的卷積層也能完美解決卷積核在Back propagation過程的程式化問題!

我們先用文字描述此做法,再用下方的圖示幫助理解:
以圖(3)來說,先將上一層的Feature map加入padding,再以Kernel的大小形成一個Sliding window對已加入padding的上層Feature map框選矩陣(e.g. [000x11]),將框選到的矩陣乘上Lz11,先把結果暫存起來。接著將Sliding window依據stride設定移動,重複上述操作並將乘積不斷加總,如圖(4~6)所示。

因為是Sliding window矩陣乘上一個純量,所以結果也會是一個與Kernel形狀一致的矩陣,加總後的結果就會是[Lw11Lw12Lw21Lw22]

CNN Tutorial back propagation for kernels of CNN 1圖(3):計算卷積核偏微分量1

 

CNN Tutorial back propagation for kernels of CNN 2圖(4):計算卷積核偏微分量2

 

CNN Tutorial back propagation for kernels of CNN 3圖(5):計算卷積核偏微分量3

 

CNN Tutorial back propagation for kernels of CNN 4圖(6):計算卷積核偏微分量4

最終,Lw的結果應該是:

Lw11=Lz22x11+Lz23x12+Lz24x13+Lz32x12+Lz33x22+Lz34x23+Lz42x31+Lz43x32+Lz44x33

Lw12=Lz21x11+Lz22x12+Lz23x13++Lz31x21+Lz32x22+Lz33x23+Lz41x31+Lz42x32+Lz43x33

Lw21=Lz12x11+Lz13x12+Lz14x13+Lz22x21+Lz23x22+Lz24x23+Lz32x31+Lz33x32+Lz34x33

Lw22=Lz11x11+Lz12x12+Lz13x13+Lz21x21+Lz22x22+Lz23x23+Lz31x31+Lz32x32+Lz33x33

Reference
  1. Andrew Ng – Convolution Neural Networks in Coursera
  2. (paper) A guide to convolution arithmetic for deep learning
  3. Back Propagation in Convolutional Neural Networks — Intuition and Code
  4. A Comprehensive Introduction to Different Types of Convolutions in Deep Learning

Andy Wang

站在巨人的肩膀上仍須戰戰兢兢!

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料