深度学习之 BP 算法

神经网络的一种求解W的算法,分为信号“正向传播(FP)”求损失,“反向传播(BP)”回传误差;根据误差值修改每层的权重,继续迭代。

BP算法也叫做δ算法。以三层的感知器为例(假定现在隐层和输出层均存在相同类型的激活函数)

  • 隐层 y = f(x * v)
  • 输出层 o = f(f(y) * w)
  • 输入层误差:E=\frac{1}{2}(d-O)^{2}=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-O_k)^2
  • 隐层误差:   E=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-f(net_k))^2=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-f(\sum_{j=1}^{m}w_{jk}y_j)))^2
  • 输入层误差:E=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-f\left [ \sum_{j=1}^{m}w_{jk}f(net_j)\right ])^2=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-f\left [ \sum_{j=1}^{m}w_{jk}f\left ( \sum_{i=1}^{n}v_{ij}x_i \right )\right ])^2

误差E有了,那么为了使误差越来越小,可以采用随机梯度下降的方式进行ω和υ的求解,即求得ω和υ使得误差E最小

BP算法的例子

å¨è¿éæå¥å¾çæè¿°

  • 初始值:w(0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65),   b(0.35,0.65)
  • 输出值:O=(0.01,0.99)
  • 学习率:η=0.5 
  • 假设隐层和输出层都使用 sigmoid 激活函数

1、FP过程

先求out

net_{h_1} = w_1 * l_1 + w_2 * l_2 + b_1 * 1 = 0.1 * 5 + 0.15*10+0.35*1=2.35
out_{h_1} = \frac{1}{1+e^{-h_1}} = \frac{1}{1+e^{-2.35}} = 0.912934

同理可以得到:

out_{h_2} =0.979164
out_{h_3} =0.995275

o_1 = w_7 * out_{h_1}+w_9 * out_{h_2}+w_{10} * out_{h_3}+b_2*1

out_{o1} = \frac{1}{1+e^{-o_1}} = \frac{1}{1+e^{-2.1019206}}=0.891090

同理可以得到:

out_{0_2} =0.904330

输出层误差表示如下:

E = \frac{1}{2}(d - O)^2 = \frac{1}{2}\sum_{k=1}^l(d_k - O_k)^2
E_{o_1} = \frac{1}{2}(target_{o_1} - out_{o_1})^2

E_{total} = E_{o_1}+E_{o_2}= \frac{1}{2}(0.01 - 0.891090)^2 + \frac{1}{2}(0.99 -0.904330 )^2 = 0.391829

2、BP 过程

输出层到第二层隐层,以求 w_7  为例:

\frac{\partial E_{total}}{\partial w_7} =\frac{\partial E_{total}}{\partial out_{o_1}}*\frac{\partial out_{o_1}}{\partial o_1}*\frac{\partial o_1}{\partial w_7}

下面我们分别求上式的三个部分,其中第一部分:

E_{o_1} = \frac{1}{2}(target_{o_1} - out_{o_1})^2

E_{total} = E_{o_1}+E_{o_2}=\frac{1}{2}(target_{o_1} - out_{o_1})^2+\frac{1}{2}(target_{o_2} - out_{o_2})^2

\frac{\partial E_{total}}{\partial out_{o_1}} = 2 * \frac{1}{2}(target_{o_1}-out_{o_1}) * (-1) + 0 = -(0.01 - 0.891090) = 0.88109

第二分部因为:

out_{o1} = \frac{1}{1+e^{-o_1}}

\begin{align*} {out_{o_1}}'=\frac{e^{-o_1}}{(1+e^{-o_1})^2}=\frac{1+e^{-o_1}-1}{(1+e^{-o_1})^2}=\frac{1}{1+e^{-o_1}}-\frac{1}{(1+e^{-o_1})^2}=out_{o_1}(1- out_{o_1}) \end{align*}

\frac{\partial out_{o_1}}{\partial o_1} = out_{o_1}(1 - out_{o_1}) = 0.891090(1 - 0.891090) = 0.097049

第三部分,因为:

o_1 = w_7 * out_{h_1}+w_9 * out_{h_2}+w_{10} * out_{h_3}+b_2*1

\frac{\partial o_1}{\partial w_7} = out_{h_1} + 0 + 0+0=0.912934

最终得到:

