稀疏自动编码之反向传播算法(BP)
假设给定m个训练样本的训练集
,用梯度下降法训练一个神经网络,对于单个训练样本(x,y),定义该样本的损失函数:

那么整个训练集的损失函数定义如下:

第一项是所有样本的方差的均值。第二项是一个归一化项(也叫权重衰减项),该项是为了减少权连接权重的更新速度,防止过拟合。
我们的目标是最小化关于 W 和 b 的函数J(W,b). 为了训练神经网络,把每个参数
和
初始化为很小的接近于0的随机值(例如随机值由正态分布Normal(0,ε2)采样得到,把 ε 设为0.01), 然后运用批量梯度下降算法进行优化。由于 J(W,b) 是一个非凸函数,梯度下降很容易收敛到局部最优,但是在实践中,梯度下降往往可以取得不错的效果。最后,注意随机初始化参数的重要性,而不是全部初始化为0. 如果所有参数的初始值相等,那么所有的隐层节点会输出会全部相等,因为训练集是一样的,即输入一样,如果每个模型的参数还都一样,输出显然会相同,这样不论更新多少次参数,所有的参数还是会相等。随机初始化各个参数就是为了防止这种情况发生。
梯度下降每一次迭代用下面的方式更新参数W 和 b:

其中 α 是学习率。上述迭代的关键是计算偏导数。我们将给出一种方向传播算法,能够高效地计算这些偏导数。
由上面的总体的损失函数公式, 很容易得到偏导数公式如下:

反向传播算法的思想是:给定某个训练样本(x,y),首先进行“前向传播”计算出整个网络中所有节点的激活值,包括输出节点的输出值。那么对于 l 层的节点 i ,计算它的“残差”
,这个残差用来衡量该节点对输出的残差产生了多大程度的影响。对于输出节点,我们可以直接比较出网络的激活值与真正的目标值之间的残差,即
(nl 层就是输出层) 。对于隐层节点,我们用 l+1 层残差的加权平均值和 l 层的激活值来计算
.
下面详细给出了反向传播算法的步骤:
1. 进行前馈传播,计算每一层的中所有节点的激活值
2. 对于输出层(第nl 层)的节点 i 的残差:

这里需要注意:
表示第 l 层节点 i 的所有输出之和,f 是激活函数,例如
,
等,另外,最后一层(输出层)的假设函数
的输出值就是该层节点的激活值。
3. 对于 

4. 计算偏导数:

下面用矩阵-向量化的操作方式重写这个算法。其中"
"表示matlab中的点乘。对于
同样向量化,
也作同样处理,即
.
BP算法重写如下:
1. 进行前馈传播,计算每一层的中所有节点的激活值
2. 对于输出层(第nl 层)的节点 i 的残差:

3. 对于 

4. 计算偏导数:

注意:在上面的第2步和第3步,,我们需要为每一个 节点 i 计算其
. 假设
是sigmoid激活函数,在前向传播的过程中已经存储了所有节点的激活值
,因此利用我们在
稀疏自动编码之神经网络
中推导出的sigmoid激活函数的导数求法:对于sigmoid函数f(z) = 1 / (1 + exp( − z)),它的导函数为f'(z) = f(z)(1 − f(z)).可以提前算出
,这里用到我们上面提到的
.
最后,给出完整的梯度下降法.在下面的伪代码中
,
都是矩阵,
,
是向量。
1. 对于每一层,即所有 l ,
,
(设置为全零矩阵或者向量)
2. 从第一个训练样本开始,一直到最后一个(第 m 个训练样本):
a. 用反向传播计算
和
b.
.
c.
.
3. 更新参数:

