机器学习之反向传播算法

Thoughts of Algorithms

随笔 - 54  文章 - 1  评论 - 141

机器学习公开课笔记(5):神经网络(Neural Network)——学习

这一章可能是Andrew Ng讲得最不清楚的一章,为什么这么说呢?这一章主要讲后向传播(Backpropagration, BP)算法,Ng花了一大半的时间在讲如何计算误差项δδ,如何计算ΔΔ的矩阵,以及如何用Matlab去实现后向传播,然而最关键的问题——为什么要这么计算?前面计算的这些量到底代表着什么,Ng基本没有讲解,也没有给出数学的推导的例子。所以这次内容我不打算照着公开课的内容去写,在查阅了许多资料后,我想先从一个简单的神经网络的梯度推导入手,理解后向传播算法的基本工作原理以及每个符号代表的实际意义,然后再按照课程的给出BP计算的具体步骤,这样更有助于理解。

简单神经网络的后向传播(Backpropagration, BP)算法

1. 回顾之前的前向传播(ForwardPropagration, FP)算法

FP算法还是很简单的,说白了就是根据前一层神经元的值,先加权然后取sigmoid函数得到后一层神经元的值,写成数学的形式就是:

a(1)=Xa(1)=X

z(2)=Θ(1)a(1)z(2)=Θ(1)a(1)

a(2)=g(z(2))a(2)=g(z(2))

z(3)=Θ(2)a(2)z(3)=Θ(2)a(2)

a(3)=g(z(3))a(3)=g(z(3))

z(4)=Θ(3)a(3)z(4)=Θ(3)a(3)

a(4)=g(z(4))a(4)=g(z(4))

2. 回顾神经网络的代价函数(不含regularization项)

J(Θ)=?1m[∑i=1m∑k=1Ky(i)klog(hθ(x(i)))k+(1?y(i)k)log(1?(hθ(x(i)))k)]J(Θ)=?1m[∑i=1m∑k=1Kyk(i)log(hθ(x(i)))k+(1?yk(i))log(1?(hθ(x(i)))k)]

3. 一个简单神经网络的BP推导过程

BP算法解决了什么问题?我们已经有了代价函数J(Θ)J(Θ),接下来我们需要利用梯度下降算法(或者其他高级优化算法)对J(Θ)J(Θ)进行优化从而得到训练参数ΘΘ,然而关键问题是,优化算法需要传递两个重要的参数,一个代价函数J(Θ)J(Θ),另一个是代价函数的梯度?J(Θ)?Θ?J(Θ)?Θ,BP算法其实就是解决如何计算梯度的问题

下面我们从一个简单的例子入手考虑如何从数学上计算代价函数的梯度,考虑如下简单的神经网络(为方便起见,途中已经给出了前向传播(FP)的计算过程),该神经网络有三层神经元,对应的有两个权重矩阵Θ(1)Θ(1)和Θ(2)Θ(2),为计算梯度我们只需要计算两个偏导数即可:?J(Θ)?Θ(1)?J(Θ)?Θ(1)和?J(Θ)?Θ(2)?J(Θ)?Θ(2)。

首先我们先计算第2个权重矩阵的偏导数,即??Θ(2)J(Θ)??Θ(2)J(Θ)。首先我们需要在J(Θ)J(Θ)和Θ(2)Θ(2)之间建立联系,很容易可以看到J(Θ)J(Θ)的值取决于hθ(x)hθ(x),而hθ(x)=a(3)hθ(x)=a(3), a3a3又是由z(3)z(3)取sigmoid得到,最后z(3)=Θ(2)×a(2)z(3)=Θ(2)×a(2),所以他们之间的联系可以如下表示:

按照求导的链式法则,我们可以先求J(Θ)J(Θ)对z(3)z(3)的导数,然后乘以z(3)z(3)对Θ(2)Θ(2)的导数,即

??Θ(2)J(Θ)=??z(3)J(Θ)×?z(3)?Θ(2)??Θ(2)J(Θ)=??z(3)J(Θ)×?z(3)?Θ(2)

由z(3)=Θ(2)a(2)z(3)=Θ(2)a(2)不难计算?z(3)?Θ(2)=(a(2))T?z(3)?Θ(2)=(a(2))T,令??z(3)J(Θ)=δ(3)??z(3)J(Θ)=δ(3),上式可以重写为

??Θ(2)J(Θ)=δ(3)(a(2))T??Θ(2)J(Θ)=δ(3)(a(2))T

