神经网络及卷积神经网络的训练——反向传播算法

神经网络的训练过程,就是通过已有的样本,求取使代价函数最小化时所对应的参数。代价函数测量的是模型对样本的预测值与其真实值之间的误差,最小化的求解一般使用梯度下降法(Gradient Decent)或其他与梯度有关的方法。其中的步骤包括:

  1. 初始化参数。
  2. 求代价函数关于参数的梯度。
  3. 根据梯度更新参数的值。
  4. 经过迭代以后取得最佳参数,从而完成神经网络的训练。
    其中最重要的步骤就是求梯度,这可以通过反向传播算法(back propagation)来实现。

单个神经元的训练

单个神经元的结构如下图。假设一个训练样本为 (x,y) 。在下图中, x 是输入向量,通过一个激励函数 hw,b(x) 得到一个输出 a a 再通过代价函数得到 J

f(W,b,x)=a=sigmoid(ixiwi+b) (公式1)
J(W,b,x,y)=12yhw,b(x)2 (公式2)

这里激励函数以使用sigmoid为例,当然也可以使用其他的比如tanh或者rectived linear unit函数。要求的参数为 W b

通过定义变量 z=ixiwi+b 可以将激励函数看做是两部分,如下图右图所示。第一部分是仿射求和得到 z , 第二部分是通过sigmoid得到 a
神经网络及卷积神经网络的训练——反向传播算法_第1张图片

训练过程中,要求代价函数 J 关于 W b 的偏导数。先求 J 关于中间变量 a z 的偏导:

δ(a)=aJ(W,b,x,y)=(ya) (公式3)
δ(z)=zJ(W,b,x,y)=Jaaz=δ(a)a(1a) (公式4)

公式(4)中根据sigmoid函数的定义 σ(z)=11+ez 可得 az=a(1a)

再根据链导法则,可以求得 J 关于 W b 的偏导数,即得 W b 的梯度。

WJ(W,b,x,y)=WJ=JzzW=δ(z)xT (公式5)

bJ(W,b,x,y)=bJ=Jzzb=δ(z) (公式6)

在这个过程中,先求 J/a ,进一步求 J/z ,最后求得 J/W J/b 。结合上图及链导法则,可以看出这是一个将代价函数的增量 J 自后向前传播的过程,因此称为反向传播(back propagation)。

多层神经网络的训练

多层网络的一个例子如下图。
神经网络及卷积神经网络的训练——反向传播算法_第2张图片
假设第 l+1 层的输入和输出分别是 al al+1 , 参数为 Wl bl ,仿射结果为中间变量 zl 。注意第一层的输出 a1=x ,为整个网络的输入,最后一层的输出 aL 是代价函数的输入。

zl+1=WlxTl+bl (公式7)
al+1=sigmoid(zl+1) (公式8)

对多层网络的训练需要求代价函数 J 对每一层的参数求偏导。后向传播过程变为:

1,第一步,根据代价函数的定义,求 J aL 的偏导 δ(a)L
2,在第 l+1 层,将误差信号从 al+1 传递到 zl+1

a(l+1)z(l+1)=a(l+1)(1a(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=Ja(l)={(ya(l)),Jz(l+1)z(l+1)a(l)=(W(l))Tδ(z)l+1,if l=Lotherwise (公式11)

δ(z)l=Jz(l)=Ja(l)a(l)z(l)=δ(a)la(l)(1a(l)) (公式12)

5, 最后可得 J 对第 l 层的参数 Wl bl 的梯度:

W(l)J(W,b,x,y)=W(l)J=Jz(l+1)z(l+1)W(l)=δ(z)l+1(a(l))T (公式13)

b(l)J(W,b,x,y)=b(l)J=Jz(l+1)z(l+1)b(l)=δ(z)l+1 (公式14)

后向传播的一般形式

1,将整个神经网络加上代价函数的结构看做是一串函数(每一层对应一个函数)级联而成的一个函数,其中的每一个函数的导数都可通过数学表达式解析求得:

hθ(x)=(f(L+1)...f(l)θl...f(2)θ2f(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)=Jf(l+1)f(l+1)f(l)=δl+1f(l+1)f(l) (公式16)

3,在第 l 层求 J 关于该层参数 θ(l) 的梯度。

θ(l)J(θ,x,y)=θ(l)J=Jf(l)f(l)θ(l)=δlf(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函数(或使用其他激励函数),池化。其前向传播和后向传播的示意图如下:
神经网络及卷积神经网络的训练——反向传播算法_第3张图片
后向传播需要求得这三个函数的导数。sigmoid函数前面已经讨论过,这里讲一讲其他两个函数的处理:

卷积函数的导数及后向传播

假设一个卷积层的输入向量是 x ,输出向量是 y , 参数向量(卷积算子)是 w 。从输入到输出的过程为:

y=xw (公式18)

y 的长度为 |y|=|x||w|+1 y 中每一个元素的计算方法为:

yn=(xw)[n]=|w|i=1xn+i1wi=wTxn:n+|w|1 (公式19)

卷积过程的示意图如下:
神经网络及卷积神经网络的训练——反向传播算法_第4张图片
y 中的元素与 x 中的元素有如下导数关系:

yni+1xn=wi , ynwi=xni+1,for1i|w|. (公式20)

进一步可以得到 J 关于 w x 的导数:

δ(x)n=Jyyxn=|w|i=1Jyni+1yni+1xn=|w|i=1δ(y)ni+1wi=(δ(y)flip(w))[n] (公式21)

δ(x)=δ(y)flip(w) (公式22)

wiJ=Jyywi=|x||w|+1n=1Jynynwi=|x||w|+1n=1δ(y)nxn+i1=(δ(y)x)[i] (公式23)

wJ=δ(y)x (公式24)

因此,通过 δ(y) 与flip( w )的卷积就可得到 J 关于 x 的导数 δ(x) ,通过 δ(y) x 的卷积就可计算出 w 的梯度 wJ

池化函数的导数及后向传播

池化函数是一个下采样函数,对于大小为 m 的池化区域,池化函数及其导数可以定义为:
均值池化: g(x)=mk=1xkm , 导数为 gxi={10if xi=max(x)otherwise

p范数池化 g(x)=xp=(mk=1|xk|p)1/p , 导数为 gxi=(mk=1|xk|p)1/p1|xi|p1

下采样的后向传播过程为上采样,其示意图为:
神经网络及卷积神经网络的训练——反向传播算法_第5张图片
该后向传播过程就是利用 g 的导数将误差信号传递到 g 的输入。

δ(x)(n1)m+1:nm=x(n1)m+1:nmJ=Jynynx(n1)m+1:nm=δ(y)ngn (公式25)

δ(x)=upsample(δ(y),g)=[δ(x)(n1)m+1:nm] . (公式26)

有了上述求导公式,就能够将误差信号传递到每一层的输出,再通过每一层的函数对参数的导数,可求得参数的梯度。有了计算梯度的方法,再通过基于梯度的最优化,就能寻得最优值,完成训练过程。

PPT及参考资料:
1,http://www.slideshare.net/kuwajima/cnnbp
2,http://ufldl.stanford.edu/tutorial/

你可能感兴趣的:(机器学习)