神经网络和深度学习之——前馈神经网络

前面一章咱们详细讲解了神经网络的组成,工做原理,信号在网络中如何流动,以及如何求解每个输入信号赋予的权重等计算过程;同时咱们还构建了一个逻辑回归网模型来解决鸢尾花分类问题,很明显,这种网络很“浅”,但它对于分类鸢尾花数据仍是很是有效的,并且不只仅是鸢尾花,对于有须要的其余二分类问题,该模型也能表现得很好。因为这种模型太“浅”了,咱们通常称这种模型为bp网络,而不直接称为神经网络,有些人甚至以为这种网络还不配叫作神经网络。我无需去争论这些芝麻小事,咱们要作的就是从这一章起,迈向深度神经网络,了解什么是深度神经网络,它结构是什么样,它如何工做,以及综合前面三章的内容,用Pytorch搭建一个三层网络实现手写数字分类。python

1. 深度前馈网络

1.1 什么是深度前馈网络

深度神经网络,简单来理解就是含有多个隐藏层的网络。一个深度神经网络总会有一个输入层,一个输出层,还有中间多个隐藏层,隐藏层的维数决定了网络的宽度。不管是输入层、隐藏层仍是输出层,每一层都是由多个感知器组成,因此深度神经网络又称多层感知机。算法

前馈(feedforward)也能够称为前向,从信号流向来理解就是输入信号进入网络后,信号流动是单向的,即信号从前一层流向后一层,一直到输出层,其中任意两层之间的链接并无反馈(feedback),亦即信号没有从后一层又返回到前一层。若是从输入输出关系来理解,则为当输入信号进入后,输入层以后的每个层都将前一个层的输出做为输入。以下图所示的四层网络,这个图也能够称为有向无环路图。反之,当前馈神经网络中层与层之间的信号有反向流动,或者自输入时,咱们则称这种网络为循环神经网络,循环神经网络在天然语言处理方面发挥着极大的做用。
编程



图5.1.1网络


在深度前馈网络中,链式结构也就是层与层之间的链接方式,层数就表明网络深度。若是咱们把每一层看做一个函数,那么深度神经网络就是许多不一样非线性函数复合而成,这里与以前典型的线性回归和逻辑回归明显的区别开来。好比,第一层函数为\(f^{(1)}\),第二层函数为\(f^{(2)}\),第三层函数为\(f^{(3)}\),那么这个链式结构就能够表示为:\(f(x)=f^{(3)}(f^{(2)}(f^{(1)}(x)))\),经过屡次复合,实现输入到输出的复杂映射,链的全长也就表明模型深度。这种网络结构比较好搭建,应用也十分普遍,好比在图像识别领域占主导地位的卷积神经网络就是深度前馈网络的一种,学习这种网络,是咱们通向循环神经网络的奠定石。机器学习

1.2 深度学习

维基百科对深度学习的解释是:深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。因为深度神经网络也是多层非线性变换的载体,因此也有人认为深度学习就是深度神经网络的代名词。这里请注意,咱们所说是深度神经网络,而不是深度前馈网络,前馈网络仅仅是深度神经网络的其中一种。函数

为何深度学习是多层和非线性变换的结合呢,很显然,咱们须要从两个方面来理解。学习

一,咱们从以前的学习中能够知道线性模型仅仅可以解决的是简单的线性分类问题,对于异或逻辑的出现会直接让线性模型出现没法工做的状况,因此非线性变换随此出现。
二,对于上面说起的多层,其实咱们指的是多层隐藏层。相对于输入层或输出层的设计直观性,隐藏层的设计便是科学又是艺术,一些经验法则指出,隐藏层并非越多越好,神经网络的研究人员已经为隐藏层开发了许多设计最优法则,这有助于网络的行为能符合人们的指望。测试

若是把隐藏层当作一个黑盒,那么你所要关心的只是输出,而不关注隐藏层内部如何对数据特征进行提取,如何优化权重参数和随机变量;若是把隐藏层拆开细究,隐藏层表明的则是数据特征,上一个隐藏层把特征向量通过一系列变换后输入到下一个隐藏层,隐藏层的每个神经元都带有特征数据向前传播。以下图举例说明,输入一张人物头像,三层隐藏层依次输出的图片信息可视化后,最后由计算机得出图像特征是人脸仍是动物。
优化



图5.1.2spa


你能够这样理解,每一张图片就表明一层隐藏层的输出,这样咱们便知道了隐藏层在对数据进行特征提取方面发挥着重要做用。

2. 梯度降低的再次学习

