神经网络与反向传播算法

1、前言

先简单的说下神经网络吧。

简单来说就是模拟大脑的神经元。

前端会有一大批数据输入,例如,前端输入了一张图像的所有像素点。

中间层会有成千上万个网络数据节点,我们可以称之为神经元。

一系列的神经元经过各种复杂运算。

输出端输出预算结果

举个例子,

前端输入了一张图像的所有像素点数据(数据来源可以通过摄像头获取),中间层

经过层层运算,最后输出 这张照片上面的是两只天鹅。

这就是神经网络宏观上面的解释。上面的例子就是图像识别上面的应用了。

那么我们来看下这背后的算法原理吧。

2、原理

学习

我们来看下一个简单的神经网络模型吧:

假设输入是3个数据,最后输出是两个数据,中间有4个神经元。

那么问题来了,我们中间的运算是如何展开的?怎么样才能确定我们的

运算公式是合理的呢?

这个时候,我们可以一开始随便设置我们的运算参数,然后输入数据,

看下输出结果如何?如果输出结果不满意?我们再改变一下运算的参数。

反复对比,总之,我们进过几万次运算,

修改了几万次参数。最终得到一个合理的参数。

这就是一个学习的过程了。

google 的 阿尔法狗,也正是基于深度学习的设计思想,设计出来了的。一开始的阿尔法狗参数

不太合理,但是经过学习,慢慢的完善,最终击败了所有棋手。

运算公式

好了,下面是需要一定的数学基础的人才能看懂的了,非作战人员请默默地关注下本公众号,然后可以关闭页面了。。。

作战人员请继续。。。

首先,我们看上面的三层结构的网络,输入层,中间层,输出层。

假设

为第l层的数据,注意,这里是向量形式的,也就是说

那么,

就是l+1 层的数据了。对于

,我们定义运算规则为:

为sigmod函数。也就是说:

其中和

就是改层的运算参数了~~~~~~~~我们前面说什么来的?我们要找到合适的参数。

是的,神经网络整个过程中最终就是要求得

和为何值时,神经网络的输出最为合理。

那么,我们就要问了,什么是合理?

我们不是最终有输出层吗?

假设我们手头上有一万张照片,我当做输入,最终会有一万个计算结果。

我们就拿这1万个计算结果和实际结果做对比,只要计算结果和实际结果相差越来越小,错误率越来越低,我们不就可以认为

和是合理的了吗?

我们假设

是输入,是实际结果。是计算结果,那么C为损失函数,于是我们有:

其中,

表示输入的样本,

表示实际的分类,

表示预测的输出,

表示神经网络的最大层数。

对于上面的表达式,不熟悉的,请回顾下线性回归。

反向传播算法

这就是我们最核心的地方了,怎么求解出

和呢?

我们需要用到一个反向传播算法。

下面是它的公式推导:

首先,将第

层第个神经元中产生的错误(即实际值与预测值之间的误差)定义为:

其中,z在上面定义了。

公式1(计算最后一层神经网络产生的错误):

其中,

表示Hadamard乘积,用于矩阵或向量之间点对点的乘法运算。

我们有必要来看下

到底是个什么东西:

事实上他就是C对a的偏导。

公式1的推导过程如下,运用链式法则。

公式2(由后往前,计算每一层神经网络产生的错误):

推导过程:

既然我都以及知道了

的值了,通过公式1可以算出来了,

然后我们又知道了公式2,那不就可以把所有的

求解出来了吗?那么我们就运用到下面的公式3和公式4了

公式3(计算权重的梯度):

推导过程:

公式4(计算偏置的梯度):

推导过程:

4.反向传播算法伪代码

·输入训练集

·对于训练集中的每个样本x,设置输入层(Input layer)对应的激活值

·前向传播:

·

·计算输出层产生的错误:

·

·反向传播错误:

·使用梯度下降(gradient descent),训练参数:

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180102G0Z8LQ00?refer=cp_1026

扫码关注云+社区