这里默认了解前向传播,所以不在重述这块,如果对梯度下降有疑惑的,不知道原理的可以看我这篇博客
http://blog.csdn.net/sxf1061926959/article/details/66976356
我用线性回归讲了下梯度下降的原理以及一些理解。本篇主要在BP反向传播的推导,直接开始

不太会画图,直接手画了一个。

隐藏层梯度求解过程

如上图所示,为一个输出层神经元,在计算输出层梯度的时候,我们不用去考虑前一层是如何输入的。所以我们用y来表示,图中的y(n)表示第n个样本在前一层的输出值,这一层的输入值。我们将当前节点定义为j。那么当前节点j的输入值之和为

这里的m是节点j前一层的输入节点的个数,其中包括一个偏置项b。这里的公式都很像,看公式注意下标。然后节点j的输出要经过激活函数,如图所示我们定义激活函数为。那么当前节点j的输出值为

图中还有一个,这个表示输入样本的真实标签,这是用来度量网络输出和真实样本之间的误差的。此处定义误差

然后为计算梯度,我们需要有一个损失函数,因为反传其实就是在求损失函数对权值的梯度。
我们这里使用平方误差作为损失函数,所以损失函数为

这里的C为全部的输出层神经节点
好了,把前提说清楚了,就可以开始求梯度了
我们现在开始求隐藏层权值的梯度

写得简单点,用上面定义好符号的代替就是
然后我们按照上面的一个个把梯度求出来,在最后去把他们乘起来。

继续

这里注意下,分子上的求和符号展开后,除了含有的哪项外,其他所求的导数都为0,,因为对当前权值来说,他们都是常数,常数的导数为0.所以我们能得到

现在把这些都放回原来的公式去

可以看出来,当前求的梯度和前一层的输入直接相关。一旦有了梯度,我们要做的就是用这个梯度去更新权值,当然不能直接减,太大了,所以加入一个步长,得到

最后更新权值

这里要注意,里我提前加了一个负号,所以,在后面公式中我用的去更新梯度,但是如果前面没加负号,那么这里应该是减号,因为我们要找的是梯度下降的方向。

隐藏层梯度计算

前面计算了输出层的梯度更新,这里我们要计算隐藏层。
之所以输出层和隐藏层要分开计算,那是因为隐藏层更加复杂,可以想象一下,隐藏层的节点,会连接下一层的所有节点,那么在梯度反传的时候也要从这些连接的节点去获取梯度。所以隐藏层就不能只求一个节点的梯度了,但是原理还是一样的,也是求损失函数对当前权值的梯度,只是计算过程变得比前面一个复杂了一点点。

这里我重新画了两个节点,左边这个表示隐藏层节点j,右边那个表示输出层节点k,我们刚才计算的就是右边那个,现在我们来计算前面这个。
别看我这里只画了一个输出层节点k,但是真实情况不一定只有一个,如果有多个,那么当前的节点j一定会和其有链接,那么和其连接的节点就会有梯度反传。
所以需要重新计算梯度,和输出层不同的是,输出层只需要去考虑一个输出神经元的损失,而隐藏层需要去考虑全部全部输出层节点的损失,如下

在求输出层的时候,因为权值只和其中的一个e有关,所以上面的累加展开后,只有一项为非零,其他全是0。但是在这里,隐藏层和上面的每个节点都要连接,所以我们这里要对全部的e求导。
得到

然后后面的就是差不多的了,一直求梯度求下去、

这里我直接写出来了,步骤和前面的差不多,自己试着推导下就知道了
我们直接得到最终的梯度更新

看着是不是有点复杂,别急
到这里,梯度更新的推导算是结束了,根据以上公式可以推导出任何一个权值的梯度
然后我们可以看看这些梯度之间有那些共同点,我把前面推导好的输出层和隐藏层梯度拿下来,如下

上面一个是输出层的,下面一个是隐藏层的,可以发现,每个公式中,最后一项都是所求权值的输入值,导数第二项都是激活函数的导数值,剩下的为传下来的损失。所以在算法实现的时候,往往把前面的损失值和激活函数导数的乘积当作一项整体,这样就可以实现链式计算,方便代码实现。我们把他叫做局部梯度,如上面两个公式可以改成如下式子(下标kj的是输出层的,下标ji的是隐藏层的):

然后隐藏层的前半部分式子可以继续合并

最终得到

所以不管是求哪个权值的梯度,我们都可以化简为如下形式

这样算法实现起来就方便多了

python实现

主程序

定义好输入节点、输出节点、隐藏节点大小、以及学习率等

前向传播

反向更新

代码github地址

参考

1.neural network and machine learning.

