BP算法推导(python实现)
这里默认了解前向传播,所以不在重述这块,如果对梯度下降有疑惑的,不知道原理的可以看我这篇博客
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实现)相关推荐
- 反向传播(BP算法)python实现
反向传播(BP算法)python实现 1.BP算法描述 BP算法就是反向传播,要输入的数据经过一个前向传播会得到一个输出,但是由于权重的原因,所以其输出会和你想要的输出有差距,这个时候就需要进行反向传 ...
- 机器学习必刷题-手撕推导篇(2):BP算法推导
本系列文章对常见的机器学习面试题进行了搜集.分类和整理,主要包括"手撕推导篇"."模型比较篇"."工程经验篇"以及"基础概念篇&q ...
- 多层感知机Perceptron反向传播BP算法推导(Back Propagation)
看了很多BP的推导,都不够简洁直观,这里总结一下.多层Perceptron就是全连接的网络,定义第l层的输入为x(l)x^{(l)}x(l),那么全连接的线性输出z(l)=W(l)x(l)+b(l)z ...
- 标准BP算法用Python编程实现
1.需要导入两个模块 import pandas as pd import numpy as np 2.定于激活函数 def sigmoid(x):return 1/(1+np.exp(-x)) 3. ...
- 机器学习--BP算法推导理解
首先打卡Ng老师的机器学习,今天是第六天. 昨天晚上在b站看了神经网络那节,Ng老师对于反向传播原理并没有做出解释,听了之后满头问号.幸亏开了弹幕,在各种弹幕发的博客链接的帮助下,今天总算把整个过程搞 ...
- BP算法与python代码实现
反向传播算法是神经网络训练参数与权重的方法之一.该方法与梯度下降算法相结合,对网络中所有权重以及偏置计算损失函数的梯度,并利用梯度值来更新权值与偏置,实现损失函数的最小化. 1.前向传播 前向传播指的 ...
- 鸢尾花完整的python代码_鸢尾花BP算法实现 Python
映射关系: train 120条数据,4个特征值 W1 arrY1 隐藏层为10层 W2 arrY2 每一条数据,有3种输出结果 测试数据,输入层 权重 隐藏层 权重 输出层 输入层到隐藏层: 隐藏层 ...
- 全链接神经网络——BP算法推导过程
- 神经网络中BP算法的推导
神经网络BP算法的推导 有关BP算法推导的文章数不胜数,但是好多只讲到了单样本的BP算法的推导,有些虽然讲到了多样本的BP算法的推导,但是没讲清楚甚至是讲错了的都有一些. 1. 单样本BP算法推导 关 ...
最新文章
- ThunderSoft Flash to HTML5中文版
- Object C为UILabel添加点击事件
- 51`CTO下载中心——我的新爱
- Linux Shell文本处理工具集锦
- stm32实验报告心得体会_嵌入式第9次实验报告
- 论文计算机辅助辅助教学应用,计算机辅助教学应用论文.doc
- 电脑桌面便签_电脑上哪些便签有提醒功能?求一款好用的电脑桌面提醒便签软件...
- FFmpeg总结(六)AV系列结构体之AVPacket
- Java知识系统回顾整理01基础01第一个程序05Eclipse中运行Java程序
- priority_queue C++
- VB程序设计算机,VB编程:编写一个过程,用来计算并输出 S=1+1/2+1/3+……+1/100 的值。...
- 第三届易观算法大赛 -- OLAP Session分析(5万奖金)
- Oracle 购买价格 和 服务费 计算方式
- oracle 加权久期,债券 加权久期 怎么计算
- 计算机word排版素材,WORD基础排版素材
- 虚拟专用网络安全技术
- 27岁了,目前从事软件测试,听说测试前途是IT里最差的,是这样吗?
- MIT6.824-lab3AB-2022(万字推导思路及代码构建)
- 关于多个债权人申请执行同一被执行人的清偿顺序问题
- 虚拟机包 OVF和OVA的区别
热门文章
- Windows 定时启动 关闭软件
- 工业大数据应用技术国家工程实验室
- Java教程,Java视频,培训机构免费资源下载汇总帖,全网最有情怀,集合所以品牌机构(持续更新...)
- 概率函数P(x)、概率分布函数F(x)与概率密度函数f(x)的区别
- named_modules named_parameters
- python panda3d教程_panda3d学习笔记(一)Hello World
- word2vec(2) 背景知识
- electron-builder 和 pnpm(monorepo) 一起使用
- C#连接数据库代码示例
- grasscutter 使用指南——Android/Windows/IOS端均已支持