神经网络

神经网络_第1张图片

引言

人工智能现在越来越火,而我的研究方向是目标检测,那么从这部分开始,就主要写AI方面的知识,要想先比较深入的去研究人工智能智能,就要先掌握其基础,最底层都是神经网络,所以这篇先介绍神经网络!

神经网络介绍

人工神经网络(Artificial Neural Network,即ANN)是由简单的神经元经过相互连接形成网状结构,通过调节各连接的权重值改变连接的强度,进而实现感知判断。

传统神经网络结构比较简单,训练时随机初始化输入参数,并开启循环计算输出结果,与实际结果进行比较从而得到损失函数,并更新变量使损失函数结果值极小,当达到误差阈值时即可停止循环。

神经网络的训练目的是希望能够学习到一个模型,实现输出一个期望的目标值。学习的方式是在外界输入样本的刺激下不断改变网络的连接权值。传统神经网络主要分为几类:前馈型神经网络、反馈型神经网络和自组织神经网络。这几类网络具有不同的学习训练算法,可以归结为监督型学习算法和非监督型学习算法。

监督型学习算法主要进行分类,数据集是有标注的;非监督学习算法是进行聚类,数据集是没有标注的。

本章将介绍单层神经网络(感知机)、两层神经网络(多层感知机)、多层神经网络(深度学习)

感知器

感知器是一种结构最简单的前馈神经网络,也称为感知机,它主要用来求解分类问题

一个感知器可以接收n个输入X=(x1,x2,x3,....,xn),对应n个权值w=(w1,w2,w3,...,wn),此外还有一个偏置项阈值,就是下图中的b,神经元将所有输入参数与对应权值进行加权求和,得到的结果经过激活函数变换后输出,计算公式如下:
y=f(x*w+b)
神经网络_第2张图片

sum所代表的就是神经元,用于处理数据的,相当于我们所说的细胞核,t就是输出,在输入输出之间有个处理函数f,我们称为激活函数。

两层神经网络(多层感知机)

神经元的作用可以理解为对输入空间进行直线划分,单层感知机无法解决最简单的非线性可分问题----异或问题

感知器可以顺利求解与(AND)和或(OR)问题,但是对于异或(XOR),感知机无法通过一条线进行分割。
神经网络_第3张图片

感知机无法解决异或问题,但是当增加一个新的计算层后,不仅可以解决异或问题,而且具有很好的线性分类效果,不过两层神经网络的计算是一个问题,没有一个好的解法,因此有人提出反向传播(backpropagation,BP)算法,解决了两层神经网络所需要的复杂计算量问题。

两层神经网络也叫bp神经网络,它也是前馈神经网络,只是它的权重是由反向传播学习进行调整的

