一步一步教你反向传播的样例

背景

反向传播(Backpropagation)是训练神经网络最通用的方法之中的一个,网上有很多文章尝试解释反向传播是如何工作的,可是非常少有包括真实数字的样例,这篇博文尝试通过离散的数据解释它是如何工作的。

Python实现的反向传播

你能使用Python来实现反向传播,我以前在this Github repo上实现了反向传播算法。

反向传播的可视化

显示神经网络学习时相互作用的可视化,检查我的Neural Network visualization

另外的资源

假设你发现这个教程对你实用而且想继续学习神经网络以及它的应用。我强烈建议你看Adrian Rosebrock优秀的教程Getting Started with Deep Learning and Python

概述

对于这个教程。我们将使用2个输入神经元、2个隐含层神经元以及2个输出层神经元组成一个神经网络,另外,隐含层和输出层神经元各包括一个偏差。

这是基本结构:

目的让神经网络工作,我们对权重偏差和训练的输入/输出设置一个初始值:

反向传播的目的是优化权重。以便于让神经网络学习如何正确的把随意的输入映射到输出中。

这篇教程的剩余部分我们将要和单一的训练集工作:输入0.05和0.10,我们想要神经网络输出0.01和0.99。

前向反馈

为了開始,当前给定权重和偏差以及输入值0.05和0.10,神经网络预測结果是什么,我们须要把输入值向前传给网络。

我们知道所有的输入值传到每一个隐含层神经元中。使用激活函数挤压所有的输入值(在这里。我们使用logistic函数),对输出层神经元反复这一过程。

计算h1的输入:

然后我们利用logistic函数把neth1挤压到h1的输出:

对h2进行同样的操作:

outh2=0.596884378

对输出层神经元反复操作,使用隐含层神经元的输出作为输出层神经元的输入。

这是o1的输出:

对o2进行同样操作:

outo2=0.772928465

计算总体误差

利用平方和误差,我们能计算每一个输出层神经元的误差:

比如,目标输出o1是0.01,可是神经网络输出是0.75136507,因此误差是:

对o2反复这个过程:

Eo2=0.023560026

神经网络总体误差:

反向传播

反向传播的目的是更新网络中每一个权重。以便他们真实的输出值是接近目标输出,从而最小化输出层神经元的误差。

输出层

考虑w5。我们想要知道w5如何影响总体误差,即αEtotalαw5

应用链式规则:

可视化我们正在做的:

我们须要理解这个公式的每一步。

首先,output如何改变总体误差?

下一步。net input如何改变o1输出?

logistic函数的偏导数是输出乘以1减输出:

最后,w5如何改变o1的net input?

把它们结合起来:

你经常能看到delta rule的结合形式:

我们利用αEtotalαouto1和αouto1αneto1来重写αEtotalαneto1,我们使用这个又一次上面的表达式:

因此:

为了降低误差,我们从当前权重减去这个值(乘以一个学习率,设置成0.5):

我们能反复这个过程得到新的权重w6,w7和w8:

当我们继续以下的反向传输算法时,我们使用初始权重,而不是更新过的权重。

隐含层

下一步,我们将继续向后计算w1。w2,w3和w4新值,这是我们须要理解的:

可视化:

我们将要对隐含层神经元使用类似的过程。可是略微不同的是。每一个隐含层神经元的输出贡献到多个输出层神经元中。我们知道outh1影响outo1和outo2,因此αEtotalαouth1须要考虑两个输出层神经元的影响:

αEtotalαouth1=αEo1αouth1+αEo2αouth1

先计算αEo1αouth1:

αEo1αouth1=αEo1αneto1?αneto1αouth1

使用稍早前计算的值来计算αEo1αneto1:

αEo1αneto1=αEo1αouto1?αouto1αneto1=0.74136507?0.186815602

αneto1αouth1等于w5:

neto1=w5?outh1+w6?outh2+b2?1

αneto1αouth1=w5=0.40

合在一起:

αEo1αouth1=αEo1αneto1?αneto1αouth1=0.138498562?0.40=0.055399425

对αEo2αouto1做同样的处理:

αEo2αouth1=?0.019049119

因此:

如今我们有αEtotalαouth1,我们还须要计算αouth1αneth1,然后对每一个权重计算αneth1αw:

我们计算h1对w1的偏导数:

把它们结合起来:

你也能够例如以下写:

如今我们能更新w1:

对w2。w3和w4反复上面过程:

最后,我们更新所有权重。当我们把输入0.05和0.1向前反馈。神经网络的误差为0.298371109,在一次反向传播后,总体误差降到0.291027924,它看似不多。可是反复10000次之后,误差大幅下降到0.000035085,在这之后,我们把输入0.05和0.1向前反馈,那么输出的2个神经元生成0.015912196(vs 目标0.01)和0.984065734(vs 目标0.99)。

原文链接:A Step by Step Backpropagation Example

时间: 2024-10-12 13:00:40

一步一步教你反向传播的样例的相关文章

反向传播算法的微分详细证明过程

