机器学习之神经网络bp算法推导

这是一篇学习UFLDL反向传导算法的笔记,按自己的思路捋了一遍,有不对的地方请大家指点。

首先说明一下神经网络的符号:

1. nl 表示神经网络的层数。

2. sl 表示第 l 层神经元个数,不包含偏置单元。

3. z(l)i 表示第 l 层第 i 个神经元的输入;a(l)i 表示第 l 层第 i 个神经元的输出。

4. W(l)ij 表示第 l 层第 j 个神经元连接到第 l+1 层第 i 个神经元的权重,因此权值矩阵 W 的维数为 sl+1 x sl

第二层各神经元的计算方法如下:

a(2)1a(2)2a(2)3a(2)4=f(W(1)11x1+W(1)12x2+W(1)13x3+b(1)1)=f(W(1)21x1+W(1)22x2+W(1)23x3+b(1)2)=f(W(1)31x1+W(1)32x2+W(1)33x3+b(1)3)=f(W(1)41x1+W(1)42x2+W(1)43x3+b(1)4)

我们可以将其向量化表示:

z(2)a(2)=W(1)x+b(1)=f(z(2))

这里的矩阵W的具体形式为:

W4×3=????????W(1)11W(1)21W(1)31W(1)41W(1)12W(1)22W(1)32W(1)42W(1)13W(1)23W(1)33W(1)43????????

第2层的神经元个数为4,第1层神经元的个数为3,因此为 4×3 维的矩阵。

代价函数

对于单个样本我们将神经网络的代价函数定义为:

J(W,b;x,y)=12∥∥hW,b(x)?y∥∥2

对所有 K 个样本,神经网络的总的代价函数(这也是批量的由来)为:

J(W,b)=[1K∑k=1KJ(W,b;x(k),y(k))]+λ2∑l=1nl?1∑i=1sl∑j=1sl+1(W(l)ji)2=[1K∑k=1K(12∥∥hW,b(x(k))?y(k)∥∥2)]+λ2∑l=1nl?1∑i=1sl∑j=1sl+1(W(l)ji)2

使用批量梯度下降算法寻求神经网络的最优参数

我们使用批量梯度下降算法寻求神经网络的最优参数 W(l),bl。

我们先来看对于 第 l+1 层第 i 个神经元来说,第 l 层第 j 个神经元的权值可按如下方式迭代更新:

W(l)ij=W(l)ij?α??W(l)ijJ(W,b)=W(l)ij?α????1K∑k=1K??W(l)ijJ(W,b;x(k),y(k))??+λW(l)ij??

类似的,对于 第 l+1 层第 i 个神经元来说,第 l 层的偏置单元的权值可按如下方式迭代更新:

b(l)i=b(l)i?α??b(l)iJ(W,b)=b(l)i?α??1K∑k=1K??b(l)iJ(W,b;x(k),y(k))??

我们现在的目的是求出以下两个式子就可以对参数进行迭代了:

??W(l)ijJ(W,b;x(k),y(k))??b(l)iJ(W,b;x(k),y(k))

又我们知道第 l+1 层第 i 个神经元的输入 z(l+1)i 可以由以下式子计算:

z(l+1)i=∑j=1slW(l)ija(l)j+b(l)i

再进一步的对上面的式子进行变形:

??W(l)ijJ(W,b;x(k),y(k))=?J(W,b;x(k),y(k))?z(l+1)i??z(l+1)i?W(l)ij=?J(W,b;x(k),y(k))?z(l+1)i?a(l)j

同样的,对于 b(l)i的偏导数:

??b(l)iJ(W,b;x(k),y(k))=?J(W,b;x(k),y(k))?z(l+1)i??z(l+1)i?b(l)i=?J(W,b;x(k),y(k))?z(l+1)i

残差的定义

接下来我们定义:

δ(l)i=??z(l)iJ(W,b;x(k),y(k))

为第k个样本在第l层第i个神经元上产生的残差。再次回顾我们的参数更新公式:

对于 W(l)ij 我们有:

W(l)ij=W(l)ij?α??W(l)ijJ(W,b)=W(l)ij?α????1K∑k=1K??W(l)ijJ(W,b;x(k),y(k))??+λW(l)ij??=W(l)ij?α????1K∑k=1K?J(W,b;x(k),y(k))?z(l+1)i?a(l)j??+λW(l)ij??=W(l)ij?α[(1K∑k=1Kδ(l+1)i?a(l)j)+λW(l)ij]

类似的,对于 b(l)i 我们有:

b(l)i=b(l)i?α??b(l)iJ(W,b)=b(l)i?α1K∑k=1K??b(l)iJ(W,b;x(k),y(k))=b(l)i?α1K∑k=1K?J(W,b;x(k),y(k))?z(l+1)i=b(l)i?α1K∑k=1Kδ(l+1)i

