zoukankan      html  css  js  c++  java
  • 反向传播算法简介

    <!doctype html>

    反向传播算法

    反向传播算法简介(BP)

    原文地址:http://neuralnetworksanddeeplearning.com/chap2.html

    BP (Backpropagation algorithm) 算法所关注的是神经网络中损失函数 C (cost function) 与每一个权重 和偏置 的偏导。BP 不仅仅是一个快速的算法,其同时为我们提供了一个视角,让我们观察权值和偏置是如何影响网络输出的。

    译者注:本文中所描述的网络以层为单位,如果把层当做图的节点,数据流向作为图的有向边,那么本文所描述的网络所抽象出的图一定是有向无环的。本文并没有翻译原文所有内容

    1. 热身:利用矩阵实现网络计算

    先介绍一种网络权重的数学标记法:,这个数学标记表示神经网络中第 层的第 个元素和第 层第 个元素之间的权重。同样, 表示网络第 层第 个元素的偏置值, 表示 层第 个元素的激活函数输出值。利用这种数学标记法, 可以表示为:

    其中 为神经元的激活函数,使用矩阵形式表示上述表达式:

    定义 为神经元激活函数的输入值则可以将上面表达式 表示为:

    2. 损失函数的两个特点

    BP 算法用于计算网络中所有权重 和偏置 关于损失函数 的偏导数 。为了使 BP 算法正常运行,损失函数需要满足两个条件。在给出这两个条件前,我们先介绍一种常用的均方差损失函数,如式所示:

    表达式 中变量分别为: 是训练网络的样本个数; 是训练样本 的期望值(也就是样本的标签值); 表示网络的层数; 是网络在输入为 时输出层的输出。

    现在描述我们对损失函数的要求。首先,损失函数可以写成所有训练样本损失值均值的形式:

    我们做上面的要求是因为训练的过程中我们常常使用批训练的方式,而不是每次只使用一个样本训练网络。批训练之后我们求当前批次样本损失值的平均数来更新权重和偏置,所以损失函数要满足叠加定理。

    其次,损失函数可以使用网络输出层的输出作为参数: 是网络输出层的输出,如果不满足这个要求我们将不能定量分析网络的性能(因为无法计算网络的损失值)。以均方差损失函数为例,当样本为 时,网络的损失值为:

    上式中所有元素的值都是已知的, 是标签、 是网络输出层的输出。

    3. Hadamard 积,

    Hadamardd 积(哈达玛积)表示矩阵按对应元素做乘法:,例如:

    4. BP 算法所依赖的四个方程

    BP 算法用于计算网络中权值与偏置关于网络损失值的偏导,也就是计算: 。在计算偏导前我们先引入一个中间变量 ,这个变量表示网络第 层第 个元素的输入值()对整个网络损失的影响。BP 算法可以帮我们计算出 ,然后我们就可以通过 得到

    为了便于理解,这里我们假设网络中的某个神经元(第 层第 个)旁边住着一个小恶魔,它可以帮我们调整神经元的输入()。小恶魔不出手时这个神经元的输入为:,小恶魔出手后,当前神经元的输入为:,其中 是小恶魔做的调整,此时这个神经元的输出为 。小恶魔对当前神经元的调整最终将影响整个网络的输出,小恶魔出手后对整个网络损失值的影响为:

    如果这是一个善良的小恶魔,那么它可以帮我们调整输入以减少网络的损失值。如果 的值不为0,那么调整,将减小整个网络的损失值( 是学习率,是个比较小的小数)。如果 的值为0,那么小恶魔的调整对网络损失的贡献就非常小,因为导数为 0,再大的调整对网络都没有影响(这里暂不考虑舍入误差)。

    我们定义 如下:

    的矩阵表示方法为:。BP 算法可以帮助我们计算网络中每一层的

    4.1 BP1:输出层损失值计算

    网络输出层 的计算方式为:

    BP1 等号右侧偏导部分表示网络输出层最后的输出对网络损失的影响强度, 的导数表示这个神经元输入对整个网络损失的影响强度(下有证明)。

    需要注意的是对于最后一层而言,BP1 的结果是很容易计算的。依赖于损失函数的形式。举个例子,如果我们使用式中的均方差作为最终的损失函数,那么

    以矩阵的形式表示

    如果损失函数还是均方差的话,那么 ,从而可得:

    证明:

    4.2 BP2:使用 计算

    先给出公式:

    是网络第层权值矩阵的转置。结合,我们可以计算出网络中所有层的

    证明:

    使

    写成矩阵形式即为式

    译者注

    如果将神经网络的每一层都看做一个函数 为当前层的输入, 是当前层的输出,则输入对输出影响的强度即为函数的导数:

    神经网络一般有很多层,每一层的输入都是前一层的输出(这里只考虑简单的网络,每一层的输入只和相邻的前一层相关),那么一个含有两个隐藏层的网络可以用函数 表示。其中 是整个网络的输入, 表示第一层网络, 表示第二层网络, 为整个网络的输出。

    在已知第二层网络输入的前提下,。在已知网络第一层输入 的前提下,求 需要使用微积分中的链式求导法则,即:

    中所包含的思想和式是相同的,在已知 的前提下 也是已知的。因为 的函数形式是已知的故其导数形式也是已知的。

    综上所述,所有层的 都是可以通过链式求导法则进行计算的。

    4.3 BP3:偏置值对网络损失值的影响

    网络中偏置值 的变化对网络损失值的影响可以使用如下表达式进行计算:

    结合可证式

    从式可知,我们可以使用来计算偏置值关于损失函数的梯度。

    4.4 BP4:权值对网络损失值的影响

    告诉我们,我们可以使用前一层网络的输出和 来计算权值关于损失函数的梯度,而这些值都是已知的。

    证明:

    观察上面几个方程,对于输出层而言,如果非常大且我们使用的激活函数为,那么,此时,网络是无法更新权重与偏置的,即网络失去了学习能力。

    随着网络层数的增加,位于左侧的层其权值与偏置也将非常难以更新,因为 值向左传播的过程中会越来越接近于0。因此,好的激活函数对网络的训练是有益的,而且网络的层数也不是越多越好,跨层连接(如ResNet)对网络的训练也是有益的。

    BP所依赖的四个方程总结如下:

  • 相关阅读:
    window查看已保存过的wifi的密码
    js 多个数组取交集
    macOS APP 窗口焦点监听
    proxifier注册码
    天才算法之睡眠排序(C#实现)
    Tomcat 7使用AJP协议设置问题
    nginx启动报错(1113: No mapping for the Unicode character exists in the target multi-byte code page)
    八皇后的n种放置方法
    insufficient permission for adding an object to repository database .git/objects
    centos下搭建php开发环境(lamp)
  • 原文地址:https://www.cnblogs.com/jiahu-Blog/p/11411346.html
Copyright © 2011-2022 走看看