看了andrew ng 老师的机器学习教程,在关于反向传播算法进行讲解时,微分过程被省略掉了,只是说这个过程非常复杂.网上找了一些资料,有一篇比较详细的讲解,在http://axon.cs.byu.edu/resources/backprop_derived.pdf可以下载.这里也贴出来.微分过程中记法和andrew ng教程不太一样.不过貌似看着也蛮方便的.第20-24步的过程正好是δ反向传播的过程. 注意h(θ)这个假设函数,是关于输入向量的l层复合函数. 向量形式大概是这个样子    h(

教你一步一步部署.net免费空间OpenShift系列之一------帐号注册和验证

前几天有博友发布了一篇文章<一键部署mono 免费空间支持ASP.NET MVC 再也不担心伙食费换空间了>,支持MVC3和域名绑定,觉得不错,于是自己实践了一下,发现自己实际遇到的问题真不少,而且网上的关于此空间的帖子要么千篇一律,要么语焉不详,现总结为图文教程系列 帐号注册和验证 打开https://www.openshift.com/products/pricing,出现三种选择,前2种是免费的,建议选择第二个. 点击Create one跳转到创建用户界面 看到如下信息,填写邮箱和密码,

教你一步一步实现图标无缝变形切换

我的简书同步发布:教你一步一步实现图标无缝变形切换 ?欢迎打赏? 转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001] 本来这篇文章几天前就应该写好并发布出来的,由于要写小论文,被导师劈头盖脸的骂了几天,一直在搞论文,耽误了博文的编写.今天终于把小论文给投出去了,终于可以好好写博客了! 在上一篇文章<酷炫的Activity切换动画,打造更好的用户体验 >中,我们感受到了过渡切换动画带来的不一样的用户体验.如何你还意犹未尽,那么今天我

教你一步一步实现一个Promise

Promise我想现在大家都非常熟悉了,主要作用就是解决异步回调问题,这里简单介绍下. Promise规范是CommonJS规范之一,而Promise规范又分了好多种,比如 Promises/A.Promises/B.Promises/Kiss等等 有兴趣的可以到这多了解一些 http://wiki.commonjs.org/wiki/Promises 现在比较流行的是Promise/A规范,人们对它的完善和扩展,逐渐形成了Promise/A+规范,A+已脱颖而出. 说到这里规范是什么,可以去这

一步一步教你如何重装笔记本电脑系统?

本文标签:  电脑技巧 重装笔记本电脑系统 重装系统 重装dell联想宏碁电脑系统 原文地址:http://whosmall.com/?post=461 不知不觉中,已在程序猿这个职业中疯狂熬过去了3年时间,这3年虽然苹果技术天天更新,天天进步,但是如计算机常识方面却不忍心看它还是原地踏步! 从事编程时间久了,每次回家的时候,免不了会有朋友说起听说你从事计算机工作的吧,是啊,那帮我装个系统吧,最近电脑卡的要命.我家网线坏了,帮我连下网线吧!更有甚者,说我刚才误删某某重要文件,帮我恢复下吧! 你要

【Unity3D实战】零基础一步一步教你制作跑酷类游戏(填坑完整版)

在两个月前曾写了一篇<[Unity3D实战]零基础一步一步教你制作跑酷类游戏(1)>,里面一步一步演示了制作跑酷类游戏,然而由于时间原因,只写到了让角色往前移动为止.这个坑一直没有时间去填,(虽然也没多少人看啦),今天刚好有时间完成了一个跑酷类游戏的Demo.放上来给有兴趣的朋友看看. Demo源码及对应素材下载:链接:http://pan.baidu.com/s/1i4QkkuD 密码:p04w 游戏简要说明 游戏类型:跑酷类游戏(Demo,非完整游戏) 操作方式:左右方向键(可自己移植到手

Ace教你一步一步做Android新闻客户端(一)

复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和新手引导 软件侧滑菜单 滑动主页的GUI篇 一个内容解析篇. 代码里有很详细的注释 所以直接放代码了 有不会的站内信或者评论我会及时回复. MainActivity XML :只有一个ListView布局 <?xml version="1.0" encoding="utf-

C#WPF 语音开发教程 源代码下载 csdn tts(text to sound) 一步一步 教你制作语音软件 附图和源代码

C#WPF  语音开发教程  一步一步 教你制作语音软件 附图和源代码 效果展示 一 项目准备 1.vs2012开发平台 2.微软的语音软件库 下载:http://download.csdn.net/detail/wyx100/8431269 (含实例项目源代码) 二.开发目标 制作一个语音软件,可以朗读文字: 多个语音库:男音和女音.支持英文和中文朗读: 支持选择播放设备 支持朗读语速选择 支持音量选择 三 开发过程 1.新建WpfSpeechDemo工程 文件(vs开发平台左上角)----新

一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app

一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app 转载 作者:jrainlau 链接:https://segmentfault.com/a/1190000005844155 项目地址:https://github.com/jrainlau/wechat-subscriptor 下载&运行 git clone git@github.com:jrainlau/wechat-subscriptor.git cd wechat-subscriptor && np