接下来仅需要计算δ(3)δ(3)即可,由上一章的内容我们已经知道g′(z)=g(z)(1?g(z))g′(z)=g(z)(1?g(z)), hθ(x)=a(3)=g(z(3))hθ(x)=a(3)=g(z(3)),忽略前面的1/m∑i=1m1/m∑i=1m(这里我们只对一个example推导,最后累加即可)

δ(3)=?J(Θ)z(3)=(?y)1g(z(3))g′(z(3))?(1?y)11?g(z(3))[1?g(z(3))]′=?y(1?g(z(3)))+(1?y)g(z(3))=?y+g(z(3))=?y+a(3)δ(3)=?J(Θ)z(3)=(?y)1g(z(3))g′(z(3))?(1?y)11?g(z(3))[1?g(z(3))]′=?y(1?g(z(3)))+(1?y)g(z(3))=?y+g(z(3))=?y+a(3)

至此我们已经得到J(Θ)J(Θ)对Θ(2)Θ(2)的偏导数,即

?J(Θ)?Θ(2)=(a(2))Tδ(3)?J(Θ)?Θ(2)=(a(2))Tδ(3)

δ(3)=a(3)?yδ(3)=a(3)?y

接下来我们需要求J(Θ)J(Θ)对Θ(1)Θ(1)的偏导数,J(Θ)J(Θ)对Θ(1)Θ(1)的依赖关系如下:

根据链式求导法则有

?J(Θ)?Θ(1)=?J(Θ)?z(3)?z(3)?a(2)?a(2)?Θ(1)?J(Θ)?Θ(1)=?J(Θ)?z(3)?z(3)?a(2)?a(2)?Θ(1)

我们分别计算等式右边的三项可得:

?J(Θ)?z(3)=δ(3)?J(Θ)?z(3)=δ(3)

?z(3)?a(2)=(Θ(2))T?z(3)?a(2)=(Θ(2))T

?a(2)?Θ(1)=?a(2)?z(2)?z(2)?Θ(1)=g′(z(2))a(1)?a(2)?Θ(1)=?a(2)?z(2)?z(2)?Θ(1)=g′(z(2))a(1)

带入后得

?J(Θ)?Θ(1)=(a(1))Tδ(3)(Θ(2))Tg′(z(2))?J(Θ)?Θ(1)=(a(1))Tδ(3)(Θ(2))Tg′(z(2))

令δ(2)=δ(3)(Θ(2))Tg′(z(2))δ(2)=δ(3)(Θ(2))Tg′(z(2)), 上式可以重写为

?J(Θ)?Θ(1)=(a(1))Tδ(2)?J(Θ)?Θ(1)=(a(1))Tδ(2)

δ(2)=δ(3)(Θ(2))Tg′(z(2))δ(2)=δ(3)(Θ(2))Tg′(z(2))

把上面的结果放在一起,我们得到J(Θ)J(Θ)对两个权重矩阵的偏导数为:

δ(3)=a(3)?yδ(3)=a(3)?y

?J(Θ)?Θ(2)=(a(2))Tδ(3)?J(Θ)?Θ(2)=(a(2))Tδ(3)

δ(2)=δ(3)(Θ(2))Tg′(z(2))δ(2)=δ(3)(Θ(2))Tg′(z(2))

?J(Θ)?Θ(1)=(a(1))Tδ(2)?J(Θ)?Θ(1)=(a(1))Tδ(2)

观察上面的四个等式,我们发现

  • 偏导数可以由当前层神经元向量a(l)a(l)与下一层的误差向量δ(l+1)δ(l+1)相乘得到
  • 当前层的误差向量δ(l)δ(l)可以由下一层的误差向量δ(l+1)δ(l+1)与权重矩阵ΔlΔl的乘积得到

所以可以从后往前逐层计算误差向量(这就是后向传播的来源),然后通过简单的乘法运算得到代价函数对每一层权重矩阵的偏导数。到这里算是终于明白为什么要计算误差向量,以及为什么误差向量之间有递归关系了。尽管这里的神经网络十分简单,推导过程也不是十分严谨,但是通过这个简单的例子,基本能够理解后向传播算法的工作原理了。

严谨的后向传播算法(计算梯度)

假设我们有mm个训练example,LL层神经网络,并且此处考虑正则项,即

J(Θ)=?1m[∑i=1m∑k=1Ky(i)klog(hθ(x(i)))k+(1?y(i)k)log(1?(hθ(x(i)))k)]+λ2m∑l=1L?1∑i=1sl∑j=1sl+1(Θ(l)ji)2J(Θ)=?1m[∑i=1m∑k=1Kyk(i)log(hθ(x(i)))k+(1?yk(i))log(1?(hθ(x(i)))k)]+λ2m∑l=1L?1∑i=1sl∑j=1sl+1(Θji(l))2

