深层神经网络前馈 && 反向传播

学习深度学习,深层神经网络是一个绕不过的话题,包括其前向以及反向的计算过程是很有必要搞清楚,这样对于之后的调参,以及梯度消失 & 爆炸的处理会很有帮助;

所以立足于此,尽可能详细的阐述其前向 & 后向的计算过程:

1.为什么使用深层神经网络
2.深层神经网络的 前向 & 反向 计算过程详解

1.为什么使用深层神经网络
1.1 神经网络

神经网络,顾名思义就是模拟大脑皮层,从感知信息,传递,再到激活然后输出的一个个神经元构成的网络模型,在此过程中,低阶神经网络构成低阶网络层,中阶神经元构成的中阶网络层,一次类推,一层一层网络层前向传递,知道输出预测值;同时从输出开始,反向微分一步步调节网络;

神经网络由 输入层 ,隐藏层,输出层组成

  • 输入层: 就是训练数据的入口
  • 隐藏层: 一级一级抽象特征的网络层
  • 输出层: 网络预测值的输出口
使用深层神经网络的目的

在实际的应用中,我们会使用多层的神经网络(主要指多个隐藏层)来进行模型训练,这样做的目的就是捕捉细粒度的特征

用一个大家比较熟悉的例子:一张人脸图片做卷积(conv代表卷积层(也是隐藏层),这里以卷积神经网络来阐述):

  • conv1:进行边缘抽象,如圆角,直线等基础抽象
  • conv2:基于conv1进行连接,抽象出鼻子,眼镜,嘴巴等基础五官
  • conv3:基于conv2进行组合,抽象出人脸

到此为止我们可以认为,人脸识别模型构建完毕,的确,基于上面的简单例子可以看出,隐藏层的作用就是对特征进行低阶—>高阶的抽象过程,网络层越多,抽象的粒度也就越细,这就是使用深层神经网络的目的

2.深层神经网络的 前向 & 反向计算过程

神经网络训练模型分为前向和反向传播的过程:

  • 前向传递:可以认为就是求解预测值的过程,这样便可以在迭代训练过程中求出成本函数
  • 反向传播:其实要比前向传递耗时许多,根据前向传递的出成本函数,然后梯度下降来更新每一层的参数,这是训练模型的关键

这里我盗用Andrew Ng的一张图来进行求解过程:

在这里插入图片描述
这里我们来规定几个定义,方便一会儿计算的过程:

  • 数据为横向堆叠矩阵,即每一列是单个特征向量, e g eg eg:输入就是{ x 1 , x 2 , . . . x m x_1,x_2,...x_m x1,x2,...xm}

  • l l l代表层数, n [ l ] n^{[l]} n[l]代表每一层的节点数

  • 每一层的激活函数我们用 g g g来表示,则有这样的计算过程: Z [ l ] = W [ l ] A [ l − 1 ] + b [ l ]      Z^{[l]}=W^{[l]}A^{[l-1]} + b^{[l]}\;\; Z[l]=W[l]A[l1]+b[l] A [ l ] = g ( Z [ l ] )      A^{[l]} = g(Z^{[l]})\;\; A[l]=g(Z[l])

  • n l n^{l} nl是每一层的节点数, W [ l ] W^{[l]} W[l]是每一层的参数, b [ l ] b^{[l]} b[l]是每一层的偏移量, m m m是批量中的个数

  • 我们规定 输入层是第0层,节点数为 n [ 0 ] n^{[0]} n[0],其输入数据为 A [ 0 ] A^{[0]} A[0];以此类推… n [ 1 ] , n [ 2 ] , . . . n^{[1]},n^{[2]},... n[1],n[2],...

2.1 前向过程(依照上图来计算,计算4层)

计算第一个隐藏层

