1. 基于矩阵计算网络输出

首先给出网络中权重的清晰定义。使用表示从层的个神经元到层的个神经元的链接上的权重。如下图所示,给出了第2个隐藏层的第4个神经元到第3个隐藏层的第2个神经元的链接上的权重。

对网络偏差和激活值也使用类似的表示。显式地,使用 表示在 个神经元的偏差,使用 表示 个神经元的激活值。如下图所示。

这样一来, 层的 个神经元的激活值 就与 层的激活值关联起来了,如下式所示。

我们引入向量化函数来按照矩阵形式重写上述公式,由于我们对权值矩阵 索引下标做出了定义,于是上式就转化为下面这种整洁的形式,避免了对权值矩阵做转置运算。

利用上述方程计算 时,我们称中间量 层的带权输入。则 的每个元素是 ,即 个神经元的激活函数的带权输入。

2. 关于代价函数的两个假设

反向传播的目标是计算代价函数 分别关于 和 的偏导数。为了让反向传播可行,我们需要做出关于代价函数的两个主要假设。这里以二次代价函数为例。


其中n是训练样本的总数;求和是在所有的训练样本x上进行的;y=y(x)是对应的目标输出;L表示网络的层数; 是当输入是x时的网络输出的激活值向量。
第一个假设就是代价函数可以被写成一个在每个训练样本x上的代价函数 的均值 。这是关于二次代价函数的例子, 其中对每个独立的训练样本其代价是 。需要这个假设的原因是反向传播实际上是对一个独立的训练样本计算了 。然后我们通过在所有训练样本上进行平均化获得 。实际上,有了这个假设,我们会认为训练样本x已经被固定住了,丢掉了其下标,将代价函数 看做
第二个假设就是代价可以写成神经网络输出的函数:

例如,二次代价函数满足这个要求,因为对于一个单独的训练样本 其二次代价函数可以写作:

这是输出的激活值的函数。当然,这个代价函数同样还依赖于目标输出。输入的训练样本x是固定的,所以输出同样是一个固定的参数。所以说,并不是可以随意改变权重和偏差的,也就是说,这不是神经网络学习的对象。所以,将 看成仅有输出激活值 的函数才是合理的,而y仅仅是帮助定义函数的参数而已。

3. 反向传播的四个基本方程

1)Hadamard 乘积
反向传播基于一种叫做Hadamard 乘积的矩阵运算实现。特别地,假设s和t是两个同样维度的向量。那么我们使用来表示按元素的乘积。所以的元素就是。给个例子,


2)四个基本方程
反向传播其实是对权重和偏差变化影响代价函数过程的理解。 最终极的含义其实就是计算偏导数 。但是为了计算这些值,我们首先引入一个中间量 ,这个我们称为在 层第 个神经元上的误差(error)。反向传播将给出计算误差 的流程,然后将其关联到计算 上。
为了理解误差是如何定义的,假设在神经网络上有一个小精灵:

这个小精灵在 层的第 个神经元上。小精灵通过增加很小的变化 ,使得神经元输出由 变成 。这个变化向网络后面的层传播,最终导致整个代价函数产生 的改变。为降低代价函数,小精灵可以通过选择与 相反符号的 。相反,若 接近于0,则小精灵不能通过扰动带权输入z来改变太多代价函数。在小精灵看来,这时神经元已经接近最优了。
按照上面描述,我们定义 层的 个神经元的误差 为:
这里不加证明地给出反向传播的四个基本方程:

通过观察四个基本方程,可以得出以下结论:
(1)观察方程BP1,这里 被定义成一个向量,其元素是偏导数 。你可以将其看成 关于输出激活值的改变速度。举个例子,在二次代价函数时,我们有 ,所以BP1就变成
回忆sigmoid函数,当函数值接近1或0时, 接近于0。所以如果输出神经元处于或者低激活值或者高激活值时,最终层的权重学习缓慢。这样的情形,我们常常称输出神经元已经饱和了,并且,权重学习也会终止(或者学习非常缓慢)。类似的结果对于输出神经元的偏差也是成立的。
(2)观察方程BP2,其中 是权重矩阵 的转置。这其实可以很直觉地看做是后在 层的输出的误差的反向传播,给出了某种关于误差的度量方式。然后,我们进行Hadamard乘积运算 。这会让误差通过 层的激活函数反向传递回来并给出在 的带权输入的误差
通过组合BP1和BP2,我们可以计算任何层的误差了。首先使用BP1计算 ,然后应用方程BP2来计算 , 然后不断作用BP2,一步一步地反向传播完整个网络。特别地,当输出神经元已经接近饱和, 很有可能变小,导致权重学习缓慢。
(3)观察方程BP4,来自很低的激活值神经元的权重学习同样会非常缓慢。

