机器学习笔记——神经网络与深度学习

机器学习笔记——神经网络与深度学习

  • 一、神经网络引言
  • 二、神经元模型与激活函数
    • 2.1 神经元模型
    • 2.2 激活函数
      • 2.2.1 sigmoid & tanh
      • 2.2.2 ReLU激活函数
      • 2.2.3 Leaky Relu & Parametric ReLU
  • 三、反向传播 BP算法
  • 四、深度学习初步感知
  • 五、深度学习Tips
    • 5.1 都是“过拟合”惹得祸?
    • 5.2 Dropout

一、神经网络引言

  • 神经网络常常用于解决分类问题,实际生活中遇到的分类问题往往特征维度特别高,而我们的模型一旦阶数比较高,就会出现数据爆炸的情况。
    机器学习笔记——神经网络与深度学习_第1张图片
  • 比如说上图我们无法用线性函数实现分类,因此随着模型复杂度提高,待学习的参数个数爆炸式增长,根本无法用一般的方法通过依次确定每个参数的值来建立映射函数。
  • 那么有没有一种不显示表达参数的函数呢?其实我们学习的目的就是为了获得一个映射关系,之前的方法映射关系都是显示表达的函数,而神经网络不存在显示表达的函数而是通过网络架构以及权重参数来共同决定一个映射关系。越复杂的映射关系获得显示表达函数的难度越大,因此就更适合于运用神经网络解决。

二、神经元模型与激活函数

  • 看似简单的激活函数在神经网络学习中扮演着举足轻重的角色。往往激活函数的不同选择极大影响了计算速度收敛速度网络架构搜索空间以及最终解的优秀程度

2.1 神经元模型

机器学习笔记——神经网络与深度学习_第2张图片

  • 神经网络最基本的单位就是一个个神经元(Neuron),无论多复杂的神经网络或者是深度学习网络其最基本的结构都是相同的。
  • 一个神经元可以有多个输入 x i , i = 1 , 2 , 3... x_i,i=1,2,3... xi,i=1,2,3...,每个输入都要有相应的权重 θ i , i = 1 , 2 , 3... \theta_i,i=1,2,3... θi,i=1,2,3...。除此之外神经元的阈值bias也可以理解为一个输入恒为 x 0 = 1 x_0=1 x0=1,权重 θ 0 = − b i a s \theta_0=-bias θ0=bias的输入项。因此如果输入一共有n个特征项,那么总共有n+1个输入,也就是一个n+1维的列向量,权重 θ \theta θ也可以表示为一个n+1维的列向量。
  • 神经元分为两部分,第一部分是将所有的输入线性组合 θ 0 + θ 1 x 1 + θ 2 x 2 . . . = θ T x = z \theta_0+\theta_1x_1+\theta_2x_2...=\theta^Tx=z θ0+θ1x1+θ2x2...=θTx=z。第二部分是激活函数,输出值 a = g ( z ) a=g(z) a=g(z)
  • 神经元结构的设计关键就在于激活函数的选择,不同激活函数其性质差异往往很大。下面介绍几种常用的激活函数。

2.2 激活函数

2.2.1 sigmoid & tanh

机器学习笔记——神经网络与深度学习_第3张图片

  • sigmoid函数我们再熟悉不过了,但该函数用在激活函数上还是比较优秀的选择吗?并不是。
  • sigmoid函数随着层数的叠加会出现梯度消失。sigmoid函数每次把输入都压缩到0-1之间,层层压缩会使数值越来越小。 g ′ ( x ) = g ( x ) ( 1 − g ( x ) ) g'(x)=g(x)(1-g(x)) g(x)=g(x)(1g(x)),相应其梯度也会一直减小直到接近于0,这都是梯度下降法的大忌。
  • sigmoid函数的值域范围为0-1,并没有实现0中心化。也就是说限制了搜索范围到0-1之间,范围小其训练得到的模型优秀程度肯定较差。
  • 除此之外 e x e^x ex运算复杂度较大,不适合于大规模数据运算。
    机器学习笔记——神经网络与深度学习_第4张图片
  • 相较于sigmoid函数,tanh函数做了些许的优化。但仅仅是实现了0中心化,仍然没有解决梯度消失与运算复杂的问题。

