Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前向传播算法(Forward propagation)与反向传播算法(Back propagation)「建议收藏」

前向传播算法(Forward propagation)与反向传播算法(Back propagation)「建议收藏」

作者头像
全栈程序员站长
发布于 2022-08-10 10:59:57
发布于 2022-08-10 10:59:57
68420
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice

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

1.前向传播

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

对于前向传播来说,不管维度多高,其过程都可以用如下公式表示: a 2 = σ ( z 2 ) = σ ( a 1 ∗ W 2 + b 2 ) a^2 = \sigma(z^2) = \sigma(a^1 * W^2 + b^2) a2=σ(z2)=σ(a1∗W2+b2)

其中,上标代表层数,星号表示卷积,b表示偏置项bias, σ \sigma σ表示激活函数。

2.反向传播算法(Back propagation)

BackPropagation算法是多层神经网络的训练中举足轻重的算法。简单的理解,它的确就是复合函数的链式法则,但其在实际运算中的意义比链式法则要大的多。要回答题主这个问题“如何直观的解释back propagation算法?” 需要先直观理解多层神经网络的训练。

机器学习可以看做是数理统计的一个应用,在数理统计中一个常见的任务就是拟合,也就是给定一些样本点,用合适的曲线揭示这些样本点随着自变量的变化关系.

深度学习同样也是为了这个目的,只不过此时,样本点不再限定为(x, y)点对,而可以是由向量、矩阵等等组成的广义点对(X,Y)。而此时,(X,Y)之间的关系也变得十分复杂,不太可能用一个简单函数表示。然而,人们发现可以用多层神经网络来表示这样的关系,而多层神经网络的本质就是一个多层复合的函数。借用网上找到的一幅图[1],来直观描绘一下这种复合关系。

其对应的表达式如下:

上面式中的Wij就是相邻两层神经元之间的权值,它们就是深度学习需要学习的参数,也就相当于直线拟合y=k*x+b中的待求参数k和b。

和直线拟合一样,深度学习的训练也有一个目标函数,这个目标函数定义了什么样的参数才算一组“好参数”,不过在机器学习中,一般是采用成本函数(cost function),然后,训练目标就是通过调整每一个权值Wij来使得cost达到最小。cost函数也可以看成是由所有待求权值Wij为自变量的复合函数,而且基本上是非凸的,即含有许多局部最小值。但实际中发现,采用我们常用的梯度下降法就可以有效的求解最小化cost函数的问题。

梯度下降法需要给定一个初始点,并求出该点的梯度向量,然后以负梯度方向为搜索方向,以一定的步长进行搜索,从而确定下一个迭代点,再计算该新的梯度方向,如此重复直到cost收敛。那么如何计算梯度呢?

假设我们把cost函数表示为 H ( W 11 , W 12 , ⋯   , W i j , ⋯   , W m n ) H(W_{11}, W_{12}, \cdots , W_{ij}, \cdots, W_{mn}) H(W11​,W12​,⋯,Wij​,⋯,Wmn​),那么它的梯度向量[2]就等于 ∇ H = ∂ H ∂ W 11 e 11 + ⋯ + ∂ H ∂ W m n e m n \nabla H = \frac{\partial H}{\partial W_{11} }\mathbf{e}_{11} + \cdots + \frac{\partial H}{\partial W_{mn} }\mathbf{e}_{mn} ∇H=∂W11​∂H​e11​+⋯+∂Wmn​∂H​emn​, 其中 e i j \mathbf{e}_{ij} eij​表示正交单位向量。为此,我们需求出cost函数H对每一个权值Wij的偏导数。而BP算法正是用来求解这种多层复合函数的所有变量的偏导数的利器。

我们以求e=(a+b)*(b+1)的偏导[3]为例。 它的复合关系画出图可以表示如下:

在图中,引入了中间变量c,d。 为了求出a=2, b=1时,e的梯度,我们可以先利用偏导数的定义求出不同层之间相邻节点的偏导关系,如下图所示。

利用链式法则我们知道: ∂ e ∂ a = ∂ e ∂ c ⋅ ∂ c ∂ a 以 及 ∂ e ∂ b = ∂ e ∂ c ⋅ ∂ c ∂ b + ∂ e ∂ d ⋅ ∂ d ∂ b \frac{\partial e}{\partial a}=\frac{\partial e}{\partial c}\cdot \frac{\partial c}{\partial a}以及\frac{\partial e}{\partial b}=\frac{\partial e}{\partial c}\cdot \frac{\partial c}{\partial b}+\frac{\partial e}{\partial d}\cdot \frac{\partial d}{\partial b} ∂a∂e​=∂c∂e​⋅∂a∂c​以及∂b∂e​=∂c∂e​⋅∂b∂c​+∂d∂e​⋅∂b∂d​