初始化:设置Δ(l)ij=0Δij(l)=0 (理解为对第ll层的权重矩阵的偏导累加值)

For i = 1 : m

  • 设置 a(1)=Xa(1)=X
  • 通过前向传播算法(FP)计算对各层的预测值a(l)a(l),其中l=2,3,4,…,Ll=2,3,4,…,L
  • 计算最后一层的误差向量 δ(L)=a(L)?yδ(L)=a(L)?y,利用后向传播算法(BP)从后至前逐层计算误差向量 δ(L?1),δ(L?1),…,δ(2)δ(L?1),δ(L?1),…,δ(2), 计算公式为δ(l)=(Θ(l))Tδ(l+1).?g′(z(l))δ(l)=(Θ(l))Tδ(l+1).?g′(z(l))
  • 更新Δ(l)=Δ(l)+δ(l+1)(a(l))TΔ(l)=Δ(l)+δ(l+1)(a(l))T

end // for

计算梯度:

D(l)ij=1mΔ(l)ij,j=0Dij(l)=1mΔij(l),j=0

D(l)ij=1mΔ(l)ij+λmΘ(l)ij,j≠0Dij(l)=1mΔij(l)+λmΘij(l),j≠0

?J(Θ)?Θ(l)=D(l)?J(Θ)?Θ(l)=D(l)

BP实际运用中的技巧

1. 将参数展开成向量

对于四层三个权重矩阵参数Θ(1),Θ(2),Θ(3)Θ(1),Θ(2),Θ(3)将其展开成一个参数向量,Matlab code如下:


1

thetaVec = [Theta1(:); Theta2(:); Theta3(:)];

2. 梯度检查

为了保证梯度计算的正确性,可以用数值解进行检查,根据导数的定义

dJ(θ)dθ≈J(θ+?)?J(θ??)2?dJ(θ)dθ≈J(θ+?)?J(θ??)2?

Matlab Code 如下


1

2

3

4

5

6

7

for i = 1 : n

    thetaPlus = theta;

    thetaPlus(i) = thetaPlus(i) + EPS;

    thetaMinus = theta;

    thetaMinus(i) = thetaMinus(i) - EPS;

    gradApprox(i) = (J(thetaPlus) - J(thetaMinus)) / (2 * EPS);

end

最后检查 gradApprox 是否约等于之前计算的梯度值即可。需要注意的是:因为近似的梯度计算代价很大,在梯度检查后记得关闭梯度检查的代码。

3. 随机初始化

初始权重矩阵的初始化应该打破对称性 (symmetry breaking),避免使用全零矩阵进行初始化。可以采用随机数进行初始化,即 Θ(l)ij∈[??,+?]Θij(l)∈[??,+?]

如何训练一个神经网络

  1. 随机初始化权重矩阵
  2. 利用前向传播算法(FP)计算模型预测值hθ(x)hθ(x)
  3. 计算代价函数J(Θ)J(Θ)
  4. 利用后向传播算法(BP)计算代价函数的梯度 ?J(Θ)?Θ(l)?J(Θ)?Θ(l)
  5. 利用数值算法进行梯度检查(gradient checking),确保正确后关闭梯度检查
  6. 利用梯度下降(或者其他优化算法)求得最优参数ΘΘ

附:一个简短的后向传播教学视频

参考文献

[1] Andrew Ng Coursera 公开课第五周

[2] Derivation of Backpropagation. http://web.cs.swarthmore.edu/~meeden/cs81/s10/BackPropDeriv.pdf

[3] Wikipedia: Backpropagation. https://en.wikipedia.org/wiki/Backpropagation

[4] How the backpropagation algorithm works. http://neuralnetworksanddeeplearning.com/chap2.html

[5] 神经网络和反向传播算法推导. http://www.mamicode.com/info-detail-671452.html

Copyright ?2017 python27

时间: 2024-10-13 07:23:02

机器学习之反向传播算法的相关文章

机器学习之五:神经网络、反向传播算法

一.逻辑回归的局限 在逻辑回归一节中,使用逻辑回归的多分类,实现了识别20*20的图片上的数字. 但所使用的是一个一阶的模型,并没有使用多项式,为什么? 可以设想一下,在原有400个特征的数据样本中,增加二次.三次.四次多项式,会是什么情形? 很显然,训练样本的特征数量将会拔高多个数量级,而且,更重要的,要在一个式子中拟合这么多的特征,其难度是非常大的,可能无法收敛到一个比较理想的状态. 也就是说,逻辑回归没法提供很复杂的模型. 因为其本质上是一个线性的分类器,擅长解决的是线性可分的问题. 那么

