神经网络之后向传播算法

本文结合维基百科http://en.wikipedia.org/wiki/Backpropagation的说明,对神经网络的后向传播算法做一个总结,并作简单的公式推导。

典型的只含有1个隐层的3层神经网络的后向传播算法流程如下:

initialize network weights (often small random values)
  do
     forEach training example ex
        prediction = neural-net-output(network, ex)  // forward pass
        actual = teacher-output(ex)
        compute error (prediction - actual) at the output units
        compute $\Delta$ $w_h$ for all weights from hidden layer to output layer  // backward pass
        compute $\Delta$ $w_i$ for all weights from input layer to hidden layer   // backward pass continued
        update network weights // input layer not modified by error estimate
  until all examples classified correctly or another stopping criterion satisfied
  return the network

简单的说明,即当网络的预测结果出来之后,与真实结果相比,计算出错误率,然后对每个权重$w_{ij}$计算其对错误率的偏导数,然后根据偏导数(梯度)调整权重。

记号:

1、$net_j$记为第$j$个神经元的原始输出;

2、$o_j$记为第$j$个神经元的最终输出;

3、转换函数记为$\varphi(\mbox{net}_{j}) = \varphi\left(\sum_{k=1}^{n}w_{kj}x_k\right)=o_{j} $;

4、$E$为整个网络的误差函数,一般为目标值$t$与预测值(输出值)$y$的函数$E=f(t,y)$;

5、$L_j$记为节点$j$的所有输出节点的集合,不引起歧义情况下会省略下标。

我们最终要求出的是$\frac{\partial E}{\partial w_{ij}}$,根据链式法则有:

$$\frac{\partial E}{\partial w_{ij}} = \frac{\partial E}{\partial o_j} \frac{\partial o_j}{\partial\mathrm{net_j}} \frac{\partial \mathrm{net_j}}{\partial w_{ij}} $$

根据定义,$net_j$是$w_{ij}$的线性函数,因此右边最后一项:

$$\frac{\partial \mathrm{net_j}}{\partial w_{ij}} = \frac{\partial}{\partial w_{ij}}\left(\sum_{k=1}^{n}w_{kj}x_k\right) = x_i$$

右边第二项为转换函数$\varphi(z)$的导数,一般用的比较多的是logistic函数,$ \varphi(z) = \frac{1}{1+e^{-z}} $,其导数为

$$\frac {\partial\varphi}{\partial z} = \varphi(1-\varphi)$$

主要推导的是右部第一项$\frac{\partial E}{\partial o_j}$。

当$j$在输出层时,是比较好计算的,即为$E$对$y$的偏导数:$\frac{\partial E}{\partial o_j} = \frac{\partial E}{\partial y} $。

当$j$在隐层时,我们有以下关系:

$$ \frac{\partial E}{\partial o_j} = \sum_{l \in L} \left(\frac{\partial E}{\partial \mathrm{net}_l}\frac{\partial \mathrm{net}_l}{\partial o_j}\right) = \sum_{l \in L} \left(\frac{\partial E}{\partial o_{l}}\frac{\partial o_{l}}{\partial \mathrm{net}_l}w_{jl}\right) $$

这是一个递推公式,从后层逐渐往前层递推,而最后层即是输出层,由上面公式给出,综合起来,我们有:

$$\dfrac{\partial E}{\partial w_{ij}} = \delta_{j} x_{i}$$

where,

$$\delta_{j} = \frac{\partial E}{\partial o_j} \frac{\partial o_j}{\partial\mathrm{net_j}} = \begin{cases} (o_{j}-t_{j})\varphi(\mbox{net}_{j})(1-\varphi(\mbox{net}_{j})) & \mbox{if } j \mbox{ is an output neuron,}\\ (\sum_{l\in L} \delta_{l} w_{jl})\varphi(\mbox{net}_{j})(1-\varphi(\mbox{net}_{j})) & \mbox{if } j \mbox{ is an inner neuron.} \end{cases} $$

$$$$

给定学习率,我们可以得到权重的调整度为:

