模型構成
相比於一般的神經網絡,卷積的輸入數據更多,同時模型的相關參數也會更多,這就導致了其訓練的消耗會比一般的神經網絡大,但是基本的結構還是有類似的地方的。
輸入數據
輸入的數據一般爲圖像數據,但是由於圖形數據中的色彩特徵,往往會存在一些預處理,將相應的圖形分解爲rgb三個色彩通道;或者僅僅關注圖像的輪廓特徵,進行灰度處理;有些還會在正式的卷積訓練前額外加一層,將圖片進行一些放縮操作,最終獲得的數據以數字形式表示。
輸出數據
一般卷積用來構建分類器,輸出就是對應的標籤數據,一般以0,1表示,0表示不屬於這個類型,或者是輸出這一類型分類的概率。一般最後輸出都是來自全連接層的。
評估函數
輸出的數據是要有一個評估的,使用這個評估我們可以瞭解模型參數對數據的擬合情況,對於多分類我們一般用H(y)=∑in(yi−y^i)2 來表示,yi爲實際的分類標籤值,y^i爲預測的標籤值,我們訓練的目的也就是儘可能的減小該函數的值,使得我們的模型能夠儘可能的擬合數據情況。通過梯度下降等方式,對參數進行求偏導這與一般的神經網絡也是一致的。
卷積核
模型中主要的參數承擔者就是卷積核了,一個卷積核往往含有多個參數,對於一般的二維卷積核(以矩陣的形式表示):[a11a21a12a22](爲了表示方便使用2∗2的形狀,一般的卷積核形狀都是奇數∗奇數,這裏按互相關運算來卷積)
相應的函數定義爲f(x)=x11∗a11+x12∗a12+x21∗a21+x22∗a22+b(還有一個偏置值)
對於多通道的卷積核:[a11a21a12a22][b11b21b12b22][c11c21c12c22]
相應的函數定義爲f(x)=(x111∗a11+x112∗a12+x121∗a21+x122∗a22)+(x211∗b11+x212∗b12+x221∗b21+x222∗b22)+(x311∗c11+x312∗c12+x321∗c21+x322∗c22)+b(還有一個偏置值)
池化函數
最大池化max([x11x21x12x22])=max(x11,x12,x21,x22)
平均池化mean([x11x21x12x22])=(x11+x12+x21+x22)/4
池化的操作就與之間的神經網絡有很大的不同了,在池化之前一般經過了激活函數的處理(激活函數與池化的處理順序可以互換,池化之後進行激活可以減少激活函數的運算量,但是對應的池化消去的數據就無法在之後使用了)
激活函數
相應的激活函數與一般的神經網絡一致,常用的有Sigmoid函數與Relu函數等。
參數初始化
爲網絡中的諸多參數確定初值,爲了保證訓練的效果,需要對這些參數的初值進行一些要求。
這些參數的初值不能全部相同,否則運算過程中相同形狀的卷積覈對相同的輸入進行運算,會導致多個卷積核僅僅只能提取一個特徵。(多個卷積覈對應的運算實際是等效的(“對稱性”))
要打破這種對稱性,可以進行隨機初始化,同時爲了保證在之後的偏導計算中(特別是鏈式法則的乘法運算)不會出現過大或過小的梯度值,取得隨機值不宜過大,也不宜爲0。根據不同的激活函數,可以選擇不同的初始化方式。
前向傳播
前向傳播的過程是從輸入層向後進行的逐層的參數計算,直至得到輸出並且計算到相應的評估函數。
順序爲卷積運算得到特徵圖,特徵圖經由激活函數(可能還有歸一化),再進行池化(可能有多層次),最終到全連接層前將數據展開,之後逐層進行線性運算,激活(可能還有歸一化),直到最後輸出,轉到評估函數。
感受野
網絡的前向計算中,實際是對輸入的多個參數的處理,但是在每一層的計算中參與的輸入數據是有數量(感受野的大小)差別的,越向後面的計算,實際展開時包含的輸入參數就越多,相應的一個參數能涵蓋的輸入數據的區域(感受野)也就越大。
圖中第二層中的每個參數都需要最底層中9個輸入參與計算,所以其感受野爲對應的9個元素,而最上層的元素計算需要第二層的9個元素,對應到最底層中就是底層的全部元素參與計算,相應的感受野就是底層的全部元素。(步幅爲1,無填充)
反向傳播
主要通過梯度下降來進行訓練,與一般的神經網絡類似,只是在卷積與池化的處理上與一般的神經網絡不同。利用偏導計算來進行,逐步減小評估函數值。
參數更新:新的參數的值w(新值)=w(舊值)+η(學習率)∗h(偏導值)
全連接層
全連接層的訓練就是一般的反向傳播,從評估函數開始逐層傳遞,並進行偏導計算,多個層次的參數相當於多個函數的複合形式,對應的使用鏈式法則對其進行處理,相應的可以參考深度學習筆記------神經網絡。
池化層
對於池化層的反向傳播只要根據不同的池化函數將誤差對應分配。
最大池化
對於最大池化,返回給上層的有兩類數據,一個是在池化中保留下來最大值的上層元素,對應將誤差傳遞,其餘的元素對應返回誤差爲0。
例如:池化層得到的偏導誤差爲[3647]
上層的數據爲⎣⎢⎢⎡1233345165610233⎦⎥⎥⎤對應分配到的誤差爲⎣⎢⎢⎡0000036040700000⎦⎥⎥⎤
平均池化
平均池化則是將相應的誤差數據均分,並且傳遞給所有的上層元素。
例如:池化層得到的偏導誤差爲[4848]
上層的數據爲⎣⎢⎢⎡1233345165610233⎦⎥⎥⎤對應分配到的誤差爲⎣⎢⎢⎡1122112211221122⎦⎥⎥⎤
卷積層
先從一個簡單的互相關運算開始(步幅爲1):
⎣⎡a11a21a31a12a22a32a13a23a33⎦⎤conv[w11w21w12w22]展開一下有:
⎣⎢⎢⎡w11000w12w11000w1200w210w110w22w21w12w110w220w1200w21000w22w21000w22⎦⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a11a12a13a21a22a23a31a32a33⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤得到:
[a11w11+a12w12+a21w21+a22w22a21w11+a22w12+a31w21+a32w22a12w11+a13w12+a22w21+a23w22a22w11+a23w12+a32w21+a33w22]
對應於上層傳過來的誤差爲:[δ11δ21δ12δ22]
對於aij進行求偏導對應的爲:
a11爲w11δ11+0δ12+0δ21+0δ22
a12爲w12δ11+w11δ12+0δ21+0δ22
a13爲0δ11+w12δ12+0δ21+0δ22
a21爲w21δ11+0δ12+w11δ21+0δ22
a22爲w22δ11+w21δ12+w12δ21+w11δ22
a23爲w22δ11+0δ12+w12δ21+0δ22
a31爲0δ11+0δ12+w21δ21+0δ22
a32爲0δ11+0δ12+w22δ21+w21δ22
a33爲0δ11+0δ12+0δ21+w22δ22
即爲w上對應的列向量,組成爲矩陣爲
⎣⎡w11δ11w21δ11+w11δ21w21δ21w12δ11+w11δ12w22δ11+w21δ12+w12δ21+w11δ22w22δ21+w21δ22w12δ12w22δ11+w12δ21w22δ22⎦⎤
變化一下有:⎣⎢⎢⎡00000δ11δ2100δ12δ2200000⎦⎥⎥⎤conv[w22w12w21w11](步幅爲1)
反轉卷積核(關於中心對稱反轉,或者反轉返回的誤差δ),再將返回的誤差δ填充爲0,最後進行互相關操作就可以得到對應的偏導了。對於步幅爲1的卷積層關於輸入參數a的偏導就完成了。(有些參數後面只有一層就不許要後續的輸入參數,在求偏導時也就不需要這一過程了)
之後是對卷積函數中的參數w求偏導。
將上面的式子⎣⎡a11a21a31a12a22a32a13a23a33⎦⎤conv[w11w21w12w22]再次展開:
⎣⎢⎢⎡a11a12a21a22a12a13a22a23a21a22a31a32a22a23a32a33⎦⎥⎥⎤⎣⎢⎢⎡w11w12w21w22⎦⎥⎥⎤(轉換回二維)得到:
[a11w11+a12w12+a21w21+a22w22a21w11+a22w12+a31w21+a32w22a12w11+a13w12+a22w21+a23w22a22w11+a23w12+a32w21+a33w22]
對應於上層傳過來的誤差爲:[δ11δ21δ12δ22]
對於wij進行求偏導對應的爲:
w11爲a11δ11+a12δ12+a21δ21+a22δ22
w12爲a12δ11+a13δ12+a22δ23+a22δ22
w21爲a21δ11+a22δ12+a31δ21+a32δ22
w22爲a22δ11+a23δ12+a32δ21+a33δ22
即爲a上對應的列向量,組成爲矩陣爲:
[a11δ11+a12δ12+a21δ21+a22δ22a21δ11+a22δ12+a31δ21+a32δ22a12δ11+a13δ12+a22δ23+a22δ22a22δ11+a23δ12+a32δ21+a33δ22]
變化一下有:⎣⎡a11a21a31a12a22a32a13a23a33⎦⎤conv[δ11δ21δ12δ22]
關於卷積核的參數wij的偏導即爲返回的誤差與輸入層參數的互相關運算。
但是上面我們沒有考慮步幅的因素(填充相當於固定某些位置爲0)。
步幅爲2的卷積
⎣⎢⎢⎡a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44⎦⎥⎥⎤conv[w11w21w12w22]=[t11t21t12t22]
t11=a11w11+a12w12+a21w21+a22w22
t12=a13w11+a14w12+a23w21+a24w22
t21=a31w11+a32w12+a41w21+a42w22
t22=a33w11+a34w12+a43w21+a44w22
展開一下有:
⎣⎢⎢⎡w11000w120000w11000w1200w21000w220000w21000w220000w11000w120000w11000w1200w21000w220000w21000w22⎦⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a11a12a13a14a21a22a23a24a31a32a33a34a41a42a43a44⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
對應於上層傳過來的誤差爲:[δ11δ21δ12δ22]
對於aij進行求偏導對應的爲:⎣⎢⎢⎡w11δ11w21δ11w11δ21w21δ21w12δ11w22δ11w12δ21w22δ21w11δ12w21δ12w11δ22w21δ22w12δ12w22δ12w12δ22w22δ22⎦⎥⎥⎤即爲w上對應的列向量.
同樣可以進行對應的變換於是得到:
⎣⎢⎢⎢⎢⎡000000δ110δ210000000δ120δ22000000⎦⎥⎥⎥⎥⎤conv[w22w12w21w11](步幅爲1)
與步幅爲一的操作差不多,只不過在返回誤差的元素之間加上了一個填充。對於更大的步幅可以同樣的進行推導。
卷積函數中的參數w求偏導
一樣進行展開有:
⎣⎢⎢⎡a11a13a31a33a12a14a32a34a21a23a41a43a22a24a42a44⎦⎥⎥⎤⎣⎢⎢⎡w11w12w21w22⎦⎥⎥⎤
[a11w11+a12w12+a21w21+a22w22a31w11+a32w12+a41w21+a42w22a13w11+a14w12+a23w21+a24w22a33w11+a34w12+a43w21+a44w22]
對應於上層傳過來的誤差爲:[δ11δ21δ12δ22]
對於wij進行求偏導對應的爲:
w11爲a11δ11+a13δ12+a31δ21+a33δ22
w12爲a12δ11+a14δ12+a32δ23+a34δ22
w21爲a21δ11+a23δ12+a41δ21+a43δ22
w22爲a22δ11+a24δ12+a42δ21+a44δ22
即爲a上對應的列向量,組成爲矩陣爲:
[a11δ11+a13δ12+a31δ21+a33δ22a21δ11+a23δ12+a41δ21+a43δ22a12δ11+a14δ12+a32δ23+a34δ22a22δ11+a24δ12+a42δ21+a44δ22]
變化一下有:⎣⎢⎢⎡a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44⎦⎥⎥⎤conv⎣⎡δ110δ21000δ120δ22⎦⎤(步幅爲1)
也在返回誤差的元素之間加上了一個填充,得到了關於wij的偏導。
還有關於偏置b的偏導,在卷積運算中(線性運算),最後還要加上一個相應的偏置值。
每一個卷積覈定義一個偏置值b,在計算中這一個偏置是共享的,上面的卷積運算改變一下有:
t11=a11w11+a12w12+a21w21+a22w22+b
t12=a13w11+a14w12+a23w21+a24w22+b
t21=a31w11+a32w12+a41w21+a42w22+b
t22=a33w11+a34w12+a43w21+a44w22+b
同樣根據返回的誤差有:[δ11δ21δ12δ22]
於是關於b的偏導爲δ11+δ12+δ21+δ22,步幅的改變對其沒有影響,上面步幅爲1的運算關於b的偏導也是相應返回誤差的和。
卷積完成後的激活函數操作與一般的神經網絡相同,也是直接求其偏導加入到鏈式法則中運算。
最終得到的相應的誤差值進行梯度下降,使用相應的學習率參數來控制迭代的速度。
參數更新:新的參數的值w(新值)=w(舊值)+η(學習率)∗h(偏導值)