上一章的神经网络实际上是前馈神经网络(feedforward neural network),也叫多层感知机(multilayer perceptron,MLP)。具体来说,每层神经元与下一层神经元全互联,神经元之间不存在同层或跨层连接;输入层神经元仅接受外界输入,不进行函数处理;隐藏层与输出层包含功能神经元,对信号进行加工;最终结果由输出层神经元输出。“前馈”是说网络拓补结构上不存在环路或回路,而不是指网络信号不能向后传递。

前向传播(FP)

  所谓前向传播,就是根据一些列包含偏置项的权重矩阵Θ和输入层向量x,根据激活函数逐层计算,最终计算到输出层,得到输出结果的过程。

  输入:总层数L,所有隐藏层和输出层对应的权重矩阵Θ,输入向层量x

  输出:输出层的向量y

学习策略

  首先为下面的4层多分类神经网络定义一些符号。

  • 训练样本:{ (x(1), y(1)), (x(2), y(2)), ……, (x(m), y(m)) }
  • 神经网络层数: L
  • 每一层的神经元数:Sl 下标l 表示神经元所在的层数,Sl 不包括偏置项
  • 输出层的维度:K,由于输出层的神经元数=输出层的维度,所以 SL = K。K=1表示二分类,K≥3表示多分类,K = 2没有意义(K=1已经是二分类,没有必要再添加一个输出神经元)。

  上图中:

  我们已经知道逻辑回归的损失函数:

  上面的损失函数加入了正则化。由于神经元使用了sigmoid函数作为损失函数,所以神经网络的损失函数:

  其中y(i)k 表示第i个样本在输出层第k个维度的值。例如:

  每个输出神经元的损失函数都和逻辑回归的类似。如果是单个神经元,即K=1时,正是逻辑回归的损失函数:

单个神经元

  对于多分类,比如上面的4分类,逻辑回归首先对训练样本的进行预处理,根据分类不同,得到4组相同输入但标签不同的训练样本;然后使用相同的损失函数对每组样本进行训练,得出4个不同的hθ;最后取置信度最高的hθ作为预测结果。而神经网络只需要对训练样本进行一次预处理,训练后得到唯一的hΘ

  神经网络的正则化项是所有隐藏层和输出层上所有神经元的正则化之和:

  这里J(Θ)是一个实数。对于正则化项,L - 1是因为输出层作为最末层,不再继续向后传播。正则化同样不计算偏置项,所以Θ的下标从1开始。S是第 l 层神经元的个数。以上面的4分类神经网络为例,L = 4:

算法——反向传播(BP)

  神经网络的学习过程就是根据训练数据来调整神经元之间的权值,通过权值可以计算出该层神经元的阈值,换句话说,神经网络学到的东西,蕴含在权值和阈值中。

  我们的目的是找到最佳的Θ使得J(Θ)最小化,将求解Θ转换为最优化问题,即:

  依然可以使用梯度下降:

  这里需要对Θ求导,然而实际推导时会发现,求导的过程远比逻辑回归困难。我们的求导目标:

  以下图为例,尝试进行反向传播的推导:

  简单起见,将J(Θ)的正则化项去掉,并令m = 1,即仅有一个训练样本,此时可以去掉上标并固化一些参数:

  通过上一章的内容,我们知道,每一层的节点都依赖于上一层的节点和权重:

  g是激活函数,这里是sigmoid函数。可以通过z和Θ之间的关联使用链式法则,对Θi,j(l)求偏导:

  现在来重新审视一下J(Θ)的意义,它代表神经网络函数与实际结果的误差,也就是输出层与实际结果的误差,输出层的误差又来源于上一层……就这样从输出层开始,层层追责,直到输入层为止,这也是被称为“反向传播”的原因。

  由于神经网络每一层有多个神经元,所以每层的误差又是由该层所有神经元的误差组成。对某一神经元的输入加以扰动就能获得该神经元对最终结果的影响,因此定义第 l 层第 j 个神经元aj(l)的误差是:

  写成向量形式:

  因为定义了神经元的误差项δ作为中间变量,所以:

  l 层的所有权重的偏导可以表示为矩阵:

  上式等于下面的简化形式:

  注意这里Θ(l)是Sl+1×Sl的矩阵,需要使用矩阵求导公式(y是标量,X是矩阵):

  最后的结果是一个矩阵,矩阵中的每一个元素都对应神经网络中的一个权重,算法的训练目标正是求得最佳权重。a(l)可以通过输入层和初始权重求得,现在的问题是如何求解误差项δ。