Z [ 1 ] = W [ 1 ] A [ 0 ] + b [ 1 ]          A [ 1 ] = g ( Z [ 1 ] ) Z^{[1]} = W^{[1]}A^{[0]} + b^{[1]} \;\;\;\; A^{[1]} = g(Z^{[1]}) Z[1]=W[1]A[0]+b[1]A[1]=g(Z[1])
A [ 0 ] A^{[0]} A[0]就是输入的数据集,即m个{ x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1,x2,x3,x4}的横向堆叠,所以:

  • W [ 1 ] − ( n [ 1 ] , n [ 0 ] )        A [ 0 ] − ( n [ 0 ] , m )        b [ 1 ] − ( n [ 1 ] , 1 ) W^{[1]}-(n^{[1]},n^{[0]})\;\;\;A^{[0]} -(n^{[0]},m)\;\;\;b^{[1]}-(n^{[1]},1) W[1](n[1],n[0])A[0](n[0],m)b[1](n[1],1)这里b由于python的广播机制,在做+运算时候会自动扩展为m个b向量,这里我们可以认为b的维度是 ( n [ 1 ] , m ) (n^{[1]},m) (n[1],m)
  • 计算之后 Z [ 1 ] − ( n [ 1 ] , m )        A [ 1 ] − ( n [ 1 ] , m ) Z^{[1]}-(n^{[1]},m)\;\;\;A^{[1]}-(n^{[1]},m) Z[1](n[1],m)A[1](n[1],m)

计算第二个隐藏层

Z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ]          A [ 2 ] = g ( Z [ 2 ] ) Z^{[2]} = W^{[2]}A^{[1]} + b^{[2]} \;\;\;\; A^{[2]} = g(Z^{[2]}) Z[2]=W[2]A[1]+b[2]A[2]=g(Z[2])

  • W [ 2 ] − ( n [ 2 ] , n [ 1 ] )        A [ 1 ] − ( n [ 1 ] , m )        b [ 2 ] − ( n [ 2 ] , 1 ) W^{[2]}-(n^{[2]},n^{[1]})\;\;\;A^{[1]} -(n^{[1]},m)\;\;\;b^{[2]}-(n^{[2]},1) W[2](n[2],n[1])A[1](n[1],m)b[2](n[2],1)
  • 计算之后 Z [ 2 ] − ( n [ 2 ] , m )        A [ 2 ] − ( n [ 2 ] , m ) Z^{[2]}-(n^{[2]},m)\;\;\;A^{[2]}-(n^{[2]},m) Z[2](n[2],m)A[2](n[2],m)

计算第三个隐藏层

Z [ 3 ] = W [ 3 ] A [ 2 ] + b [ 3 ]          A [ 3 ] = g ( Z [ 3 ] ) Z^{[3]} = W^{[3]}A^{[2]} + b^{[3]} \;\;\;\; A^{[3]} = g(Z^{[3]}) Z[3]=W[3]A[2]+b[3]A[3]=g(Z[3])

  • W [ 3 ] − ( n [ 3 ] , n [ 2 ] )        A [ 2 ] − ( n [ 2 ] , m )        b [ 3 ] − ( n [ 3 ] , 1 ) W^{[3]}-(n^{[3]},n^{[2]})\;\;\;A^{[2]} -(n^{[2]},m)\;\;\;b^{[3]}-(n^{[3]},1) W[3](n[3],n[2])A[2](n[2],m)b[3](n[3],1)
  • 计算之后 Z [ 3 ] − ( n [ 3 ] , m )        A [ 3 ] − ( n [ 3 ] , m ) Z^{[3]}-(n^{[3]},m)\;\;\;A^{[3]}-(n^{[3]},m) Z[3](n[3],m)A[3](n[3],m)

输出层

Z [ 4 ] = W [ 4 ] A [ 3 ] + b [ 4 ]          A [ 4 ] = g ( Z [ 4 ] ) Z^{[4]} = W^{[4]}A^{[3]} + b^{[4]} \;\;\;\; A^{[4]} = g(Z^{[4]}) Z[4]=W[4]A[3]+b[4]A[4]=g(Z[4])

  • W [ 4 ] − ( n [ 4 ] , n [ 3 ] )        A [ 3 ] − ( n [ 3 ] , m )        b [ 4 ] − ( n [ 4 ] , 1 ) W^{[4]}-(n^{[4]},n^{[3]})\;\;\;A^{[3]} -(n^{[3]},m)\;\;\;b^{[4]}-(n^{[4]},1) W[4](n[4],n[3])A[3](n[3],m)b[4](n[4],1)
  • 计算之后 Z [ 4 ] − ( n [ 4 ] , m )        A [ 4 ] − ( n [ 4 ] , m ) Z^{[4]}-(n^{[4]},m)\;\;\;A^{[4]}-(n^{[4]},m) Z[4](n[4],m)A[4](n[4],m)

