BP/CNN神经网络总结整理

ann

准备工作

常用的激励函数一般有两种,一种是sigmoid函数,它的值域为 ( 0 , 1 ) (0,1) (0,1),因此这个函数能很好地解释概率方面的意义。另一个函数是tanh函数,它的值域为 ( − 1 , 1 ) (-1,1) (1,1)。两个函数的形态都差不多,都是S型。

sigmoid函数的形式被定义为:
f ( z ) = 1 1 + exp ⁡ ( − z ) f(z)=\frac{1}{1+\exp(-z)} f(z)=1+exp(z)1
其导数为
f ′ ( z ) = f ( z ) ( 1 − f ( z ) ) f'(z)=f(z)(1-f(z)) f(z)=f(z)(1f(z))
tanh函数的形式被定义为:
f ( z ) = t a n h ( z ) = exp ⁡ ( z ) − exp ⁡ ( − z ) exp ⁡ ( z ) + exp ⁡ ( − z ) f(z)=tanh(z)=\frac{\exp(z)-\exp(-z)}{\exp(z)+\exp(-z)} f(z)=tanh(z)=exp(z)+exp(z)exp(z)exp(z)
其导数为:
f ′ ( z ) = 1 − ( f ( z ) ) 2 f'(z)=1-(f(z))^2 f(z)=1(f(z))2

三层BP神经网络前向传导

这里说的三层,是指包含输入层、隐含层、输出层一共为三层。其前向传导可以用公式写为:
a ( 1 ) = x z ( 2 ) = W ( 1 ) a ( 1 ) + b ( 1 ) a ( 2 ) = f ( z ( 2 ) ) z ( 3 ) = W ( 2 ) a ( 2 ) + b ( 2 ) a ( 3 ) = f ( z ( 3 ) ) \begin{align} a^{(1)} &= x\\ z^{(2)} &= W^{(1)}a^{(1)}+b^{(1)}\\ a^{(2)} &= f(z^{(2)})\\ z^{(3)} &= W^{(2)}a^{(2)}+b^{(2)}\\ a^{(3)} &= f(z^{(3)})\\ \end{align} a(1)z(2)a(2)z(3)a(3)=x=W(1)a(1)+b(1)=f(z(2))=W(2)a(2)+b(2)=f(z(3))
其中,x为输入特征, a ( 1 ) a^{(1)} a(1)为输入层。 W ( 1 ) W^{(1)} W(1) b ( 1 ) b^{(1)} b(1)为输入层到隐层映射时的参数。 z ( 2 ) z^{(2)} z(2)是未被激活的隐层节点。 a ( 2 ) a^{(2)} a(2)为激活了的隐层节点。 W ( 2 ) W^{(2)} W(2) b ( 2 ) b^{(2)} b(2)为隐含层到输出层映射的参数。 z ( 3 ) z^{(3)} z(3)是未被激活的输出层节点。 a ( 3 ) a^{(3)} a(3)为激活了的输出层节点。
如果不使用矩阵形式,那么可以写为:
a i ( 1 ) = x i z j ( 2 ) = ∑ i W j i ( 1 ) a i ( 1 ) + b j ( 1 ) a j ( 2 ) = f ( z j ( 2 ) ) z k ( 3 ) = ∑ j W k j ( 2 ) a j ( 2 ) + b k ( 2 ) a k ( 3 ) = f ( z k ( 3 ) ) \begin{align} a_i^{(1)} &= x_i\\ z_j^{(2)} &= \sum_{i}{W_{ji}^{(1)}}a_i^{(1)}+b_j^{(1)}\\ a_j^{(2)} &= f(z_j^{(2)})\\ z_k^{(3)} &= \sum_{j}{W_{kj}^{(2)}}a_j^{(2)}+b_k^{(2)}\\ a_k^{(3)} &= f(z_k^{(3)})\\ \end{align} ai(1)zj(2)aj(2)zk(3)ak(3)=xi=iWji(1)ai(1)+bj(1)=f(zj(2))=jWkj(2)aj(2)+bk(2)=f(zk(3))

其中, i = 1 , 2 , . . . , N i i=1,2,...,N_i i=1,2,...,Ni, j = 1 , 2 , . . . , N h j=1,2,...,N_h j=1,2,...,Nh, k = 1 , 2 , . . . , N o k=1,2,...,N_o k=1,2,...,No N i N_i Ni, N h N_h Nh, N o N_o No分别表示输入层的节点数、隐含层层的节点数以及输出层的节点数。

代价函数

