虽然学深度学习有一段时间了,但是对于一些算法的具体实现还是模糊不清,用了很久也不是很了解。因此特意先对深度学习中的相关基础概念做一下总结。先看看前向传播算法(Forward propagation)与反向传播算法(Back propagation)。

1.前向传播

如图所示,这里讲得已经很清楚了,前向传播的思想比较简单。
举个例子,假设上一层结点i,j,k,…等一些结点与本层的结点w有连接,那么结点w的值怎么算呢?就是通过上一层的i,j,k等结点以及对应的连接权值进行加权和运算,最终结果再加上一个偏置项(图中为了简单省略了),最后在通过一个非线性函数(即激活函数),如ReLu,sigmoid等函数,最后得到的结果就是本层结点w的输出。
最终不断的通过这种方法一层层的运算,得到输出层结果。

如果你觉得这篇文章看起来稍微还有些吃力,或者想要系统地学习人工智能,那么推荐你去看床长人工智能教程。非常棒的大神之作,教程不仅通俗易懂,而且很风趣幽默。点击这里可以查看教程。

对于前向传播来说,不管维度多高,其过程都可以用如下公式表示:

a2=σ(z2)=σ(a1∗W2+b2)a2=σ(z2)=σ(a1∗W2+b2)

的值。

大家也许已经注意到,这样做是十分冗余的,因为很多路径被重复访问了。比如上图中,a-c-e和b-c-e就都走了路径c-e。对于权值动则数万的深度模型中的神经网络,这样的冗余所导致的计算量是相当大的。

同样是利用链式法则,BP算法则机智地避开了这种冗余,它对于每一个路径只访问一次就能求顶点对所有下层节点的偏导值。
正如反向传播(BP)算法的名字说的那样,BP算法是反向(自上往下)来寻找路径的。

从最上层的节点e开始,初始值为1,以层为单位进行处理。对于e的下一层的所有子节点,将1乘以e到某个节点路径上的偏导值,并将结果“堆放”在该子节点中。等e所在的层按照这样传播完毕后,第二层的每一个节点都“堆放”些值,然后我们针对每个节点,把它里面所有“堆放”的值求和,就得到了顶点e对该节点的偏导。然后将这些第二层的节点各自作为起始顶点,初始值设为顶点e对它们的偏导值,以”层”为单位重复上述传播过程,即可求出顶点e对每一层节点的偏导数。

以上图为例,节点c接受e发送的1*2并堆放起来,节点d接受e发送的1*3并堆放起来,至此第二层完毕,求出各节点总堆放量并继续向下一层发送。节点c向a发送2*1并对堆放起来,节点c向b发送2*1并堆放起来,节点d向b发送3*1并堆放起来,至此第三层完毕,节点a堆放起来的量为2,节点b堆放起来的量为2*1+3*1=5, 即顶点e对b的偏导数为5.

举个不太恰当的例子,如果把上图中的箭头表示欠钱的关系,即c→e表示e欠c的钱。以a, b为例,直接计算e对它们俩的偏导相当于a, b各自去讨薪。a向c讨薪,c说e欠我钱,你向他要。于是a又跨过c去找e。b先向c讨薪,同样又转向e,b又向d讨薪,再次转向e。可以看到,追款之路,充满艰辛,而且还有重复,即a, b 都从c转向e。

而BP算法就是主动还款。e把所欠之钱还给c,d。c,d收到钱,乐呵地把钱转发给了a,b,皆大欢喜。

3.反向传播具体计算过程推导

为了方便起见,这里我定义了三层网络,输入层(第0层),隐藏层(第1层),输出层(第二层)。并且每个结点没有偏置(有偏置原理完全一样),激活函数为sigmod函数(不同的激活函数,求导不同),符号说明如下:

对应网络如下:

其中对应的矩阵表示如下

首先我们先走一遍正向传播,公式与相应的数据对应如下:

那么:

同理可以得到:

那么最终的损失为

,我们当然是希望这个值越小越好。这也是我们为什么要进行训练,调节参数,使得最终的损失最小。这就用到了我们的反向传播算法,实际上反向传播就是梯度下降法中链式法则的使用。

下面我们看如何反向传播

根据公式,我们有:

这个时候我们需要求出C对w的偏导,则根据链式法则有:

同理有:

到此我们已经算出了最后一层的参数偏导了.我们继续往前面链式推导:

我们现在还需要求

,下面给出一个推导其它全都类似

同理可得其它几个式子:

则最终的结果为:

再按照这个权重参数进行一遍正向传播得出来的Error为0.165

而这个值比原来的0.19要小,则继续迭代,不断修正权值,使得代价函数越来越小,预测值不断逼近0.5.我迭代了100次的结果,Error为5.92944818e-07(已经很小了,说明预测值与真实值非常接近了),最后的权值为:

bp过程可能差不多就是这样了,可能此文需要你以前接触过bp算法,只是还有疑惑,一步步推导后,会有较深的理解。

上面的python代码实现如下:

