欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

深度学习探索(第二部分):从前向计算到反向传播详解

最编程 2024-07-24 22:47:01
...

深度学习系列(2):前向传播和后向传播算法

前言

讲真,之前学吴恩达的机器学习课时,还手写实现过后向传播算法,但如今忘得也一干二净。总结两个原因:1. 理解不够透彻。2. 没有从问题的本质抓住后向传播的精髓。今天重温后向传播算法的推导,但重要的是比较前向传播和后向传播的优缺点,以及它们在神经网络中起到了什么不一般的作用,才让我们如此着迷。

反向传播的由来

反向传播由Hinton在1986年发明,该论文发表在nature上,高尚大的杂志啊。

Rumelhart, David E, G. E. Hinton, and R. J. Williams. “Learning representations by back-propagating errors. ” Nature 323.6088(1986):533-536.

简单说说吧,反向传播主要解决神经网络在训练模型时的参数更新问题。神经网络如下图:
alt text

反向传播算法需要解决每条边对应的权值如何更新,才能使得整个输出的【损失函数】最小。如果对神经网络还不了解,建议先学习了什么是神经网络,再阅读以下内容。

这里推荐几篇关于神经网络的文章,总体来说不错:

  1. 计算机的潜意识
  2. Machine Learning & Algorithm 神经网络基础

关于反向传播算法有种不太恰当的比方,对于每个输出结点,给定一个输入样例,会得到一个预测值,而这个预测值和真实值之间的差距我们当作误差(欠的钱),是谁影响了欠债的多少呢?很明显,在神经网络模型中,只有待求的参数 {w1,w2,...,wn} 了。如何衡量每个参数对误差的影响,我们定义一个敏感度: 当参数 wi 在某个很小的范围内变动时,误差变动了多少,用数学表示即: ΔLΔwi ,在考虑极限情况下,即微分: Lwi

所以我们有了最基础的微分表达式,也是反向传播所有推导公式的源泉,那为什么这个敏感度就能更新权值呢?其实 ΔLΔwi 很有意思,因为不管最终 L(w) 的形式是什么样子, ΔLΔwi= ,所以假设 Δwi>0 ,那么该定值为负数的情况下, wi 增大的方向上 L(wi) 将减小,而该定值为正数的情况时, wi 增大的方向上 L(wi) 将增大。

所以梯度下降的更新算法有 w:=wηLwi ,当然你也可以画图形象的理解下,不难。

那么 Lwi 这玩意怎么计算呢?在简单的感知机模型中很容易计算得到,具体可以参考上一篇博文,这里不再赘述了。

反向传播的计算

我很讨厌一上来就来了一堆反向传播的公式以及各种推导。这样没错,简单直接,理解了觉得自己还很牛逼,结果过了一段时间怎么又忘了公式的推导,还得重新推一遍。而理解反向传播的精髓并非这些公式的推导,而是它弥补了前向算法的哪些不足,为啥它就被遗留下来作为神经网络的鼻祖呢?解决了什么问题,如何优雅的解决了该问题?从哪些角度能让我们构建出反向传播算法才是应该去学习和理解的。

我们先来建个简单的神经网络图吧,注意,这里只是帮助理解反向传播算法的构建过程,与真实的神经网络有一定的差距,但其中的分析过程是大同小异的。

此外这三篇文章写的不错,【推导】【本质】【实现】都有了:

  1. 【看看就行】机器学习:一步步教你理解反向传播方法
  2. 【后续内容基于此文,推荐】Calculus on Computational Graphs: Backpropagation
  3. 【python实现ANN,只要42行!】A Neural Network in 11 lines of Python (Part 1)

如图所示:
这里写图片描述

为了简化推导过程,输入层只使用了一个特征,同样输出层也只有一个结点,隐藏层使用了两个结点。注意在实际神经网络中,大多数文章把z1和h1当作一个结点来画图的,这里为了方便推导才把两者分开。

所以我们有:
z1=w1x
z2=w2x
h1=11+ez1
h2=11+ez2
z3=w3h1+w4h2
y=11+ez3

假定给了输入x,我们就能根据这一系列公式求得y,接下来我们需要定义损失函数了,使用平方误差函数(只针对一次输入):

L=12(yt)2

t 表示真实值,ok,根据第一节的内容,模型训练实际上是更新wi,既然要更新 w

上一篇: 简单易懂:向前传播与向后传播的基本概念解析

下一篇: 打造个人专属的 TensorFlow 教程(一):理解计算图与前向传播