从上面的前馈过程使用归纳法可以得到对应参数的矩阵规律,以便在编写网络时候核对矩阵维度:
W [ l ] − ( n [ l ] , n [ l − 1 ] ) W^{[l]} -(n^{[l]},n^{[l-1]}) W[l](n[l],n[l1])
b [ l ] − ( n [ l ] , 1 ) b^{[l]} -(n^{[l]},1) b[l](n[l],1)
A [ l ] − ( n [ l ] , m ) A^{[l]} -(n^{[l]},m) A[l](n[l],m)
Z [ l ] − ( n [ l ] , m ) Z^{[l]} -(n^{[l]},m) Z[l](n[l],m)

2.2 反向传播

反向传播是对成本函数反向微分的过程,所以耗时会远大于前馈过程,这个过程中前馈的输入输出会反过来,为了便于理解对比,接下来使用与前馈一致的符号规定
这里为了直观我们将上述的网络结构抽象成一个流程图:
在这里插入图片描述
输出层
d A [ 4 ] = ∂ l o s s ∂ A [ 4 ] dA^{[4]} = \frac{\partial loss}{\partial A^{[4]}} dA[4]=A[4]loss
d Z [ 4 ] = d A [ 4 ]      ∂ A ∂ Z [ 4 ] = d A [ 4 ] ∗ g ′ ( Z [ 4 ] ) dZ^{[4]} =dA^{[4]}\;\; \frac{\partial A}{\partial Z^{[4]}} = dA^{[4]} * g^{'}(Z^{[4]}) dZ[4]=dA[4]Z[4]A=dA[4]g(Z[4])
d W [ 4 ] = 1 m d Z [ 4 ]      ∂ Z [ 4 ] ∂ W [ 4 ] = 1 m d Z [ 4 ]    A [ 3 ] T dW^{[4]} =\frac{1}{m} dZ^{[4]} \;\; \frac{\partial Z^{[4]}}{\partial W^{[4]}} = \frac{1}{m} dZ^{[4]} \;A^{[3]T} dW[4]=m1dZ[4]W[4]Z[4]=m1dZ[4]A[3]T
d b [ 4 ] = 1 m d Z [ 4 ]      ∂ Z [ 4 ] ∂ b [ 4 ] = 1 m d Z [ 4 ] db^{[4]} =\frac{1}{m} dZ^{[4]} \;\; \frac{\partial Z^{[4]}}{\partial b^{[4]}} = \frac{1}{m} dZ^{[4]} db[4]=m1dZ[4]b[4]Z[4]=m1dZ[4]
第3个隐藏层
d A [ 3 ] = d Z [ 4 ] ∂ Z [ 4 ] ∂ A [ 3 ] = W [ 4 ] T d Z [ 4 ] dA^{[3]} = dZ^{[4]}\frac{\partial Z^{[4]}}{\partial A^{[3]}} = W^{[4]T}dZ^{[4]} dA[3]=dZ[4]A[3]Z[4]=W[4]TdZ[4]
d Z [ 3 ] = d A [ 3 ]      ∂ A [ 3 ] ∂ Z [ 3 ] = W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) dZ^{[3]} =dA^{[3]}\;\; \frac{\partial A^{[3]} }{\partial Z^{[3]}} = W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) dZ[3]=dA[3]Z[3]A[3]=W[4]TdZ[4]g(Z[3])
d W [ 3 ] = 1 m d Z [ 3 ]      ∂ Z [ 3 ] ∂ W [ 3 ] = 1 m W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] )    A [ 2 ] T dW^{[3]} =\frac{1}{m} dZ^{[3]} \;\; \frac{\partial Z^{[3]}}{\partial W^{[3]}} = \frac{1}{m}W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]})\;A^{[2]T} dW[3]=m1dZ[3]W[3]Z[3]=m1W[4]TdZ[4]g(Z[3])A[2]T
d b [ 3 ] = 1 m d Z [ 3 ]      ∂ Z [ 3 ] ∂ b [ 3 ] = 1 m W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) db^{[3]} =\frac{1}{m} dZ^{[3]} \;\; \frac{\partial Z^{[3]}}{\partial b^{[3]}} = \frac{1}{m} W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) db[3]=m1dZ[3]b[3]Z[3]=m1W[4]TdZ[4]g(Z[3])