2.2.2 ReLU激活函数

机器学习笔记——神经网络与深度学习_第5张图片

  • 神经网络的实际应用中ReLU才是最常用的激活函数,不要看表达式、图像简单就觉得性质不好。首先在正区域无梯度消失,并且计算方便收敛迅速(收敛速率达到sigmoid的6倍,这在大型神经网络训练中提速十分可观),某些层面更加符合生物实际。
  • 缺点也存在,同样没有实现0中心化。负区域直接等于0未免太过草率,使得在负区域不激活也不会存在参数更新(梯度为0)。

2.2.3 Leaky Relu & Parametric ReLU

机器学习笔记——神经网络与深度学习_第6张图片

  • 针对ReLU提出的问题我们又做了进一步的优化。将负区域从0调整为 0.01 x 0.01x 0.01x,这样负区域也有了学习与参数调整的能力,使得学习搜索范围扩大,更大可能获得更优的网络结构。
  • 我们可能会产生疑惑:为什么要确定为0.1x或0.01x。其实我们可以将这个参数也设为未知,通过学习的方法确定该参数。这就是ReLU优化的终极版:Parametric ReLu。

三、反向传播 BP算法

  • 当我们确定了神经网络结构、损失函数之后,我们要考虑的便是如何训练这个神经网络。神经网络的网络架构所代表的就是个抽象的函数,因此没有具体的函数表达式无法使用正规方程的方法。神经网络只可以使用梯度下降的方法。但梯度下降的方法也需要根据具体的损失函数表达式去计算梯度,不好计算梯度怎么办?我们使用反向传播BP算法)。
  • BP算法的基本思想是:学习过程由信号的正向传播(求损失)与误差的反向传播(误差回传)两个过程组成。
  • BP算法的基本思路理解起来非常简单,说白了就是将计算关系画成计算图,然后根据链式法则求导即可。难点首先在于如果我们的计算对象都换成矩阵的时候,涉及到矢量与矩阵之间的微分运算,需要注意计算数之间维度是否匹配,计算顺序是否正确。除此之外最难的就是如何将简单的思想用代码的形式表示,这也是我最近致力于学习的地方。
  • BP算法的正向传播与反向传播并不是同时进行的。每一组输入的学习过程都是先正向传播数值,在最后一层神经网络计算出损失,然后再反向传播损失更新没层的参数,当反向传播到达输入层后就完成了一次参数更新过程。在代码层次实现时关键就在于对forward与backward两个函数的实现。

四、深度学习初步感知

  • 我们在回归分析中知道,所选定的函数模型越复杂其所能涵盖的搜索范围越大,学习模仿能力越强。而在神经网络中,我们并没有显示的函数表达式,网络结构的设计便是我们在模型选择中能考虑的唯一因素。
  • 网络结构的设计包含很多方面,我也仅仅是谈一下自己了解到的部分。首先神经元的个数当然是可以调整的,每层神经元的个数可以调整,神经元的层数也可以调整,这两部融合便可以得到无穷多的网络结构。除此之外不同层次之间不同神经元之间还可以根据需要的不同选择不同的激活函数,神经元之间的连接方式也不固定可以是单向全连接、也可以部分连接甚至可以回接。
  • 我们接触到的最简单的神经网络只有三层,输入层、隐层、输出层,或者再简单一点只有一个神经元也可以构成感知机模型。感知机模型只可以处理线性可分的问题,甚至连异或问题都无法处理。越简单的神经网络结构,其问题解决的能力就越弱,而神经网络常常被我们用来处理高特征维度的多分类问题,甚至还用来图像、音频处理。
  • 我们想要将网络结构复杂化,显而易见地有两种思考方式,一种是让神经网络变胖,也就是增加每层的神经元个数,另一种是让神经网络变长,也就是增加神经网络的层数。但二者归根结底都是增加神经元的个数,后者经常被使用也就是我们所说的“深度学习”,而前者却仅仅停留在理论阶段,这又是为什么呢?
    机器学习笔记——神经网络与深度学习_第7张图片
    机器学习笔记——神经网络与深度学习_第8张图片
  • 分析上图我们可以看出,增加层数也就是神经网络变长的过程,其错误率下降的很快,而增加每层的神经元个数错误率改变却不大。换种方式比较,左侧最后一行22k=14k个神经元,错误率下降到了17.1;而右侧最后一行116k=16k个神经元,错误率仅仅下降到了22.1。综上所述,增加每层的神经元个数确实可以降低错误率,但往往需要增加成千上万个神经元,其带来的计算成本是巨大的。因此人们常用深度学习。
    机器学习笔记——神经网络与深度学习_第9张图片
  • 计算机视觉是神经网络乃至深度学习应用的最重要领域之一。以上数据是不同年代不同网络层数所能达到的最小错误率,明显可以看出随着网络层数的增加错误率确实显著下降,但随之而来的是对计算能力与网络架构设计的挑战。

