人工神经网络,简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或者计算模型。其实是一种与贝叶斯网络很像的一种算法。之前看过一些内容始终云里雾里,这次决定写一篇博客。弄懂这个基本原理,毕竟现在深度学习太火了。
神经网络是一种方法,既可以用来做有监督的任务,如分类、视觉识别等,也可以用作无监督的任务。首先,我们看一个简单的例子。如下图所示(这个图网上有很多人引用了,但我找不到出处,欢迎指正),如果我们想训练一个算法可以使其识别出是猫还是狗,这是很简单的一个分类任务,我们可以找一条线(模型),在这个二元坐标中进行“一刀切”,把这两组数据分开。我们知道,在解析几何中,这条直线可以用如下的公式表达:
图1 猫狗数据
图2 一个简单的神经网络
这里的W1和W2就是两个坐标轴上的系数,可以称为权重。W0可以称作截距,也叫做偏移。新来一个数据点,也就是一组输入值(X1,X2),如果在这条线的左边,那么它就是一只狗,如果在右边就是一只猫了。这就可以用一个简单的神经网络来表示。如图2所示,X1和X2分别是输入值,Y是输出值,两条边的权重分别是W1和W2。这是一个最简单的神经网络了。这就是使用神经网络定义了一个线性分类器了。这里的一个圆形的节点就是一个神经元。我们也可以采用另一种方式,即在输入输出之间加一个中间节点S,然后增加一个输出层,包括两个节点Y1和Y2,分别对应猫和狗,最后哪个输出节点的值大,那么这个数据就属于哪个类别(猫或者狗)。
对于简单的二分类问题这就可以解决了。但在实际情况中,有很多问题无法简单的使用“一刀切”的方式解决,如图3所示,假设猫和狗的数据分布如下图,那么这就无法用“一刀切”的方式来解决了,但是我们可以切两刀,横竖各一刀,然后把相同的“块”联合起来,这样就解决了比较复杂的分类问题了。也有些问题,需要用曲线来分割。在这种情况下,我们就需要比较复杂一点的神经网络了。以曲线为例,我们可以设计出一个三层的神经网络。这就是用神经网络设计的一个非线性分类器。理论上讲,如何一个分类器都可以设计一个神经网络来表征,也就是说,不管实际图形如何,我们都可以设计一个神经网络来拟合。到这里,可能有人问,每个节点的这个函数要如何选择?根据吴军老师《数学之美》第二版中的说法,为了提供人工神经网络的通用性,我们一般规定每个神经元的函数只能针对其输入的变量做一次非线性的变换。举个例子说就是假如某个神经元Y 的输入值是X1,X2,...Xn,它们的边的权重分别为W1,W2,...Wn,那么计算Y节点的值分两步进行,第一步是计算来自输入值的线性组合:
第二步是计算y=f(G),这里的f(⋅)可以使非线性的,,但因为里面的参数是一个具体的值,所以不会很复杂。这两个步骤的结合使得人工神经网络既灵活又不至于太复杂。这里的f(⋅)就是激活函数。线性模型的表达能力不够,它的作用就是来增强模型的表示能力。人工神经网络可以很多层连接在一起,因此在人工神经网络中,主要的工作就是设计结构(基层网络,每层几个节点等)和激活函数。我们常用的激活函数包括Sigmoid函数、ReLU函数、Tanh函数等等。如下图所示,这是几种简单的激活函数的示意图( https://ypwhs.gitbooks.io/nnplayground/content/Activation.html )