典型的卷积神经网络,开始阶段都是卷积层以及池化层的相互交替使用,之后采用全连接层将卷积和池化后的结果特征全部提取进行概率计算处理。
在具体的误差反馈和权重更新的处理上,不论是全连接层的更新还是卷积层的更新,使用的都是经典的反馈神经网络算法,这种方法较原本较为复杂的、要考虑长期的链式法则转化为只需要考虑前后节点输入和输出误差对权重的影响,使得当神经网络深度加大时能够利用计算机计算,以及卷积核在计算过程中产生非常多的数据计算。
反馈神经网络正向与反向传播公式推导
经典反馈神经网络主要包括3个部分,数据的前向计算、误差的反向传播以及权值的更新。如下图所示。
可以看到每个层l(假设是卷积或者池化层的一种)都会接一个下采样层l+1。对于反馈神经网络来说,要想求得层l的每个神经元对应的权值更新,就需要先求层l的每一个神经元点的灵敏度。简单来说,总体有以下几个权重以及数值需要在传递的过程中进行计算,即:
1.输入层-卷积层
2.卷积层-池化层
3.池化层-全连接层
4.全连接层-输出层
这是正向的计算,而当权值更新时,需要对其进行反向更新,即:
1.输出层-全连接层
2.全连接层-池化层
3.池化层-卷积层
4.卷积层-输出层
1.前向传播算法
对于前向传播的值传递,隐藏层输出值定义如下:
a
h
H
1
a^{H1}_h
ahH1=
W
h
H
1
W^{H1}_h
WhH1×
X
i
X_i
Xi
b
h
H
1
b^{H1}_h
bhH1 =
f
(
a
h
H
1
)
f(a^{H1}_h)
f(ahH1)
其中
X
i
X_i
Xi是当前输入节点的值,
W
h
H
1
W^{H1}_h
WhH1是连接到此节点的权重,
a
h
H
1
a^{H1}_h
ahH1是输出值。f是当前阶段的激活函数,
b
h
H
1
b^{H1}_h
bhH1是当前节点的输入值经过计算后被激活的值。
对于输出层,定义如下:
a
k
a_k
ak =
∑
W
h
k
×
b
h
H
1
\displaystyle\sum_{}^{} W_{hk}×b^{H1}_h
∑Whk×bhH1
其中,
W
h
k
W_{hk}
Whk为输入的权重,
b
h
H
1
b^{H1}_h
bhH1为输入到输出节点的输入值。对所有输入值进行权重计算后求得和值,将其作为神经网络的最后输出值
a
k
a_k
ak。
2.反向传播算法
与前向传播类似,首先定义两个值
δ
k
δ_k
δk与
δ
h
H
1
δ^{H1}_h
δhH1:
δ
k
δ_k
δk =
∂
L
∂
a
k
\frac{∂L}{∂a_k}
∂ak∂L = (Y - T)
δ
h
H
1
δ^{H1}_h
δhH1 =
∂
L
∂
a
h
H
1
\frac{∂L}{∂a^{H1}_h}
∂ahH1∂L
其中,
δ
k
δ_k
δk为输出层的误差项,其计算值为真实值与模型计算值的差值。Y是计算值,T是输出真实值。
δ
h
H
1
δ^{H1}_h
δhH1为输出层的误差。
神经网络反馈算法,就是逐层地将最终的误差进行分解,即每一层只与下一层打交道(如下图所示)。因此,可以假设每一层均为输出层的前一个层级,通过计算前一个层级与输出层的误差得到权重的更新。
因此反馈神经网络计算公式定义如下:
δ
h
H
1
δ^{H1}_h
δhH1 =
∂
L
∂
a
h
H
1
\frac{∂L}{∂a^{H1}_h}
∂ahH1∂L
=
∂
L
∂
b
h
H
1
\frac{∂L}{∂b^{H1}_h}
∂bhH1∂L ×
∂
b
h
H
1
∂
a
h
H
1
\frac{∂b^{H1}_h}{∂a^{H1}_h}
∂ahH1∂bhH1
=
∂
L
∂
b
h
H
1
\frac{∂L}{∂b^{H1}_h}
∂bhH1∂L × f’(
a
h
H
1
a^{H1}_h
ahH1)
=
∂
L
∂
a
k
\frac{∂L}{∂a_k}
∂ak∂L ×
∂
a
k
∂
b
h
H
1
\frac{∂a_k}{∂b^{H1}_h}
∂bhH1∂ak × f’(
a
h
H
1
a^{H1}_h
ahH1)
=
δ
k
δ_k
δk ×
∑
W
h
k
\displaystyle\sum_{}^{} W_{hk}
∑Whk × f’(
a
h
H
1
a^{H1}_h
ahH1)
=
∑
W
h
k
\displaystyle\sum_{}^{} W_{hk}
∑Whk ×
δ
k
δ_k
δk × f’(
a
h
H
1
a^{H1}_h
ahH1)
即当前层输出值对误差的梯度可以通过下一层的误差与权重和输出值的梯度乘积获得。在公式
∑
W
h
k
\displaystyle\sum_{}^{} W_{hk}
∑Whk ×
δ
k
δ_k
δk × f’(
a
h
H
1
a^{H1}_h
ahH1)中,
δ
k
δ_k
δk若为输出层,即可以通过
δ
k
δ_k
δk =
∂
L
∂
a
k
\frac{∂L}{∂a_k}
∂ak∂L = (Y - T)求得;而
δ
k
δ_k
δk为非输出层时,可以使用逐层反馈方式求得
δ
k
δ_k
δk的值。
换一种形式将上面的公式表示为:
δ
l
δ^{l}
δl =
∑
W
i
j
l
\displaystyle\sum_{}^{} W^l_{ij}
∑Wijl ×
δ
j
l
+
1
δ^{l+1}_j
δjl+1 × f’(
a
i
j
a^{j}_i
aij)
通过更为泛化的公式把当前层的输出对输入的梯度计算转化成求下一个层级的梯度计算值。
3.权重的更新
反馈神经网络计算的目的是对权重进行更新。与梯度下降法类似,其更新可以仿照梯度下降对权值的更新公式:
θ = θ - α(f(θ) -
y
i
y_i
yi)
x
i
x_i
xi
即:
W
j
i
W_{ji}
Wji=
W
j
i
W_{ji}
Wji + α×
δ
j
l
δ^{l}_j
δjl×
x
j
i
x_{ji}
xji
b
j
i
b_{ji}
bji=
b
j
i
b_{ji}
bji + α×
δ
j
l
δ^{l}_j
δjl
其中ji表示为反向传播时对应的节点系数,通过对
δ
j
l
δ^{l}_j
δjl的计算来更新对应的权重值。