• BP(反向传播)算法推导带图片详解



     适合不熟悉矩阵求导的人,我会尽量用数学公式和图解的方式来详细地推导BP算法。

    在这里插入图片描述

    标记规定

    θ j k l mathop heta olimits_{jk}^l θjkl:代表连接第l层第k个神经元和第l+1层第j个神经元的权重参数。
    z j l mathop z olimits_j^l zjl: 代表第l层第j个神经元的输入。
    a j l mathop a olimits_j^l ajl: 代表第l层第j个神经元的输出。
    σ sigma σ :代表激活函数。
    δ j l mathop delta olimits_j^l δjl :代表第l层第j个神经元产生的错误。
    L:代表神经网络的层数(这里可以理解为3)。
    c :代表代价函数(不太明白的话可以就直接理解为关于输出层a的函数)。
    这里的规定标记不熟悉的话可以看一下吴恩达大佬的机器学习课程。

    公式一(反向传播最后一层的错误)

     我们不采用向量的形式来推导,这里仅是涉及到标量的计算。
    根据定义: δ j l mathop delta olimits_j^l δjl = δ C δ z j l frac{{delta { m{C}}}}{{delta mathop z olimits_j^l }} δzjlδC(学过微积分的同学肯定很好理解,这里的错误就是反应了这个神经元对代价函数的影响有多大)。
    由链式法则可以得到:
    δ j L mathop delta olimits_j^L δjL = δ C δ a j L frac{{delta { m{C}}}}{{delta mathop a olimits_j^L }} δajLδC * δ a j L δ z j L frac{{delta { m{ mathop a olimits_j^L}}}}{{delta mathop z olimits_j^L }} δzjLδajL。这两个式子就很容易算出来,第一个在已知C的时候很容易就求出来了,第二个的话因为 a j l mathop a olimits_j^l ajl = σ sigma σ( z j L mathop z olimits_j^L zjL),所以也很容易求出来(但是这里特别要注意的是因为我们反向传播的时候是只是知道 a j L mathop a olimits_j^L ajL的值,所以需要用 a j L mathop a olimits_j^L ajL来计算 σ sigma σ '( z j L mathop z olimits_j^L zjL)的值)。
     然后,我们用向量的形式来计算:
    δ L mathop delta olimits^L δL = δ C δ a L frac{{delta { m{C}}}}{{delta mathop a olimits^L}} δaLδC .* δ a L δ z L frac{{delta { m{ mathop a olimits^L}}}}{{delta mathop z olimits^L }} δzLδaL。(这个.*就是对应元素相乘)。就这里的网络结构来看 δ L mathop delta olimits^L δL算出来就是一个2×1的向量。

    公式二(每一层的误差计算)

     同样还是从标量的形式来看:
    δ j l mathop delta olimits_j^l δjl = δ C δ z j l frac{{delta { m{C}}}}{{delta mathop z olimits_j^l }} δzjlδC(这里可以把l看做2)。则由链式法则可得:
    δ j l mathop delta olimits_j^l δjl = ∑ k δ C δ z k l + 1 × δ z k l + 1 δ a j l × δ a j l δ z j l sum olimits_k {frac{{delta C}}{{delta mathop z olimits_k^{l + 1} }}} { m{ imes }}frac{{delta mathop z olimits_k^{l + 1} }}{{delta mathop a olimits_j^l }}{ m{ imes }}frac{{delta mathop a olimits_j^l }}{{delta mathop z olimits_j^l }} kδzkl+1δC×δajlδzkl+1×δzjlδajl。我解释一下为什么要做这个k的累和,首先我们来看这样一张图(就是这里第一层映射到第二层的图):
    在这里插入图片描述
    从这个矩阵乘法就可以看出来每一个 a j 1 mathop a olimits_j^1 aj1 z k 2 mathop z olimits_k^2 zk2都有贡献,所以这里需要求和才能算出 δ j l mathop delta olimits_j^l δjl
    所以:
    δ j l mathop delta olimits_j^l δjl = ∑ k δ j l + 1 × θ k j l × σ ′ ( z j l ) sum olimits_k{mathop delta olimits_j^{l+1}×mathop heta olimits_{kj}^l×sigma'(mathop z olimits_j^l)} kδjl+1×θkjl×σ(zjl)
     然后我们再来看看矩阵形式的表示(如果熟悉矩阵求导的话就可以不用看了),同样还是先看一张图:
    在这里插入图片描述
    这个图就是刚刚向量方式计算出来的错误的矩阵计算形式,这里可以看出来θ是要转置的,于是我们便得出了 δ l mathop delta olimits^l δl 的矩阵表示形式。
    δ l mathop delta olimits^l δl = ( θ l . T ∗ δ l + 1 ) . ∗ σ ′ ( z j l ) (mathop heta olimits^l.T * mathop delta olimits^{l+1}) .* sigma'(mathop z olimits_j^l) (θl.Tδl+1).σ(zjl)

    公式三(权重θ的梯度)

     BP算法的最终目的便是要求出来权重的梯度以便于更新权重,所以接下来我们看看权重的梯度是如何计算的。
     同样先是看看在标量之下如何计算:
    δ C δ θ j k l = δ C δ z j l + 1 × δ z j l + 1 δ θ j k l = δ j l + 1 × a k l frac{{delta C}}{{delta mathop heta olimits_{jk}^l }}{ m{ = }}frac{{delta { m{C}}}}{{delta mathop z olimits_j^{l + 1} }}{ m{ imes }}frac{{delta mathop z olimits_j^{l + 1} }}{{delta mathop heta olimits_{jk}^l }} = mathop delta olimits_j^{l + 1} { m{ imes }}mathop a olimits_k^l δθjklδC=δzjl+1δC×δθjklδzjl+1=δjl+1×akl
     然后用矩阵进行表示,还是先看一张图,注意:这里右边那个是θ梯度矩阵,不是θ的矩阵(主要是博主比较懒,不想画了):
    在这里插入图片描述
    以上就是BP算法的推导,如果熟悉矩阵求导的话就可以跳过那些图片啦,博主主要是想用一种更直观的方式来介绍BP算法。当然还有偏置bias的求导,大家可以自己这样推一推。

  • 相关阅读:
    java类继承总结一 父类类型与子类类型之间的转化问题(转)
    将子类对象引用赋值给超类对象 JAVA 编译时多态性
    JAVA访问控制变量、类变量、类方法
    java传递是引用的拷贝,既不是引用本身,更不是对象
    JAVA的StringBuffer类
    (文件名.JAVA)的文件名只能与该文件中的public类的名称一致
    类变量(静态变量)的值不能被构造函数改写
    程序启动的顺序以及实例变量相互赋值、传递拷贝的理解
    MySQL选择合适的字符集
    MySQL日期类型选择
  • 原文地址:https://www.cnblogs.com/lsl1229840757/p/14122608.html
Copyright © 2020-2023  润新知