栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

反向传播的一般情形

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

反向传播的一般情形

前提条件
  • 使用交叉熵损失函数
  • 使用sigmod激活函数
  • 输出层使用softmax函数
网络结构
  • 全连接,输出层没有sigmoid函数,使用softmax函数
目标
  • 推导前提条件下的四个反向传播方程
  • Python实现手写数字识别(两个隐藏层,第一隐藏层192个神经元,第二个隐藏层30个神经元)

    其中, w i j l w^{l}_{ij} wijl​表示第 l l l层的第 j j j个神经元到第 l + 1 l+1 l+1层第 i i i个神经元的权重,可以将 w i j l w^{l}_{ij} wijl​理解为 ( W l ) T (W^{l})^{T} (Wl)T对应的元素; b i l b^{l}_{i} bil​表示第 l l l层到第 l + 1 l+1 l+1层第 i i i个神经元的偏置。
BP方程推导过程
  • 推导方式:从某个神经元 j j j拓展到整个层的神经元
  • 引入中间变量: δ j l = ∂ E ∂ z j l delta^{l}_{j}=frac{partial\E}{partial\z^{l}_{j}} δjl​=∂zjl​∂E​,表示第푙层第푗个神经元的误差。其中 E E E表示损失函数。
BP1

定义网络的输出层为第 L L L层,则由 s o f t m a x softmax softmax函数可得,第 L L L层第 j j j个神经元的输出为:
h j L = e z j L ∑ j = 1 d L e z j L h^{L}_{j}=frac{e^{z^{L}_{j}}}{sum_{j=1}^{d_{L}}e^{z^{L}_{j}}qquad} hjL​=∑j=1dL​​ezjL​ezjL​​(1)
因为损失函数为交叉熵损失函数,则
E = ∑ j = 1 d L − y j l n h j L E=sum_{j=1}^{d_{L}}-y_{j}lnh^{L}_{j}qquad E=∑j=1dL​​−yj​lnhjL​(2)
又因为标签 y y y是one-hot( y i = 1 y_{i}=1 yi​=1,其余项均为0),所以
E = − l n h j L E=-lnh^{L}_{j} E=−lnhjL​(3)
进一步地,由式(1)和式(3),可得
E = − l n h j L = − l n e z j L ∑ j = 1 d L e z j L = − z i L + l n ∑ j = 1 d L e z j L E=-lnh^{L}_{j}=-lnfrac{e^{z^{L}_{j}}}{sum_{j=1}^{d_{L}}e^{z^{L}_{j}}qquad}=-z^{L}_{i}+ln{sum_{j=1}^{d_{L}}e^{z^{L}_{j}}qquad} E=−lnhjL​=−ln∑j=1dL​​ezjL​ezjL​​=−ziL​+ln∑j=1dL​​ezjL​(4)
下面对 δ j l = ∂ E ∂ z j l delta^{l}_{j}=frac{partial\E}{partial\z^{l}_{j}} δjl​=∂zjl​∂E​进行分类讨论,当 j = i j=i j=i时,有
δ i l = ∂ E ∂ z i l = − 1 + h i L delta^{l}_{i}=frac{partial\E}{partial\z^{l}_{i}}=-1+h^{L}_{i} δil​=∂zil​∂E​=−1+hiL​(5)
当 j ≠ i j{neq}i j​=i时,有
δ j l = ∂ E ∂ z j l = 0 + h j L delta^{l}_{j}=frac{partial\E}{partial\z^{l}_{j}}=0+h^{L}_{j} δjl​=∂zjl​∂E​=0+hjL​(6)
联合式(5)和式(6)可得
δ j l = ∂ E ∂ z j l = h j L − y j delta^{l}_{j}=frac{partial\E}{partial\z^{l}_{j}}=h^{L}_{j}-y_{j} δjl​=∂zjl​∂E​=hjL​−yj​(7)
扩展到矩阵运算,得到BP1:
δ L = ∂ E ∂ z L = h L − y delta^{L}=frac{partial\E}{partial\z^{L}}=h^{L}-y δL=∂zL∂E​=hL−y, δ L ∈ R d L × 1 delta^{L}{in}R^{d_{L}{times}1} δL∈RdL​×1(8)

BP2

BP2是整个反向传播方程最关键的一步。BP2寻找网络层与层之间的联系,即推导 δ l + 1 delta^{l+1} δl+1和 δ l delta^{l} δl之间的关系,又由 δ l + 1 delta^{l+1} δl+1和 δ l delta^{l} δl的定义是 E E E关于 z l + 1 z^{l+1} zl+1和 z l z^{l} zl的误差,最终转化为寻找 z l + 1 z^{l+1} zl+1和 z l z^{l} zl的联系。

由上图可得,第 l + 1 l+1 l+1层的第 j j j个神经元 z j l + 1 z^{l+1}_{j} zjl+1​接收由第 l l l层所有神经元发送的权重(多对一的关系),即
z j l + 1 = ∑ k = 1 d l w j k l h k l + b j l z^{l+1}_{j}={sum_{k=1}^{d_{l}}{w^{l}_{jk}}{h_{k}^{l}}qquad}+b^{l}_{j} zjl+1​=∑k=1dl​​wjkl​hkl​+bjl​(9)