\frac{\partial E_{total}}{\partial w_7} =0.88109*0.097049*0.912934=0.078064

更新 w_7 的值:

\hat{w_7} = w_7 + \Delta w_7 = w_7 - \eta \frac{\partial E_{total}}{\partial w_7} =0.4 - 0.5 * 0.078064=0.360968

同理可以求出:

\hat{w_8} = 0.453383

\hat{w_9} = 0.458137

\hat{w_{10}} = 0.553629 

\hat{w_{11}} = 0.557448

\hat{w_{12}} = 0.653688

第二层隐层到第一层隐层,以求 w_1 为例:

\frac{\partial E_{total}}{\partial w_1} = \frac{\partial E_{total}}{\partial out_{h_1}}* \frac{\partial out_{h_1}}{\partial h_1}* \frac{\partial h_1}{\partial w_1}

\frac{\partial E_{total}}{\partial w_1}=\Big(\frac{\partial E_{o_1}}{\partial out_{h_1}} + \frac{\partial E_{o_2}}{\partial out_{h_1}}\Big)* \frac{\partial out_{h_1}}{\partial h_1}* \frac{\partial h_1}{\partial w_1}

\frac{\partial E_{o_1}}{\partial out_{h_1}}=\frac{\partial E_{o_1}}{\partial out_{o_1}} * \frac{\partial out_{o_1}}{\partial o_1}*\frac{\partial o_1}{\partial out_{h_1}}

下面我们分别计算,第一部分:

\frac{\partial E_{o_1}}{\partial out_{h_1}}=\frac{\partial E_{o_1}}{\partial out_{o_1}} * \frac{\partial out_{o_1}}{\partial o_1}*\frac{\partial o_1}{\partial out_{h_1}}

其中:

E_{o_1} = \frac{1}{2}(target_{o_1} - out_{o_1})^2

out_{o1} = \frac{1}{1+e^{-o_1}}

o_1 = w_7 * out_{h_1}+w_9 * out_{h_2}+w_{10} * out_{h_3}+b_2*1

\frac{\partial E_{o_1}}{\partial out_{h_1}}=-(target_{o_1} - out_{o_1})*out_{o_1}*(1- out_{o_1})*\hat{w_7}

注意:这里由于是反向传播,此时要用到之前更新后的 w_7​ 的值

\begin{align*}\frac{\partial E_{o_1}}{\partial out_{h_1}}=-(0.01 - 0.891090)*0.891090*(1-0.891090)*0.360968=0.030866 \end{align*}

同理计算:

\frac{\partial E_{o_2}}{\partial out_{h_1}} = \frac{\partial E_{o_2}}{\partial out_{o_2}} * \frac{\partial out_{o_2}}{\partial o_2}*\frac{\partial o_2}{\partial out_{h_1}}

\begin{align*} \frac{\partial E_{o_2}}{\partial out_{h_1}} &= -(target_{o_2} -out_{o_2})*out_{o_2}(1-out_{o_2})*w_8 \\ & =-(0.99-0.904330)*0.904330*(1-0.904330)*0.453383\\ &=-0.003360 \end{align*}

接着计算第二部分:

\frac{\partial out_{h_1}}{\partial h_1}=out_{h_1}*(1-out_{h_1}) =0.912934*(1-0.912934)=0.079486

接着计算第三部分:

\frac{\partial h_1}{\partial w_1} = l_1 = 5

最终整合起来:

\frac{\partial E_{total}}{\partial w_1} = (0.030866 + (-0.003360))*0.079486 *5=0.010932

于是更新 w_1

\hat{w_1} = w_1 + \Delta w_1 = w_1 - \eta \frac{\partial E_{total}}{\partial w_1} = 0.1 - 0.5 *0.010932 =0.094534

同理求出:w_2, w_3,w_4,w_5,w_6

以上是第一次迭代,经过多次迭代,最终的误差会越来越小

上图可以看出,当迭代1000次时,输出为 O=(0.022971,0.977675) 和原本的 O=(0.01,0.99) 比较接近了。

python代码

https://github.com/flepeng/code/blob/master/DL/bp_demo.py