第2个隐藏层
d A [ 2 ] = d Z [ 3 ] ∂ Z [ 3 ] ∂ A [ 2 ] = W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) dA^{[2]} = dZ^{[3]}\frac{\partial Z^{[3]}}{\partial A^{[2]}} = W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]})) dA[2]=dZ[3]A[2]Z[3]=W[3]T(W[4]TdZ[4]g(Z[3]))
d Z [ 2 ] = d A [ 2 ]      ∂ A [ 2 ] ∂ Z [ 2 ] = W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) dZ^{[2]} =dA^{[2]}\;\; \frac{\partial A^{[2]} }{\partial Z^{[2]}} = W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) )* g^{'}(Z^{[2]}) dZ[2]=dA[2]Z[2]A[2]=W[3]T(W[4]TdZ[4]g(Z[3]))g(Z[2])
d W [ 2 ] = 1 m d Z [ 2 ]      ∂ Z [ 2 ] ∂ W [ 2 ] = 1 m W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) )    A [ 1 ] T dW^{[2]} =\frac{1}{m} dZ^{[2]} \;\; \frac{\partial Z^{[2]}}{\partial W^{[2]}} = \frac{1}{m}W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]})) * g^{'}(Z^{[2]}))\;A^{[1]T} dW[2]=m1dZ[2]W[2]Z[2]=m1W[3]T(W[4]TdZ[4]g(Z[3]))g(Z[2]))A[1]T
d b [ 2 ] = 1 m d Z [ 2 ]      ∂ Z [ 4 ] ∂ b [ 4 ] = 1 m W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ∗ g ′ ( Z [ 2 ] ) ) db^{[2]} =\frac{1}{m} dZ^{[2]} \;\; \frac{\partial Z^{[4]}}{\partial b^{[4]}} = \frac{1}{m} W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) * g^{'}(Z^{[2]})) db[2]=m1dZ[2]b[4]Z[4]=m1W[3]T(W[4]TdZ[4]g(Z[3])g(Z[2]))

第1个隐藏层
d A [ 1 ] = d Z [ 2 ] ∂ Z [ 2 ] ∂ A [ 1 ] = W [ 2 ] T ( W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) ) dA^{[1]} = dZ^{[2]}\frac{\partial Z^{[2]}}{\partial A^{[1]}} = W^{[2]T}(W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) )* g^{'}(Z^{[2]})) dA[1]=dZ[2]A[1]Z[2]=W[2]T(W[3]T(W[4]TdZ[4]g(Z[3]))g(Z[2]))
d Z [ 1 ] = d A [ 1 ]      ∂ A [ 1 ] ∂ Z [ 1 ] = W [ 2 ] T ( W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) ) ∗ g ′ ( Z [ 1 ] ) dZ^{[1]} =dA^{[1]}\;\; \frac{\partial A^{[1]} }{\partial Z^{[1]}} = W^{[2]T}(W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) )* g^{'}(Z^{[2]})) * g^{'}(Z^{[1]}) dZ[1]=dA[1]Z[1]A[1]=W[2]T(W[3]T(W[4]TdZ[4]g(Z[3]))g(Z[2]))g(Z[1])
d W [ 1 ] = 1 m d Z [ 1 ]      ∂ Z [ 1 ] ∂ W [ 1 ] = 1 m W [ 2 ] T ( W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) ) ∗ g ′ ( Z [ 1 ] )    A [ 0 ] T dW^{[1]} =\frac{1}{m} dZ^{[1]} \;\; \frac{\partial Z^{[1]}}{\partial W^{[1]}} = \frac{1}{m}W^{[2]T}(W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) )* g^{'}(Z^{[2]})) * g^{'}(Z^{[1]})\;A^{[0]T} dW[1]=m1dZ[1]W[1]Z[1]=m1W[2]T(W[3]T(W[4]TdZ[4]g(Z[3]))g(Z[2]))g(Z[1])A[0]T
d b [ 1 ] = 1 m d Z [ 2 ]      ∂ Z [ 4 ] ∂ b [ 4 ] = 1 m W [ 2 ] T ( W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) ) ∗ g ′ ( Z [ 1 ] ) db^{[1]} =\frac{1}{m} dZ^{[2]} \;\; \frac{\partial Z^{[4]}}{\partial b^{[4]}} = \frac{1}{m} W^{[2]T}(W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) )* g^{'}(Z^{[2]})) * g^{'}(Z^{[1]}) db[1]=m1dZ[2]b[4]Z[4]=m1W[2]T(W[3]T(W[4]TdZ[4]g(Z[3]))g(Z[2]))g(Z[1])

