美文网首页
神经网络反向传播

神经网络反向传播

作者: 扎哈_ | 来源:发表于2021-11-15 16:30 被阅读0次

    简单神经网络

    整理吴恩达老师的神经网络的前向和反向传播

    定义

    • 处理2分类问题
    • 神经网络有1个输入层(3个特征),1个隐层(4个神经元),1个输出层(单个神经元)
    • 隐层和输出层分别使用使用tanh和sigmoid函数作为激活函数
    • 数据集:X\in\mathbb {R}^{3*m}\quad 隐层权重:W^{[1]}\in \mathbb {R}^{4*3} \quad 输出层权重:W^{[2]}\in \mathbb {R}^{1*4} 结果集:Y\in\mathbb {R}^{1*m}

    向量化的前向传播

    • 隐层: Z^{[1]}=W^{[1]}X+b^{[1]} \quad\quad\quad\quad A^{[1]}=tanh(Z^{[1]})
    • 输出层:Z^{[2]}=W^{[2]}A^{[1]}+b \quad\quad\quad\quad A^{[2]}=sigmoid(Z^{[2]})
      (\#注释\# Z^{[1]}\in\mathbb {R}^{4*m}\quad A^{[1]}\in \mathbb {R}^{4*m}\quad Z^{[2]}\in \mathbb {R}^{1*m}\quad A^{[2]}\in \mathbb {R}^{1*m})

    损失函数

    • J=-\frac {1}{m}[Y⊙ \ln(A^{[2]}) + (1-Y)⊙\ln(1-A^{[2]})] \quad C\in \mathbb {R}^{1*m}

    推导反向传播

    • 损失函数对A^{[2]}的导数记为dA^{[2]}:
      (J仅对元素一一进行计算,求导结果只是对每个元素求导后按原矩阵排列方式将结果排列成一个新矩阵)
      \begin {aligned} \frac {dJ}{dA^{[2]}} &= \frac { d(-\frac {1}{m}[Y⊙\ln(A^{[2]}) + (1-Y)⊙ \ln(1-A^{[2]})])}{dA^{[2]}} \\ &= -\frac {1}{m} [Y⊙\frac {1}{A^{[2]}} + (1-Y )⊙\frac {1}{1-A^{[2]}}] \quad (2.1) \end {aligned}
    • A^{[2]}Z^{[2]}求导:
      (sigmoid(Z^{[2]})仅对元素一一进行计算,求导结果只是对每个元素求导后按原矩阵排列方式将结果排列成一个新矩阵)
      (sigmoid函数导数有很好的性质:sig'(x)=sig(x)(1-sig(x)))
      \begin {aligned} \frac {dA^{[2]}}{dZ^{[2]}} = \frac {d(sigmoid(Z^{[2]}))}{dZ^{[2]}} &= sigmoid(Z^{[2]})⊙(1- sigmoid(Z^{[2]})) \quad (2.2) \end {aligned}
    • Z^{[2]}W^{[2]}求导:
      \begin {aligned} \frac {dZ^{[2]}}{dW^{[2]}} = \frac {d(W^{[2]}A^{[1]}+b )}{dW^{[2]}} &= {A^{[1]}}_{(m*4)}^{T} \quad (2.3.1) \end {aligned}
    • Z^{[2]}b^{[2]}求导:
      \begin {aligned} \frac {dZ^{[2]}}{db^{[2]}} &= \frac {d(W^{[2]}A^{[1]}+b^{[2]})}{db^{[2]}} \\ &= 1 \quad (2.3.2) \end {aligned}
    • Z^{[2]}A^{[1]}求导:
      \begin {aligned} \frac {dZ^{[2]}}{dA^{[1] }} = \frac {d(W^{[2]}A^{[1]}+b)}{dA^{[1]}} &= {W^{[2]}}_{(4*1)}^{T}\quad (2.4) \end {aligned}
    • \frac {dJ}{dA^{[1]} }就为:
      (后两步是对元素一一计算,所以求导后的链式法则也同样需要用元素一一对应的计算方式)
      (\frac {dZ^{[2]}}{dA^{[1]} }因为A^{[1]}Z^{[2]}=W^{[2]}A^{[1]}+b公式的右乘子,所以导数求点积乘时放在左边)
      \begin {aligned} \frac {dJ}{dA^{[1]}} &=\frac {dZ^{[2]}}{dA^{[1]} }·(\frac {dA^{[2]}}{dZ^{[2]}}⊙\frac {dJ}{dA^{[2]}}) \\ &={W^{[2]}}^{T}·sig(Z^{[2]})⊙(1-sig(Z^{[2]}))⊙(-1)\frac {1}{m}[Y⊙\frac {1}{A^{[2]}} + (1-Y)⊙\frac {1}{1-A^{[2]}}] \\ &={W^{[2]}}^{T}·A^{[2]}⊙(1-A^{[2]})⊙(-1)\frac {1}{m}[Y⊙\frac {1}{A^{[2]}} + (1-Y)⊙\frac {1}{1-A^{[2]}}] \\ &={W^{[2]}}^{T}·\frac {1}{m }(A^{[2]}-Y) \in \mathbb {R}^{4*m } \quad (2.5) \end {aligned}
    • 继续向前,A^{[1]}Z^{[1]}求导:
      (tanh(Z^{[1]})仅对元素一一进行计算,求导结果只是对每个元素求导后按原矩阵排列方式将结果排列成一个新矩阵)
      \begin {aligned} \frac {dA^{[1]}}{dZ^{[1]}}&=\frac {d(tanh(Z^{[1]}))}{dZ^{[1]}} \\ &=1-(tanh(z^{[1]})⊙tanh(z^{[1]})) \\ &=1-tanh(z^{[1]})^2 \quad \in \mathbb {R}^{4*m} \end {aligned}
    • Z^{[1]}W^{[1]} 求导:
      \frac {dZ^{[1]}}{dW^{[1]}}=X^T \in \mathbb {R}^{m*3}
    • \frac {dJ}{dW^{[1] }}为:
      (\frac {dZ^{[1]}}{dW^{[1]}}因为W^{[1]}Z^{[1]}=W^{[1]}X+b公式的左乘子,所以导数求点积乘时放在右边)
      \begin {aligned} \frac {dJ}{dW^{[1] }}&=(\frac {dA^{[1]}}{dZ^{[1]}}⊙(\frac {dZ^{[2]}}{dA^{[1]}} · (\frac {dA^{[2]}}{dZ^{[2]}}⊙\frac {dJ}{dA^{[2]}})))·\frac {dZ^{[1]}}{dW^{[1]}} \\ &=((1-tanh(z^{[1]})^2 )⊙{W^{[2]}}^{T}·\frac {1}{m }(A^{[2] }-Y)) · X^T \end {aligned}
      其他项均可依葫芦画瓢得出。反向计算需要先求出反向第一项的结果,再与反向第二项结果进行计算,以此计算到反向推导的最后一项。如果计算过程中顺序出现错乱,则很有可能在写出的python代码中出现各种错误或奇怪的bug。

    相关文章

      网友评论

          本文标题:神经网络反向传播

          本文链接:https://www.haomeiwen.com/subject/kiowzltx.html