现在,我们可以重复梯度下降法的迭代步骤来减小损失函数
的值,进而训练出我们的神经网络。
学习来源:http://deeplearning.stanford.edu/wiki/index.php/Backpropagation_Algorithm
稀疏自动编码之反向传播算法(BP)的更多相关文章
- 深度神经网络(DNN)反向传播算法(BP)
在深度神经网络(DNN)模型与前向传播算法中,我们对DNN的模型和前向传播算法做了总结,这里我们更进一步,对DNN的反向传播算法(Back Propagation,BP)做一个总结. 1. DNN反向 ...
- 【机器学习】反向传播算法 BP
知识回顾 1:首先引入一些便于稍后讨论的新标记方法: 假设神经网络的训练样本有m个,每个包含一组输入x和一组输出信号y,L表示神经网络的层数,S表示每层输入的神经元的个数,SL代表最后一层中处理的单元 ...
- 神经网络与机器学习 笔记—反向传播算法(BP)
先看下面信号流图,L=2和M0=M1=M2=M3=3的情况,上面是前向通过,下面部分是反向通过. 1.初始化.假设没有先验知识可用,可以以一个一致分布来随机的挑选突触权值和阈值,这个分布选择为均值等于 ...
- 卷积神经网络(CNN)反向传播算法
在卷积神经网络(CNN)前向传播算法中,我们对CNN的前向传播算法做了总结,基于CNN前向传播算法的基础,我们下面就对CNN的反向传播算法做一个总结.在阅读本文前,建议先研究DNN的反向传播算法:深度 ...
- 神经网络训练中的Tricks之高效BP(反向传播算法)
神经网络训练中的Tricks之高效BP(反向传播算法) 神经网络训练中的Tricks之高效BP(反向传播算法) zouxy09@qq.com http://blog.csdn.net/zouxy09 ...
- 机器学习 —— 基础整理(七)前馈神经网络的BP反向传播算法步骤整理
这里把按 [1] 推导的BP算法(Backpropagation)步骤整理一下.突然想整理这个的原因是知乎上看到了一个帅呆了的求矩阵微分的方法(也就是 [2]),不得不感叹作者的功力.[1] 中直接使 ...
- 【深度学习】BP反向传播算法Python简单实现
转载:火烫火烫的 个人觉得BP反向传播是深度学习的一个基础,所以很有必要把反向传播算法好好学一下 得益于一步一步弄懂反向传播的例子这篇文章,给出一个例子来说明反向传播 不过是英文的,如果你感觉不好阅读 ...
- 反向传播(BP)算法理解以及Python实现
全文参考<机器学习>-周志华中的5.3节-误差逆传播算法:整体思路一致,叙述方式有所不同: 使用如上图所示的三层网络来讲述反向传播算法: 首先需要明确一些概念, 假设数据集\(X=\{x^ ...
- 人工神经网络反向传播算法(BP算法)证明推导
为了搞明白这个没少在网上搜,但是结果不尽人意,最后找到了一篇很好很详细的证明过程,摘抄整理为 latex 如下. (原文:https://blog.csdn.net/weixin_41718085/a ...
随机推荐
- hdu 1565(状态压缩基础题)
题意:容易理解. 分析:这是我做的状态压缩第二题,一开始超内存了,因为数组开大了,后来超时了,因为能够成立的状态就那么多,所以你应该先把它抽出来!!总的来说还是比较简单的!! 代码实现: #inclu ...
- robotframework学习
下载地址: https://pypi.python.org/pypi/robotframework Installation If you already have Python with pip i ...
- python在linux上的GUI无法弹出界面
在进行python写GUI程序的时候,使用Tkinter,发现无法执行程序,报错如下: X connection to localhost:10.0 broken(explicit kill or s ...
- 【C traps and pit falls】阅读笔记
已经是第几遍读C 陷阱与缺陷了,某种意义上,这不是一本常读常新的书,大概是因为读一遍过后就记住了. 一.编译器在将程序分解成符号的时候,使用的是大嘴法. 二.使用不对称边界有很多好处. 三.缓冲输出与 ...
- WebSocket with Flask
转自:https://blog.shonenada.com/post/websocket-with-flask/ WebSocket with Flask HTML5 以前,HTML 还不支持 Web ...
- Mapreduce读取Hbase表,写数据到一个Hbase表中
public class LabelJob { public static void main(String[] args) throws Exception { Job job = Job.getI ...
- Ubuntu安装PostgreSQl
warrior@pc:~$ sudo apt-get install postgresql-xx-xx #可以使用Tab键进行代码补全 warrior@pc:~$ sudo su postgres # ...
- Google Test资料
Google Test资料 玩转Google开源C++单元测试框架Google Test系列(gtest)(总) gtest.h file not found googletest xcode 7.0 ...
- 轻松学习Linux之理解Shell的硬链接与软连接
大家在学习linux的过程中常常遇到一些模糊且容易混淆的概念比如什么是硬链接和软链接,他们有什么区别? 软连接有点象windows中的快捷方式,连接和目标文件具有相同的节点,而硬连接就好象重新复制 ...
- Spark RDD概念学习系列之RDD的创建(六)
RDD的创建 两种方式来创建RDD: 1)由一个已经存在的Scala集合创建 2)由外部存储系统的数据集创建,包括本地文件系统,还有所有Hadoop支持的数据集,比如HDFS.Cassandra.H ...