而第 l l l层第 j j j个神经元 z j l z^{l}_{j} zjl​和 h j l h^{l}_{j} hjl​之间的差别仅仅是一个sigmoid函数
h j l = σ ( z j l ) h^{l}_{j}=sigma(z^{l}_{j}) hjl​=σ(zjl​)(10)
联合式(9)和式(10)可以得到 z l z^{l} zl和 z l + 1 z^{l+1} zl+1的关系
z j l + 1 = ∑ k = 1 d l w j k l σ ( z k l ) + b j l z^{l+1}_{j}={sum_{k=1}^{d_{l}}{w^{l}_{jk}}sigma(z^{l}_{k})qquad}+b^{l}_{j} zjl+1​=∑k=1dl​​wjkl​σ(zkl​)+bjl​(11)
这里需要注意的是,第 l l l层的第 j j j个神经元向第 l + 1 l+1 l+1层所有的神经元都发送了权重(一对多的关系),所以
δ j l = ∂ E ∂ z j l = ∑ k = 1 d l + 1 ∂ E ∂ z k l + 1 ∂ z l + 1 ∂ z j l = ∑ k = 1 d l + 1 δ k l + 1 w k j l σ , ( z j l ) delta^{l}_{j}=frac{partial\E}{partial\z^{l}_{j}}={sum_{k=1}^{d_{l+1}}frac{partial\E}{partial\z^{l+1}_{k}}frac{partial\z^{l+1}}{partial\z^{l}_{j}}qquad}\={sum_{k=1}^{d_{l+1}}delta^{l+1}_{k}w^{l}_{kj}sigma^{,}(z^{l}_{j})qquad} δjl​=∂zjl​∂E​=∑k=1dl+1​​∂zkl+1​∂E​∂zjl​∂zl+1​=∑k=1dl+1​​δkl+1​wkjl​σ,(zjl​)(12)

扩展到矩阵运算,其中 δ l + 1 ∈ R d l + 1 × 1 delta^{l+1}in{R^{d_{l+1}times1}} δl+1∈Rdl+1​×1; W l ∈ R d l × d l + 1 W^{l}in{R^{d_{l}times{d_{l+1}}}} Wl∈Rdl​×dl+1​; z l ∈ R d l × 1 z^{l}in{R^{d_{l}times1}} zl∈Rdl​×1,得到BP2:
δ l = ∂ E ∂ z l = σ , ( z l ) ⊙ ( W l δ l + 1 ) delta^{l}=frac{partial\E}{partial\z^{l}}=sigma^{,}(z^{l})odot(W^{l}delta^{l+1}) δl=∂zl∂E​=σ,(zl)⊙(Wlδl+1), δ l ∈ R d l × 1 delta^{l}in{R^{d_{l}times1}} δl∈Rdl​×1(13)
BP2比较复杂,字母下标很容易搞混淆,关键在于理解层与层之间多对多的关系。

BP3

得到BP2之后,开始正式推导 ∂ E ∂ b j l − 1 frac{partial\E}{partial\b^{l-1}_{j}} ∂bjl−1​∂E​(写成 ∂ E ∂ b j l − 1 frac{partial\E}{partial\b^{l-1}_{j}} ∂bjl−1​∂E​而不是 ∂ E ∂ b j l frac{partial\E}{partial\b^{l}_{j}} ∂bjl​∂E​的形式只是为了对应BP2),这是反向传播过程中真正需要更新的参数。
由上文中的式(9)
z j l + 1 = ∑ k = 1 d l w j k l h k l + b j l z^{l+1}_{j}={sum_{k=1}^{d_{l}}{w^{l}_{jk}}{h_{k}^{l}}qquad}+b^{l}_{j} zjl+1​=∑k=1dl​​wjkl​hkl​+bjl​(9)
进行简单地变换得到
z j l = ∑ k = 1 d l − 1 w j k l − 1 h k l − 1 + b j l − 1 z^{l}_{j}={sum_{k=1}^{d_{l-1}}{w^{l-1}_{jk}}{h_{k}^{l-1}}qquad}+b^{l-1}_{j} zjl​=∑k=1dl−1​​wjkl−1​hkl−1​+bjl−1​(14)
推导可得
∂ E ∂ b j l − 1 = ∂ E ∂ z j l ∂ z j l ∂ b j l − 1 = δ j l frac{partial\E}{partial\b^{l-1}_{j}}=frac{partial\E}{partial\z^{l}_{j}}frac{partial\z^{l}_{j}}{partial\b^{l-1}_{j}}=delta^{l}_{j} ∂bjl−1​∂E​=∂zjl​∂E​∂bjl−1​∂zjl​​=δjl​
扩展到矩阵运算,得到BP3:
∂ E ∂ b l − 1 = ∂ E ∂ z l ∂ z l ∂ b l − 1 = δ l frac{partial\E}{partial\b^{l-1}}=frac{partial\E}{partial\z^{l}}frac{partial\z^{l}}{partial\b^{l-1}}=delta^{l} ∂bl−1∂E​=∂zl∂E​∂bl−1∂zl​=δl

