精华内容
下载资源
问答
  • 反向传播算法
    2021-12-17 01:39:26

    作者丨南柯一梦宁沉沦@知乎(已授权)

    来源丨https://zhuanlan.zhihu.com/p/61898234

    编辑丨极市平台

    导读

     

    在本篇文章中我们将从直观感受和数学公式两方面来介绍CNN反向传播算法的推导。

    多层感知机反向传播的数学推导,主要是用数学公式来进行表示的,在全连接神经网络中,它们并不复杂,即使是纯数学公式也比较好理解。而卷积神经网络相对比较复杂,在本篇文章中我们将从直观感受和数学公式两方面来介绍CNN反向传播算法的推导。

    首先我给大家介绍一下我分析delta误差反向传播过程的简单方法,如果神经网络l+1层某个结点的delta误差要传到l层,我们就去找前向传播时l+1层的这个结点和第l层的哪些结点有关系,权重是多少,那么反向传播时,delta误差就会乘上相同的权重传播回来。

    假设第l层有一个结点a,l+1层有一个结点b。两个结点间的连接权重为w。如果前向传播时,结点a对结点b的影响是  。而反向传播时,结点b的delta误差  对结点a的delta误差  的影响是  。它们的系数都为两结点之间的连接权重。

    卷积神经网络前向传播过程简要介绍

    在理解卷积神经网络的反向传播之前,我们需要对卷积、池化以及卷积神经网络前向传播过程作一个简要的回顾。

    卷积运算介绍

    在卷积神经网络中,所谓的卷积运算,其实并不是严格的数学意义上的卷积。深度学习中的卷积实际上是信号处理和图像处理中的互相关运算,它们二者之间有细微的差别。深度学习中的卷积(严格来说是互相关)是卷积核在原始图像上遍历,对应元素相乘再求和,得到的新图像在尺寸上会有减小。可以通过下图直观的去理解。假设输入图像的有m行,n列,卷积核的尺寸为filter_size×filter_size,输出图像的尺寸即为(m-filter_size+1)×(n-filter_size+1)

    6111864d97b62bfe8d05e569416d6b38.png
    图源http://ufldl.stanford.edu/tutorial/supervised/FeatureExtractionUsingConvolution/

    在全连接神经网络,图像数据以及特征是以列向量的形式进行存储。而在卷积神经网络中,数据的格式主要是以张量(可以理解为多维数组)的形式存储。图片的格式为一个三维张量,行×列×通道数。卷积核的格式为一个四维张量,卷积核数×行×列×通道数

    卷积操作是每次取出卷积核中的一个,一个卷积核的格式为三维,为行×列×通道数。对应通道序号的图片与卷积核经过二维卷积操作后(即上图所示操作),得到该通道对应的卷积结果,将所有通道的结果相加,得到输出图像的一个通道。每个卷积核对应输出图像的一个通道,即输出图像的通道数等于卷积核的个数。

    这里概念有一点绕,但是卷积神经网络中所谓张量的卷积,本质上是进行了一共卷积核数×通道数二维卷积操作。每一个卷积核对应卷积结果的一个通道,每一个卷积核的通道对应原始图片的一个通道。这个操作和一个列向量乘上一个矩阵得到一个新的列向量有相似的地方。

    下图直观地展示了张量卷积具体操作过程:

    7ce1fde85ccd8acc60a588370060bcc9.png
    图源http://cs231n.github.io/convolutional-networks/侵删

    池化操作介绍

    所谓的池化,就是对图片进行降采样,最大池化就是在图片中用每个区域的最大值代表这个区域,平均池化就是用每个区域平均值代表这个区域。

    cc127858d7bce63e86cd747e00b4ae29.png
    图源http://cs231n.github.io/convolutional-networks/侵删

    卷积神经网络反向传播推导

    池化层反向传播

    池化层的反向传播比较容易理解,我们以最大池化举例,上图中,池化后的数字6对应于池化前的红色区域,实际上只有红色区域中最大值数字6对池化后的结果有影响,权重为1,而其它的数字对池化后的结果影响都为0。假设池化后数字6的位置delta误差为  ,误差反向传播回去时,红色区域中最大值对应的位置delta误差即等于  ,而其它3个位置对应的delta误差为0。

    因此,在卷积神经网络最大池化前向传播时,不仅要记录区域的最大值,同时也要记录下来区域最大值的位置,方便delta误差的反向传播。

    而平均池化就更简单了,由于平均池化时,区域中每个值对池化后结果贡献的权重都为区域大小的倒数,所以delta误差反向传播回来时,在区域每个位置的delta误差都为池化后delta误差除以区域的大小。

    卷积层反向传播

    虽然卷积神经网络的卷积运算是一个三维张量的图片和一个四维张量的卷积核进行卷积运算,但最核心的计算只涉及二维卷积,因此我们先从二维的卷积运算来进行分析:

    63e081ccf7e1fab0abea72047449db87.png

    如上图所示,我们求原图A处的delta误差,就先分析,它在前向传播中影响了下一层的哪些结点。显然,它只对结点C有一个权重为B的影响,对卷积结果中的其它结点没有任何影响。因此A的delta误差应该等于C点的delta误差乘上权重B。

    551f8137d19c09cc5a7bea7e8e8c2ebf.png

    我们现在将原图A点位置移动一下,再看看变换位置后A点的delta误差是多少,同样先分析它前向传播影响了卷积结果的哪些结点。经过分析,A点以权重C影响了卷积结果的D点,以权重B影响了卷积结果的E点。那它的delta误差就等于D点delta误差乘上C加上E点的delta误差乘上B。

    大家可以尝试用相同的方法去分析原图中其它结点的delta误差,结果会发现,原图的delta误差,等于卷积结果的delta误差经过零填充后,与卷积核旋转180度后的卷积。如下图所示:

    f7eb5527ab9c93aff8c69f219eab3b6d.png
    图源https://grzegorzgwardys.wordpress.com/2016/04/22/8/侵删

    好了,直观上的理解有了,我们接下来用数学公式来对此进行证明,尽管它们会有些枯燥:

    让我们回顾一下delta误差的定义,是损失函数对于当前层未激活输出  的导数,我们现在考虑的是二维卷积,因此,每一层的delta误差是一个二维的矩阵。 表示的是第l层坐标为(x,y)处的delta误差。假设我们已经知道第l+1层的delta误差,利用求导的链式法则,可以很容易写出下式:

    在这里,坐标(x',y')是第l+1层中在前向传播中受第l层坐标(x,y)影响到的点,它们不止一个,我们需要将它们加起来。再利用前向传播的关系式:

    我们可以进一步将表达式展开:

    后面一大串尽管看起来很复杂,但实际上很容易就可以简化:

    同时我们得到两个限制条件  和

    将限制条件代入上式可得:

    再令  以及

    我们最终的结论得到了:

    我们可以短暂的庆祝一下子了,然而我们目前的结论还只是基于二维卷积,我们还需要把它推广到我们卷积神经网络中张量的卷积中去。

    再回顾一下张量的卷积,后一层的每个通道都是由前一层的各个通道经过卷积再求和得到的。

    等等,这个关系听起来好像有点熟悉,如果把通道变成结点,把卷积变成乘上权重,这个是不是和全连接神经网络有些类似呢?

    99be2a624cf393ef577602d1188107fd.png

    上图中每根连线都代表与一个二维卷积核的卷积操作,假设第l层深度为3,第l+1层深度为2,卷积核的维度就应该为2×filter_size×filter_size×3。第l层的通道1通过卷积影响了第l+1层的通道1和通道2,那么求第l层通道1的delta误差时,就应该根据求得的二维卷积的delta误差传播方式,将第l+1层通道1和通道2的delta误差传播到第l层的delta误差进行简单求和即可。

    已知第l层delta误差,求该层的参数的导数

     ,

    第l层卷积核  是一个4维张量,它的维度表示为卷积核个数×行数×列数×通道数。实际上,可以把它视为有卷积核个数×通道数个二维卷积核,每个都对应输入图像的对应通道和输出图像的对应通道,每一个二维卷积核只涉及到一次二维卷积运算。那求得整个卷积核的导数,只需分析卷积核数×通道数次二维卷积中每个二维卷积核的导数,再将其组合成4维张量即可。

    所以我们分析二维卷积即可:

    b48a41f0526a10b4ec4ab7ccc321c612.png

    可以利用之前的分析方法,卷积核上点A显然对卷积结果每一个点都有影响。它对卷积结果的影响等于将整个原图左上3×3的部分乘上点A的值,因此delta误差反向传播回时,点A的导数等于卷积结果的delta误差与原图左上3×3红色部分逐点相乘后求和。因此二维卷积核的导数等于原图对应通道与卷积结果对应通道的delta误差直接进行卷积。

    我们将原图通道数×卷积结果通道数个二维卷积核的导数重新进行组合成4为张量,即可得到整个卷积核的导数。

    下面我们从数学公式进行推导:

    同样我们可以进行简化,并得到两个限制条件: 和  :

    这一次我们并不需要进行旋转180度这种操作。

    已知第l层delta误差,求该层的参数的导数

    我们的  是一个列向量,它给卷积结果的每一个通道都加上同一个标量。因此,在反向传播时,它的导数等于卷积结果的delta误差在每一个通道上将所有delta误差进行求和的结果。

    提供简单的公式证明如下:

     由于  为1

    所以:

     得证

    卷积神经网络包括卷积层,池化层和全连接层,本文介绍了卷积层和池化层的反向传播算法以及各层参数导数的计算方法,全连接层的反向传播方法以及参数导数的计算在之前文章中也介绍过了。

    让我们对卷积神经网络的训练过程进行一个总结:

    1. 对神经网络进行初始化,定义好网络结构,设定好激活函数,对卷积层的卷积核W、偏置b进行随机初试化,对全连接层的权重矩阵W和偏置b进行随机初始化。
      设置好训练的最大迭代次数,每个训练batch的大小,学习率

    2. 从训练数据中取出一个batch的数据

    3. 从该batch数据中取出一个数据,包括输入x以及对应的正确标注y

    4. 将输入x送入神经网络的输入端,得到神经网络各层输出参数和

    5. 根据神经网络的输出和标注值y计算神经网络的损失函数

    6. 计算损失函数对输出层的delta误差

    7. 利用相邻层之间delta误差的递推公式求得每一层的delta误差
      如果是全连接层δδσ
      如果是卷积层 
      如果是池化层

    8. 利用每一层的delta误差求出损失函数对该层参数的导数
      如果是全连接层:
      δ ,δ
      如果是卷积层:
       ,

    9. 将求得的导数加到该batch数据求得的导数之和上(初始化为0),跳转到步骤3,直到该batch数据都训练完毕

    10. 利用一个batch数据求得的导数之和,根据梯度下降法对参数进行更新

    11. 跳转到步骤2,直到达到指定的迭代次数

    参考:

    [1]刘建平Pinard:卷积神经网络(CNN)反向传播算法

    [2]Grzegorz Gwardys:Convolutional Neural Networks backpropagation: from intuition to derivation

    [3]Kunlun Bai:A Comprehensive Introduction to Different Types of Convolutions in Deep Learning

    [4]CS231n Convolutional Neural Networks for Visual Recognition

    本文仅做学术分享,如有侵权,请联系删文。

    重磅!计算机视觉工坊-学习交流群已成立

    扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

    同时也可申请加入我们的细分方向交流群,目前主要有ORB-SLAM系列源码学习、3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、深度估计、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

    a54856db673735bf0787435d5fcb1580.png

    ▲长按加微信群或投稿

    2fed9cf500a89adf8174508256dbff75.png

    ▲长按关注公众号

    3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列手眼标定相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

    学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

    90bfb989dd8e4637869979c7c219596a.png

     圈里有高质量教程资料、可答疑解惑、助你高效解决问题

    觉得有用,麻烦给个赞和在看~

    更多相关内容
  • 吴恩达机器学习课程反向传播算法的数学推导 Proof of Back Propagation Algorithm.pdf 【本文旨在给出吴恩达机器学习课程反向传播算法的数学推导】
  • 反向传播算法

    2021-02-11 15:05:02
    反向传播算法
  • 反向传播算法是人工神经网络训练时采用的一种通用方法,在现代深度学习中得到了大 规模的应用。全连接神经网络(多层感知器模型,MLP),卷积神经网络(CNN),循环神 经网络(RNN)中都有它的实现版本。算法从多元复合...
  • 反向传播算法PPT

    2018-11-30 20:16:59
    这是我在机器学习课程上做汇报用的反向传播算法的PPT,主要是通过学习吴恩达老师的课程总结得来
  • 主要介绍了numpy实现神经网络反向传播算法的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 今天有朋友咨询我反向传播算法,我觉得不需要太复杂的推导,就可以解释清楚这个算法的原理。 序 假定神经网络采用下面的结构: 1. 最简单的神经网络模型 我们考虑最简单的情况:一个输入节点、一个输出节点、一个...
  • 因此,关于反向传播算法,我们继续查看下文。 我们向相反的方向迈出了一小步——最大下降的方向,也就是将我们带到成本函数的局部最小值的方向。 图示演示: 反向传播算法中Sigmoid函数代码演示: # 实现 sigmoid ...
  • 前馈神经网络(反向传播算法)用到的数据集,包含5000张数字图片X及对应标签y。由于是matlab类型的数据,X需要转置。
  • 反向传播算法.rar

    2019-12-07 11:06:22
    本项目主要实现了python端的反向传播算法,通过实现算法本身而不是调用库实现,另外里面还进行了包括调整激活函数,学习参数,学习率的调整方法等对原始程序进行了改进,可以用来进行不同参数下实现的比较
  • 训练输入向量和目标向量分别从... 这个想法是从 AliReza KashaniPour 和 Phil Brierley 创建的算法中挑选出来的。 隐藏层的激活函数是logsig,输出层是线性的! 只需按 F5 就可以了! anshuman0387[at]yahoo[dot]com :)
  • 为了在保证图像质量的前提...实验结果表明,DR-BP算法相比仅适用于单站式成像的快速傅里叶变换算法,重建图像边缘干扰少,相比传统的反向传播算法,重建速度大幅提升,本文实验中获得的图像质量相同时,重建速度可提升60倍。
  • 该编程练习实现了神经网络的反向传播算法,并将其应用于手写数字识别的任务。 这套包括: ex4.mlx-逐步执行练习的MATLAB Live脚本 ex4.pdf-此练习的信息 ex4data1.mat-手写数字训练集 ex4weights.mat-练习4的神经...
  • matlab开发-多层感知神经网络模型与反向传播算法。Simulink多层感知器神经网络模型及反向传播算法
  • 零基础入门深度学习 神经网络 反向传播算法 神经网络和反向传播算法
  • 针对多感知器,梯度下降算法 1.预测一个连续值,我们的做法是,不对他激活,直接输出 2.预测“是”或“否”的分类问题,则对输出层,做sigmoid运算二分类输出 3.多分类softmax运算,输出多个分类在概率上的分别 多层...
  • 反向传播算法pdf讲义超详细
  • 对儿童艾滋病毒状况的预测在医学研究中提出了真正的挑战。 尽管已经使用了不同的统计技术和机器学习算法来预测具有二进制... 在本文中,弹性回传算法用于训练神经网络和多层前馈网络,以预测母婴传播艾滋病毒的状况。
  • 反向传播算法代码 MachineLearning-DeepLearning-NLP-LeetCode-StatisticalLearningMethod 最近在学习机器学习,深度学习,自然语言处理,统计学习方法等知识,所以决定自己将学习的相关算法用Python实现一遍,并...
  • 在Matlab中使用ANN反向传播算法对MNIST手写图像进行分类 在此作业中,我们使用了MNIST数据库,其中包含6万个手写训练图像和1万个测试图像。 使用具有对数乙状sigmod传递函数和反向传播的两层人工神经网络,我们在...
  • 使用反向传播算法的多层神经网络的 MATLAB 实现。 数据使用:MNIST( http://yann.lecun.com/exdb/mnist/ )
  • 深度学习基础之反向传播算法Good.pdf
  • 反向传播算法python实现.
  • Chain Rule(链式法则) Case 1 如果有: y=g(x) z=h(y)y = g(x)\ \ \ \ \ \ z = h(y)y=g(x) z=h(y) 那么“变量影响链”就有: Δx→ΔyΔz\Delta x\rightarrow \Delta y \Delta zΔx→ΔyΔz ...
  • 误差反向传播算法

    2022-05-13 16:18:13
    和其他机器学习算法一样,神经网络的训练,就是给定训练集,通过学习算法,确定学习参数的过程。可以直接使用梯度下降法需要计算损失函数的梯度,在没有隐含层的单层神经网络中,可以通过计算直接得到梯度。 在多层...

    通过单个感知机或者单层神经网络只能够实现线性分类的问题,而多层神经网络可以解决非线性分类问题。

    神经网络中的模型参数,是神经元模型中的连接权重以及每个功能神经元的阈值,
    在这里插入图片描述
    这些模型参数并不是我们人工设计或者指定的,而是通过算法自动学习到的。

    和其他机器学习算法一样,神经网络的训练,就是给定训练集,通过学习算法,确定学习参数的过程。可以直接使用梯度下降法需要计算损失函数的梯度,在没有隐含层的单层神经网络中,可以通过计算直接得到梯度。
    在这里插入图片描述
    在多层神经网络中,上一层的输出是下一层的输入,要在网络中的每一层计算损失函数的梯度会非常的复杂,
    在这里插入图片描述
    为了解决这个问题,科学家提出一种解决方法,即利用链式法则,反向传播损失函数的梯度信息,只要从后往前遍历一遍神经网络,就能够计算出损失函数对网络中所有模型参数的梯度。这种方法被称之为误差反向传播算法。

    需要注意的是,很多人认为误差反向传播算法是多层神经网络的学习算法。这是不对的。

    误差反向传播算法仅仅是一种在神经网络的训练过程中用来计算梯度的方法,它能够计算损失函数对网络中所有模型参数的梯度,这个梯度会反馈给某种学习算法,例如梯度下降法,用来更新权值,最小化损失函数,这里梯度下降法才是学习算法,除了梯度下降法,也可以采用其他的学习算法。另外,误差反向传播法并不仅仅适应于多层神经网络,原则上它可以计算任何函数的导数。

    为了便于理解,我们首先来看一个简单的例子,
    在这里插入图片描述
    上图为一个最简单的两层神经网络。它的输入层、隐含层和输出层都只有一个节点。隐含层和输出层的激活函数都使用 Sigmoid 函数,隐含层神经元接收输入值 x ,
    在这里插入图片描述
    首先,进行线性变换,然后将线性变换的结果 zh 作为激活函数函数的输入,从而产生隐含层的输出 yh ,
    在这里插入图片描述
    输出层神经元接收隐含层的输出yh 作为输入,对其进行线性变换,产生zo
    在这里插入图片描述
    然后再将 zo 作为激活函数函数的输入,从而产生神经网络的输出 yo
    在这里插入图片描述
    这个神经网络中的所有模型参数是 wh ,bh ,wo ,bo .

    训练的过程就是将样本数据x输入网络中,从而通过学习算法,寻找合适的模型参数,使得网络的输出yo 与样本数据的标签一致。

    假设现在有一个样本
    在这里插入图片描述
    我们将其输入到这个神经网络中,看看网络是如何进行训练的,
    步骤一:设置模型参数初始值
    在这里插入图片描述
    步骤二:正向计算预测值
    使用模型参数初始值和输入值x,逐层计算,得到神经网络的预测值0.59,它而样本标签0.8相差比较大,因此需要使用误差函数来调整模型参数,也就是训练网络。

    第三步:计算误差
    使用平方损失函数计算出预测值和标签值之间的误差。

    第四步:误差反向传播
    使用误差反向传播算法对误差损失函数的梯度信息进行反向传播,同时更新所有的模型参数,首先更新输出层模型参数。

    梯度下降法的参数更新公式如下:
    在这里插入图片描述
    这里要计算误差损失函数对 wo 和 bo 的偏导数,在之前,我们在编程实现逻辑回归时,直接使用了 TensorFlow 中提供的自动求导函数,并没有关心这个倒数是如何计算出来的。

    现在,来手动计算一下,
    在这里插入图片描述
    可以发现,这三个函数之间是嵌套的关系,要得到损失函数对wo 的偏导数,可以使用链式求导法则来进行计算。
    在这里插入图片描述
    下面来分别对每一项进行计算。
    在这里插入图片描述
    再将这三个得到的值进行相乘,
    在这里插入图片描述
    就得到了损失函数对 wo 的偏导数。

    取学习率 η 等于 0.5 ,根据迭代公式,更新 wo 的值。
    在这里插入图片描述
    同样的方法可得
    在这里插入图片描述
    其中,
    在这里插入图片描述
    再使用迭代公式更新 bo
    在这里插入图片描述
    现在,输出层的参数就已经更新好了。
    在这里插入图片描述
    下面,继续更新隐含层的参数,同样,梯度下降法的参数更新公式如下:
    在这里插入图片描述
    这里要计算误差损失函数对 wh 和 bh 的偏导数。

    同样可以使用链式求导法则来进行计算。
    在这里插入图片描述
    并且存在下述嵌套关系,
    在这里插入图片描述
    计算其中所有的偏导数,
    在这里插入图片描述
    最后把他们的各自结果代入上面的链式求导公式,
    在这里插入图片描述
    最终求得损失函数对 wh 的偏导数结果,采用同样的方法,最终也可以得到损失函数对 bh 的偏导数。

    在这里插入图片描述
    (计算技巧:与损失函数对 wh 的偏导数公式相比,只有最后一项不同。)

    最后代入上述公式可以得到。
    在这里插入图片描述
    得到
    在这里插入图片描述
    之后,就可以根据迭代公式得到
    在这里插入图片描述
    到此为止,我们已经将这个神经网络中的四个模型参数都更新了,完成了一轮训练。
    在这里插入图片描述
    接下来,再使用新的参数逐层正向计算得到新的预测值,然后和标签值进行比较计算误差,再逐层反向传播损失函数的梯度信息,更新模型参数,完成下一轮训练,如此循环,直到误差收敛到一个理想的值。

    这个神经网络相对简单,每层只有一个神经元,因此,输出层的误差和梯度全部被反向传播给隐含层。

    如果隐含层中有多个神经元,那么误差项就会根据不同神经元的贡献程度,进行反向传播。这个贡献程度,是由它们的权值来决定的。
    在这里插入图片描述
    例如,一个是 0.4 ,一个是 0.6
    在这里插入图片描述
    那么就会把输出层的误差按照这个权值的比例分别传递给节点 E 和结点 F,同样隐含层节点 E 的误差,也按照连接的权值分别传递给节点 C 和结点 D。
    在这里插入图片描述
    下图分别是节点 C 和结点 D 接收到的来自节点 E 的误差,在这里插入图片描述
    结点 F 的误差也按照权值分别传递给节点 C 和结点 D,下图即为节点 C 和结点 D 接收到的来自结点 F 的误差,
    在这里插入图片描述
    对于节点 C 来说,它分别接收来自节点 E 和 F 传递过来的误差,下图为它接收到的误差,
    在这里插入图片描述
    同样对于节点 D 来说,它也是分别接收来自节点 E 和 F 传递过来的误差,下图为它接收到的误差。
    在这里插入图片描述
    当隐含层中,有多个结点时,神经网络就是这样逐层按照权值反向传播误差的。

    如果再复杂一点,输出层也有两个神经元,
    在这里插入图片描述
    那么输出层结点 G 的误差分别传递给节点 E 和结点 F ,
    在这里插入图片描述
    而 H 的误差也分别传递给节点 E 和结点 F ,
    在这里插入图片描述
    下图分别为 E 和 F 接收到的误差,
    在这里插入图片描述
    继续按照权值比例逐层反向传递误差。
    在这里插入图片描述
    可以想象,随着网络层数的加深以及每层中神经元个数的增加,误差反向传播算法得计算也会越来越复杂。

    幸运的是,TensorFlow 为我们计算梯度的功能,我们在编程时是不需要这样手动推导公式,并且编写代码实现的。

    总结一下,这节课的内容,就是多层神经网络的训练是通过梯度下降法训练模型参数,其中,梯度的计算是通过误差反向传播算法来进行的。训练的过程可以概括为:正向传递信号,反向传递误差。
    在这里插入图片描述
    首先,在输入层接收输入样本特征 X ,然后在神经网络中逐层传递,直到在输出层得到预测值 Yo 。 接着将神经网络输出的预测值和 Yo 和标签值 Y 相比较,然后计算损失,
    在这里插入图片描述
    如果损失值比较大,就使用梯度下降法调整最后一层神经元的参数,然后反向传播梯度信息,逐层后退,更新模型参数,完成一轮训练。
    在这里插入图片描述
    参数调整后的网络,再次根据样本特征,正向计算预测值,反向传播误差,调整模型参数,最终通过这样不断地训练,直到网络输出与标签值一致。

    这就好像我们学习,每个人都有自己的学习习惯和学习方法,
    比如如何测试,如何写作业,如果做笔记等等,
    在这里插入图片描述
    我们输入的知识就可以当做是 X ,经过这一系列环节之后,迎来一场考试,这就是知识正向传播的过程,输出就是考试的成绩。

    如果没有自动更新的能力,那么这个考试成绩就不会去改变学习习惯,下次再考,还是这个成绩,而如果具备这种误差反向传播的能力,那么就会根据试卷上的错题,分析自己学习方法的不足,然后一层一层倒回去,调整自己的学习方式和学习习惯,完成对学习活动中各个环节的参数的调整,然后再下一轮的学习中就可以表现的更好,得到一个满意的成绩。
    在这里插入图片描述
    如果泛化能力很强,那么使用这套调整后的学习方法再今后学习不同领域的知识时,也能取得一个好成绩。

    展开全文
  • 一文读懂反向传播算法原理

    千次阅读 2021-05-28 09:54:03
      写这个文章主要是因为学习了吴恩达老师的机器学习视频,在神经网络的反向传播算法(Back Propagation)的公式推导有些模糊,所以自己也查阅了很多资料,才基本搞明白其中的原理。所以希望通过写一下文章来进行...

    1.前言

      写这个文章主要是因为学习了吴恩达老师的机器学习视频,在神经网络的反向传播算法(Back Propagation)的公式推导有些模糊,所以自己也查阅了很多资料,才基本搞明白其中的原理。所以希望通过写一下文章来进行梳理一下。
      因为本文的公式推导是基于吴恩达老师的课程,课程里的神经网络部分主要讲述的是神经网络在分类的应用,因此激活函数采用的是sigmoid函数,下面的公式推导也基于这个进行推导。
      最后,因为自己是刚开始学习机器学习,所以可能理解上存在一些小的偏差。如果文章中有错误,欢迎大家指正。

    2.前向传播

      要理解反向传播,那么就必须先理解前向传播,下图以一个三层神经网络为例。。
    在这里插入图片描述

      根据上图,我给大家罗列一下正向传播的步骤,前向传播还是比较好理解的。通过输入层(Layer1)将数据输入(注意要加上偏执单元a0(l)=1),然后经过隐藏层(Layer2)加工处理,最后通过输出层(Layer3)进行输出结果。

    1、输入层输入训练集
      输入层其实就是对应上图中的Layer1
      我们会有训练集**(x,y)**,训练集中会包含许多的 (x(i),y(i))样本,每一个x(i)中又会包含许多的特征 xj(i),如x1(i)、x2(i)等等。
      然后我们将x(i)中的xj(i)输入到神经网络中,就成为了输入层中的 aj(0),其中x1(i)=a1(1)、x2(i)=a2(1)
      最后,为了计算方便,我们需要加上 偏置单元a0(1)=1

    2、隐藏层计算zj(2)
      第二步就是通过权重矩阵计算出zj(2),具体的计算方法如下图所示:
    在这里插入图片描述
      因为权重w和参数θ代表的是一个意思,因此对于上图可以进行向量化表示,具体如下图所示(@代表矩阵的方式相乘):
    在这里插入图片描述
    3、通过激活函数计算出aj(2)
      通过上一步计算的zj(2),经过激活函数sigmoid,计算出aj(2),具体如下图所示
    在这里插入图片描述

    4、计算输出层的aj(3)
      原理和上面计算隐藏层的类似,这里就不再重复了,相类比就可以计算出aj(3)

    3.反向传播

    还是老规矩,我们先上图,再一步一步进行解释。
    在这里插入图片描述
      反向传播的提出其实是为了解决偏导数计算量大的问题,利用反向传播算法可以快速计算任意一个偏导数。反向传播算法的思想和前向传播是一样的,只是一个反向的过程,推导过程中注意链式法则,一层扣一环即可求得结果。
      大家在看下面的推导的时候,一定记得高数中的链式法则,逐步推导就可以了,其实是一个很简单的过程。

    1、定义损失函数
      首先,我们先定义这个神经网络的损失函数,如下图所示
    在这里插入图片描述

    2、定义误差δ
      吴恩达老师在视频中将δ翻译为误差,其实这是一种广义上的误差。因为除了输出层之外,我们是无法直接得到每一层的误差的。
      广义上定义这个误差是这样的,如下图所示:
    在这里插入图片描述
      因为偏导数其实就是表明了自变量对因变量产生了多大的影响。因此对于上面这个图中关于δ的定义,我们也就可以理解为zj(l)这个数对最终输出层的计算的误差J(θ)产生了多大的影响,也就是这个数对于这个误差做出了多大贡献。最理想的状态是δ=0,也就是偏导数等于0,没有对误差最终的误差产生影响。然后我们就将把这个“贡献”称为误差。
       后面的公式计算每一层的δj(l)其实都是基于这个定义进行推导的。至于为什么在输出层没有使用这个定义去求误差,而是直接使用δj(L)=aj(L)-y得到输出层的误差,大家可以看完全文后回头去看一下这篇文章:反向传播输出层误差 δ。这篇文章清晰地进行了证明,这是因为逻辑回归的损失函数凑巧的一个性质造成的,如果是其他的损失函数则需要按照定义去

    3、第L层δ(输出层)的具体推导
       首先,我们先定义误差δ的一般形式,如下图所示:
    在这里插入图片描述

       对于输出层的误差推导如下图所示:
    在这里插入图片描述
    4、第l层误差δ的具体推导
       下面我们对上一步进行推广,得到普遍的l层的误差误差δ
    在这里插入图片描述

       对上图结果向量化可得:
    在这里插入图片描述
       上面的推导看似很复杂,其实就是遵循一个链式法则,我已经基本没有省略步骤了,应该是很详细了。推导的时候需要记得前向传播中a(l)是如何通过权重矩阵编程z(l+1)的,然后z(l+1)通过激活函数又会变成a(l+1),只要遵循这个就可以一步一步推导得出结果。

    5、计算得出θij(l)的偏导数
       反向传播算法的最终目的就是为了方便计算偏导数,到这一步就可以计算偏导数了。下面先重新放上吴恩达老师的视频截图,如下图所示
    在这里插入图片描述

       从上图中我们可以看到,吴恩达老师还把g’(a)展开成了g(a)*(1-g(a))的形式,这个其实是因为sigmoid函数的性质造成的,具体推导如下:
    在这里插入图片描述
       关于偏导数的推导如下图所示:
    在这里插入图片描述
       通过上面的推导,就可以完全解释吴恩达老师所有公式的原理了。

    4.参考文章

    1、反向传播算法(过程及公式推导)
    2、反向传播输出层误差 δ
    3、详解反向传播算法(上)
    4、详解反向传播算法(下)

    展开全文
  • 定义 首先来一个反向传播算法的定义(转自维基百科):反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。...

    前言(扯犊子)

    自己学习机器学习,深度学习也有好长一段时间了,一直以来都想写点有价值的技术博客,以达到技术分享及记录自己成长的目的,奈何之前一直拖着,近来算是醒悟,打算以后不定时写一写博客,也算是作为自己不断学习,不断进步的记录。既然是写博客,希望自己的博客以后要做到“准确、生动、简洁、易懂”的水平,做到对自己、对读者负责,希望大家多交流,共同进步!

    言归正传,想起当时自己刚入门深度学习的时候,当时对神经网络的“反向传播”机制不是很理解(这对理解以后的很多概念来说,很重要!!一定要搞懂!!),当时查了很多资料,花费了很多时间,感谢当时所查阅的很多资料的作者,本篇博客就网络上很多优秀的资料和我个人的理解,争取生动、简单地讲解一下BP算法,希望能够帮助到大家。

    定义

    首先来一个反向传播算法的定义(转自维基百科):反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。 该方法对网络中所有权重计算损失函数的梯度。 这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。(误差的反向传播)

    算法讲解(耐心看)

    如果去问一下了解BP算法的人“BP算法怎推导?”,大概率得到的回答是“不就是链式求导法则嘛”,我觉得这种答案对于提问题的人来说没有任何帮助。BP的推导需要链式求导不错,但提问者往往想得到的是直观的回答,毕竟理解才是王道。直观的答案,非图解莫属了。
    注:下图的确是反向传播算法,但不是深度学习中的backprop,不过backward的大体思想是一样的,毕竟误差没法从前往后计算啊。(在深度学习中操作的是计算图—Computational graph),如果暂时不理解上面那句话,你可以当我没说过,不要紧~(手动?)

    下面通过两组图来进行神经网络前向传播反向传播算法的讲解,第一组图来自国外某网站,配图生动形象。如果对你来说,单纯的讲解理解起来比较费劲,那么可以参考第二组图——一个具体的前向传播和反向传播算法的例子。通过本篇博客,相信就算是刚刚入门的小白(只要有一点点高等数学基础知识),也一定可以理解反向传播算法!

    CASE 1(图示讲解,看不太懂没关系,看第二组图)

    首先拿一个简单的三层神经网络来举例,如下:
    在这里插入图片描述

    每个神经元由两部分组成,第一部分(e)是输入值权重系数乘积的,第二部分(f(e))是一个激活函数(非线性函数)的输出, y=f(e)即为某个神经元的输出,如下:
    在这里插入图片描述

    下面是前向传播过程:
    在这里插入图片描述
    -----------手动分割-----------
    在这里插入图片描述
    -----------手动分割-----------
    在这里插入图片描述

    到这里为止,神经网络的前向传播已经完成,最后输出的y就是本次前向传播神经网络计算出来的结果(预测结果),但这个预测结果不一定是正确的,要和真实的标签(z)相比较,计算预测结果和真实标签的误差( δ \delta δ),如下:
    在这里插入图片描述

    下面开始计算每个神经元的误差( δ \delta δ):
    在这里插入图片描述
    (If propagated errors came from few neurons they are added. The illustration is below: )

    在这里插入图片描述

    下面开始利用反向传播的误差,计算各个神经元(权重)的导数,开始反向传播修改权重(When the error signal for each neuron is computed, the weights coefficients of each neuron input node may be modified. In formulas below d f ( e ) d e \dfrac {df\left( e\right) }{de} dedf(e) represents derivative of neuron activation function (which weights are modified). ):
    在这里插入图片描述
    在这里插入图片描述
    -----------手动分割-----------
    在这里插入图片描述
    -----------手动分割-----------
    在这里插入图片描述

    Coefficient η \eta η affects network teaching speed.
    到此为止,整个网络的前向,反向传播和权重更新已经完成,推荐参考上面给出的本教程的链接,如果对纯理论讲解较难接受,没关系,强烈推荐第二组图的例子!!!

    CASE 2(具体计算举例,嫌麻烦的可直接看这个,强烈推荐!!!!!)

    首先明确,“正向传播”求损失,“反向传播”回传误差。同时,神经网络每层的每个神经元都可以根据误差信号修正每层的权重,只要能明确上面两点,那么下面的例子,只要会一点链式求导规则,就一定能看懂!

    BP算法,也叫 δ \delta δ算法,下面以3层的感知机为例进行举例讲解。
    在这里插入图片描述

    上图的前向传播(网络输出计算)过程如下:(此处为网络的整个误差的计算,误差E计算方法为mse)

    在这里插入图片描述

    上面的计算过程并不难,只要耐心一步步的拆开式子,逐渐分解即可。现在还有两个问题需要解决:

    1. 误差E有了,怎么调整权重让误差不断减小?
    2. E是权重w的函数,何如找到使得函数值最小的w。

    解决上面问题的方法是梯度下降算法(简单图示如下),大家如有不太懂的可先行查阅别的资料,只要能达到理解线性回归梯度下降算法的水平即可,这里不再赘述。
    在这里插入图片描述

    划重点,划重点,划重点!!!
    BP算法的具体例子来喽!!

    就算上面的所有东西你都看的迷迷糊糊,通过下面的例子,相信绝大多数人也能很轻松的理解BP算法。如图是一个简单的神经网络用来举例:
    在这里插入图片描述

    下面是前向(前馈)运算(激活函数为sigmoid):
    在这里插入图片描述

    下面是反向传播(求网络误差对各个权重参数的梯度):

    我们先来求最简单的,求误差E对w5的导数。首先明确这是一个“链式求导”过程,要求误差E对w5的导数,需要先求误差E对out o1的导数,再求out o1对net o1的导数,最后再求net o1对w5的导数,经过这个链式法则,我们就可以求出误差E对w5的导数(偏导),如下图所示:
    在这里插入图片描述

    导数(梯度)已经计算出来了,下面就是反向传播与参数更新过程
    在这里插入图片描述

    上面的图已经很显然了,如果还看不懂真的得去闭门思过了(开玩笑~),耐心看一下上面的几张图,一定能看懂的。

    如果要想求误差E对w1的导数,误差E对w1的求导路径不止一条,这会稍微复杂一点,但换汤不换药,计算过程如下所示:
    在这里插入图片描述

    至此,“反向传播算法”及公式推导的过程总算是讲完了啦!个人感觉,尤其是第二组图,还算是蛮通俗易懂的,希望能帮助到大家,共同进步!

    感觉本篇讲的有点啰嗦了,直接放第二组图可能会更简洁,以后争取改进。

    以上(麻烦大家 点赞 + 关注 一波啊)

    References

    http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html
    https://www.cnblogs.com/charlotte77/p/5629865.html
    https://blog.csdn.net/han_xiaoyang

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,216
精华内容 26,886
关键字:

反向传播算法

友情链接: SMA.zip