import numpy as np# 初始值
w = [0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65]
# 偏置项b不进行更新
b = [0.35, 0.65]l = [5, 10]# sigmoid函数
def sigmoid(z):return 1.0 / (1 + np.exp(-z))def f1(w, b, l):# 前向传播,计算结果值h1 = sigmoid(w[0] * l[0] + w[1] * l[1] + b[0])h2 = sigmoid(w[2] * l[0] + w[3] * l[1] + b[0])h3 = sigmoid(w[4] * l[0] + w[5] * l[1] + b[0])o1 = sigmoid(w[6] * h1 + w[8] * h2 + w[10] * h3 + b[1])o2 = sigmoid(w[7] * h1 + w[9] * h2 + w[11] * h3 + b[1])# 后向传播,更新w# 输出层到第二层隐层,前两项# 公式中的第一部分-(0.01 - o1),第二部分o1 * (l - o1)t1 = -(0.01 - o1) * o1 * (l - o1)# 第二层隐层到第一层隐层,前两项t2 = -(0.99 - o2) * o2 * (l - o2)# t1*第三部分,即输出层到第二层隐层的参数梯度w[6] = w[6] - 0.5 * (t1 * h1)w[8] = w[8] - 0.5 * (t1 * h2)w[10] = w[10] - 0.5 * (t1 * h3)w[7] = w[7] - 0.5 * (t2 * h1)w[9] = w[9] - 0.5 * (t2 * h2)w[11] = w[11] - 0.5 * (t2 * h3)# (t1 * w[6] + t2 * w[7])对于公式()中的两项,h1 * (1 - h1)对于第二项,l[0]对应第三项w[0] = w[0] - 0.5 * (t1 * w[6] + t2 * w[7]) * h1 * (1 - h1) * l[0]w[1] = w[1] - 0.5 * (t1 * w[6] + t2 * w[7]) * h1 * (1 - h1) * l[1]w[2] = w[2] - 0.5 * (t1 * w[8] + t2 * w[9]) * h2 * (1 - h2) * l[0]w[3] = w[3] - 0.5 * (t1 * w[6] + t2 * w[9]) * h2 * (1 - h2) * l[1]w[4] = w[4] - 0.5 * (t1 * w[10] + t2 * w[11]) * h3 * (1 - h3) * l[0]w[5] = w[5] - 0.5 * (t1 * w[10] + t2 * w[11]) * h3 * (1 - h3) * l[1]return o1, o2, wfor i in range(1000):r1, r2, w = f1(w, b, l)print("第{}次迭代后,结果值为:({},{}),权重更新为:{}".format(i+1, r1, r2, w))

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习之 RBF神经网络

RBF神经网络通常只有三层,即输入层、中间层和输出层。其中中间层主要计算输入x和样本矢量c(记忆样本)之间的欧式距离的Radial Basis Function (RBF)的值,输出层对其做一个线性的组合。 径向基函数: RBF神经网络的训练…

redis 队列_Redis与Rabbitmq消息队列的区别

将redis发布订阅模式用做消息队列和rabbitmq的区别:可靠性 redis :没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中;rabbit…

EasyUI中那些不容易被发现的坑——EasyUI重复请求2次的问题

问题控件:datagrid、combobox、所有能设置url属性的控件 问题版本:1.4.4、1.4.5(之前的版本没测) 问题如图: 重复请求2次,错误代码如图: 错误问题分析:html加载的时候回请求url加载数…

ElasticSearch Java API

ElasticSearch-Java Client类型 ElasticSearch-TransportClient环境准备 ElasticSearch-TransportClient连接 ElasticSearch-Document APIs ElasticSearch-搜索-原理 ElasticSearch-搜索-问题 ElasticSearch-搜索-问题解决思路 ElasticSearch-搜索-SearchType-类型一 E…

深度学习之卷积神经网络(Convolutional Neural Networks, CNN)

前面, 介绍了DNN及其参数求解的方法(深度学习之 BP 算法),我们知道DNN仍然存在很多的问题,其中最主要的就是BP求解可能造成的梯度消失和梯度爆炸.那么,人们又是怎么解决这个问题的呢?本节的卷积神经网络(Convolutional Neural Networks, CNN)就是一种解决方法. 我们…

深度学习之卷积神经网络(Convolutional Neural Networks, CNN)(二)

前面我们说了CNN的一般层次结构, 每个层的作用及其参数的优缺点等内容.深度学习之卷积神经网络(Convolutional Neural Networks, CNN)_fenglepeng的博客-CSDN博客 一 CNN参数初始化及参数学习方法 和机器学习很多算法一样, CNN在进行训练之前也要进行参数的初始化操作. 我们…