最为简单,也非常容易理解的单个样本的代价函数为:
J ( W , b ; x , y ) = 1 2 ∥ h W , b ( x ) − y ∥ 2 J(W,b;x,y)=\frac{1}{2}\Vert h_{W,b}(x)-y \Vert^2 J(W,b;x,y)=21hW,b(x)y2
相应的全局代价函数为:
J ( W , b ) = [ 1 m ∑ i = 1 m J ( W , b ; x ( i ) , y ( i ) ) ] + λ 2 ∑ l = 1 n l − 1 ∑ i = 1 S l ∑ j = 1 S l + 1 ( W j i l ) 2 J(W,b)=\left[\frac{1}{m}\sum_{i=1}^mJ(W,b;x^{(i)},y^{(i)})\right]+\frac{\lambda}{2}\sum_{l=1}^{n_l-1}\sum_{i=1}^{S_l}\sum_{j=1}^{S_{l+1}}(W_{ji}^{l})^2 J(W,b)=[m1i=1mJ(W,b;x(i),y(i))]+2λl=1nl1i=1Slj=1Sl+1(Wjil)2

反向传播

为了优化全局函数,可以求梯度并进行迭代:
W i j ( l ) = W i j ( l ) − α ∂ ∂ W i j ( l ) J ( W , b ) b i ( l ) = b i ( l ) − α ∂ ∂ b i ( l ) J ( W , b ) \begin{align} W_{ij}^{(l)} &= W_{ij}^{(l)} - \alpha\frac{\partial}{\partial W_{ij}^{(l)}}J(W,b)\\ b_{i}^{(l)} &= b_{i}^{(l)} - \alpha\frac{\partial}{\partial b_{i}^{(l)}}J(W,b)\\ \end{align} Wij(l)bi(l)=Wij(l)αWij(l)J(W,b)=bi(l)αbi(l)J(W,b)
也就是说,我们只要把注意力集中在求 J ( W , b ) J(W,b) J(W,b) W i j ( l ) W_{ij}^{(l)} Wij(l) b i ( l ) b_{i}^{(l)} bi(l)的导数就可以了。
求导可得:
∂ ∂ W i j ( l ) J ( W , b ) = [ 1 m ∑ i = 1 m ∂ ∂ W i j ( l ) J ( W , b ; x ( i ) , y ( i ) ) ] + λ W i j ( l ) ∂ ∂ b i ( l ) J ( W , b ) = 1 m ∑ i = 1 m ∂ ∂ b i ( l ) J ( W , b ; x ( i ) , y ( i ) ) \begin{align} \frac{\partial}{\partial W_{ij}^{(l)}}J(W,b) &= \left[\frac{1}{m}\sum_{i=1}^m\frac{\partial}{\partial W_{ij}^{(l)}}J(W,b;x^{(i)},y^{(i)})\right]+\lambda W_{ij}^{(l)}\\ \frac{\partial}{\partial b_{i}^{(l)}}J(W,b) &= \frac{1}{m}\sum_{i=1}^m\frac{\partial}{\partial b_{i}^{(l)}}J(W,b;x^{(i)},y^{(i)})\\ \end{align} Wij(l)J(W,b)bi(l)J(W,b)=[m1i=1mWij(l)J(W,b;x(i),y(i))]+λWij(l)=m1i=1mbi(l)J(W,b;x(i),y(i))
OK。那么现在的问题全部集中在求解 ∂ ∂ W i j ( l ) J ( W , b ; x ( i ) , y ( i ) ) \frac{\partial}{\partial W_{ij}^{(l)}}J(W,b;x^{(i)},y^{(i)}) Wij(l)J(W,b;x(i),y(i)) ∂ ∂ b i ( l ) J ( W , b ; x ( i ) , y ( i ) ) \frac{\partial}{\partial b_{i}^{(l)}}J(W,b;x^{(i)},y^{(i)}) bi(l)J(W,b;x(i),y(i))上。

首先计算解 ∂ ∂ W i j ( l ) J ( W , b ; x ( i ) , y ( i ) ) \frac{\partial}{\partial W_{ij}^{(l)}}J(W,b;x^{(i)},y^{(i)}) Wij(l)J(W,b;x(i),y(i))。我们现在有:
J ( W , b ; x , y ) = 1 2 ∥ h W , b ( x ) − y ∥ 2 = 1 2 ∑ k = 1 N o ( a k ( 3 ) − y k ) 2 \begin{align} J(W,b;x,y) &= \frac{1}{2}\Vert h_{W,b}(x)-y \Vert^2\\ &= \frac{1}{2}\sum_{k=1}^{N_o}(a_k^{(3)}-y_k)^2\\ \end{align} J(W,b;x,y)=21hW,b(x)y2=21k=1No(ak(3)yk)2
从这个式子中我们知道:
∂ J ∂ a i ( 3 ) = a i ( 3 ) − y i \frac{\partial J}{\partial a_i^{(3)}}=a_i^{(3)}-y_i ai(3)J=ai(3)yi
又,
a i ( 3 ) = f ( z i ( 3 ) ) a_i^{(3)}=f(z_i^{(3)}) ai(3)=f(zi(3))
所以,
∂ a i ( 3 ) ∂ z i ( 3 ) = f ′ ( z i ( 3 ) ) \frac{\partial a_i^{(3)}}{\partial z_i^{(3)}} = f'(z_i^{(3)}) zi(3)ai(3)=f(zi(3))
又,
z i ( 3 ) = ∑ j W i j ( 2 ) a j ( 2 ) + b k ( 2 ) z_i^{(3)} = \sum_{j}{W_{ij}^{(2)}}a_j^{(2)}+b_k^{(2)} zi(3)=jWij(2)aj(2)+bk(2)
所以,
∂ z i ( 3 ) ∂ W i j ( 2 ) = a j ( 2 ) \frac{\partial z_i^{(3)}}{\partial W_{ij}^{(2)}} = a_j^{(2)} Wij(2)zi(3)=aj(2)
综合起来,就有:
∂ J ∂ W i j ( 2 ) = ∂ J ∂ a i ( 3 ) ∂ a i ( 3 ) ∂ z i ( 3 ) ∂ z i ( 3 ) ∂ W i j ( 2 ) = ( a i ( 3 ) − y i ) f ′ ( z i ( 3 ) ) a j ( 2 ) \frac{\partial J}{\partial W_{ij}^{(2)}}=\frac{\partial J}{\partial a_i^{(3)}}\frac{\partial a_i^{(3)}}{\partial z_i^{(3)}}\frac{\partial z_i^{(3)}}{\partial W_{ij}^{(2)}} = (a_i^{(3)}-y_i)f'(z_i^{(3)})a_j^{(2)} Wij(2)J=ai(3)Jzi(3)ai(3)Wij(2)zi(3)=(ai(3)yi)f(zi(3))aj(2)