链式法则在上图中的意义是什么呢?其实不难发现, ∂ e ∂ a \frac{\partial e}{\partial a} ∂a∂e​的值等于从a到e的路径上的偏导值的乘积,而 ∂ e ∂ b \frac{\partial e}{\partial b} ∂b∂e​的值等于从b到e的路径1(b-c-e)上的偏导值的乘积加上路径2(b-d-e)上的偏导值的乘积。也就是说,对于上层节点p和下层节点q,要求得 ∂ p ∂ q \frac{\partial p}{\partial q} ∂q∂p​,需要找到从q节点到p节点的所有路径,并且对每条路径,求得该路径上的所有偏导数之乘积,然后将所有路径的 “乘积” 累加起来才能得到 ∂ p ∂ q \frac{\partial p}{\partial q} ∂q∂p​的值。

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

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

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

以上图为例,节点c接受e发送的12并堆放起来,节点d接受e发送的13并堆放起来,至此第二层完毕,求出各节点总堆放量并继续向下一层发送。节点c向a发送21并对堆放起来,节点c向b发送21并堆放起来,节点d向b发送31并堆放起来,至此第三层完毕,节点a堆放起来的量为2,节点b堆放起来的量为21+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代码实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
#coding:utf-8


import numpy as np

def 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', W1