Hadoop1.x版本升级Hadoop2.x

引言 随着企业数据化和Hadoop的应用越加广泛,hadoop1.x的框架设计越来越无法满足人们对需求,Apache一直在对Hadoop1.x进行修改,最后推出了新一代的Hadoop2.x。从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看,MapRed…

本页由试用版打印控件lodop6.2.6输出_Visual Basic 6.0 Sirk 迷你版

Visual Basic 6.0 Sirk 迷你版 VB6 Sirk Mini 2019更新1、支持主流操作系统,避免原版安装失败的问题:支持Windows XP、Vista、Win7、Win8、Win10(32位、64位)。2、保留大部分常用功能,避免精简版过度精简:包含原版完整控件&#x…

深度学习之卷积神经网络 LeNet

卷积神经网络典型CNN LeNet:最早用于数字识别的CNNLeNet5:现在常说的一般就是LeNet5AlexNet:2012ILSVRC冠军,远超第二名的CNN,比LeNet更深,用多层小卷积叠加来替换单个的大卷积ZF Net:2013ILSV…

dom4j的读写xml文件,读写xml字符串

百度了一些博客,大同小异,在选取jar包工具的时候大概看了下,大抵是jdom原始,dom4j优秀。于是做了些练习。 参考:http://www.cnblogs.com/mengdd/archive/2013/06/05/3119927.html 1 package com.test.xml;2 3 import j…

深度学习之数据增强方案和TensorFlow操作

一、数据增强的方法介绍 增加训练数据, 则能够提升算法的准确率, 因为这样可以避免过拟合, 而避免了过拟合你就可以增大你的网络结构了。 当训练数据有限的时候, 可以通过一些变换来从已有的训练数据集中生成一些新的数据&#x…

使用OpenSSL实现CA证书的搭建过程

个人博客地址:http://www.pojun.tech/ 欢迎访问 什么是CA CA,Catificate Authority,通俗的理解就是一种认证机制。它的作用就是提供证书(也就是服务端证书,由域名,公司信息,序列号,签名信息等等组成&#…

gdb使用实例

第一篇 概论我们将学习使用gdb来调试通过一个通过串行线同PC相连的嵌入式系统。Gdb可以调试各种程序,包括C、C、JAVA、PASCAL、FORAN和一些其它的语言。包括GNU所支持的所有微处理器的汇编语言。在gdb的所有可圈可点的特性中,有一点值得注意,…

Linux 监控命令之 netstat

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。 语法 netstat [-acC…

solr 配置

创建 SolrHome(solrCore) 1.解压 solr-4.10.4.tgz 到 /usr/local/solr 2.将 solr-4.10.4/example/solr 下所有文件拷贝到 /usr/local/solrhome (此 solrhome 为自己创建的) solrhome 是 solr 运行主目录,可包含多个 SolrCore 目录SolrCore 目录中包含运行 Solr 实例…

mfc程序转化为qt_10年程序员:我都学过这些语言,2019年开始我再也不是程序员......

为什么学编程2008年,高中毕业的我问一个已经工作两年的亲戚:什么专业工资高?他告诉我:程序员。2008年成都最低工资好像是800元,我的生活费也是800元,据他所说程序员出来的工资是2000,于是开始了…

day 7 引用

1.ba在c语言和python中的区别 c语言:a100 a变量里面放的100 b a b变量里面也放的100 python : a100 内存中有个100 a放的100的内存地址 b a b也放的100的内存地址 相当于给100那一块内存,贴个便利签 2.type查看数据类型&…

Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示...

Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http://www.cnblogs.com/dunitian/p/5221058.html 平台之大势何人…

ride上点击用例不能显示edit信息_接口测试平台代码实现61: 多接口用例1

终于又序更上了,原谅最近作者几天事情不断。按照我们之前的计划,需要迅速开启很重要的核心多用例接口。首先,我们要确定,这个功能的大体设计。就放在在我们的页面 用例库 中:所以也就是我们很久之前就创建好的P_cases.…

MUI - 预加载

打开详情页回到顶部:document.body.scrollTop document.documentElement.scrollTop 0;方式一:preload一次仅能预加载一个页面(除非循环) var subWebview mui.preload({url: examples/accordion.html,id: template_sub,top: styles: {48 …