#!/usr/bin/env python#coding:utf-8import numpy as npdef nonlin(x, deriv = False):    if(deriv == True):        return x * (1 - x)    return 1 / (1 + np.exp(-x))X = np.array([[0.35], [0.9]])y = np.array([[0.5]])np.random.seed(1)W0 = np.array([[0.1, 0.8], [0.4, 0.6]])W1 = np.array([[0.3, 0.9]])print 'original ', W0, '\n', W1for j in xrange(100):    l0 = X    l1 = nonlin(np.dot(W0, l0))    l2 = nonlin(np.dot(W1, l1))    l2_error = y - l2    Error = 1 / 2.0 * (y-l2)**2    print 'Error:', Error    l2_delta = l2_error * nonlin(l2, deriv=True)    l1_error = l2_delta * W1 #back propagation    l1_delta = l1_error * nonlin(l1, deriv=True)    W1 += l2_delta * l1.T    W0 += l0.T.dot(l1_delta)    print W0, '\n', W1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

前向传播算法(Forward propagation)与反向传播算法(Back propagation)相关推荐

  1. python 反传播_纯Python实现反向传播(BP算法)(5)

    目录 看鱼书记录5: 数值微分和反向传播都能更新权值的梯度度(严格来说,是损失函数关于权重参数的梯度),但反向传播更加高效. 反向传播就是求偏导(梯度),如何求呢?根据链式法则和输入值来求,具体如下 ...

  2. 机器学习入门(14)— 神经网络学习整体流程、误差反向传播代码实现、误差反向传播梯度确认、误差反向传播使用示例

    1. 神经网络学习整体流程 神经网络学习的步骤如下所示. 前提 神经网络中有合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为学习.神经网络的学习分为下面 4 个步骤. 步骤1(mini-ba ...

  3. 反向传播算法的理论基础,神经网络反向传播算法

    1.如何理解神经网络里面的反向传播算法 反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法.其 ...

  4. 从零开始数据科学与机器学习算法-人工神经网络与反向传播-09

    概述 rectifier其实就是一种模仿生物的激活机制的函数 (activation function) 常见的激活函数 https://en.wikipedia.org/wiki/Rectifier ...

  5. BP神经网络(back propagation,反向传播神经网络)

    BP神经网络就是一个"万能的模型+误差修正函数",每次根据训练得到的结果与预想结果进行误差分析,进而修改权值和阈值,一步一步得到能输出和预想结果一致的模型.举一个例子:比如某厂商生 ...

  6. 温故知新——前向传播算法和反向传播算法(BP算法)及其推导

    1. 前向传播算法 所谓的前向传播算法就是:将上一层的输出作为下一层的输入,并计算下一层的输出,一直到运算到输出层为止. 从上面可以看出,使用代数法一个个的表示输出比较复杂,而如果使用矩阵法则比较的简 ...

  7. 反向算法_10分钟带你了解神经网络基础:反向传播算法详解

    作者:Great Learning Team deephub.ai 翻译组 1.神经网络 2.什么是反向传播? 3.反向传播是如何工作的? 4.损失函数 5.为什么我们需要反向传播? 6.前馈网络 7 ...

  8. [AI 笔记] BP反向传播算法

    [AI 笔记] BP反向传播算法 说明 BP算法 链式法则 计算图 简单例子 前向传播 反向传播 聚焦计算节点,深入理解 计算节点的代码实现 例子 各种门的功能 多元链式法则 向量化BP算法 参考资料 ...

  9. 深度神经网络(DNN)反向传播算法(BP)

    在深度神经网络(DNN)模型与前向传播算法中,我们对DNN的模型和前向传播算法做了总结,这里我们更进一步,对DNN的反向传播算法(Back Propagation,BP)做一个总结. 1. DNN反向 ...

最新文章

  1. 使用Python批量删除windows下特定目录的N天前的旧文件实战:Windows下批量删除旧文件、清除缓存文件、解救C盘、拒绝C盘爆炸
  2. 慕课网Flask高级编程实战-10.鱼书业务处理
  3. python编程语言继承_python应用:学习笔记(Python继承)
  4. fwrite视频写入帧率测试(不用测了。。)
  5. boost::log模块实现一个简单日志的例子
  6. Linux内存管理:一个故事看懂CPU内存管理技术
  7. C++ - 构造和析构 2018-01-10
  8. linux常见术语示意
  9. 什么是C++标准库?
  10. unable to remove repository reference  (must force) - container is using its referenced image
  11. PAT1018. Public Bike Management (30)
  12. 学习信号与系统的看过来~~
  13. 金仓数据库KingbaseES数据库管理员指南--15.1. 管理视图
  14. 恒天餐饮管理系统服务器代码,恒天餐饮管理软件使用教程.doc
  15. 优先队列三大利器——二项堆、斐波那契堆、Pairing 堆
  16. 假期抱病上班 货车司机买彩票中2.98亿美元大奖
  17. Kaggle数据集之电信客户流失数据分析
  18. 手表上发条的方法?雷诺手表如何上发条?
  19. ubuntu kylin mysql_Ubuntu Kylin 安装和配置mysql
  20. react-native的Dimensions.get(‘screen‘)和Dimensions.get(‘window‘)有什么不同

热门文章

  1. ITPUB网站的知识索引汇总
  2. DJ无人机延时摄影后处理
  3. 设备sdk--海康,大华SDK
  4. 深度linux安装教程 pe,深度官方装机PE下载
  5. 文本朗读器的设计与制作
  6. 初级模拟电路:3-11 BJT实现电流源
  7. 今日份Ps练习 | 剪纸效果
  8. 云服务器Windows server 2012 R2 搭建网站
  9. 苹果电脑的3d性能测试软件,苹果iMac 2014电脑3D及游戏性能测试
  10. php实现手机归属地的查询,PHP实现手机归属地查询API接口