BP算法推导(python实现)相关推荐

  1. 反向传播(BP算法)python实现

    反向传播(BP算法)python实现 1.BP算法描述 BP算法就是反向传播,要输入的数据经过一个前向传播会得到一个输出,但是由于权重的原因,所以其输出会和你想要的输出有差距,这个时候就需要进行反向传 ...

  2. 机器学习必刷题-手撕推导篇(2):BP算法推导

    本系列文章对常见的机器学习面试题进行了搜集.分类和整理,主要包括"手撕推导篇"."模型比较篇"."工程经验篇"以及"基础概念篇&q ...

  3. 多层感知机Perceptron反向传播BP算法推导(Back Propagation)

    看了很多BP的推导,都不够简洁直观,这里总结一下.多层Perceptron就是全连接的网络,定义第l层的输入为x(l)x^{(l)}x(l),那么全连接的线性输出z(l)=W(l)x(l)+b(l)z ...

  4. 标准BP算法用Python编程实现

    1.需要导入两个模块 import pandas as pd import numpy as np 2.定于激活函数 def sigmoid(x):return 1/(1+np.exp(-x)) 3. ...

  5. 机器学习--BP算法推导理解

    首先打卡Ng老师的机器学习,今天是第六天. 昨天晚上在b站看了神经网络那节,Ng老师对于反向传播原理并没有做出解释,听了之后满头问号.幸亏开了弹幕,在各种弹幕发的博客链接的帮助下,今天总算把整个过程搞 ...

  6. BP算法与python代码实现

    反向传播算法是神经网络训练参数与权重的方法之一.该方法与梯度下降算法相结合,对网络中所有权重以及偏置计算损失函数的梯度,并利用梯度值来更新权值与偏置,实现损失函数的最小化. 1.前向传播 前向传播指的 ...

  7. 鸢尾花完整的python代码_鸢尾花BP算法实现 Python

    映射关系: train 120条数据,4个特征值 W1 arrY1 隐藏层为10层 W2 arrY2 每一条数据,有3种输出结果 测试数据,输入层 权重 隐藏层 权重 输出层 输入层到隐藏层: 隐藏层 ...

  8. 全链接神经网络——BP算法推导过程

  9. 神经网络中BP算法的推导

    神经网络BP算法的推导 有关BP算法推导的文章数不胜数,但是好多只讲到了单样本的BP算法的推导,有些虽然讲到了多样本的BP算法的推导,但是没讲清楚甚至是讲错了的都有一些. 1. 单样本BP算法推导 关 ...

最新文章

  1. ThunderSoft Flash to HTML5中文版
  2. Object C为UILabel添加点击事件
  3. 51`CTO下载中心——我的新爱
  4. Linux Shell文本处理工具集锦
  5. stm32实验报告心得体会_嵌入式第9次实验报告
  6. 论文计算机辅助辅助教学应用,计算机辅助教学应用论文.doc
  7. 电脑桌面便签_电脑上哪些便签有提醒功能?求一款好用的电脑桌面提醒便签软件...
  8. FFmpeg总结(六)AV系列结构体之AVPacket
  9. Java知识系统回顾整理01基础01第一个程序05Eclipse中运行Java程序
  10. priority_queue C++
  11. VB程序设计算机,VB编程:编写一个过程,用来计算并输出 S=1+1/2+1/3+……+1/100 的值。...
  12. 第三届易观算法大赛 -- OLAP Session分析(5万奖金)
  13. Oracle 购买价格 和 服务费 计算方式
  14. oracle 加权久期,债券 加权久期 怎么计算
  15. 计算机word排版素材,WORD基础排版素材
  16. 虚拟专用网络安全技术
  17. 27岁了,目前从事软件测试,听说测试前途是IT里最差的,是这样吗?
  18. MIT6.824-lab3AB-2022(万字推导思路及代码构建)
  19. 关于多个债权人申请执行同一被执行人的清偿顺序问题
  20. 虚拟机包 OVF和OVA的区别

热门文章

  1. Windows 定时启动 关闭软件
  2. 工业大数据应用技术国家工程实验室
  3. Java教程,Java视频,培训机构免费资源下载汇总帖,全网最有情怀,集合所以品牌机构(持续更新...)
  4. 概率函数P(x)、概率分布函数F(x)与概率密度函数f(x)的区别
  5. named_modules named_parameters
  6. python panda3d教程_panda3d学习笔记(一)Hello World
  7. word2vec(2) 背景知识
  8. electron-builder 和 pnpm(monorepo) 一起使用
  9. C#连接数据库代码示例
  10. grasscutter 使用指南——Android/Windows/IOS端均已支持