现在的核心问题只剩下一个了,这个残差该如何求?

我们先计算最后一层第 i 个神经元上的残差,这里为了简单起见,不再指定为第 k 个样本。

δ(nl)i=??z(nl)iJ(W,b;x,y)=??z(nl)i12∥∥hW,b(x)?y∥∥2=??z(nl)i12∑j=1snl(yj?a(nl)j)2=??z(nl)i12∑j=1snl(yj?f(z(nl)j))2=?(yi?f(z(nl)i))f′(z(nl)i)

然后计算倒数第二层即第 nl?1 层第 i 个神经元的残差:

δ(nl?1)i=??z(nl?1)iJ(W,b;x,y)=??z(nl?1)i12∑j=1snl(yj?a(nl)j)2=12∑j=1snl??z(nl?1)i(yj?f(z(nl)j))2=∑j=1snl?(yj?f(z(nl)j))??z(nl?1)if(z(nl)j)=∑j=1snl?(yj?f(z(nl)j))f′(z(nl)j)?z(nl)j?z(nl?1)i=∑j=1snlδ(nl)j??z(nl?1)i∑q=1snlW(nl?1)jqf(z(nl?1)q)=∑j=1snlW(nl?1)jiδ(nl)jf′(z(nl?1)i)

从这里可以看出紧挨着的两层神经元之间的残差是有关系的,这也是反向传播的由来。更一般的,可以将上述关系表述为:

δ(l)i=∑j=1sl+1W(l)jiδ(l+1)jf′(z(l)i)

再再次回顾我们的参数更新公式:

W(l)ijb(l)i=W(l)ij?α[(1K∑k=1Kδ(l+1)i?a(l)j)+λW(l)ij]=b(l)i?α1K∑k=1Kδ(l+1)i

我们需要先计算输出层神经元的残差,然后一级一级的计算前一层的神经元的残差,利用这些残差就可以更新神经网络参数了。

向量化表示

这里我们尝试将上述结果表示成向量或矩阵的形式,比如我们希望能一次性更新某一层神经元的权值和偏置,而不是一个一个的更新。

δ(l+1)i 表示的是第 l+1 层第 i 个神经元的残差,那么整个第 l+1 层神经元的偏差是多少呢?

δ(l+1)i=∑j=1sl+2W(l+1)jiδ(l+2)jf′(z(l+1)i)

从而得到:

δ(l+1)=(W(l+1))Tδ(l+2)?f′(z(l+1))

注:这里的 ? 是指点乘,即对应元素相乘,δ(l+1) 是一个 sl+1×1 维的列向量。

a(l)j 表示第 l 层第 j 个神经元的输出,因此整个第 l 层的神经元的输出可用 a(l) 表示,是一个 sl×1 维的列向量。

因此对于矩阵 W(l) 来说,我们记:

?W(l)J(W,b;x,y)=δ(l+1)(a(l))T

我们将 ΔW(l) 初始化为 0 ,然后对所有 K 个样本将它们的 ?W(l)J(W,b;x,y) 累加到 ΔW(l) 中去:

ΔW(l):=ΔW(l)+?W(l)J(W,b;x,y)

然后更新一次W(l):

W(l)=W(l)?α[(1KΔW(l))+λW(l)]

这里再强调一下:上式中的 ΔW(l) 是所有 K 个样本的 δ(l+1)(a(l))T 累加和,如果希望做随机梯度下降了或者是mini-batch,这里就不用把所有样本的残差加起来了。

类似的,令:

?b(l)J(W,b;x,y)=δ(l+1)

我们将 Δb(l) 初始化为 0 , 然后对所有 K 个样本将它们的 ?b(l)J(W,b;x,y) 累加到 Δb(l) 中去

Δb(l):=Δb(l)+?b(l)J(W,b;x,y)

于是有:

b(l)=b(l)?α[1KΔb(l)]

同样的,上式中的 Δb(l) 是所有 K 个样本的 δ(l+1) 累加和。

小结

上面的推导过程尝试把所有的步骤都写出来了,个人感觉比UFLDL上的教程更为详尽,只要你耐心看总能看得懂的。当然这篇文章有些细节并未作说明,比如惩罚因子的作用,为什么没有对偏置进行规则化,激活函数的选择等,这些都可以在UFLDL中找到答案,对应的链接在下面的参考中给出。

参考

[1] 神经网络

[2] 反向传导算法

时间: 2024-08-20 02:40:34

机器学习之神经网络bp算法推导的相关文章

多层神经网络BP算法 原理及推导

