神经网络和反向传播算法
来源:互联网 发布:服务器 定时关机 软件 编辑:程序博客网 时间:2024/05/18 13:23
神经元
神经元和感知器本质上是一样的,只不过我们说感知器的时候,它的激活函数是阶跃函数;而当我们说神经元时,激活函数往往选择为sigmoid函数或tanh函数。如下图所示:
计算一个神经元的输出的方法和计算一个感知器的输出是一样的。假设神经元的输入是向量
sigmoid函数的定义如下:
将其带入前面的式子,得到
sigmoid函数是一个非线性函数,值域是(0,1)。函数图像如下图所示
sigmoid函数的导数是:
可以看到,sigmoid函数的导数非常有趣,它可以用sigmoid函数自身来表示。这样,一旦计算出sigmoid函数的值,计算它的导数的值就非常方便。
神经网络是啥
神经网络其实就是按照一定规则连接起来的多个神经元。上图展示了一个全连接(full connected, FC)神经网络,通过观察上面的图,我们可以发现它的规则包括:
- 神经元按照层来布局。最左边的层叫做输入层,负责接收输入数据;最右边的层叫输出层,我们可以从这层获取神经网络输出数据。输入层和输出层之间的层叫做隐藏层,因为它们对于外部来说是不可见的。
- 同一层的神经元之间没有连接。
- 第N层的每个神经元和第N-1层的所有神经元相连(这就是full connected的含义),第N-1层神经元的输出就是第N层神经元的输入。
- 每个连接都有一个权值。
上面这些规则定义了全连接神经网络的结构。事实上还存在很多其它结构的神经网络,比如卷积神经网络(CNN)、循环神经网络(RNN),他们都具有不同的连接规则。
计算神经网络的输出
神经网络实际上就是一个输入向量
根据输入计算神经网络的输出,需要首先将输入向量
接下来举一个例子来说明这个过程,我们先给神经网络的每个单元写上编号。
如上图,输入层有三个节点,我们将其依次编号为1、2、3;隐藏层的4个节点,编号依次为4、5、6、7;最后输出层的两个节点编号为8、9。因为我们这个神经网络是全连接网络,所以可以看到每个节点都和上一层的所有节点有连接。比如,我们可以看到隐藏层的节点4,它和输入层的三个节点1、2、3之间都有连接,其连接上的权重分别为
为了计算节点4的输出值,我们必须先得到其所有上游节点(也就是节点1、2、3)的输出值。节点1、2、3是输入层的节点,所以,他们的输出值就是输入向量
一旦我们有了节点1、2、3的输出值,我们就可以根据式1计算节点4的输出值
上式的
同样,我们可以继续计算出节点5、6、7的输出值
同理,我们还可以计算出
神经网络的矩阵表示
神经网络的计算如果用矩阵来表示会很方便(当然逼格也更高),我们先来看看隐藏层的矩阵表示。
首先我们把隐藏层4个节点的计算依次排列出来:
接着,定义网络的输入向量
代入到前面的一组式子,得到:
现在,我们把上述计算
带入前面的一组式子,得到
在式2中,
每一层的算法都是一样的。比如,对于包含一个输入层,一个输出层和三个隐藏层的神经网络,我们假设其权重矩阵分别为
则每一层的输出向量的计算可以表示为:
这就是神经网络输出值的计算方法。
神经网络的训练
现在,我们需要知道一个神经网络的每个连接上的权值是如何得到的。我们可以说神经网络是一个模型,那么这些权值就是模型的参数,也就是模型要学习的东西。然而,一个神经网络的连接方式、网络的层数、每层的节点数这些参数,则不是学习出来的,而是人为事先设置的。对于这些人为设置的参数,我们称之为超参数(Hyper-Parameters)。
接下来,我们将要介绍神经网络的训练算法:反向传播算法。
反向传播算法(Back Propagation)
我们首先直观的介绍反向传播算法,最后再来介绍这个算法的推导。当然读者也可以完全跳过推导部分,因为即使不知道如何推导,也不影响你写出来一个神经网络的训练代码。事实上,现在神经网络成熟的开源实现多如牛毛,除了练手之外,你可能都没有机会需要去写一个神经网络。
我们以监督学习为例来解释反向传播算法。在零基础入门深度学习(2) - 线性单元和梯度下降一文中我们介绍了什么是监督学习,如果忘记了可以再看一下。另外,我们设神经元的激活函数
我们假设每个训练样本为
首先,我们根据上一节介绍的算法,用样本的特征
然后,我们按照下面的方法计算出每个节点的误差项
- 对于输出层节点
i ,
其中,
- 对于隐藏层节点,
其中,
最后,更新每个连接上的权值:
其中,
类似的,权重
偏置项的输入值永远为1。例如,节点4的偏置项
我们已经介绍了神经网络每个节点误差项的计算和权重更新方法。显然,计算一个节点的误差项,需要先计算每个与其相连的下一层节点的误差项。这就要求误差项的计算顺序必须是从输出层开始,然后反向依次计算每个隐藏层的误差项,直到与输入层相连的那个隐藏层。这就是反向传播算法的名字的含义。当所有节点的误差项计算完毕后,我们就可以根据式5来更新所有的权重。
以上就是基本的反向传播算法,并不是很复杂,您弄清楚了么?
反向传播算法的推导
反向传播算法其实就是链式求导法则的应用。然而,这个如此简单且显而易见的方法,却是在Roseblatt提出感知器算法将近30年之后才被发明和普及的。对此,Bengio这样回应道:
很多看似显而易见的想法只有在事后才变得显而易见。
接下来,我们用链式求导法则来推导反向传播算法,也就是上一小节的式3、式4、式5。
前方高能预警——接下来是数学公式重灾区,读者可以酌情阅读,不必强求。
按照机器学习的通用套路,我们先确定神经网络的目标函数,然后用随机梯度下降优化算法去求目标函数最小值时的参数值。
我们取网络所有输出层节点的误差平方和作为目标函数:
其中,
然后,我们用文章零基础入门深度学习(2) - 线性单元和梯度下降中介绍的随机梯度下降算法对目标函数进行优化:
随机梯度下降算法也就是需要求出误差
观察上图,我们发现权重
上式中,
对于
输出层权值训练
对于输出层来说,
考虑上式第一项:
考虑上式第二项:
将第一项和第二项带入,得到:
如果令
上式就是式3。
将上述推导带入随机梯度下降公式,得到:
上式就是式5。
隐藏层权值训练
现在我们要推导出隐藏层的
首先,我们需要定义节点
因为
上式就是式4。
——数学公式警报解除——
至此,我们已经推导出了反向传播算法。需要注意的是,我们刚刚推导出的训练规则是根据激活函数是sigmoid函数、平方和误差、全连接网络、随机梯度下降优化算法。如果激活函数不同、误差计算方式不同、网络连接结构不同、优化算法不同,则具体的训练规则也会不一样。但是无论怎样,训练规则的推导方式都是一样的,应用链式求导法则进行推导即可。
- 神经网络和反向传播算法
- 神经网络-反向传播算法
- 神经网络反向传播算法
- 神经网络和反向传播算法推导
- 神经网络和反向传播算法推导
- 神经网络和反向传播算法推导
- 前馈神经网络和反向传播算法
- 神经网络和反向传播算法推导
- BP 神经网络 反向传播算法
- 卷积神经网络反向传播算法
- 神经网络正向反向传播算法
- 神经网络初探:反向传播算法
- 深度学习:神经网络中的前向传播和反向传播算法推导
- 人工神经网络之反向传播算法
- Matlab之BP神经网络反向传播算法
- 人工神经网络之反向传播算法
- 神经网络 反向传播算法(BP)
- 神经网络的反向传播BP算法
- FreeRTOS-互斥信号量
- 将int型转换成二进制
- ARC080 F
- ES6入门day01
- Codeforces Round #439 (Div. 2) A-C题解
- 神经网络和反向传播算法
- 数据结构——链表之有序链表的建立
- matlab中图像叠加
- aspx文件,app_code内的类无法使用的排查 编译器错误消息 CS0246 找不到类型或命名空间名称“QPUtils”(是否缺少 using 指令或程序集引用)
- java客户端访问集群时用户权限报错:rg.apache.hadoop.security.AccessControlException:
- Python 窗体(tkinter)列表框(Listbox)
- Java 基础(3) —— this 的用法
- linux网络API细节
- makefile