4. 反向传播算法

4.1 算法流程

反向传播方程给出了一种计算代价函数梯度的方法。 让我们显式地用算法描述出来:
1. 输入x:为输入层设置对应的激活值
2. 前向传播:对每个l = 2, 3, …, L计算相应的
3. 输出层误差:计算向量
4. 反向误差传播:对每个l = L-1, L-2, …, 2,计算
5. 输出:代价函数的梯度由

4.2 反向传播快速的原因

如果仅仅把代价看作权重的函数即C=C(w),则计算某个权值关于C的导数:


其中 是一个很小的正数,而 是在第j个方向上的单位向量。换句话说,我们可以通过计算 的两个接近相同的点的值来估计 ,然后应用上述公式。同样方法也可以用来计算
然后,遗憾的是,当你实现了之后,运行起来这样的方法非常缓慢。为了理解原因,假设我们有1,000,000个权重。对每个不同的权重 ,我们需要计算 来计算 。这意味着为了计算梯度,我们需要计算代价函数 1,000,000次,需要1,000,000次前向传播(对每个样本) 。我们同样需要计算C(w), 总共是1,000,001次。反向传播聪明的地方就是它确保我们可以同时计算所有的偏导数 使用一次前向传播,加上一次后向传播。粗略地说, 后向传播的计算代价和前向的一样。

4.3 反向传播大视野

回顾反向传播算法,可以发现关于代价函数梯度的计算均是基于链式法则进行的。假设某个做一点小小的变动


那么这个改变逐渐向后面网络层产生影响,最终到达输出层,影响代价函数:

所以代价函数 改变与 按如下公式关联起来:

同时 导致了 个神经元的激活值的变化 ,即

继而影响到下一层的激活值的变化,即

则综合前一层变化 ,有

最终,对于代价函数变化 ,有

对路径中所有可能的中间神经元选择进行求和。则有

而这个公式告诉我们的是:两个神经元之间的连接其实是关联于一个变化率因子,这仅仅是一个神经元的激活值相对于其他神经元的激活值的偏导数。从第一个权重到第一个神经元的变化率因子是 。路径的变化率因子其实就是这条路径上的众多因子的乘积。而整个的变化率 就是对于所有可能的从初始权重到最终输出的代价函数的路径的变化率因子的和。针对某一个路径,这个过程解释如下:

观察发现,可以将反向传播想象成一种计算所有可能的路径变化率的求和的方式。或者,换句话说,反向传播就是一种巧妙地追踪权重(和偏差)微小变化的传播,抵达输出层影响代价函数的技术。