BP4

BP4由式(14)推导 ∂ E ∂ w j k l − 1 frac{partial\E}{partial\w^{l-1}_{jk}} ∂wjkl−1​∂E​
z j l = ∑ k = 1 d l − 1 w j k l − 1 h k l − 1 + b j l − 1 z^{l}_{j}={sum_{k=1}^{d_{l-1}}{w^{l-1}_{jk}}{h_{k}^{l-1}}qquad}+b^{l-1}_{j} zjl​=∑k=1dl−1​​wjkl−1​hkl−1​+bjl−1​(14)
对于具体的每一个参数 w j k l − 1 {w^{l-1}_{jk}} wjkl−1​,有
∂ E ∂ w j k l − 1 = ∂ E ∂ z j l ∂ z j l ∂ w j k l − 1 = δ j l h k l − 1 frac{partial\E}{partial\w^{l-1}_{jk}}=frac{partial\E}{partial\z^{l}_{j}}frac{partial\z^{l}_{j}}{partial\w^{l-1}_{jk}}=delta^{l}_{j}h_{k}^{l-1} ∂wjkl−1​∂E​=∂zjl​∂E​∂wjkl−1​∂zjl​​=δjl​hkl−1​
扩展到矩阵运算, δ l ∈ R d l × 1 delta^{l}in{R^{d_{l}times1}} δl∈Rdl​×1; h l − 1 ∈ R d l − 1 × 1 h^{l-1}in{R^{d_{l-1}times1}} hl−1∈Rdl−1​×1,得到BP4:
∂ E ∂ W l − 1 = ∂ E ∂ z l ∂ z l ∂ W l − 1 = h l − 1 ( δ l ) T frac{partial\E}{partial\W^{l-1}}=frac{partial\E}{partial\z^{l}}frac{partial\z^{l}}{partial\W^{l-1}}=h^{l-1}(delta^{l})^{T} ∂Wl−1∂E​=∂zl∂E​∂Wl−1∂zl​=hl−1(δl)T, ∂ E ∂ W l − 1 ∈ R d l − 1 × d l frac{partial\E}{partial\W^{l-1}}in{R^{d_{l-1}times{d_{l}}}} ∂Wl−1∂E​∈Rdl−1​×dl​

BP方程
  • BP1: δ L = ∂ E ∂ z L = h L − y delta^{L}=frac{partial\E}{partial\z^{L}}=h^{L}-y δL=∂zL∂E​=hL−y, δ L ∈ R d L × 1 delta^{L}{in}R^{d_{L}{times}1} δL∈RdL​×1
  • BP2: δ l = ∂ E ∂ z l = σ , ( z l ) ⊙ ( W l δ l + 1 ) delta^{l}=frac{partial\E}{partial\z^{l}}=sigma^{,}(z^{l})odot(W^{l}delta^{l+1}) δl=∂zl∂E​=σ,(zl)⊙(Wlδl+1), δ l ∈ R d l × 1 delta^{l}in{R^{d_{l}times1}} δl∈Rdl​×1(13)
  • BP3: ∂ E ∂ b l − 1 = ∂ E ∂ z l ∂ z l ∂ b l − 1 = δ l frac{partial\E}{partial\b^{l-1}}=frac{partial\E}{partial\z^{l}}frac{partial\z^{l}}{partial\b^{l-1}}=delta^{l} ∂bl−1∂E​=∂zl∂E​∂bl−1∂zl​=δl
  • BP4: ∂ E ∂ W l − 1 = ∂ E ∂ z l ∂ z l ∂ W l − 1 = h l − 1 ( δ l ) T frac{partial\E}{partial\W^{l-1}}=frac{partial\E}{partial\z^{l}}frac{partial\z^{l}}{partial\W^{l-1}}=h^{l-1}(delta^{l})^{T} ∂Wl−1∂E​=∂zl∂E​∂Wl−1∂zl​=hl−1(δl)T, ∂ E ∂ W l − 1 ∈ R d l − 1 × d l frac{partial\E}{partial\W^{l-1}}in{R^{d_{l-1}times{d_{l}}}} ∂Wl−1∂E​∈Rdl−1​×dl​
问题
  • 如果输出层使用sigmoid函数,均方误差损失函数,BP方程会有什么变化?
    答:仅BP1发生变化
  • 如果改用Relu函数作为激活函数,BP方程会有什么变化?
    答:仅BP2发生变化
代码实现
  • Python实现手写数字识别(两个隐藏层,第一隐藏层192个神经元,第二个隐藏层30个神经元)
  • 输入图像像素为 28 × 28 = 784 28times28=784 28×28=784
# 明天再实现
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290625.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号