深度学习基础聊一聊从感知机到神经网络

Posted 非晚非晚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习基础聊一聊从感知机到神经网络相关的知识,希望对你有一定的参考价值。

1. 从机器学习到深度学习

1.1 简要了解机器学习到深度学习

我们知道,Machine Learning分为两大派别:频率派和贝叶斯派;前者逐渐发展为统计学习,后者逐渐发展为概率图模型(PGM,Probability graph model)。

  • 频率派:常用的思想有:正则化、核化、集成化、层次化;概率图模型常见的模型有:有向图模型如Bayesian Network,无向图模型如:Markov Network,有向+无向(混合)模型:mixed Network。频率派中的层次化思想最主要的应用就是神经网络(Neural Network),神经网络有很多模型:MLP多层感知机,AutoEncoder自动编码机,CNN人工神经网络,RNN循环神经网络;这些统称为深度神经网络。
  • 贝叶斯派:有向图如果加了Deep,就变成Deep Diercted Network,如Sigmoid 信念网络、GAN生成式对抗网络,VAE变分自编码器;无向图模型加了Deep,会有深层波尔兹曼机;有向+无向模型加了Deep,会有深度信念网络Deep Belief Network;他们统称为深化生成模型Deep Generative Model。

1.2 深度学习的发展浪潮

先两张深度学习发展历史图。

  • 第一代神经网络(1958~1969)

最早的神经网络的思想起源于1943年的MCP人工神经元模型,当时是希望能够用计算机来模拟人的神经元反应的过程,该模型将神经元简化为了三个过程:输入信号线性加权,求和,非线性激活(阈值法)。第一次将MCP用于机器学习(分类)的当属1958年Rosenblatt发明的感知机(perceptron)算法。

感知机算法使用MCP模型对输入的多维数据进行二分类,且能够使用梯度下降法从训练样本中自动学习更新权值。1962年,该方法被证明为能够收敛,理论与实践效果引起第一次神经网络的浪潮。

1969年,美国数学家及人工智能先驱Minsky在其著作中证明了感知器本质上是一种线性模型,只能处理线性分类问题,就连最简单的XOR(亦或)问题都无法正确分类。这等于直接宣判了感知器的死刑,神经网络的研究也陷入了近20年的停滞。

  • 第二代神经网络(1986~1998)

第一次打破非线性诅咒的当属现代DL大牛Hinton,其在1986年发明了适用于多层感知器(MLP)的BP算法,并采用Sigmoid进行非线性映射,有效解决了非线性分类和学习的问题。该方法引起了神经网络的第二次热潮。

1989年,Robert Hecht-Nielsen证明了MLP的万能逼近定理,即对于任何闭区间内的一个连续函数f,都可以用含有一个隐含层的BP网络来逼近该定理的发现极大的鼓舞了神经网络的研究人员。也是在1989年,LeCun发明了卷积神经网络-LeNet,并将其用于数字识别,且取得了较好的成绩,不过当时并没有引起足够的注意。

值得强调的是在1989年以后由于没有特别突出的方法被提出,且NN一直缺少相应的严格的数学理论支持,神经网络的热潮渐渐冷淡下去。冰点来自于1991年,BP算法被指出存在梯度消失问题,即在误差梯度后向传递的过程中,后层梯度以乘性方式叠加到前层,由于Sigmoid函数的饱和特性,后层梯度本来就小,误差梯度传到前层时几乎为0,因此无法对前层进行有效的学习,该发现对此时的NN发展雪上加霜。

1997年,LSTM模型被发明,尽管该模型在序列建模上的特性非常突出,但由于正处于NN的下坡期,也没有引起足够的重视。

  • 第三代神经网络(2006年–至今)