到目前为止,咱们了解的梯度降低算法是基于线性模型的残差\(E(w)\),初始化权重\(w\)、可设定的常数学习率\(\eta\)的前提下,结合如下公式来不断更新。
\[w_{n+1}=w_{n}-\eta \frac{\partial E(w)}{\partial w}\]
固然,还有种解法,若是残差(代价函数)为凸函数,那么咱们只须要设残差(代价函数)的导数为0,即可以求得残差最小值所对应的权重。
\[E(w)'=0\]
这种方法理论上是可行的,但若是遇到代价函数的导数很难求解的时候,问题就卡住了,相信你应该不会硬碰硬的去直接求解函数\(y=(e^x+x^2)^{\frac {1} {e^x+x}}\)的导数吧?。所以,回到上面的\(\frac{\partial E(w)}{\partial w}\),若是遇到导数没法求解的时候,咱们是否能够换个方式或者法则来计算呢?数学中,链式法是求解复合函数导数的一种重要方法,让咱们来回顾一下。
假设\(E(f(w))\)\(y=f(w)\)\(w\)复合而成的函数,那么对于求导数,咱们能够有:
\[E(f(w))'=E'(f(w))f'(w)\]
对于求微分可写成:
\[\frac{\partial E}{\partial w}=\frac{\partial E}{\partial y} \cdot \frac{\partial y}{\partial w}\]
而咱们面对的问题,和上面的链式法则定义一致。首先,别忘了残差\(E\)的定义是真实值\(t{k}\)和输出预测值\(O_{k}\)之差的平方,表示为\(E=(t_{k}-O_{k})^2\)
残差对权重的微分也可写做
\[\frac{\partial E}{\partial w}=\frac{\partial (t-O)^2}{\partial w}\]
而预测值\(O_{k}\)又是权重\(w\)的函数,\(O_{k}=O_{k}(w)\)

运用链式法则,咱们把残差对权重的微分写成:
\[\frac{\partial E}{\partial w_{j,k}}=\frac{\partial E}{\partial O_{k}} \cdot \frac{\partial O_{k}}{\partial w}\]
其中\(\frac{\partial E}{\partial O}\)的微分是很容易计算的平方函数微分,因此上面的式子可为:
\[\frac{\partial E}{\partial w_{j,k}}=-2(t_{k}-O_{k})\frac{\partial O_{k}}{\partial w_{j,k}}\]
进行到这里,咱们可能须要引入深度前馈网络来详细考虑一下这个\(\frac{\partial O_{k}}{\partial w_{j,k}}\)的微分该如何表示。以下某网络中任意一层,其中有四个节点,每一个节点为S型感知器(即加入Sigmoid函数),咱们知道,不管这一层是输入层、隐藏层仍是输出层,这一层左边的输入来自外部输入或来自上一层网络的输出,而层右边的输出可做为下一层网络的输入,也可做为最终的输出。接着,咱们用\(w_{j,k}\)来表示上一层的第\(j\)个节点和如图所示的这一层第\(k\)个节点的连接权重(其中\(j=1,2...n\)\(k=1,2...m\))。



图5.1.3


当输入进入该层,权重和输入信号进行加权求和,同时经过Sigmoid函数输出值:
\[O_{k}=Sigmoid({\sum_{k=1,j=1}^{4}} w_{j,k} \cdot x_{j})\]

这样推导事后,咱们能够获得下面的式子:
\[\frac{\partial E}{\partial w_{j,k}}=-2(t_{k}-O_{k})\frac{\partial}{\partial w_{j,k}} Sigmoid(\sum w_{j,k} \cdot x_{j})\]
在求解Sigmoid函数的导数前咱们回顾一下\(Sigmoid\)函数表达式:
\[Sigmoid(x)=\frac{1}{1+e^{-x}}\]
\(Sigmoid\)\(x\)的微分:
\[\frac{\partial }{\partial x}Sigmoid(x)=Sigmoid(x)(1-Sigmoid(x))\]
咱们暂时没必要把\(Sigmoid\)函数带入计算,从这里能够看出原来Sigmoid函数的导数是如此简单,并且易于使用。

在求解\(\frac{\partial}{\partial w_{j,k}} Sigmoid(\sum w_{j,k})\),再使用一次链式法则。

咱们得出一个很是炫酷的式子:




这确实是一个振奋人心的结果,眼尖的你可能一眼就看出表达式中每一项表明的意思。




不过我以为把式子中的"2"去掉也许更简洁,为何?由于无论前面常数是-2,2,或者是20都不是影响残差斜率的关键因素,咱们只须要记住本身须要什么就能够了,这样残差的斜率就被咱们简化成最干净利落的样子:
\[\frac{\partial E}{\partial w_{j,k}}=-(t_{k}-O_{k}) \cdot O_{k}\cdot (1-O_{k}) \cdot x_{j}\]

咱们能够放心大胆的在线性感知器中使用权重更新公式了,只要咱们记住权重改变的方向与梯度方向相反,以及适度的设置其中的学习率以防止超调。
\[w_{n+1}=w_{n}-\eta \frac{\partial E}{\partial w_{j,k}}\]

不难看出,新的权重\(w_{n+1}\)是由刚刚获得偏差斜率取反来调整旧的权重\(w_{n}\)而获得的。若是斜率为正,咱们但愿减少权重,若是斜率为负,咱们但愿增长权重,所以,咱们要对斜率取反。学斜率\(\eta\)就是用于调节这些变化的强度,确保不会超调。如今终于能够明白,咱们在上一章鸢尾花的分类中定义权重时一个重要的初始化步骤居然就是这样来的。

self.wih += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)),
                                        numpy.transpose(inputs))

