zoukankan      html  css  js  c++  java
  • CNN反向传播更新权值

    背景

    反向传播(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):
    这里写图片描述

    我们能重复这个过程得到新的权重w6w7w8
    这里写图片描述

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

    隐含层

    下一步,我们将继续向后计算w1w2w3w4新值,这是我们需要理解的:
    这里写图片描述

    可视化:
    这里写图片描述

    我们将要对隐含层神经元使用相似的过程,但是稍微不同的是,每个隐含层神经元的输出贡献到多个输出层神经元中。我们知道outh1影响outo1outo2,因此α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.741365070.186815602

    αneto1αouth1等于w5:

    neto1=w5outh1+w6outh2+b21

    αneto1αouth1=w5=0.40

    合在一起:
    αEo1αouth1=αEo1αneto1αneto1αouth1=0.1384985620.40=0.055399425

    αEo2αouto1做相同的处理:

    αEo2αouth1=0.019049119

    因此:

    这里写图片描述

    现在我们有αEtotalαouth1,我们还需要计算αouth1αneth1,然后对每个权重计算αneth1αw

    这里写图片描述

    我们计算h1w1的偏导数:

    这里写图片描述

    把它们结合起来:
    这里写图片描述

    你也可以如下写:

    这里写图片描述

    现在我们能更新w1

    这里写图片描述

    w2w3w4重复上面过程:

    这里写图片描述

    最后,我们更新所有权重,当我们把输入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

    转https://blog.csdn.net/shaomingliang499/article/details/50587300

  • 相关阅读:
    做程序员,我骄傲了吗?
    乐字节Java面向对象三大特性以及Java多态
    Java为什么有前途?什么人适合学Java?
    Java新手从入门到精通的学习建议
    Java变量与数据类型之二:Java常量与变量
    模块化、结构化的代码,程序员正讲述着人生
    乐字节Java变量与数据类型之一:Java编程规范,关键字与标识符
    乐字节Java学习课程-path环境变量的作用与配置
    我英语不好,能学会编程吗?
    为什么欧拉图要用栈存然后逆着输出
  • 原文地址:https://www.cnblogs.com/sdu20112013/p/11561278.html
Copyright © 2011-2022 走看看