bp神经网络模型拓扑结构包括输入层、隐层和输出层,利用激活函数来实现从输入到输出的任意非线性映射,从而模拟各层神经元之间的交互(题外话:激活函数须满足处处可导的条件。例如,Sigmoid函数连续可微,求导合适,单调递增,输出值是0-1之间的连续量,这些特点使其适合作为神经网络的激活函数)(图来自illikang的博客

神经网络_第4张图片
上图表示其结构,包含一个输入层,中间层和输出层,ax(y)表示第y层的第x个节点,下面给出了a1(2)和a2(2)的计算公式。
image.png
输出层的节点表示为z,如下图所示,z的公式也如下所示
神经网络_第5张图片
image.png
这是没有考虑偏置的情况,如果把偏置考虑进去,就是在公式里把偏置b加上即可
这里需要说明的是,在两层神经网络中,我们不在使用sgn函数作为激活函数,而是使用平滑函数sigmoid函数作为激活函数
事实上,神经网络的本质就是通过参数与激活函数来拟合特征与目标之间的函数关系。

通过理论可以证明,两层神经网络可以无限逼近任意连续函数。这是什么意思呢?也就是说,面对非线性分类任务,两层神经网络可以分类的很好。

下面就是一个例子,(文字部分来自illikang的博客)(此两图来自colah的[博客] (http://colah.github.io/posts/...),红色的线与蓝色的线代表数据。而红色区域和蓝色区域代表由神经网络划开的区域,两者的分界线就是决策分界。
神经网络_第6张图片
可以看到,这个两层神经网络的决策分界是非常平滑的曲线,而且分类的很好。有趣的是,前面已经学到过,单层网络只能做线性分类任务。而两层神经网络中的后一层也是线性分类层,应该只能做线性分类任务。为什么两个线性分类任务结合就可以做非线性分类任务?

我们可以把输出层的决策分界单独拿出来看一下。就是下图。
神经网络_第7张图片
可以看到,输出层的决策分界仍然是直线。关键就是,从输入层到隐藏层时,数据发生了空间变换。也就是说,两层神经网络中,隐藏层对原始的数据进行了一个空间变换,使其可以被线性分类,然后输出层的决策分界划出了一个线性分类分界线,对其进行分类。

这样就导出了两层神经网络可以做非线性分类的关键--隐藏层。联想到我们一开始推导出的矩阵公式,我们知道,矩阵和向量相乘,本质上就是对向量的坐标空间进行一个变换。因此,隐藏层的参数矩阵的作用就是使得数据的原始坐标空间从线性不可分,转换成了线性可分。

两层神经网络通过两层的线性模型模拟了数据内真实的非线性函数。因此,多层的神经网络的本质就是复杂函数拟合。

多层神经网络结构(深度学习)

神经网络_第8张图片
上图表示的就是多层神经网络结构,a1(4)表示输出,有两个中间层,所以是多层神经网络,然后网络结构所对应的计算公式如下所示(包含偏置):
神经网络_第9张图片
式中的wij就是相邻两层神经元之间的权值,他们是在训练过程中需要学习的参数,a1(2)中表示第二层的第1个神经元,公式中求出了3个神经元的输出结果,而hwb(x)表示第3层第1个神经元a1(3)的值。图中箭头所指的方向为前向传播的过程,就是所有输入参数经过加权求和之后,将结果值依次向下一层传递,直到最后输出层,层数越多,层中神经元越多,形成的权重值参数就越多。

与两层层神经网络不同。多层神经网络中的层数增加了很多,增加更多的层次有什么好处?更深入的表示特征,以及更强的函数模拟能力。

更深入的表示特征可以这样理解,随着网络的层数增加,每一层对于前一层次的抽象表示更深入。在神经网络中,每一层神经元学习到的是前一层神经元值的更抽象的表示。例如第一个隐藏层学习到的是“边缘”的特征,第二个隐藏层学习到的是由“边缘”组成的“形状”的特征,第三个隐藏层学习到的是由“形状”组成的“图案”的特征,最后的隐藏层学习到的是由“图案”组成的“目标”的特征。通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。

以上就是神经网络的介绍,下面简单说下bp神经网络的训练

训练

(该部分来自illikang的[博客])(https://blog.csdn.net/illikan...
在Rosenblat提出的感知器模型中,模型中的参数可以被训练,但是使用的方法较为简单,并没有使用目前机器学习中通用的方法,这导致其扩展性与适用性非常有限。从两层神经网络开始,神经网络的研究人员开始使用机器学习相关的技术进行神经网络的训练。例如用大量的数据(1000-10000左右),使用算法进行优化等等,从而使得模型训练可以获得性能与数据利用上的双重优势。

机器学习模型训练的目的,就是使得参数尽可能的与真实的模型逼近。具体做法是这样的。首先给所有参数赋上随机值。我们使用这些随机生成的参数值,来预测训练数据中的样本。样本的预测目标为yp,真实目标为y。那么,定义一个值loss,计算公式如下。
loss=(yp-y)2
这个值称为损失(loss),我们的目标就是使对所有训练数据的损失和尽可能小。

我们可以把损失写为关于参数(parameter)的函数,这个函数称之为损失函数(loss function)。下面的问题就是求:如何优化参数,能够让损失函数的值最小。

此时这个问题就被转化为一个优化问题。一个常用方法就是高等数学中的求导,但是这里的问题由于参数不止一个,求导后计算导数等于0的运算量很大,所以一般来说解决这个优化问题使用的是梯度下降算法。梯度下降算法每次计算参数在当前的梯度,然后让参数向着梯度的反方向前进一段距离,不断重复,直到梯度接近零时截止。一般这个时候,所有的参数恰好达到使损失函数达到一个最低值的状态。

在神经网络模型中,由于结构复杂,每次计算梯度的代价很大。因此还需要使用反向传播算法。反向传播算法是利用了神经网络的结构进行的计算。不一次计算所有参数的梯度,而是从后往前。首先计算输出层的梯度,然后是第二个参数矩阵的梯度,接着是中间层的梯度,再然后是第一个参数矩阵的梯度,最后是输入层的梯度。计算结束以后,所要的两个参数矩阵的梯度就都有了。

反向传播算法可以直观的理解为下图。梯度的计算从后往前,一层层反向传播。前缀E代表着相对导数的意思。
神经网络_第10张图片
反向传播算法的启示是数学中的链式法则。在此需要说明的是,尽管早期神经网络的研究人员努力从生物学中得到启发,但从BP算法开始,研究者们更多地从数学上寻求问题的最优解。不再盲目模拟人脑网络是神经网络研究走向成熟的标志。正如科学家们可以从鸟类的飞行中得到启发,但没有必要一定要完全模拟鸟类的飞行方式,也能制造可以飞天的飞机。

优化问题只是训练中的一个部分。机器学习问题之所以称为学习问题,而不是优化问题,就是因为它不仅要求数据在训练集上求得一个较小的误差,在测试集上也要表现好。因为模型最终是要部署到没有见过训练数据的真实场景。提升模型在测试集上的预测效果的主题叫做泛化(generalization),相关方法被称作正则化(regularization)。神经网络中常用的泛化技术有权重衰减等。

总结

文章主要讲解了神经网络的结构,单层、两层、多层和两层的训练方法,神经网络很重要,但是学习起来并不容易,这是因为其结构比较难懂,本文主要没有数学推导,只是把结构讲解一下,希望对各位有所帮助。现在神经网络大概明白了,之后就会详细讲解激活函数、损失函数、学习率、过拟合等神经网络中的相关概念。

你可能感兴趣的:(神经网络深度学习)