2006年,DL元年。是年,Hinton提出了深层网络训练中梯度消失问题的解决方案:无监督预训练对权值进行初始化+有监督训练微调。其主要思想是先通过自学习的方法学习到训练数据的结构(自动编码器),然后在该结构上进行有监督训练微调。但是由于没有特别有效的实验验证,该论文并没有引起重视。

  • 2011年,ReLU激活函数被提出,该激活函数能够有效的抑制梯度消失问题
  • 2011年,微软首次将DL应用在语音识别上,取得了重大突破。
  • 2012年,Hinton课题组为了证明深度学习的潜力,首次参加ImageNet图像识别比赛,其通过构建的CNN网络AlexNet一举夺得冠军,且碾压第二名(SVM方法)的分类性能。也正是由于该比赛,CNN吸引到了众多研究者的注意。
  • 2013,2014,2015年,通过ImageNet图像识别比赛,DL的网络结构,训练方法,GPU硬件的不断进步,促使其在其他领域也在不断的征服战场。
  • 2015年,Hinton,LeCun,Bengio论证了局部极值问题对于DL的影响,结果是Loss的局部极值问题对于深层网络来说影响可以忽略。该论断也消除了笼罩在神经网络上的局部极值问题的阴霾。具体原因是深层网络虽然局部极值非常多,但是通过DL的BatchGradientDescent优化方法很难陷进去,而且就算陷进去,其局部极小值点与全局极小值点也是非常接近,但是浅层网络却不然,其拥有较少的局部极小值点,但是却很容易陷进去,且这些局部极小值点与全局极小值点相差较大。
  • 其它的一些时间点
  • 1986年,决策树方法被提出,很快ID3,ID4,CART等改进的决策树方法相继出现,到目前仍然是非常常用的一种机器学习方法。该方法也是符号学习方法的代表。
  • 1995年,线性SVM被统计学家Vapnik提出。该方法的特点有两个:由非常完美的数学理论推导而来(统计学与凸优化等),符合人的直观感受(最大间隔)。不过,最重要的还是该方法在线性分类的问题上取得了当时最好的成绩。
  • 1997年,AdaBoost被提出,该方法是PAC(Probably Approximately Correct)理论在机器学习实践上的代表,也催生了集成方法这一类。该方法通过一系列的弱分类器集成,达到强分类器的效果。
  • 2000年,KernelSVM被提出,核化的SVM通过一种巧妙的方式将原空间线性不可分的问题,通过Kernel映射成高维空间的线性可分问题,成功解决了非线性分类的问题,且分类效果非常好。至此也更加终结了当时的NN时代。
  • 2001年,随机森林被提出,这是集成方法的另一代表,该方法的理论扎实,比AdaBoost更好的抑制过拟合问题,实际效果也非常不错。
  • 2001年,一种新的统一框架-图模型被提出,该方法试图统一机器学习混乱的方法,如朴素贝叶斯,SVM,隐马尔可夫模型等,为各种学习方法提供一个统一的描述框架。

2. 感知机

感知机(perceptron)是最早的监督式训练算法,是神经网络构建的基础。感知机是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别。

它的结构如下所示:

输出和输入之间学习到一个线性关系,得到中间输出结果:

接着是一个神经元激活函数:

从而得到想要的结果1或者-1.

为了找出这样的超平面,即确定感知机模型参数w 和 b, 需要确定一个学习策略,即定义(经验)损失函数并将损失函数极小化。损失函数的一个自然选择是误分类点的总数,但是这样损失函数不是参数w和b的连续可到函数,不易优化。损失函数的另一个选择是误分类点到超平面S的总距离

这种简单的感知机有一个明显缺陷:只能学习线性可分函数。比如 XOR,这么简单的函数,都不能被线性分类器分类。为了解决这个问题,我们要使用一种多层感知机,也就是——前馈神经网络:事实上,我们将要组合一群这样的感知机来创建出一个更强大的学习机器。

3. 前馈神经网络

神经网络实际上就是将大量之前讲到的感知机进行组合,用不同的方法进行连接并作用在不同的激活函数上。