这个权重更新表达式不只适用于隐藏层和输出层之间的权重,并且适用于输入层和隐藏层之间的权重。好比鸢尾花分类例子中使用的模型只有一层,相似上图5.1.3,所以,代码中final_outputs表明\(O_{k}\),而inputs则就是外部输入\(x_{j}\);若模型为多层网络,那么"\(O_{k}\)"表明某一层的输出,\(x_{j}\)表明某一层的输入。到此为止,梯度降低算法总算了解透彻,若是还有其余复杂的数学推导放一边去吧,还有什么不知足的呢,用上面的公式,以及结合python语言,咱们已经可以快速实现模型的指望结果。

3. 训练一个模型

3.1 监督学习简介

监督学习(Supervised learning),是一个机器学习中的方法,能够由训练集中学到或创建一个模式(函数/ learning model),并依此模式推测新的实例。 监督学习须要的训练集是由输入向量和与每个输入向量相关联的目标向量组成。神经网络学习器使用目标向量来决定其已经学习的程度,而且经过目标向量指导权值的调整从而下降总体偏差。

虽然不一样的模型在运算数量,运算的组合方式以及所使用的参数数量上千差万别,但对于训练,咱们始终能够采用相同的通常结构:



图5.1.4


这是一个训练闭环,它的整个过程咱们实际上已经体验过了,但这里仍是不厌其烦的再讲一讲。

  1. 首先对模型参数进行初始化。一般采用对参数随机赋值的方法,但对于比较简单的模型,也能够将各参数的初值均设为0。
  2. 读取训练数据(包括每一个数据样本及其指望输出)。一般人们会在这些数据送入模型以前,随机打乱样本的次序。
  3. 在训练数据上执行推断模型。这样,在当前模型参数配置下,每一个训练样本都会获得一个输出值。
  4. 计算残差。残差是一个可以刻画模型在最后一步获得的输出与来自训练集的指望输出之间差距的归纳性指标。
  5. 调整模型参数。在给定的损失函数条件下,学习的目的在于经过大量训练步骤改善各参数的值,从而将损失最小化。最多见的策略是使用梯度降低算法,也就是以上第二部份内容“再次学习梯度降低算法”所使用的方式。
  6. 上述闭环会依据所需的学习速率、所给定的模型及其输入数据,经过大量循环不断重复上述过程。

当训练结束后,便进入验证阶段。在这一过程当中,咱们须要对一个一样含有指望输出信息的不一样测试集数据依据模型进行预测,并评估模型在该数据集上的损失。该测试集中包含了何种样本,模型是预先没法获悉的。经过评估,咱们能够了解到所训练的模型在训练集以外的推广能力。咱们经常将原始数据集一分为二,将70%的样本用于训练,其他30%的样本用于评估。

咱们在前面鸢尾花分类实践中已经使用了一次监督学习的方法,后面在卷积神经网络中咱们也会用到监督学习的方法。因此,了解它,正确使用它,咱们必须这样作。

3.2 简单说说无监督学习

在监督学习中,咱们的目标是学习从输入到输出的映射关系,其中训练数据的输出正确值已经由指导者提供,也就是说有正确的标签值。然而,无监督学习中却没有正确的标签值,只有输入数据。咱们的目标是发现输入数据中的规律,使网络不断地进行自我认知,自我巩固,最后进行自我概括。

在有监督学习中,咱们把对样本进行分类的过程称之为分类(Classification),而在无监督学习中,咱们将物体被划分到不一样集合的过程称之为聚类(Clustering)。聚类的目标是发现输入数据的簇或分组。好比对于一个拥有老客户数据的公司,客户数据包括客户的我的统计信息,以及之前与公司的交易,公司也许想知道其客户的分布,搞清楚什么类型的客户会频繁出现。这种状况下,聚类模型会将属性类似的客户分到相同的簇,一旦找出了这样的分组,公司就可能作出一些决策,好比对不一样分组的客户提供特别的服务和产品等。

目前分类算法的效果仍是不错的,在实际应用中使用普遍;但相对来说,聚类算法就一直存在发展障碍。确实,无监督学习自己的特色使其难以获得如分类同样近乎完美的结果,其中一个特色就是标签的获取经常须要极大的人工工做量,有时甚至很是困难,这无疑增长了无监督学习的难度,也称为无监督学习的发展瓶颈。不过,也有人提出经过半监督学习来解决这个难题,在半监督学习中,其训练数据的一部分是有标签,另外一部分没有标签,没有标签数据的数量远大于有标签数据的数量。半监督学习下隐藏着一个基本规律,那就是:数据的分布不是彻底随机的,经过一些有标签数据的局部特征,以及更多没标签数据的总体分布,就能够获得能够接受甚至是很是好的分类结果。

参考文献:
一、《Python神经网络编程》
二、《深度学习》
三、《计算智能导论》
四、《面向机器智能的Tensorflow实践》
五、《机器学习导论》
六、https://www.zhihu.com/question/23194489