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),训练参数:
领取专属 10元无门槛券
私享最新 技术干货