输出层误差

  输出层的误差可以直接用真实值和预测值的差值定义:

隐藏层的误差

  对于隐藏层 l 层来说,它的某一神经元节点与 l+1 层的所有神经元都存在关联,如下图所示:

  目标是计算 l 层的某个输入对最终结果的影响,即:

  这里需要使用多变量微积分的链式求导法则,首先将zj(l)关联的节点参数化:

  其中等式右侧的zi(l+1)是一个有唯一自变量zj(l)的函数,具体来说,是 l 层神经元的加权和。根据链式求导法则:

  关于上式中多变量微积分的链式求导法则,可参考《多变量微积分笔记4——全微分与链式法则》。需要注意下标 i 和 j 的切换。是sigmoid函数,如果继续计算g’:

  推导过程可参见《ML(4)——逻辑回归》。

  用向量表示误差:

  ⊙表示矩阵的对应元素两两相乘,相当于Octave中的“./”操作。以下面的四分类为例:

  

  在写这篇文章时,本来想直接从网上copy一些推导,但是仔细阅读后,发现大多数网文直接将误差的推导写成下面的形式,最后莫名其妙地得出了结论:

  实际上这是错误的,对于矩阵或向量的求导无法直接使用标量函数的链式求导法则,即使能够像上面那样使用,也不会得到最右侧的结果。

正则化项

  正则化项的求导较为简单,可以直接得出结果:

最终结果

  现在,困难的求解过程已经结束,最初的目标已经能够求解:

  注意这里的约束条件是 1 < l,因为输出层没有权重:

  扩展到m个训练样本,上标 t 表示第 t 组数据:

  如果加入正则化项:

  最终的梯度下降公式:

计算过程

  根据梯度下降算法,需要反复计算权重的偏导,这在逻辑回归中很容易,但在神经网络中就比较麻烦,下面是权重偏导的计算过程:

  1.训练数据:{(x(1),y(1)), (x(1),y(1)),…, (x(m),y(m))}

  2.将所有权重初始化,设Δi,j(l)是m个训练数据中所有相同位置的权重和,即:

  3.开始训练,t = 1 for t to m:

    3.1. set a(1) = x(1)

    3.2. 用前向传播方法计算每一层的神经元输出,即a(l)

    3.3. 计算每一层的误差,需要注意的是输出层和隐藏层的区别:

    3.4.  累加Δi,j(l)

  4. 求得权重的偏导:

  注意D(l)是一个包含 l 层所有权重偏导的Sl+1×Sl矩阵。

  参考:

  Ng视频《Neural Networks》

  《机器学习》周志华

  《视觉机器学习20讲》


  作者:我是8位的

  出处:http://www.cnblogs.com/bigmonkey

  本文以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,非商业用途!

  扫描二维码关注公众号“我是8位的”

  