前向神经网络,它有以下属性:

  • 一个输入层,一个输出层,一个或多个隐含层。上图所示的神经网络中有一个三神经元的输入层、一个四神经元的隐含层、一个二神经元的输出层。
  • 每一个神经元都是一个上文提到的感知机。
  • 输入层的神经元作为隐含层的输入,同时隐含层的神经元也是输出层神经元的输入。
  • 每条建立在神经元之间的连接都有一个权重 w (与感知机中提到的权重类似)。
  • 在 t 层的每个神经元通常与前一层( t - 1层)中的每个神经元都有连接(但你可以通过将这条连接的权重设为0来断开这条连接)。
  • 为了处理输入数据,将输入向量赋到输入层中。在上例中,这个网络可以计算一个3维输入向量(由于只有3个输入层神经元)。假如输入向量是 [7, 1, 2],你将第一个输入神经元输入7,中间的输入1,第三个输入2。这些值将被传播到隐含层,通过加权传递函数传给每一个隐含层神经元(这就是前向传播),隐含层神经元再计算输出(激活函数)。
  • 输出层和隐含层一样进行计算,输出层的计算结果就是整个神经网络的输出。

再多线性函数的组合还是线性函数。如果我们限定只能使用线性激活函数的话,前馈神经网络其实比一个感知机强大不到哪里去,无论网络有多少层。正是这个原因,大多数神经网络都是使用的非线性激活函数,如对数函数、双曲正切函数、阶跃函数、整流函数等。不用这些非线性函数的神经网络只能学习输入数据的线性组合。

4. 反向传播(Backpropagation)

假设有下列一个网络层:

  • 第一层是输入层,包含两个神经元 i 1 , i 2 i_1,i_2 i1i2,和截距项 b 1 b_1 b1
  • 第二层是隐含层,包含两个神经元 h 1 , h 2 h_1,h_2 h1,h2和截距项 b 2 b_2 b2;
  • 第三层是输出 o 1 , o 2 o_1,o_2 o1,o2;
  • 每条线上标的 w i w_i wi是层与层之间连接的权重,激活函数我们默认为sigmoid函数。

(1)step1:赋初始值

现在对他们赋初始值,如下图:

  • 输入数据 i 1 = 0.05 , i 2 = 0.10 i_1=0.05,i_2=0.10 i1=0.05i2=0.10;
  • 输出数据 o 1 = 0.01 , o 2 = 0.99 o_1=0.01,o_2=0.99 o1=0.01,o2=0.99;
  • 初始权重 w 1 = 0.15 , w 2 = 0.20 , w 3 = 0.25 , w 4 = 0.30 ; w 5 = 0.40 , w 6 = 0.45 , w 7 = 0.50 , w 8 = 0.55 w_1=0.15,w_2=0.20,w_3=0.25,w_4=0.30;w_5=0.40,w_6=0.45,w_7=0.50,w_8=0.55 w1=0.15,w2=0.20,w3=0.25,w4=0.30;w5=0.40,w6=0.45,w7=0.50,w8=0.55

(2)step2:前向传播

  • 输入层---->隐含层

计算 h 1 h_1 h1的输入加权和:

n e t h 1 = w 1 ∗ i 2 + w 2 ∗ i 2 + b 1 ∗ 1 = 0.15 ∗ 0.05 + 0.2 ∗ 0.1 + 0.36 ∗ 1 = 0.3775 net_h_1=w_1*i_2+w_2*i_2+b_1*1=0.15*0.05+0.2*0.1+0.36*1=0.3775 neth1=w1i2+w2i2+b11=0.150.05+0.20.1+0.361=0.3775
计算 h 1 h_1 h1的输出 o 1 o_1 o1(使用sigmoid函数):
o u t h 1 = 1 1 + e − n e t h 1 = 1 1 + e − 0.3775 = 0.593269992 out_h_1=\\frac11+e^-net_h_1=\\frac11+e^-0.3775=0.593269992 outh1=1+eneth11=1+e0.37751=0.593269992
同理计算 h 2 h_2 h2的输出 o 2 o_2 o2 o u t h 2 = 0.596884378 out_h_2=0.596884378 outh2=0.596884378