当前位置: 首页 > news >正文

BP神经网络的反向传播(Back Propagation)

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/

目录

  • 一、什么是BP的反向传播
    • 1.1 什么是反向传播
    • 1.2 反向传播的意义
  • 二、BP神经网络如何通过反向传播计算梯度
  • 三、BP梯度公式解读

BP神经网络更原始的名称是"多层线性感知机MLP",由于它在训练时使用梯度下降算法,并"反向传播Back Propagation Neural"地计算梯度,所以后来也称为BP神经网络。下面讲解什么是BP神经网络的反向传播。

一、什么是BP的反向传播

1.1 什么是反向传播

“反向传播指的是BP神经网络计算参数的梯度时的计算方式”,由于BP神经网络求解时所使用的是梯度下降算法(或其他算法),这些算法一般都需要利用误差函数对参数的梯度,因此,计算梯度是BP神经网络训练中重要的一部分,而反向传播式地计算梯度就是BP神经网络的特色,BP神经网络之所以叫BP(Back Propagation Neural Network)神经网络,指的正是它计算梯度时这种后馈的特色。
BP神经网络反向传播

1.2 反向传播的意义

而对于常用的三层BP神经网络的梯度推导,而可以简单地直接求导就可以,甚至不需要涉及到反向传播,反向传播更多是为了多层、深层的BP神经网络而提出的计算方法。反向传播的意义更多是体现在深度学习之中。
三层BP神经网络梯度推导过程:三层BP神经网络梯度推导过程

二、BP神经网络如何通过反向传播计算梯度

如下,是一个K层的BP神经网络:
在这里插入图片描述
不妨以第k-1层到第k层的参数 p ( k , k − 1 ) p^{(k,k-1)} p(k,k1)为例,分析它的梯度公式是什么
由于第k层节点是关于 p ( k , k − 1 ) p^{(k,k-1)} p(k,k1)的函数,且后一层的节点总是前一层节点的函数
如此一来, E ( p ( k , k − 1 ) ) E(p (k,k−1) ) E(p(k,k1))可以看成是如下一个超级复合函数:
E ( p ( k , k − 1 ) ) = E ( N ( K ) ( . . . ( N ( k + 1 ) ( N ( k ) ( p ( k , k − 1 ) ) ) ) ) E(p^{(k,k-1)})=E(N^{(K)}(...(N^{(k+1)}(N^{(k)}(p^{(k,k-1)})))) E(p(k,k1))=E(N(K)(...(N(k+1)(N(k)(p(k,k1)))))
因此对于 p ( k , k − 1 ) p^{(k,k-1)} p(k,k1)的梯度,根据复合函数的链式求导,则有:
∂ E ∂ p ( k , k − 1 ) = ∑ i K ∂ E ∂ N i K ( K ) ∑ i K − 1 ∂ N i K ( K ) ) ∂ N i K − 1 ( K − 1 ) ∑ i K − 2 ∂ N i K − 1 ( K − 1 ) ) ∂ N i K − 2 ( K − 2 ) . . . . ∑ i k ∂ N i k ( k ) ) ∂ p ( k , k − 1 ) \dfrac{\partial E}{\partial p^{(k,k-1)}} =\sum\limits_{i_K}\dfrac{\partial E}{\partial N^{(K)}_{i_K}} \sum\limits_{i_{K-1}}\dfrac{\partial N^{(K)}_{i_K})}{\partial N^{(K-1)}_{i_{K-1}}} \sum\limits_{i_{K-2}}\dfrac{\partial N^{(K-1)}_{i_{K-1}})}{\partial N^{(K-2)}_{i_{K-2}}} ....\sum\limits_{i_{k}}\dfrac{\partial N^{(k)}_{i_k})}{\partial p^{(k,k-1)}} p(k,k1)E=iKNiK(K)EiK1NiK1(K1)NiK(K))iK2NiK2(K2)NiK1(K1))....ikp(k,k1)Nik(k))

三、BP梯度公式解读

看着头很晕,但粗略可以看出,它分为三块:
BP神经网络梯度公式解读

  1. 先由误差函数求出最后一层的节点梯度
  2. 不断地求后一层节点对前一层的节点梯度,直到所要求的参数所在的节点
  3. 最后求出节点对参数的梯度就可以

可以看出,整个梯度的计算过程由误差函数开始,不断地后馈到前一层节点,最后传播到参数上
而这种后馈的特性,给求解梯度带来了非常大的便利性,它的计算过程如下:

  • 先算出最后一层节点的梯度,再后馈式逐层传播到每一层的节点
  • 每当算出某层节点的梯度时,就马上计算当层的参数,如此迭代就可以

相关链接:

《老饼讲解-机器学习》:老饼讲解-机器学习教程-通俗易懂
《老饼讲解-神经网络》:老饼讲解-matlab神经网络-通俗易懂
《老饼讲解-神经网络》:老饼讲解-深度学习-通俗易懂

相关文章:

  • 方法区讲解
  • EasyExcel 导出批注信息
  • 【Go】十四、图形验证码、短信验证码、注册接口与redis的简单使用
  • 单片机练习题3
  • 每日优秀影视分享❗❗
  • WPF文本绑定显示格式StringFormat设置-特殊格式时间日期和多数据绑定
  • 原生dom操作快速写入html渲染(insertAdjacentHTML)
  • Cadence:Conformal系列形式验证工具
  • 深入解析Netty的Reactor模型及其实现:详解与代码示例
  • Pikachu靶场--XSS
  • excel数据透视
  • Ubuntu常见命令解释
  • 修改主频睡眠模式停止模式待机模式
  • 第五章重采样方法
  • 牛顿迭代法(求解整数的近似平方根)
  • 分享一款快速APP功能测试工具
  • 2019.2.20 c++ 知识梳理
  • Angular 响应式表单之下拉框
  • C# 免费离线人脸识别 2.0 Demo
  • CentOS 7 防火墙操作
  • ES6核心特性
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript异步流程控制的前世今生
  • learning koa2.x
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux Process Manage
  • mysql外键的使用
  • oschina
  • Promise初体验
  • Python爬虫--- 1.3 BS4库的解析器
  • scrapy学习之路4(itemloder的使用)
  • Transformer-XL: Unleashing the Potential of Attention Models
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue.js-Day01
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • WePY 在小程序性能调优上做出的探究
  • zookeeper系列(七)实战分布式命名服务
  • 从伪并行的 Python 多线程说起
  • 对JS继承的一点思考
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 高性能JavaScript阅读简记(三)
  • 近期前端发展计划
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 前端攻城师
  • 学习使用ExpressJS 4.0中的新Router
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 你对linux中grep命令知道多少?
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 移动端高清、多屏适配方案
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • (10)STL算法之搜索(二) 二分查找
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数