神经网络与深度学习(三)——反向传播算法相关推荐

  1. 神经网络与深度学习-chapter2 反向传播算法

    英语原文:Neural Networks and Deep Learning(Michael Nielsen) 中文译文:神经网络与深度学习(Michael Nielsen) 第2章 反向传播算法如何 ...

  2. 深度学习之反向传播算法

    深度学习之反向传播算法 直观理解反向传播 反向传播算法是用来求那个复杂到爆的梯度的. 上一集中提到一点,13000维的梯度向量是难以想象的.换个思路,梯度向量每一项的大小,是在说代价函数对每个参数有多 ...

  3. 深度学习-误差反向传播算法

    文章目录 一.误差反向传播算法是干什么的? 二.计算图 (一) 了解计算图的写法 (二)局部计算 (三) 计算图的优点 三. 误差反向传播算法的具体实现 一.误差反向传播算法是干什么的? 通过数值微分 ...

  4. 深度学习中反向传播算法简单推导笔记

    反向传播算法简单推导笔记 1.全连接神经网络 该结构的前向传播可以写成: z(1)=W(1)x+b(1)z^{(1)} = W^{(1)}x+b^{(1)}z(1)=W(1)x+b(1) a(1)=σ ...

  5. 深度学习(3)--反向传播算法

    由上一节的内容中我们知道了随机梯度下降算法,我们通过下面两个公式来进行更新,最重要的就是对两个变量weights和biases的更新,我们通过backpropagation来计算偏导数. Backpr ...

  6. 深度神经网络(DNN)的反向传播算法总结与图解

    文章目录 前言 第一个问题 第二个问题 第三个问题 总结 前言 其实,深度神经网络的反向传播我们只需知道这个算法的理念,即这个算法的目标方程是谁,对目标方程做什么运算,为什么这样做或者这样做的好处是什 ...

  7. 神经网络与深度学习三:编写单隐层神经网络

    三:编写单隐层神经网络 1 神经网络概述 这篇文章你会学到如何实现一个神经网络,在我们深入学习技术细节之前,现在先大概快速的了解一下如何实现神经网络,如果你对某些内容不甚理解(后面的文章中会深入其中的 ...

  8. 深度学习之——反向传播

    反向传播算法(BP): 前向传播通过训练数据和权重参数计算输出结果:反向传播通过导数链式法则计算损失函数对各参数的梯度,并根据梯度进行参数的更新. 1.前向传播 在前面的:全连接神经网络--前向传播中 ...

  9. 机器学习深度学习中反向传播之偏导数链式法则

    前记    无论是机器学习还是深度学习,都是构造目标函数,这个目标函数内部有很多未知变量,我们的目标就是求得这些未知变量.    那么如何构造目标函数?这是一个非常优美的话题(本文未讲,先欠着).美好 ...

  10. 深度学习——误差反向传播法

    前言 通过数值微分的方法计算了神经网络中损失函数关于权重参数的梯度,虽然容易实现,但缺点是比较费时间,本章节将使用一种高效的计算权重参数梯度的方法--误差方向传播法 本文将通过①数学式.②计算图,这两 ...

最新文章

  1. python 编程一日一练-「每日一练」巧用python生成随机数
  2. MLPrimitive如何添加自定义的Primitive
  3. 在一个数组中找出和为目标值的那 两个 整数,并返回他们的数组下标python代码(Leetcode1)
  4. Bridge 、 Adapter 和 Facade 的区别
  5. HDU4891 The Great Pan 暴力
  6. jQuery获取select onChange的值
  7. Java 基础——日期(Date)的解析
  8. Python爬虫小白入门(六)爬取披头士乐队历年专辑封面-网易云音乐
  9. 最佳Excel导入实践(一)
  10. Hadoop之倒排索引
  11. SQL SERVER中游标也有Continue,break等跳出循环的语句
  12. truffle migrate 强制重新部署合约
  13. 正点原子STM32f4系列其他串口通信失败问题解决
  14. Topaz滤镜2018全系列合集Topaz Plugins Bundle
  15. java 窗体音量调节,Mixer音量调节
  16. html浅色_修改CSS样式实现网页灰色(没有颜色只有浅色黑白)的几个方法整理
  17. golang mysql 非阻塞_Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库...
  18. 捉迷藏之二-第10届蓝桥杯Scratch国赛真题第6题程序2
  19. 三表左连接sql语句例子
  20. 数据结构之 红黑树(左倾红黑树) java实现

热门文章

  1. 响应式个人导航主页源码
  2. 我们在二楼有一个计算机教室用英语怎么说,人教英语新起点三年级 Unit2 知识...
  3. 原道N70双擎EZ系列刷机包
  4. 感受颇深的职业生涯规划课
  5. LabVIEW新手学习——使用DAQ相关函数前仿真配置!
  6. 开源推荐:国内3大主流前端UI表单设计器,千万不要让领导知道
  7. Java控制器controller_详解springMVC—三种控制器controller
  8. 启动计算机时会出现什么,为什么电脑启动的时候会出现很多英文字母?
  9. JavaScript 一元钱可以买一瓶水,两个空瓶可以换一瓶水,三个瓶盖可以换一瓶水,20块钱可以换多少瓶水。
  10. Java网络编程与NIO详解13:epoll、poll、select面试题汇总