下面再来推导 ∂ J / ∂ W i j ( 1 ) {\partial J}/{\partial W_{ij}^{(1)}} J/Wij(1)。我们已知
J ( W , b ; x , y ) = 1 2 ∑ k = 1 N o ( a k ( 3 ) − y k ) 2 J(W,b;x,y) = \frac{1}{2}\sum_{k=1}^{N_o}(a_k^{(3)}-y_k)^2\\ J(W,b;x,y)=21k=1No(ak(3)yk)2
在这里,
∂ J ∂ a k ( 3 ) = ∑ k = 1 N o ( a k ( 3 ) − y k ) \frac{\partial J}{\partial a_k^{(3)}}=\sum_{k=1}^{N_o}(a_k^{(3)}-y_k) ak(3)J=k=1No(ak(3)yk)
这是因为每一个 a k ( 3 ) , k = 1 , . . . , N o a_k^{(3)},k=1,...,N_o ak(3)k=1,...,No都是 W i j ( 1 ) W_{ij}^{(1)} Wij(1)的函数。
∂ J ∂ W i j ( 1 ) = ∂ J ∂ a k ( 3 ) ∂ a k ( 3 ) ∂ z k ( 3 ) ∂ z k ( 3 ) ∂ a i ( 2 ) ∂ a i ( 2 ) ∂ z i ( 2 ) ∂ z i ( 2 ) ∂ W i j ( 1 ) \frac{\partial J}{\partial W_{ij}^{(1)}}=\frac{\partial J}{\partial a_k^{(3)}}\frac{\partial a_k^{(3)}}{\partial z_k^{(3)}}\frac{\partial z_k^{(3)}}{\partial a_i^{(2)}}\frac{\partial a_i^{(2)}}{\partial z_i^{(2)}}\frac{\partial z_i^{(2)}}{\partial W_{ij}^{(1)}} Wij(1)J=ak(3)Jzk(3)ak(3)ai(2)zk(3)zi(2)ai(2)Wij(1)zi(2)
其中,
KaTeX parse error: No such environment: eqnarray* at position 8: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲*̲}̲ \frac{\partial…

归纳总结

推广一下,可以首先设定一个变量 δ i ( l ) \delta_i^{(l)} δi(l),其中 i i i表示第单元的序号, l l l表示层数,它被定义为:
δ i ( l ) = ∂ ∂ z i ( l ) J ( W , b ; x , y ) \delta_i^{(l)}=\frac{\partial}{\partial z_i^{(l)}}J(W,b;x,y) δi(l)=zi(l)J(W,b;x,y)
比如刚才的例子中,
δ i ( 3 ) = ∂ ∂ z i ( 3 ) J ( W , b ; x , y ) δ i ( 2 ) = ∂ ∂ z i ( 2 ) J ( W , b ; x , y ) = ∂ J ∂ a k ( 3 ) ∂ a k ( 3 ) ∂ z k ( 3 ) ∂ z k ( 3 ) ∂ a i ( 2 ) ∂ a i ( 2 ) ∂ z i ( 2 ) \begin{align} \delta_i^{(3)} &= \frac{\partial}{\partial z_i^{(3)}}J(W,b;x,y)\\ \delta_i^{(2)} &= \frac{\partial}{\partial z_i^{(2)}}J(W,b;x,y)\\ &= \frac{\partial J}{\partial a_k^{(3)}}\frac{\partial a_k^{(3)}}{\partial z_k^{(3)}}\frac{\partial z_k^{(3)}}{\partial a_i^{(2)}}\frac{\partial a_i^{(2)}}{\partial z_i^{(2)}} \end{align} δi(3)δi(2)=zi(3)J(W,b;x,y)=zi(2)J(W,b;x,y)=ak(3)Jzk(3)ak(3)ai(2)zk(3)zi(2)ai(2)
定义了 δ i ( l ) \delta_i^{(l)} δi(l)后,就有:
∂ ∂ W i j ( l ) J ( W , b ; x , y ) = a j ( l ) δ i ( l + 1 ) ∂ ∂ b i ( l ) J ( W , b ; x , y ) = δ i ( l + 1 ) \begin{align} \frac{\partial}{\partial W_{ij}^{(l)}}J(W,b;x,y) &= a_j^{(l)}\delta_i^{(l+1)}\\ \frac{\partial}{\partial b_{i}^{(l)}}J(W,b;x,y) &= \delta_i^{(l+1)}\\ \end{align} Wij(l)J(W,b;x,y)bi(l)J(W,b;x,y)=aj(l)δi(l+1)=δi(l+1)
上式的证明是这样:
∂ ∂ W i j ( l ) J ( W , b ; x , y ) = ∂ J ∂ z i ( l + 1 ) ∂ z i ( l + 1 ) ∂ W i j ( l ) ∂ ∂ b i ( l ) J ( W , b ; x , y ) = ∂ J ∂ z i ( l + 1 ) ∂ z i ( l + 1 ) ∂ b i ( l ) \begin{align} \frac{\partial}{\partial W_{ij}^{(l)}}J(W,b;x,y) &= \frac{\partial J}{\partial z_i^{(l+1)}}\frac{\partial z_i^{(l+1)}}{\partial W_{ij}^{(l)}}\\ \frac{\partial}{\partial b_{i}^{(l)}}J(W,b;x,y) &= \frac{\partial J}{\partial z_i^{(l+1)}}\frac{\partial z_i^{(l+1)}}{\partial b_{i}^{(l)}}\\ \end{align} Wij(l)J(W,b;x,y)bi(l)J(W,b;x,y)=zi(l+1)JWij(l)zi(l+1)=zi(l+1)Jbi(l)zi(l+1)
由于
z i ( l + 1 ) = ∑ k W i k ( l ) a k ( l ) + b i ( l ) z_i^{(l+1)} = \sum_{k}{W_{ik}^{(l)}}a_k^{(l)}+b_i^{(l)} zi(l+1)=kWik(l)ak(l)+bi(l)
所以
∂ z i ( l + 1 ) ∂ W i j ( l ) = a j ( l ) ∂ z i ( l + 1 ) ∂ b i ( l ) = 1 \begin{align} \frac{\partial z_i^{(l+1)}}{\partial W_{ij}^{(l)}} &= a_j^{(l)}\\ \frac{\partial z_i^{(l+1)}}{\partial b_{i}^{(l)}} &= 1\\ \end{align} Wij(l)zi(l+1)bi(l)zi(l+1)=aj(l)=1

向量化

刚刚的都是针对单个标量的公式求导。真正实现的时候,可以转换为向量形式:
δ ( n l ) = − ( y − a ( n l ) ) ∙ f ′ ( z ( n l ) ) δ ( l ) = ( ( W ( l ) ) T δ ( l + 1 ) ) ∙ f ′ ( z ( l ) ) \begin{align} \boldsymbol{\delta}^{(n_l)} &= -(\boldsymbol{y}-\boldsymbol{a}^{(n_l)})\bullet f'(\boldsymbol{z}^{(n_l)})\\ \boldsymbol{\delta}^{(l)} &= \left( (W^{(l)})^T \boldsymbol{\delta}^{(l+1)}\right) \bullet f'(\boldsymbol{z^{(l)}})\\ \end{align} δ(nl)δ(l)=(ya(nl))f(z(nl))=((W(l))Tδ(l+1))f(z(l))

∇ W ( l ) J ( W , b ; x , y ) = δ ( l + 1 ) ( a ( l ) ) T ∇ b ( l ) J ( W , b ; x , y ) = δ ( l + 1 ) \begin{align} \nabla_{W^{(l)}}J(W,b;x,y) &= \boldsymbol{\delta}^{(l+1)}\left( \boldsymbol{a^{(l)}} \right)^T\\ \nabla_{b^{(l)}}J(W,b;x,y) &= \boldsymbol{\delta}^{(l+1)}\\ \end{align} W(l)J(W,b;x,y)b(l)J(W,b;x,y)=δ(l+1)(a(l))T=δ(l+1)
另外,我们还可以使用下式来简化计算
f ′ ( z i ( l ) ) = f ( z i ( l ) ) ( 1 − f ( z i ( l ) ) ) = a i ( l ) ( 1 − a i ( l ) ) f'(z_i^{(l)})=f(z_i^{(l)})(1-f(z_i^{(l)}))=a_i^{(l)}(1-a_i^{(l)}) f(zi(l))=f(zi(l))(1f(zi(l)))=ai(l)(1ai(l))

整体梳理

  1. Δ W ( l ) : = 0 \Delta W^{(l)}:=0 ΔW(l):=0, Δ b ( l ) : = 0 \Delta \boldsymbol{b}^{(l)}:=0 Δb(l):=0
  2. For i i i=1 to m m m
  3. 计算 ∇ W ( l ) J ( W , b ; x , y ) \nabla_{W^{(l)}}J(W,b;x,y) W(l)J(W,b;x,y) ∇ b ( l ) J ( W , b ; x , y ) \nabla_{b^{(l)}}J(W,b;x,y) b(l)J(W,b;x,y)
  4. Δ W ( l ) : = Δ W ( l ) + ∇ W ( l ) J ( W , b ; x , y ) \Delta W^{(l)}:=\Delta W^{(l)}+\nabla_{W^{(l)}}J(W,b;x,y) ΔW(l):=ΔW(l)+W(l)J(W,b;x,y)
  5. Δ b ( l ) : = Δ b ( l ) + ∇ b ( l ) J ( W , b ; x , y ) \Delta \boldsymbol{b^{(l)}}:=\Delta \boldsymbol{b}^{(l)}+\nabla_{b^{(l)}}J(W,b;x,y) Δb(l):=Δb(l)+b(l)J(W,b;x,y)
  6. 更新参数:
    W ( l ) = W ( l ) − α [ ( 1 m Δ W ( l ) ) + λ W ( l ) ] b ( l ) = b ( l ) − α [ ( 1 m Δ b ( l ) ) ] \begin{align} W^{(l)} &= W^{(l)} - \alpha\left[ (\frac{1}{m}\Delta W^{(l)})+\lambda W^{(l)} \right]\\ \boldsymbol{b}^{(l)} &= \boldsymbol{b}^{(l)} - \alpha\left[ (\frac{1}{m}\Delta \boldsymbol{b}^{(l)}) \right]\\ \end{align} W(l)b(l)=W(l)α[(m1ΔW(l))+λW(l)]=b(l)α[(m1Δb(l))]

最后一层变为softmax模型

如果使用softmax模型,则代价函数变为
J ( θ ) = − [ ∑ n = 1 N ∑ k = 1 K 1 { y ( n ) = k } l o g e x p ( ( θ ( k ) ) T h W , b ( x ( n ) ) ) ∑ j = 1 K e x p ( ( θ ( j ) ) T h W , b ( x ( n ) ) ) ] = − ∑ n = 1 N ∑ k = 1 K t n k log ⁡ S n k \begin{align} J(\theta) &= -\left[ \sum_{n=1}^N\sum_{k=1}^K1\{ y^{(n)}=k \}log\frac{exp\left(\left( \theta^{(k)} \right)^T h_{W,b}\left( x^{(n)} \right) \right)}{\sum_{j=1}^Kexp\left(\left( \theta^{(j)} \right)^T h_{W,b}\left( x^{(n)} \right) \right)} \right]\\ &= - \sum_{n=1}^N\sum_{k=1}^K t_{nk} \log S_{nk}\\ \end{align} J(θ)= n=1Nk=1K1{y(n)=k}logj=1Kexp((θ(j))ThW,b(x(n)))exp((θ(k))ThW,b(x(n))) =n=1Nk=1KtnklogSnk
其中,
t n k = 1 { y ( i ) = k } S n k = exp ⁡ ( ( θ ( k ) ) T h W , b ( x ( n ) ) ) ∑ j = 1 K exp ⁡ ( ( θ ( j ) ) T h W , b ( x ( n ) ) ) \begin{align} t_{nk} &= 1\{ y^{(i)}=k \}\\ S_{nk} &= \frac{\exp\left(\left( \theta^{(k)} \right)^T h_{W,b}\left( x^{(n)} \right) \right)}{\sum_{j=1}^K\exp\left(\left( \theta^{(j)} \right)^T h_{W,b}\left( x^{(n)} \right) \right)}\\ \end{align} tnkSnk=1{y(i)=k}=j=1Kexp((θ(j))ThW,b(x(n)))exp((θ(k))ThW,b(x(n)))
S n k S_{nk} Snk中, n n n表示的是样本的序列。不失一般性,去掉 n n n,则有
P ( y = k ∣ x ; θ ) = S k ( x ; θ ) = exp ⁡ ( z k ( 3 ) ) ∑ j exp ⁡ ( z j ( 3 ) ) P(y=k|x;\theta)=S_k(x;\theta)=\frac{\exp(z_k^{(3)})}{\sum_j\exp(z_j^{(3)})} P(y=kx;θ)=Sk(x;θ)=jexp(zj(3))exp(zk(3))
其中,
z k ( 3 ) = ( θ ( k ) ) T h W , b ( x ( n ) ) a ( 2 ) = h W , b ( x ( n ) ) \begin{align} z_k^{(3)} &= \left( \theta^{(k)} \right)^T h_{W,b}\left( x^{(n)} \right) \\ \boldsymbol{a^{(2)}} &= h_{W,b}\left( x^{(n)} \right)\\ \end{align} zk(3)a(2)=(θ(k))ThW,b(x(n))=hW,b(x(n))
然后我们便可以根据之前所说的来求解 δ i ( 3 ) \delta_i^{(3)} δi(3)
δ i ( 3 ) = ∂ J ∂ z i ( 3 ) = ∂ J ∂ S n k ∂ S n k ∂ z i ( 3 ) = − ∑ n = 1 N ∑ k = 1 K t n k 1 S n k S n k ( I k i − S n i ) = − ∑ n = 1 N ∑ k = 1 K t n k ( I k i − S n i ) = − ∑ n = 1 N ( ∑ k = 1 K t n k I k i − ∑ k = 1 K t n k S n i ) = − ∑ n = 1 N ( t n i − S n i ) \begin{align} \delta_i^{(3)} &= \frac{\partial J}{\partial z_i^{(3)}} \\ &= \frac{\partial J}{\partial S_{nk}} \frac{\partial S_{nk}}{\partial z_i^{(3)}}\\ &= -\sum_{n=1}^N\sum_{k=1}^Kt_{nk}\frac{1}{S_{nk}}S_{nk}(I_{ki}-S_{ni})\\ &= -\sum_{n=1}^N\sum_{k=1}^Kt_{nk}(I_{ki}-S_{ni})\\ &= -\sum_{n=1}^N\left( \sum_{k=1}^Kt_{nk}I_{ki}- \sum_{k=1}^Kt_{nk}S_{ni} \right)\\ &= -\sum_{n=1}^N\left( t_{ni}-S_{ni} \right) \end{align} δi(3)=zi(3)J=SnkJzi(3)Snk=n=1Nk=1KtnkSnk1Snk(IkiSni)=n=1Nk=1Ktnk(IkiSni)=n=1N(k=1KtnkIkik=1KtnkSni)=n=1N(tniSni)
在上面的推导中,我们利用了 ∑ k t n k = 1 \sum_kt_{nk}=1 ktnk=1

CNN(Convolutional Neural Network)

还是假设三层网络。第一层是输入层,第二层是卷积后池化的隐含层,第三层是最后的输出层。第二层和第三层之间是全连接的。则:
δ i ( 2 ) = ∂ J ∂ z i ( 2 ) = ∂ J ∂ z k ( 3 ) ∂ z k ( 3 ) ∂ a j ( 2 ) ∂ a j ( 2 ) ∂ z i ( 2 ) = ∑ k = 1 K δ k ( 3 ) W k j ( 2 ) ∂ a j ( 2 ) ∂ z i ( 2 ) \begin{align} \delta_i^{(2)} &= \frac{\partial J}{\partial z_i^{(2)}} \\ &= \frac{\partial J}{\partial z_{k}^{(3)}} \frac{\partial z_{k}^{(3)}}{\partial a_j^{(2)}}\frac{\partial a_j^{(2)}}{\partial z_i^{(2)}}\\ &= \sum_{k=1}^K\delta_k^{(3)}W_{kj}^{(2)}\frac{\partial a_j^{(2)}}{\partial z_i^{(2)}} \end{align} δi(2)=zi(2)J=zk(3)Jaj(2)zk(3)zi(2)aj(2)=k=1Kδk(3)Wkj(2)zi(2)aj(2)
现在的关键是 ∂ a j ( 2 ) / ∂ z i ( 2 ) {\partial a_j^{(2)}}/{\partial z_i^{(2)}} aj(2)/zi(2)
下面考虑一下物理意义:

  1. a ( 1 ) \boldsymbol{a}^{(1)} a(1)是输入层,一般来说,是一幅二维的图像。
  2. 用一个kernel对这幅图像进行卷积,并加上一个偏移量后,称之为 z ( 2 ) \boldsymbol{z}^{(2)} z(2)
  3. z ( 2 ) \boldsymbol{z}^{(2)} z(2)激励,并池化后的结果称之为 a ( 2 ) \boldsymbol{a}^{(2)} a(2)

那么可以举一个例子:设 z ( 2 ) \boldsymbol{z}^{(2)} z(2)为一个 8 × 8 8\times8 8×8的矩阵且池化为原尺寸的 1 2 × 1 2 \frac{1}{2}\times\frac{1}{2} 21×21。则,
a 1 ( 2 ) = 1 4 ( f ( z 1 ( 2 ) ) + f ( z 2 ( 2 ) ) + f ( z 9 ( 2 ) ) + f ( z 10 ( 2 ) ) ) a_1^{(2)}=\frac{1}{4}\left( f(z_1^{(2)}) + f(z_2^{(2)}) + f(z_9^{(2)}) + f(z_{10}^{(2)}) \right) a1(2)=41(f(z1(2))+f(z2(2))+f(z9(2))+f(z10(2)))
这样,我们就知道
∂ a 1 ( 2 ) ∂ z 1 ( 2 ) = 1 4 f ′ ( z 1 ( 2 ) ) ∂ a 1 ( 2 ) ∂ z 2 ( 2 ) = 1 4 f ′ ( z 2 ( 2 ) ) ∂ a 1 ( 2 ) ∂ z 9 ( 2 ) = 1 4 f ′ ( z 9 ( 2 ) ) ∂ a 1 ( 2 ) ∂ z 10 ( 2 ) = 1 4 f ′ ( z 10 ( 2 ) ) \begin{align} \frac{\partial a_1^{(2)}}{\partial z_1^{(2)}} &= \frac{1}{4}f'(z_1^{(2)}) \\ \frac{\partial a_1^{(2)}}{\partial z_2^{(2)}} &= \frac{1}{4}f'(z_2^{(2)}) \\ \frac{\partial a_1^{(2)}}{\partial z_9^{(2)}} &= \frac{1}{4}f'(z_9^{(2)}) \\ \frac{\partial a_1^{(2)}}{\partial z_{10}^{(2)}} &= \frac{1}{4}f'(z_{10}^{(2)}) \\ \end{align} z1(2)a1(2)z2(2)a1(2)z9(2)a1(2)z10(2)a1(2)=41f(z1(2))=41f(z2(2))=41f(z9(2))=41f(z10(2))
而这就相当于对 a 1 ( 2 ) a_1^{(2)} a1(2)上采样为 2 × 2 2\times 2 2×2,并且将每一个值变为原来的1/4。然后再分别与对应的 z j ( 2 ) z_j^{(2)} zj(2)的导数相乘。由于我也不会严格推导,因此,这里就直接给出答案:
δ k ( 2 ) = u p s a m p l e ( ( W k ( 2 ) ) T δ k ( 3 ) ) ∙ f ′ ( z k ( 2 ) ) \delta_k^{(2)}=upsample\left( \left( W_k^{(2)} \right)^T\delta_k^{(3)} \right)\bullet f'(z_k^{(2)}) δk(2)=upsample((Wk(2))Tδk(3))f(zk(2))
那么,如果是max-pooling呢?还是举刚才的例子:
a 1 ( 2 ) = max ⁡ ( f ( z 1 ( 2 ) ) , f ( z 2 ( 2 ) ) , f ( z 9 ( 2 ) ) , f ( z 10 ( 2 ) ) ) a_1^{(2)}=\max\left( f(z_1^{(2)}),f(z_2^{(2)}),f(z_9^{(2)}),f(z_{10}^{(2)}) \right) a1(2)=max(f(z1(2)),f(z2(2)),f(z9(2)),f(z10(2)))
这个导数怎么求?其实也不难,如果我们知道 f ( z 1 ( 2 ) ) , f ( z 2 ( 2 ) ) , f ( z 9 ( 2 ) ) , f ( z 10 ( 2 ) ) f(z_1^{(2)}),f(z_2^{(2)}),f(z_9^{(2)}),f(z_{10}^{(2)}) f(z1(2)),f(z2(2)),f(z9(2)),f(z10(2))中哪个值最大,那么对那个 z i ( 2 ) z_i^{(2)} zi(2)的分量求导就是 f ′ ( z i ( 2 ) ) f'(z_i^{(2)}) f(zi(2))而对其它的分量求导就是0。
这样的话,就相当于 δ k ( 2 ) \delta_k^{(2)} δk(2)的式子不用改,而只需要更改 u p s a m p l e upsample upsample的含义就可以了。求平均的池化方法类似于把误差平分到每一个单元,而max-pooling方法的误差全部都放到某一个上采样后的单元上,其它单元全部设为0。

到现在, δ ( 2 ) \delta^{(2)} δ(2)已经求解成功,但还没有结束。下面还需要求解 ∂ z i ( 2 ) / ∂ W m n ( 1 ) {\partial z_i^{(2)}}/{\partial W_{mn}^{(1)}} zi(2)/Wmn(1)。假设kernel是一个 3 × 3 3\times 3 3×3的矩阵。并且可以写成:
( W 11 ( 1 ) W 12 ( 1 ) W 13 ( 1 ) W 21 ( 1 ) W 22 ( 1 ) W 23 ( 1 ) W 31 ( 1 ) W 32 ( 1 ) W 33 ( 1 ) ) \left( \begin{array}{rcl} W_{11}^{(1)}&W_{12}^{(1)}&W_{13}^{(1)}\\ W_{21}^{(1)}&W_{22}^{(1)}&W_{23}^{(1)}\\ W_{31}^{(1)}&W_{32}^{(1)}&W_{33}^{(1)}\\ \end{array} \right) W11(1)W21(1)W31(1)W12(1)W22(1)W32(1)W13(1)W23(1)W33(1)
z 1 ( 2 ) = ∑ i = 1 3 ∑ j = 1 3 W i j ( 1 ) a i j ( 1 ) + b ( 1 ) z_1^{(2)}=\sum_{i=1}^3\sum_{j=1}^3W_{ij}^{(1)}a_{ij}^{(1)}+b^{(1)} z1(2)=i=13j=13Wij(1)aij(1)+b(1)
∂ z 1 ( 2 ) / ∂ W 11 ( 1 ) = a 11 ( 1 ) \partial z_1^{(2)}/\partial W_{11}^{(1)}=a_{11}^{(1)} z1(2)/W11(1)=a11(1),而对 W 11 ( 1 ) W_{11}^{(1)} W11(1)有贡献的 z ( 2 ) \boldsymbol{z}^{(2)} z(2)的分量还有很多,他们的导数构成了一下的矩阵:
( a 11 ( 1 ) ⋯ a 16 ( 1 ) ⋮ ⋱ ⋮ a 61 ( 1 ) ⋯ a 66 ( 1 ) ) \left( \begin{array}{rcl} a_{11}^{(1)}&\cdots&a_{16}^{(1)}\\ \vdots&\ddots&\vdots\\ a_{61}^{(1)}&\cdots&a_{66}^{(1)}\\ \end{array} \right) a11(1)a61(1)a16(1)a66(1)
综上,可以得出
∂ J ∂ W 11 ( 1 ) = ( ∑ i = 1 6 ∑ j = 1 6 δ i j ( 2 ) a i j ) \frac{\partial J}{\partial W_{11}^{(1)}}=\left( \sum_{i=1}^6\sum_{j=1}^6\delta_{ij}^{(2)}a_{ij} \right) W11(1)J=(i=16j=16δij(2)aij)
这其实可以看成是一种相关的形式,最后,给出整体的梯度:
∇ W k ( 1 ) J ( W , b ; x , y ) = ( a ( 1 ) ) ∗ rot90 ( δ k ( 2 ) , 2 ) , ∇ b k ( 1 ) J ( W , b ; x , y ) = ∑ r , c ( δ k ( 2 ) ) r , c . \begin{align} \nabla_{W_k^{(1)}} J(W,b;x,y) &= (a^{(1)}) \ast \text{rot90}(\delta_k^{(2)},2), \\ \nabla_{b_k^{(1)}} J(W,b;x,y) &= \sum_{r,c} (\delta_k^{(2)})_{r,c}. \end{align} Wk(1)J(W,b;x,y)bk(1)J(W,b;x,y)=(a(1))rot90(δk(2),2),=r,c(δk(2))r,c.

CNN变种(高效版)

上面介绍的CNN,在第一层到第二层之间发生的变化依次为:卷积->激活->池化。而更加高效的做法是,把顺序调整一下,顺序依次为:卷积->池化->激活。用数学公式来示意一下,即为:
第一种:
D ( f ( W x ( r , c ) + b ) ) D(f(Wx_{(r,c)}+b)) D(f(Wx(r,c)+b))
第二种:
f ( D ( W x ( r , c ) ) + b ) f(D(Wx_{(r,c)})+b) f(D(Wx(r,c))+b)
说第二种更高效的原因在于:在降采样的矩阵上做一些操作,总比在原矩阵上做同样的操作要快一些。更何况,激励函数中总是会包含指数操作。如果在DSP上运算,特别是在定点的DSP上进行运算,指数操作总是越少越好。
针对高效版的求导过程,与之前的CNN求导过程差的不多。这里就不赘述。一点提示就是,针对第一种,我的 z ( 2 ) z^{(2)} z(2)取的是 W x ( r , c ) + b Wx_{(r,c)}+b Wx(r,c)+b,而对于高效版的第二种,我的 z ( 2 ) z^{(2)} z(2)取的是 W x ( r , c ) Wx_{(r,c)} Wx(r,c)
推导的结果是:
δ k ( 2 ) = u p s a m p l e ( ( W k ( 2 ) ) T δ k ( 3 ) ∙ f ′ ( d k ( 2 ) ) ) \delta_k^{(2)}=upsample\left( \left( W_k^{(2)} \right)^T\delta_k^{(3)} \bullet f'(d_k^{(2)}) \right) δk(2)=upsample((Wk(2))Tδk(3)f(dk(2)))
其中, d k ( 2 ) d_k^{(2)} dk(2)对应的是 D ( W x ( r , c ) ) + b D(Wx_{(r,c)})+b D(Wx(r,c))+b部分。可以看到,在求解 δ k ( 2 ) \delta_k^{(2)} δk(2)的部分,第二种与第一种的区别是,第一种在前向传播的过程中是先激活,再降采样的。因此在求导的时候先上采样,再乘以激活函数的导数。而第二种在前向传播的过程中是先降采样,然后再激活的。因此在求导的时候,先乘以激活函数的导数,然后再上采样。
其它的都与第一种相同。

写在最后

在上述的推导过程中,为了更加具体地描述,我都具体地表明了采用的神经网络的结构。我采用的结构一般都为三层。但事实上,掌握了上述的方法之后,可以将层数扩展到任意层。这是因为对 W ( l ) W^{(l)} W(l) b ( l ) b^{(l)} b(l)的导数,就只与当层的 a ( l ) \boldsymbol{a}^{(l)} a(l)与后一层的 δ ( l + 1 ) \boldsymbol{\delta}^{(l+1)} δ(l+1)有关。通过从后往前的推导,我们总能求解出 W ( l ) W^{(l)} W(l) b ( l ) b^{(l)} b(l)的导数。这也是反向传播的含义。
另外,虽然我对我的数学没有很大的信心,但是,通过实际的验证,表明推导的都是正确的。这才有信心把推导的内容记录下来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值