我们接着比对每一层 d w dw dw:

d W [ 4 ] = 1 m d Z [ 4 ]      ∂ Z [ 4 ] ∂ W [ 4 ] = 1 m d Z [ 4 ]    A [ 3 ] T dW^{[4]} =\frac{1}{m} dZ^{[4]} \;\; \frac{\partial Z^{[4]}}{\partial W^{[4]}} = \frac{1}{m} dZ^{[4]} \;A^{[3]T} dW[4]=m1dZ[4]W[4]Z[4]=m1dZ[4]A[3]T
d W [ 3 ] = 1 m d Z [ 3 ]      ∂ Z [ 3 ] ∂ W [ 3 ] = 1 m W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] )    A [ 2 ] T dW^{[3]} =\frac{1}{m} dZ^{[3]} \;\; \frac{\partial Z^{[3]}}{\partial W^{[3]}} = \frac{1}{m}W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]})\;A^{[2]T} dW[3]=m1dZ[3]W[3]Z[3]=m1W[4]TdZ[4]g(Z[3])A[2]T

d W [ 2 ] = 1 m d Z [ 2 ]      ∂ Z [ 2 ] ∂ W [ 2 ] = 1 m W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) )    A [ 1 ] T dW^{[2]} =\frac{1}{m} dZ^{[2]} \;\; \frac{\partial Z^{[2]}}{\partial W^{[2]}} = \frac{1}{m}W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]})) * g^{'}(Z^{[2]}))\;A^{[1]T} dW[2]=m1dZ[2]W[2]Z[2]=m1W[3]T(W[4]TdZ[4]g(Z[3]))g(Z[2]))A[1]T

d W [ 1 ] = 1 m d Z [ 1 ]      ∂ Z [ 1 ] ∂ W [ 1 ] = 1 m W [ 2 ] T ( W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) ) ∗ g ′ ( Z [ 1 ] )    A [ 0 ] T dW^{[1]} =\frac{1}{m} dZ^{[1]} \;\; \frac{\partial Z^{[1]}}{\partial W^{[1]}} = \frac{1}{m}W^{[2]T}(W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) )* g^{'}(Z^{[2]})) * g^{'}(Z^{[1]})\;A^{[0]T} dW[1]=m1dZ[1]W[1]Z[1]=m1W[2]T(W[3]T(W[4]TdZ[4]g(Z[3]))g(Z[2]))g(Z[1])A[0]T

当然这只是前向 & 反馈的一个计算推导,可以让我们更加清晰的去理解这个计算过程,所以建议可以尝试抛开python内置的一些内置模块去实现一个原生的神经网络;相信一定会受益匪浅.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
神经网络反向传播是一种用于训练神经网络的算法。它通过计算损失函数对网络中每个参数的偏导数来更新网络的参数,从而最小化损失函数。引用中提到了反向传播使用的链式求导法则。 具体来说,反向传播算法的步骤如下: 1. 输入一个训练样本,并将其传递给神经网络进行传播,计算出网络的输出值。 2. 计算损失函数,将网络的输出值与真实值进行比较,得到网络的误差。 3. 从输出层开始,根据链式求导法则,计算每个参数对误差的偏导数。这可以通过计算损失函数对每个参数的偏导数来完成。 4. 使用计算得到的偏导数来更新网络中的参数。常用的更新规则是梯度下降法,即根据参数的偏导数和学习率来更新参数的值。 5. 重复步骤1-4,直到达到停止条件(例如达到最大迭代次数或误差小于某个阈值)为止。 需要注意的是,在计算偏导数时,可以使用链式求导法则来将误差传播回每一层的参数。这使得即使是多层网络,也可以通过反向传播来计算每个参数的梯度。引用中给出的链式求导法则提供了更详细的数学基础。 总结起来,神经网络反向传播是通过计算损失函数对每个参数的偏导数,然后使用梯度下降法来更新参数,从而训练网络并最小化损失函数。这种算法可以有效地在多层网络中传播误差,并逐步优化网络的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值