我们之前的机器学习专题已经结束,我们把机器学习领域中常用的算法、模型,以及它们的原理和实现都梳理了一遍。虽然还有一些技巧,比如马尔可夫、隐马尔可夫、条件随机场等,没有涉及到。不过这些内容比较薄弱,使用频率也不是很高,就不一一介绍了。感兴趣的同学可以自行研究。我觉得如果GBDT、SVM这些模型都能看懂,那些模型肯定不是问题。深度学习简介深度学习这几年很火,很多人都会联想到人工智能。这里的深度不是深度学习的意思,也不是说概念很深,只是简单的指由多层神经网络组成的“深度”神经网络。其实无论是神经网络,深度神经网络,还是深度学习中的算法,都有几十年的历史。例如,众所周知的深度学习核心算法——反向传播算法,最早于1989年被提出,至今已有30多年的历史。虽然历史不短,但这个领域曾有过起起落落。虽曾辉煌,但直到近年才强势崛起,成为几乎家喻户晓的概念。原因也很简单,因为训练神经网络的复杂度太大了,之前的计算资源根本无法处理如此大规模的计算。所以在以前的时代,深度学习还是一个小众领域。做研究的人不多,经费有限。直到最近几年,由于计算资源的飞速发展,再加上通过GPU加速神经网络训练的黑科技的发明,让不可能变成了可能。再加上AlphaGo打败李世石的划时代事件,让深度学习一时间吸引了大量的资源和关注,那么这个行业自然会蓬勃发展。既然深度学习是与神经网络相关的技术,那么本篇专文所讲解的内容自然不会脱离神经网络的范畴。今天我们将从神经网络最基本的神经元——感知器开始。感知器感知器的英文是perceptron,我们可以把它理解为神经网络的最小组成单元。我们知道,在自然界的生物中,神经的最小单位是神经元,而神经元就是细胞,大致如下图。我想绝大多数同学应该都在生物课本上看过神经元的图片。感知器可以理解为神经元的仿生结构。我们都知道,一个神经元可以连接多个神经细胞,这些神经元相互连接,形成一个巨大的网络。神经元可以相互传递电信号和化学物质,形成一系列复杂的反应。人脑可以理解为一个极其庞大和复杂的神经网络,但是关于人脑和生物神经元网络是如何工作的,目前还没有定论。但是,计算机科学家通过模拟神经元和神经网络建立深度学习模型,确实在一些问题上取得了非凡的成果。感知器可以被认为是神经元细胞的抽象。我们都知道,一个神经元细胞会从其他几个神经元获取信号,并将信号传递给另一个神经元细胞。我们将传入信号视为输入,传出信号视为输出,从而得到感知器的结构。这里我们把结构做的最简单,我们把输入的信号看成浮点数,每个信号都有自己的权值,所有的信号会相加,最后通过一个映射函数输出信号。我们以最简单的感知器为例:这个感知器只有两个输入,我们可以很容易地得到这里的y是一个浮点数,我们可以对y应用符号函数。所谓符号函数,就算是按照阈值来分类。比如我们设置一个阈值,否则就是一个神经元或者感知器,但是它的原理很简单。我们写出公式:这里叫做激活函数(activatefunction)。我们上面列举的例子中的激活函数就是符号函数,也就是根据阈值进行分类的函数。神经网络常用的激活函数主要有3种,一种是我们之前非常熟悉的sigmoid函数,一种是relu函数,一种是tanh函数。让我们分别看看他们的照片。relu函数的方程式很简单:。但是它的效果很好,是神经网络中最常用的激活函数之一。使用它的收敛速度比sigmoid快,原因很简单,因为sigmoid函数图像的两侧非常非常平滑,导致我们求导的结果非常接近于0,所以当我们的梯度下降时,自然收敛速度就慢了。我们之前在介绍sigmoid函数的时候就提到过这个。从图像上看,tanh函数和sigmoid函数非常相似。细微的差别是它们的取值范围不同。sigmoid函数的取值范围是0到1,而tanh是-1到1,虽然看起来取值范围不一样,但是差别还是蛮大的。一方面,两者的敏感区间不同。tanh的敏感范围相对较大。还有一点就是sigmoid输出的值都是正值,在某些场景下可能会出现问题。相信大家都看出来了,感知器其实就是一个线性方程和一个激活函数。在某种程度上,逻辑回归模型也可以看作是一个感知器。有一个问题你可能会感到困惑。为什么要在线性方程后面加一个激活函数呢?如果不行,能行吗?答案是否定的,原因很简单,因为当我们把多个神经元组织在一起,形成一个AfterZhang网络。如果每个神经元的计算都是纯线性的,那么整个神经网络其实就相当于一个线性运算。这在数学上是可以证明的,所以我们需要给感知机加点东西,让它的计算结果不是纯线性的。感知器和逻辑电路最后,让我们看一个更实际的例子。最简单的例子当然是逻辑电路中的与或门。与门、或门、非门其实很相似,都是两输入一输出。我们以与门为例:二进制与运算我们都很熟悉,只有两个数都为1才能得到1。我们写这样一个感知器也很简单:defAND(x1,x2):x=np.array([x1,x2])w=np.array([0.5,0.5])theta=0.7returnw.dot(x)>theta同样的,我们也可以写一个或门或者一个否门,这并不难。但是我们也会发现有一种情况是我们解决不了的,那就是异或情况。我们先来看异或的真值表:我们没有办法通过感知机来实现异或数据的切分。我们之前在SVM模型中引入过这个问题,因为异或数据是线性不可分的,也就是说,我们不能用一条分界线来划分它。但是异或问题也不是无解的。我们不能用单个感知器来划分它,但是我们可以将感知器串联起来形成一个简单的神经网络,这个问题就变得可以解决了。假设我们已经实现了与门、或门和非门。我们可以这样实现异或门:defXOR(x1,x2):#NOTgates1=NAND(x1,x2)s2=OR(x1,x2)returnAND(s1,s2)整个感知器的结构是这样的:TensorFlow官网提供了一个叫playground的web应用,可以让我们直观的感受神经网络的组成及其训练过程。比如刚才的异或问题,我们可以自己设定神经网络的层数和每一层的神经元个数。并且还可以设置神经元的激活函数,可以非常直观的体验神经网络的训练过程和各种参数的作用。至此,对感知机的介绍就差不多结束了。感知器是神经网络的基础。其实内容不多。无论是结构还是形式,都与之前机器学习引入的逻辑回归非常相似。技术难点和要点不多。你只需凭直觉感受即可。