首先什么是人工神经网络?简单来说就是将单个感知器作为一个神经网络节点,然后用此类节点组成一个层次网络结构,我们称此网络即为人工神经网络(本人自己的理解).当网络的层次大于等于3层(输入层+隐藏层(大于等于1)+输出层)时,我们称之为多层人工神经网络. 1.神经单元的选择 那么我们应该使用什么样的感知器来作为神经网络节点呢?在上一篇文章我们介绍过感知器算法,但是直接使用的话会存在以下问题: 1)感知器训练法则中的输出 由于sign函数时非连续函数,这使得它不可微,因而不能使用上面的梯度下降算法来最

误差逆传播(error BackPropagation, BP)算法推导及向量化表示

1.前言 看完讲卷积神经网络基础讲得非常好的cs231后总感觉不过瘾,主要原因在于虽然知道了卷积神经网络的计算过程和基本结构,但还是无法透彻理解卷积神经网络的学习过程.于是找来了进阶的教材Notes on Convolutional Neural Networks,结果刚看到第2章教材对BP算法的回顾就犯难了,不同于之前我学习的对每一个权值分别进行更新的公式推导,通过向量化表示它只用了5个式子就完成了对连接权值更新公式的描述,因此我第一眼看过去对每个向量的内部结构根本不清楚.原因还估计是自己当初

BP算法推导python实现

def sigmoid(inX):   return 1.0/(1+exp(-inX)) '''标准bp算法每次更新都只针对单个样例,参数更新得很频繁sdataSet 训练数据集labels 训练数据集对应的标签标签采用one-hot编码(一位有效编码),例如类别0对应标签为[1,0],类别1对应标签为[0,1]alpha 学习率num 隐层数,默认为1层eachCount 每一层隐层的神经元数目repeat 最大迭代次数算法终止条件:达到最大迭代次数或者相邻一百次迭代的累计误差的差值不超过0.

第5章 实现多层神经网络BP算法

前言 神经网络是一种很特别的解决问题的方法.本书将用最简单易懂的方式与读者一起从最简单开始,一步一步深入了解神经网络的基础算法.本书将尽量避开让人望而生畏的名词和数学概念,通过构造可以运行的Java程序来实践相关算法. 关注微信号"javaresearcher"来获取本书的更多信息. 上一章我们讨论了神经网络的表达能力的数学原理,这一章我们就来实现一个神经网络以及训练算法. 我们今天讨论类似下面的全连接多层单向神经网络: 我们把输入也看作一层,上图中一共有三层.输入和输出层是由问题的输

多层神经网络BP算法

Principles of training multi-layer neural network using backpropagation The project describes teaching process of multi-layer neural network employing backpropagation algorithm. To illustrate this process the three layer neural network with two input

BP算法基本原理推导----《机器学习》笔记

前言 多层网络的训练需要一种强大的学习算法,其中BP(errorBackPropagation)算法就是成功的代表,它是迄今最成功的神经网络学习算法. 今天就来探讨下BP算法的原理以及公式推导吧. 神经网络 先来简单介绍一下神经网络,引入基本的计算公式,方便后面推导使用 图1 神经网络神经元模型 图1就是一个标准的M-P神经元模型.

神经网络 误差逆传播算法推导 BP算法

??误差逆传播算法是迄今最成功的神经网络学习算法,现实任务中使用神经网络时,大多使用BP算法进行训练. ??给定训练集\(D={(x_1,y_1),(x_2,y_2),......(x_m,y_m)},x_i \in R^d,y_i \in R^l\),即输入示例由\(d\)个属性描述,输出\(l\)个结果.如图所示,是一个典型的单隐层前馈网络,它拥有\(d\)个输入神经元.\(l\)个输出神经元.\(q\)个隐层神经元,其中,\(\theta_j\)表示第\(j\)个神经元的阈值,\(\gam

stanford coursera 机器学习编程作业 exercise4--使用BP算法训练神经网络以识别阿拉伯数字(0-9)

在这篇文章中,会实现一个BP(backpropagation)算法,并将之应用到手写的阿拉伯数字(0-9)的自动识别上. 训练数据集(training set)如下:一共有5000个训练实例(training instance),每个训练实例是一个400维特征的列向量(20*20 pixel image).用 X 矩阵表示整个训练集,则 X 是一个 5000*400 (5000行 400列)的矩阵 另外,还有一个5000*1的列向量 y ,用来标记训练数据集的结果.比如,第一个训练实例对应的输出

(转)神经网络和深度学习简史(第一部分):从感知机到BP算法

深度|神经网络和深度学习简史(第一部分):从感知机到BP算法 2016-01-23 机器之心 来自Andrey Kurenkov 作者:Andrey Kurenkov 机器之心编译出品 参与:chenxiaoqing.范娜Fiona.杨超.微胖.汪汪.赵巍 导读:这是<神经网络和深度学习简史>第一部分.这一部分,我们会介绍1958年感知机神经网络的诞生,70年代人工智能寒冬以及1986年BP算法让神经网络再度流行起来. 深度学习掀起海啸 如今,深度学习浪潮拍打计算机语言的海岸已有好几年,但是,