ML(5)——神经网络2(BP反向传播)的更多相关文章

  1. 机器学习 —— 基础整理(七)前馈神经网络的BP反向传播算法步骤整理

    这里把按 [1] 推导的BP算法(Backpropagation)步骤整理一下.突然想整理这个的原因是知乎上看到了一个帅呆了的求矩阵微分的方法(也就是 [2]),不得不感叹作者的功力.[1] 中直接使 ...

  2. 【神经网络】BP反向传播神经网络

    BP算法细节 参数说明:假设有n层.J表示代价函数,和上面的E是同样的意思,只不过用不同的字母写而已. 分析:要想知道第l层的第i个结点的残差,必须知道层已经计算出来了残差,你只要把后面一层的每个结点 ...

  3. 神经网络中的反向传播法--bp【转载】

    from: 作者:Charlotte77 出处:http://www.cnblogs.com/charlotte77/ 一文弄懂神经网络中的反向传播法——BackPropagation 最近在看深度学 ...

  4. 【深度学习】BP反向传播算法Python简单实现

    转载:火烫火烫的 个人觉得BP反向传播是深度学习的一个基础,所以很有必要把反向传播算法好好学一下 得益于一步一步弄懂反向传播的例子这篇文章,给出一个例子来说明反向传播 不过是英文的,如果你感觉不好阅读 ...

  5. 一文弄懂神经网络中的反向传播法——BackPropagation【转】

    本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法——BackPropagation   最近在看深度学习 ...

  6. 一文弄懂神经网络中的反向传播法——BackPropagation

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...

  7. [转] 一文弄懂神经网络中的反向传播法——BackPropagation

    在看CNN和RNN的相关算法TF实现,总感觉有些细枝末节理解不到位,浮在表面.那么就一点点扣细节吧. 这个作者讲方向传播也是没谁了,666- 原文地址:https://www.cnblogs.com/ ...

  8. 一文弄懂神经网络中的反向传播法(Backpropagation algorithm)

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...

  9. [DeeplearningAI笔记]序列模型1.3-1.4循环神经网络原理与反向传播公式

    5.1循环序列模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.3循环神经网络模型 为什么不使用标准的神经网络 假如将九个单词组成的序列作为输入,通过普通的神经网网络输出输出序列, 在 ...

随机推荐

  1. C Runtime Library、C  Runtime

    C Runtime Library.C Runtime   1)运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些 ...

  2. ubuntu 实用命令收集

    dig 查看域名解析 最下面server为DNS解析地址 dig google.com sudo -s 转为root方式 curl ip.gs 获取本机外网的ip地理地址 开启ipv4转发功能 /et ...

  3. 四则运算 来源:一位热心的网友 http://www.tqcto.com/article/software/336297.html

    功能:实现真分数的四则运算 语言:Java  平台:JDK下的eclipse github地址:https://github.com/yeershao/hello-world/commit/9920a ...

  4. 设置idea文件类型

  5. Bug03_SSM整合_mybatis result maps collection already contains value...

    这个问题是在映射文件,但是这个映射文件是自动生成的. 所以想起来可能是在自动生成映射文件,pojo类时操作有问题.第一次运行时,出现错误,没有删除已经生成的文件就直接运行了第二次. 解决办法:删除旧的 ...

  6. win7 + nginx + php

    1. 下载 Nginx的下载地址:http://www.nginx.org/ PHP的下载地址:http://www.php.NET/downloads.php win7 64  +  php-5.4 ...

  7. tmux-2.3 conf

    set-window-option -g automatic-rename off set -g allow-rename off # 把前缀键从 C-b 更改为 C-a set -g prefix ...

  8. 创建一个版本库,把文件夹用Git管理起来

    创建一个文件夹,把这个文件夹用Git管理起来,那么这个文件夹的改变都可以被Git跟踪到,当然也可以将Git中的文件还原到某一个时刻. 首先创建一个空的目录,然后将空的目录由Git来管理 1.建立一个文 ...

  9. python2.7.9安装mysql-python模块

    我使用的系统版本是: SLES12-sp2 使用python连接Mysql数据库,需要安装mysql-python模块: 1. 首先安装pip: 从python官方网站下载get-pipe.py,执行 ...

  10. Unity调用Windows对话框保存时另存为弹框

    Unity开发VR之Vuforia 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...