五、深度学习Tips

5.1 都是“过拟合”惹得祸?

机器学习笔记——神经网络与深度学习_第10张图片

  • 假如说我们训练得到了一个神经网络模型,在测试集上测试发现结果并不理想,我们可能会惯性思维地认为是过拟合惹的祸?但事实上这是一种错误的思维,因为只有该模型在训练集上表现出色我们才去考虑存在过拟合的可能。过拟合本来字面意思就是模型过于贴合训练集从而失去了对测试集泛化的一般性。
  • 所以说如果我们发现模型在测试集上泛化效果很差,我们应该第一时间检查模型在训练集上的优劣程度。很大可能是模型压根就没有train好,可能有多方因素导致没有train好,比如激活函数选择不当、网络结构设计不当、计算力达不到迭代次数不足够等等。
    机器学习笔记——神经网络与深度学习_第11张图片
  • 如上图所示,如果我们的模型在训练集上表现很差也就是没有train好,我们可以采取的解决方案是:选择恰当的激活函数、动态调整学习率参数。如果训练集上表现优异但测试集上表现很差那么我们就要考虑过拟合,可以采取的解决方案是:Early Stopping、Regularization、Dropout。其他几方面我过去的博客都多多少少有提及,所以今天的重点在于Dropout。

5.2 Dropout

  • Dropout是深度学习领域中一种常见且高效的解决过拟合的正则化方法,我们可以将Dropout理解为一种纯粹高效近似Bagging的方法。
  • 那么什么是Bagging方法呢?Bagging是通过结合几个模型降低泛化误差的技术,主要想法是分别训练几个不同的模型,然后让所有模型表决测试样例的输出。这种策略叫作模型平均。而Dropout则是从基础网络中删去非输出单元后形成的子网络,将子网络模型平均从而得到理想模型。
    机器学习笔记——神经网络与深度学习_第12张图片
  • Dropout适用于小批量梯度下降,在每个批次训练之前dropout,得到一个新的化简后的网络结构再进行训练。训练之前每个神经元都有p%的可能性被丢掉。Dropout之后获得的网络结构更见瘦长,更有利于加速训练,训练出的模型与参数也有更好的性能。
    机器学习笔记——神经网络与深度学习_第13张图片
  • 举一个形象但不一定恰当的例子。如果说在一个团队里,每个人都知道我的队友会全力以赴的工作,那么每个人都不会好好工作想划水,整体的工作效率就会很低。而如果每个人都知道我的队友可能会划水,出于责任感我们就要更加努力的工作,从而整体的工作效率更高。
  • Dropout训练与Bagging训练不太一样。在Bagging的情况下,所有模型都是独立的。在Dropout的情况下,所有模型共享参数,其中每个模型继承父神经网络参数的不同子集。参数共享会使得剩余的子网络不通过学习的过程也能有好的参数设定。
  • Dropout有一个特殊的规律存在。当我们根据p%的丢弃率使用dropout训练完一个神经网络模型后,每个子网络使用训练得到的参数计算出的结果求取均值跟完整的网络但每个参数*(1-p%)得到的结果近似相等。下面图片用一个相对简单的例子证实了这一规律。
    机器学习笔记——神经网络与深度学习_第14张图片

你可能感兴趣的:(机器学习,神经网络,机器学习)