模型构成
相比于一般的神经网络,卷积的输入数据更多,同时模型的相关参数也会更多,这就导致了其训练的消耗会比一般的神经网络大,但是基本的结构还是有类似的地方的。
输入数据
输入的数据一般为图像数据,但是由于图形数据中的色彩特征,往往会存在一些预处理,将相应的图形分解为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(偏导值)