神经网络训练中的Tricks之高效BP(反向传播算法)

神经网络训练中的Tricks之高效BP(反向传播算法) 神经网络训练中的Tricks之高效BP(反向传播算法) [email protected] http://blog.csdn.net/zouxy09 Tricks!这是一个让人听了充满神秘和好奇的词.对于我们这些所谓的尝试应用机器学习技术解决某些问题的人,更是如此.曾记得,我们绞尽脑汁,搓手顿足,大喊“为什么我跑的模型不work?”,“为什么我实现的效果那么差?”,“为什么我复现的结果没有他论文里面说的那么好?”.有人会和你说“你不懂调参!

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

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

反向传播算法

反向传播算法(英:Backpropagation algorithm,简称:BP算法)是一种监督学习算法,常被用来训练多层感知机. 于1974年,Paul Werbos[1]首次给出了如何训练一般网络的学习算法,而人工神经网络只是其中的特例.不巧的,在当时整个人工神经网络社群中却无人知晓Paul所提出的学习算法.直到80年代中期,BP算法才重新被David Rumelhart.Geoffrey Hinton及Ronald Williams[2][3].David Parker[4]和Yann L

DL4NLP——神经网络(一)前馈神经网络的BP反向传播算法步骤整理

这里把按[1]推导的BP算法(Backpropagation)步骤整理一下,备忘使用.[1] 中直接使用矩阵微分的记号进行推导,整个过程十分简洁.而且这种矩阵形式有一个非常大的优势就是对照其进行编程实现时非常方便. 但其实用标量计算推导也有一定的好处,比如可以清楚地知道某个权重是被谁所影响的. 记号约定: $L$:神经网络的层数.输入层不算. $n^l$:第 $l$ 层神经元的个数.偏置神经元不算在内. $W^{l}\in\mathbb R^{n^l\times n^{l-1}}$:第 $l-1

反向传播算法数学推导

虽然数学不是那么好,但还是要对这个经典算法真正推导一遍心里才安稳. 主要参考资料:ufldl 开始:首先要明确,反向传播算法,是为了计算loss相对于w,b的偏导数,以此来更新每次学习的w,b,是一个巧妙地计算方法. 首先定义loss函数: 乍一看,这怎么求关于每个权值的偏导数呢?别急,反向传播算法的一个巧妙之处就是没有直接去定义loss相对于w,b的偏导数,而是先定义了一个残差的概念 以下直接上手写图了(太多公式): 一些注意点明天写!

稀疏自动编码之反向传播算法(BP)

假设给定m个训练样本的训练集,用梯度下降法训练一个神经网络,对于单个训练样本(x,y),定义该样本的损失函数: 那么整个训练集的损失函数定义如下: 第一项是所有样本的方差的均值.第二项是一个归一化项(也叫权重衰减项),该项是为了减少权连接权重的更新速度,防止过拟合. 我们的目标是最小化关于 W 和 b 的函数J(W,b). 为了训练神经网络,把每个参数 和初始化为很小的接近于0的随机值(例如随机值由正态分布Normal(0,ε2)采样得到,把 ε 设为0.01), 然后运用批量梯度下降算法进行优

循环神经网络(RNN)模型与前向反向传播算法

在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系.今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Recurrent Neural Networks ,以下简称RNN),它广泛的用于自然语言处理中的语音识别,手写书别以及机器翻译等领域. 1. RNN概述 在前面讲到的DNN和CNN中,训练样本的输入和输出是比较的确定的.但是有一类问题DNN和CNN不好解决,就是训练样本输入是连续的序列,且序列的长短不

深度学习基础--神经网络--BP反向传播算法

BP算法: 1.是一种有监督学习算法,常被用来训练多层感知机.  2.要求每个人工神经元(即节点)所使用的激励函数必须可微. (激励函数:单个神经元的输入与输出之间的函数关系叫做激励函数.) (假如不使用激励函数,神经网络中的每层都只是做简单的线性变换,多层输入叠加后也还是线性变换.因为线性模型的表达能力不够,激励函数可以引入非线性因素) 下面两幅图分别为:无激励函数的神经网络和激励函数的神经网络 如图所示,加入非线性激活函数后的差异:上图为用线性组合逼近平滑曲线来分割平面,下图为使用平滑的曲线