神经网络的训练过程,就是通过已有的样本,求取使代价函数最小化时所对应的参数。代价函数测量的是模型对样本的预测值与其真实值之间的误差,最小化的求解一般使用梯度下降法(Gradient Decent)或其他与梯度有关的方法。其中的步骤包括:
- 初始化参数。
- 求代价函数关于参数的梯度。
- 根据梯度更新参数的值。
- 经过迭代以后取得最佳参数,从而完成神经网络的训练。
其中最重要的步骤就是求梯度,这可以通过反向传播算法(back propagation)来实现。
单个神经元的训练
单个神经元的结构如下图。假设一个训练样本为
(x,y)
。在下图中,
x
是输入向量,通过一个激励函数
h
w,b
(x)
得到一个输出
a
,
a
再通过代价函数得到
J
。
f(W,b,x)=a=sigmoid(∑
i
x
i
w
i
+b)
(公式1)
J(W,b,x,y)=
12
∥y−h
w,b
(x)∥
2
(公式2)
这里激励函数以使用sigmoid为例,当然也可以使用其他的比如tanh或者rectived linear unit函数。要求的参数为
W
和
b
。
通过定义变量
z=∑
i
x
i
w
i
+b
可以将激励函数看做是两部分,如下图右图所示。第一部分是仿射求和得到
z
, 第二部分是通过sigmoid得到
a
。
训练过程中,要求代价函数
J
关于
W
和
b
的偏导数。先求
J
关于中间变量
a
和
z
的偏导:
δ
(a)
=
∂∂a
J(W,b,x,y)=−(y−a)
(公式3)
δ
(z)
=
∂∂z
J(W,b,x,y)=
∂J∂a∂a∂z
=δ
(a)
a(1−a)
(公式4)
公式(4)中根据sigmoid函数的定义
σ(z)=
11+e
−z
可得
∂a∂z
=a(1−a)
。
再根据链导法则,可以求得
J
关于
W
和
b
的偏导数,即得
W
和
b
的梯度。
∇
W
J(W,b,x,y)=
∂∂W
J=
∂J∂z∂z∂W
=δ
(z)
x
T
(公式5)
∇
b
J(W,b,x,y)=
∂∂b
J=
∂J∂z∂z∂b
=δ
(z)
(公式6)
在这个过程中,先求
∂J/∂a
,进一步求
∂J/∂z
,最后求得
∂J/∂W
和
∂J/∂b
。结合上图及链导法则,可以看出这是一个将代价函数的增量
∂J
自后向前传播的过程,因此称为反向传播(back propagation)。
多层神经网络的训练
多层网络的一个例子如下图。
假设第
l+1
层的输入和输出分别是
a
l
和
a
l+1
, 参数为
W
l
和
b
l
,仿射结果为中间变量
z
l
。注意第一层的输出
a
1
=x
,为整个网络的输入,最后一层的输出
a
L
是代价函数的输入。
z
l+1
=W
l
x
Tl
+b
l
(公式7)
a
l+1
=sigmoid(z
l+1
)
(公式8)
对多层网络的训练需要求代价函数
J
对每一层的参数求偏导。后向传播过程变为:
1,第一步,根据代价函数的定义,求a
J
对
a
L
的偏导
δ
(a)L
。
2,在第
l+1
层,将误差信号从
a
l+1
传递到
z
l+1
。
∂a
(l+1)
∂z
(l+1)
=a
(l+1)
(1−a
(l+1)
)
(公式9)
3,第三步,将误差信号从第
l+1
层向第
l
层传播。
∂z
(l+1)
∂a
(l)
=W
(l)
,
∂z
(l+1)
∂W
(l)
=a
(l)
,
∂z
(l+1)
∂b
(l)
=I
(公式10)
4, 对第
l
层可得
J
对
a
(l)
和
z
(l)
的偏导数。
δ
(a)l
=
∂J∂a
(l)
={−(y−a
(l)
),
∂J∂z
(l+1)
∂z
(l+1)
∂a
(l)
=(W
(l)
)
T
δ
(z)l+1
,if l=Lotherwise
(公式11)
δ
(z)l
=
∂J∂z
(l)
=
∂J∂a
(l)
∂a
(l)
∂z
(l)
=δ
(a)l
a
(l)
(1−a
(l)
)
(公式12)
5, 最后可得
J
对第
l
层的参数
W
l
和
b
l
的梯度:
∇
W
(l)
J(W,b,x,y)=
∂∂W
(l)
J=
∂J∂z
(l+1)
∂z
(l+1)
∂W
(l)
=δ
(z)l+1
(a
(l)
)
T
(公式13)
∇
b
(l)
J(W,b,x,y)=
∂∂b
(l)
J=
∂J∂z
(l+1)
∂z
(l+1)
∂b
(l)
=δ
(z)l+1
(公式14)
后向传播的一般形式
1,将整个神经网络加上代价函数的结构看做是一串函数(每一层对应一个函数)级联而成的一个函数,其中的每一个函数的导数都可通过数学表达式解析求得:
h
θ
(x)=(f
(L+1)
∘...∘f
(l)θ
l
∘...∘f
(2)θ
2
f
(1)
)(x)
(公式15)
其中
θ
是该神经网络的参数。
f
(1)
=x
,
f
(L+1)
=h
θ
(x)
,并且对任何一个
l
,相邻两层间函数的导数
∂f
(l+1)
∂f
(l)
都是已知的。
2,根据链导法则,求代价函数对任何一个
l
层
J
关于
f
(l)
的导数,即通过数值计算将误差信号后向传递到第
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,在第
l
层求
J
关于该层参数
θ
(l)
的梯度。
∇
θ
(l)
J(θ,x,y)=
∂∂θ
(l)
J=
∂J∂f
(l)
∂f
(l)
∂θ
(l)
=δ
l∂f
(l)
∂θ
(l)
。(公式17)
其中第
l
层对应的函数关于该层的参数的导数
∂f
(l)
∂θ
(l)
是已知的。
4,将所有样本的梯度相加得到总梯度。
∇
θ
(l)
J(θ)=∑
mi=1
∇
θ
(l)
J(θ,x
(i)
,y
(i)
)
(公式17)
对于不同的网络结构,在第2步和第3步中根据具体的
∂f
(l+1)
∂f
(l)
和
∂f
(l)
∂θ
(l)
就可以求得所有参数的梯度。
卷积神经网络的训练
卷积神经网络(CNN)的结构可阅读上一篇博文。CNN的基本层包括卷积层和池化层,二者通常一起使用,一个池化层紧跟一个卷积层之后。这两层包括三个级联的函数:卷积,求sigmoid函数(或使用其他激励函数),池化。其前向传播和后向传播的示意图如下:
后向传播需要求得这三个函数的导数。sigmoid函数前面已经讨论过,这里讲一讲其他两个函数的处理:
卷积函数的导数及后向传播
假设一个卷积层的输入向量是
x
,输出向量是
y
, 参数向量(卷积算子)是
w
。从输入到输出的过程为:
y=x∗w
(公式18)
y
的长度为
|y|=|x|−|w|+1
。
y
中每一个元素的计算方法为:
y
n
=(x∗w)[n]=∑
|w|i=1
x
n+i−1
w
i
=w
T
x
n:n+|w|−1
(公式19)
卷积过程的示意图如下:
y
中的元素与
x
中的元素有如下导数关系:
∂y
n−i+1
∂x
n
=w
i
,
∂y
n
∂w
i
=x
n−i+1
,for1≤i≤|w|.
(公式20)
进一步可以得到
J
关于
w
和
x
的导数:
δ
(x)n
=
∂J∂y∂y∂x
n
=∑
|w|i=1∂J∂y
n−i+1
∂y
n−i+1
∂x
n
=∑
|w|i=1
δ
(y)n−i+1
w
i
=(δ
(y)
∗flip(w))[n]
(公式21)
δ
(x)
=δ
(y)
∗flip(w)
(公式22)
∂∂w
i
J=
∂J∂y∂y∂w
i
=∑
|x|−|w|+1n=1∂J∂y
n
∂y
n
∂w
i
=∑
|x|−|w|+1n=1
δ
(y)n
x
n+i−1
=(δ
(y)
∗x)[i]
(公式23)
∂∂w
J=δ
(y)
∗x
(公式24)
因此,通过
δ
(y)
与flip(
w
)的卷积就可得到
J
关于
x
的导数
δ
(x)
,通过
δ
(y)
与
x
的卷积就可计算出
w
的梯度
∂∂w
J
。
池化函数的导数及后向传播
池化函数是一个下采样函数,对于大小为
m
的池化区域,池化函数及其导数可以定义为:
均值池化:
g(x)=
∑
mk=1
x
k
m
, 导数为
∂g∂x
i
={10if x
i
=max(x)otherwise
p范数池化
g(x)=∥x∥
p
=(∑
mk=1
|x
k
|
p
)
1/p
, 导数为
∂g∂x
i
=(∑
mk=1
|x
k
|
p
)
1/p−1
|x
i
|
p−1
下采样的后向传播过程为上采样,其示意图为:
该后向传播过程就是利用
g
的导数将误差信号传递到
g
的输入。
δ
(x)(n−1)m+1:nm
=
∂∂x
(n−1)m+1:nm
J=
∂J∂y
n
∂y
n
∂x
(n−1)m+1:nm
=δ
(y)n
g
′n
(公式25)
δ
(x)
=upsample(δ
(y)
,g
′
)=[δ
(x)(n−1)m+1:nm
]
. (公式26)
有了上述求导公式,就能够将误差信号传递到每一层的输出,再通过每一层的函数对参数的导数,可求得参数的梯度。有了计算梯度的方法,再通过基于梯度的最优化,就能寻得最优值,完成训练过程。