$$\Delta w_{ij} = - \alpha \frac{\partial E}{\partial w_{ij}} $$

与L-BFGS算法的区别

L-BFGS是拟牛顿法,是针对目标函数求全局最优点的算法。而后向传播是神经网络优化算法,当然,其目标函数是$E$。神经网络优化,是基于样本的,有监督的,即$E$是样本和权重(==>待调整系数)的函数,每个样本给定,对应一个配置,样本值可看作超参数,权重是变量,等价于给定超参数的情况下求全局最优的变量。当一个样本优化完毕后,再优化下一个样本。

L-BFGS可以看为,超参数隐含已给定,因此是无监督的。

从广义上来讲,将全部样本囊括,然后可以写出一个广义的目标函数,对应批量优化。

狭义上来说,每个样本对应一个目标函数,对应增量优化。

不管增量优化批量优化,神经网络都有一个目标函数,样本给定后,这个目标函数是所有权重的函数$E=E(T,O(X,W))=E(W;X,T)$,$(X,T)$即是样本。对分层神经网络,O(W;X)是嵌套函数。

对于只有输入输出两层的网络:

$$O(W;X)=\varphi(W\times X)$$

只要求出梯度向量$g_k=\nabla E(W)$和海森矩阵$H_k=\nabla^2E(W)$即可套(拟)牛顿法。

时间: 2024-08-24 22:38:17

神经网络之后向传播算法的相关文章

神经网络和反向传播算法推导

注:由于自己画图实在太难画,本文中基本所有插图来源于算法团子机器学习班,请勿转载 1.普通的机器学习模型: 其实,基本上所有的基本机器学习模型都可以概括为以下的特征:根据某个函数,将输入计算并输出.图形化表示为下图: 当我们的g(h)为sigmoid函数时候,它就是一个逻辑回归的分类器.当g(h)是一个只能取0或1值的函数时,它就是一个感知机.那么问题来了,这一类模型有明显缺陷:当模型线性不可分的时候,或者所选取得特征不完备(或者不够准确)的时候,上述分类器效果并不是特别喜人.如下例: 我们可以

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

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

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

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

神经网络之反向传播算法实现

1 神经网络模型 以下面神经网络模型为例,说明神经网络中正向传播和反向传播过程及代码实现 1.1 正向传播 (1)输入层神经元\(i_1,i_2\),输入层到隐藏层处理过程 \[HiddenNeth_1 = w_1i_1+w_2i_2 + b_1\] \[HiddenNeth_2 = w_3i_1+w_4i_2 + b_1\] \[h_1 = sigmoid(HiddenNeth_1)\] \[h_2 = sigmoid(HiddenNeth_2)\] (2)隐藏层:神经元\(h_1,h_2\)

【神经网络和深度学习】笔记 - 第二章 反向传播算法

上一章中我们遗留了一个问题,就是在神经网络的学习过程中,在更新参数的时候,如何去计算损失函数关于参数的梯度.这一章,我们将会学到一种快速的计算梯度的算法:反向传播算法. 这一章相较于后面的章节涉及到的数学知识比较多,如果阅读上有点吃力的话也可以完全跳过这一章,把反向传播当成一个计算梯度的黑盒即可,但是学习这些数学知识可以帮助我们更深入的理解神经网络. 反向传播算法的核心目的是对于神经网络中的任何weight或bias计算损失函数$C$关于它们的偏导数$\frac{\partial C}{\par

机器学习之反向传播算法

Thoughts of Algorithms 博客园 首页 联系 订阅 管理 随笔 - 54  文章 - 1  评论 - 141 机器学习公开课笔记(5):神经网络(Neural Network)--学习 这一章可能是Andrew Ng讲得最不清楚的一章,为什么这么说呢?这一章主要讲后向传播(Backpropagration, BP)算法,Ng花了一大半的时间在讲如何计算误差项δδ,如何计算ΔΔ的矩阵,以及如何用Matlab去实现后向传播,然而最关键的问题--为什么要这么计算?前面计算的这些量到

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

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

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

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

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

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