for 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.http://blog.csdn.net/lhanchao/article/details/51419150 2.https://www.zhihu.com/question/39022858

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/130184.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
太详细了,感谢分享
太详细了,感谢分享
11点赞举报
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
什么是反向传播算法
神经网络的快速发展离不开底层数学算法的演进。反向传播算法作为神经网络中学习的主力,最初是在20世纪70年代引入的,但其重要性直到1986年由一篇着名的论文才得到充分的重视,其作者是DavidRumelhart,GeoffreyHinton和RonaldWilliams。该论文描述了几种神经网络,而其中反向传播比其他早期的学习方法快得多,从而可以使用神经网络来解决以前不能解决的问题。 说到神经网络,大家看到这个图应该不陌生: 其对应的表达式如下: 上面式中的Wij就是相邻两层神经元之间的权值,它们就是深度
企鹅号小编
2018/01/15
8230
什么是反向传播算法
神经网络算法——反向传播 Back Propagation
本文将从反向传播的本质、反向传播的原理、反向传播的案例三个方面,详细介绍反向传播(Back Propagation)。
JOYCE_Leo16
2024/03/19
5.7K0
神经网络算法——反向传播 Back Propagation
反向传播( backpropagation ),可以这样直观理解!
本系列是 斯坦福大学自然语言处理-cs224课程的笔记4:神经网络的反向传播的直观解释,前 4 篇笔记如下:深度学习和自然语言处理:介绍;斯坦福大学NLP-cs224课程笔记2:词向量;一文了解Word2vec之Skip-Gram训练网络的3种技术;TensorFlow 实战 3层网络求解嵌入词向量,附代码详解
double
2018/07/25
1.1K0
反向传播( backpropagation ),可以这样直观理解!
如何直观地解释 back propagation 算法?
BackPropagation算法是多层神经网络的训练中举足轻重的算法。 简单的理解,它的确就是复合函数的链式法则,但其在实际运算中的意义比链式法则要大的多。 要回答“如何直观的解释back propagation算法?”这个问题, 需要先直观理解多层神经网络的训练。
zenRRan
2018/07/25
8750
如何直观地解释 back propagation 算法?
[MachineLearning] 反向传播Back Propagation
如何直观地解释 back propagation 算法? - 胡逸夫的回答 - 知乎
wOw
2018/09/18
9230
[MachineLearning] 反向传播Back Propagation
深度学习与CV教程(4) | 神经网络与反向传播
本系列为 斯坦福CS231n 《深度学习与计算机视觉(Deep Learning for Computer Vision)》的全套学习笔记,对应的课程视频可以在 这里 查看。更多资料获取方式见文末。
ShowMeAI
2022/05/30
8270
深度学习与CV教程(4) | 神经网络与反向传播
矩阵乘积 MatMul 的反向传播
有公式 \mathbf{y} = \mathbf{x}W ,其中 \mathbf{x} 是 D * M 矩阵,W 是 M * N 权重矩阵;另有损失函数 L 是对 \mathbf{y} 的函数,假设 对 的偏导已知(反向传播时是这样的),求 L 关于矩阵 \mathbf{x} 的偏导
王白石
2024/10/03
2860
反向传播算法(Backpropagation)—-Gradient Descent的推导过程[通俗易懂]
BP算法是适用于多层神经网络的一种算法,它是建立在梯度下降法的基础上的。本文着重推导怎样利用梯度下降法来minimise Loss Function。
全栈程序员站长
2022/06/29
5040
反向传播算法(Backpropagation)—-Gradient Descent的推导过程[通俗易懂]
详解 误差反向传播算法推导
反向传播算法(back propagation,简称BP模型)是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。
全栈程序员站长
2022/06/28
8130
详解 误差反向传播算法推导
深度神经网络(DNN)与反向传播算法
深度神经网络(DNN)是人工智能和机器学习领域的核心技术之一,尤其在图像识别、语音识别、自然语言处理等多个应用中取得了突破性的成果。DNN的成功得益于其强大的学习能力和优化算法,而反向传播(Backpropagation,简称BP)算法则是训练神经网络的关键技术之一。本文将深入剖析反向传播算法的工作原理,并结合具体的例子,详细分析其在深度神经网络中的应用过程。
LucianaiB
2025/02/10
2460
Task 4 CNN back-propagation 反向传播算法
参考CNN卷积神经网络学习笔记3:权值更新公式推导 后向传播的过程就是梯度向回传递,在CNN中,梯度的计算主要涉及三种情形
平凡的学生族
2019/05/25
9900
【深度学习基础】多层感知机 | 前向传播、反向传播和计算图
PyTorch深度学习 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/01/24
2580
【深度学习基础】多层感知机 | 前向传播、反向传播和计算图
【深度学习 | 反向传播】释放反向传播的力量: 让训练神经网络变得简单
反向传播算法是一种用于训练神经网络的常用优化算法。它通过计算损失函数对每个参数的梯度,然后根据这些梯度更新参数值,以使得神经网络能够逐步调整和改进其预测结果。
计算机魔术师
2023/10/18
4650
【深度学习 | 反向传播】释放反向传播的力量: 让训练神经网络变得简单
五万字总结,深度学习基础。「建议收藏」
人工神经网络(Artificial Neural Networks,简写为ANNs)是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的,并具有自学习和自适应的能力。神经网络类型众多,其中最为重要的是多层感知机。为了详细地描述神经网络,我们先从最简单的神经网络说起。
全栈程序员站长
2022/08/31
1K0
五万字总结,深度学习基础。「建议收藏」
斯坦福NLP课程 | 第4讲 - 神经网络反向传播与计算图
教程地址:http://www.showmeai.tech/tutorials/36
ShowMeAI
2022/05/04
1K0
斯坦福NLP课程 | 第4讲 - 神经网络反向传播与计算图
误差反向传播算法浅解
反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称。由于多层前馈神经网络的训练经常采用误差反向传播算法,人们也常把多层前馈神经网络称为BP网络。
用户9624935
2022/04/02
2.3K0
误差反向传播算法浅解
小白也能看懂的BP反向传播算法之Further into Backpropagation
在上一篇文章小白也能看懂的BP反向传播算法之Let's practice Backpropagation,我们计算了一个带sigmoid函数的嵌套网络的反向传播!从这篇文章开始,我们正式进入实际的神经网络的反向传播!本文将以一个两层的神经网络结构为例子,并且利用矩阵的方法实现神经网络的反向传播训练算法!
desperate633
2018/08/23
1.1K0
反向传播(backpropagation)算法 | 深度学习笔记
接上一篇(多层感知机(MLP)与神经网络结构 | 深度学习笔记)的最后,我们要训练多层网络的时候,最后关键的部分就是求梯度啦。纯数学方法几乎是不可能的,那么反向传播算法就是用来求梯度的,用了一个很巧妙的方法。 反向传播算法应该是神经网络最基本最需要弄懂的方法了,要是反向传播方法不懂,后面基本上进行不下去。 非常推荐的是How the backpropagation algorithm works (http://neuralnetworksanddeeplearning.com/chap2.html)
用户1332428
2018/03/08
1.5K0
反向传播(backpropagation)算法 | 深度学习笔记
小白也能看懂的BP反向传播算法之Surpass Backpropagation
上篇文章小白也能看懂的BP反向传播算法之Further into Backpropagation中,我们小试牛刀,将反向传播算法运用到了一个两层的神经网络结构中!然后往往实际中的神经网络拥有3层甚至更多层的结构,我们接下来就已一个三层的神经网络结构为例,分析如何运用动态规划来优化反向传播时微分的计算!
desperate633
2018/08/23
8630
反向传播算法详解和Python代码实现
反向传播算法是训练神经网络的经典算法,是深度学习的最重要的基础,适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上,通过迭代的方法求出目标损失函数(loss function)的近似最小值。
deephub
2020/05/09
3.5K0
反向传播算法详解和Python代码实现
推荐阅读
相关推荐
什么是反向传播算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验