Py学习  »  机器学习算法

AI | 算法工程师必备的深度学习--深度前馈网络(上)

运筹OR帷幄 • 4 年前 • 589 次点击  



↑↑↑↑↑点击上方蓝色字关注我们!






『运筹OR帷幄』原创


作者:华校专


作者信息:

华校专,曾任阿里巴巴资深算法工程师、智易科技首席算法研究员,现任腾讯高级研究员,《Python 大战机器学习》的作者。

编者按:

算法工程师必备系列更新啦!继上次推出了算法工程师必备的数学基础后,小编继续整理了必要的机器学习知识,全部以干货的内容呈现,哪里不会学哪里,老板再也不用担心你的基础问题!

深度前馈网络

  1. 深度前馈网络(deep feedfoward network)也称作前馈神经网络(feedforward neural network)或者多层感知机(multilayer perceptron:MLP),它是最典型的深度学习模型。

  • 卷积神经网络就是一种特殊的深度前馈网络。
  • 深度前馈网络也是循环神经网络的基础。

一、基础

1.1 基本概念

  1. 深度前馈网络的目标是近似某个函数

  • 分类器 将输入 映射到它的真实类别 ,其中 是真实的映射函数。
  • 深度前馈网络定义另一个映射 ,并且学习参数 从而使得 的最佳近似。

  • 深度前馈网络之所以称作前馈的(feedforward),是因为信息从输入 到输出 是单向流动的,并没有从输出到模型本身的反馈连接。

    如果存在反馈连接,则这样的模型称作循环神经网络(recurrent neural networks)。

  • 深度前馈网络通常使用许多不同的函数复合而成,这些函数如何复合则由一个有向无环图来描述。最简单的情况:有向无环图是链式结构。

    假设有三个函数 组成链式复合结构,则: 。其中: 被称作网络的第一层, 为网络第二层,称为网络第三层。链的全长称作模型的深度。


    • 深度前馈网络的最后一层也称作输出层。输出层的输入为 ,输出为

    • 给定训练样本 ,要求输出层的输出 ,但是对于其他层并没有任何要求。

      a. 因为无法观测到除了输出层以外的那些层的输出,因此那些层被称作隐层(hidden layer) 。

      b. 学习算法必须学习如何利用隐层来配合输出层来产生想要的结果。

      c. 通常每个隐层的输出都是一个向量而不是标量,这些隐层的输出向量的维数决定了深度前馈网络的宽度。

  • 也可以将每一层想象成由许多并行的单元组成,每个单元表示一个向量到标量的函数:每个单元的输入来自于前一层的许多单元,单元根据自己的激活函数来计算单元的输出。

    因此每个单元类似于一个神经元。


  • 1.2 特征学习

    1. 线性模型简单高效,且易于求解。但是它有个明显的缺陷:模型的能力被局限在线性函数中,因此它无法理解任意两个输入变量间的非线性相互作用

      解决线性模型缺陷的方法是:采用核技巧,将线性模型作用在 上,而不是原始输入 上。其中 是一个非线性变换。

      可以认为:通过 ,提供了 的一个新的representation

    2. 有三种策略来选择这样的非线性变换

    • 使用一个通用的 ,如无限维的 (采用基于 RBF核的核技巧)。

      具有足够高的维数,则总是有足够的能力来适应训练集,但是对于测试集的泛化往往不佳。这是因为:通用的 通常只是基于局部平滑的原则,并没有利用足够多的先验知识来解决高级问题。

    • 手动设计

      这种方法对于专门的任务往往需要数十年的努力(如语音识别任务)。

    • 通过模型自动学习

      这是深度学习采用的策略。以单层隐层的深度前馈网络为例:。此时有两个参数:

      a. 参数 :从一族函数中学习 ,其中 定义了一个隐层。

      b. 参数 :将 映射到所需输出。

  • 深度学习中,将representation参数化为 ,并使用优化算法来寻找 从而得到一个很好的 representation

    • 如果使用一个非常宽泛的函数族 ,则能获得第一种方案的好处:适应能力强。

    • 如果将先验知识编码到函数族 中,则能获得第二种方案的好处:有人工先验知识。

    因此深度学习的方案中,只需要寻找合适的、宽泛的函数族 ,而不是某一个映射函数

  • 通过特征学习来改善模型不仅仅适用于前馈神经网络,也适用于几乎所有的深度学习模型。

  • 1.3 训练

    1. 训练一个深度前馈网络和训练一个线性模型的选项相同:选择优化算法、代价函数、输出单元的形式。

      除此之外还需要给出下列条件:

    • 由于深度前馈网络引入了隐层的概念,因此需要选择适用于隐层的激活函数。激活函数接受隐层的输入值,给出了隐层的输出值。
    • 深度前馈网络的网络结构也需要给出,其中包括:有多少层网络、每层网络有多少个单元、层级网络之间如何连接。
  • 深度神经网络训练时需要计算复杂函数的梯度,通常这采用反向传播算法(back propagation)和它的现代推广来完成。

  • 1.4 示例

    1. XOR函数是关于两个二进制值 的运算,其中 ,要求:

      令想要学习的目标函数为:,其中 ,即 为输入 的两个分量。

      假设模型给出了一个函数 ,希望学习参数 ,使得 尽可能接近

    2. 考虑一个简单的数据集 。希望 在这四个点上都尽可能接近

      采用MSE损失函数:

    3. 假设选择一个线性模型:。通过最小化 ,可以得到它的解为:

      即:。这意味着:线性模型将在每一点都是输出 0.5 ,因此它并不是xor函数的一个很好的拟合。

      从下图可知:

    • 当  时,函数的输出随着  的增加而增加。
    • 当  时,函数的输出随着  的增加而减少。

           因此导致了 ;同理

        4. 假设采用一个简单的深度前馈网络。该网络结构如下,它有一层隐层,并且隐层中包含两个单元。


          •   第一层为隐层,对应于函数:,其输入为              ,输出为 
          •   第二层为输出层,对应于函数: ,其输入              为  ,输出为 

      令输出层仍然是一个线性回归模型,即:。则完整的模型为:

    1. 大多数神经网络中, 的构造过程为:先使用仿射变换,然后通过一个激活函数。其中:激活函数不需要参数控制,仿射变换由参数控制。

      ,其中 就是仿射变换, 为激活函数。

      假设隐层的激活函数是线性的,则 也是线性的,暂时忽略截距项,则 。即:

      令:,则有:。即:前馈神经网络整体也是线性的。根据前面讨论,线性模型无法拟合xor 函数。因此 必须是非线性函数。

    1. 现代神经网络中,默认推荐的激活函数为修正线性单元(rectified linear unit:ReLU):


      整个网络为:

      其中一个解为:

      表示输入矩阵,每个样本占用一行。则对于输入空间中的全部四个点,输入矩阵为:

      根据 ,有:

         

            其中 的每一行表示一个样本对应的隐单元 。可以看到:隐层改变了样本之间的关系。

              根据,得到:

              

    1. 在使用深度前馈网络逼近xor函数中,参数的求解可以通过简单的猜测来求解。但是对于复杂的函数逼近问题中,通常使用基于梯度的优化算法。

    • 这里给出的xor问题的解是损失函数的全局最小点,也可以通过梯度下降法找到该点。
    • 在实践中,梯度下降法通常难以找出像这样的容易理解的、整数值的解。

    二、损失函数

    2.1 损失函数的非凸性

    1. 在线性模型中,对于线性回归模型,可以直接求解出解析解。对于logistic回归或者SVM,其损失函数为凸的。

      凸优化算法可以保证全局收敛,而且理论上保证从任何一种参数出发都可以收敛。实际计算中,可能遇到数值稳定性问题。

    2. 神经网络和线性模型的最大区别是:神经网络的非线性导致大多数的损失函数都是非凸的。损失函数非凸导致两个问题:

    • 基于梯度的优化算法仅仅能够使得损失函数到达一个较小的值,而不是全局最小值。

    • 基于梯度的优化算法无法保证从任何一个初始参数都能收敛,它对于参数的初值非常敏感。

      对于神经网络:

      a. 通常将所有的权重值初始化为小的随机数。

      b. 通常将偏置初始化为零或者小的正值。

      不用负数是因为如果偏置的初始值为负,很可能导致某些神经元一直处于未激活状态。

    2.2 代价函数的选取

    1. 深度学习的一个重要方面是代价函数的选取。

    • 代价函数给出的是单个样本的损失,损失函数是代价函数在所有样本上的和。
    • 通常神经网络的代价函数与传统模型(如线性模型)的代价函数相同。
  • 大多数现代的神经网络采用最大似然准则,令代价函数为负的对数似然函数。因此损失函数为:

  •     其中:

    •  为样本的经验分布:

      为狄拉克函数,它仅在原点处非0,在其它所有位置都为 0 ,其在整个定义域上的积分为 1 。 为数据集 的大小。

    • 为对数据建立的模型, 为模型参数。代价函数的具体形式取决于 的形式,随不同的模型而改变。

      如: ,则 ,常数项包含了高斯分布的方差,与 无关。

      因此可以看到:此时的最大似然估计等价于最小均方误差。

    • 其实就是样本的经验分布 与模型 的交叉熵

    1. 使用最大似然准则来导出代价函数的优势是:减轻了为每个模型设计代价函数的负担。一旦明确了一个模型 ,则自动地确定了一个代价函数

    2. 代价函数的梯度必须足够大且能够计算。

    • 如果代价函数非常平缓,则代价函数的梯度非常小。若梯度很小甚至消失,会导致求解模型参数的迭代过程无法推进。
    • 如果代价函数太大导致发生上溢出时,数值计算会出现问题。用负的对数似然函数作为代价函数可以避免这个问题。
  • 均方误差和平均绝对误差这两种代价函数,在使用基于梯度的优化方法时,经常会产生非常小的梯度。

    这也是使用负的对数似然函数作为代价函数的一个重要原因。

  • 三、输出单元

    1. 代价函数的选取和输出单元的类型紧紧相关。
    2. 任何类型的输出单元,也可以用作隐单元。

    3.1 线性输出单元

    1. 最简单的输出单元为线性单元:它基于仿射变换,不包含非线性。

    • 给定特征 ,单个线性输出单元的输出为:
    • 若输出层包含多个线性输出单元,则线性输出层的输出为:
  • 线性输出层经常用于学习条件高斯分布的均值:

    给定 的条件下, 的分布为均值为 、方差为 1 的高斯分布。此时:最大化对数似然函数等价于最小化均方误差。

  • 最大似然准则也可以用于学习高斯分布的协方差矩阵。但是由于协方差矩阵的特点(对称的、正定的),因此用线性输出层来描述这种限制是困难的。所以通常采用其他类型的输出单元来学习协方差矩阵。

  • 线性模型不会饱和,因此可以方便的使用基于梯度的优化算法。

  • 3.2 sigmoid 输出单元

    1. sigmoid单元:用于Bernoulli分布的输出。

    2. 二类分类问题可以用伯努利分布来描述。由于伯努利分布只需要一个参数来定义,因此神经网络只需要预测 ,它必须位于区间 [0,1]之间。

    • 一种方案是采用线性单元,但是通过阈值来使它位于 [0,1]之间:


      ,则上式右侧就是函数 ,函数图象如下。


      该函数有个问题:当 z 位于 [0,1]之外时,模型的输出 对于 的梯度都为 0。根据反向传播算法,此时对于参数 和参数的梯度都为零。从而使得梯度下降算法难以推进。

    • 另一种方案就是采用 sigmoid单元:,其中 就是sigmoid函数。


      虽然 sigmoid 函数也存在饱和的问题,但是它比 要稍微缓解。

    1. sigmoid输出单元有两个部分:首先它用一个线性层来计算 ;然后它使用 sigmoid激活函数将 转化成概率。

      根据:

      则有:。即:

    2. sigmoid单元的代价函数通常采用负的对数似然函数:

      其中 ,它是函数 的一个近似。


      可以看到,只有当 取一个非常大的负值时,代价函数才非常接近于0。因此代价为0发生在:

      符号错误时(即 为负数,而 ;或者为正数,但是 ), ,则softplus函数会渐进地趋向于 ,且其梯度不会收缩。这意味着基于梯度的学习可以很快地改正错误的

    • 为一个较大的正值,此时表示正类分类正确。
    • 为一个较大的负值 ,此时表示负类分类正确。
  • 当使用其他代价函数时(如均方误差),代价函数会在任何 饱和时饱和,此时梯度会变得非常小从而无法学习。

    因此最大似然函数总是训练sigmoid输出单元的首选代价函数。

  • 3.3 softmax 输出单元

    1. softmax单元:用于multinoulli分布的输出。

    2. 当表示一个具有 n 个可能取值的离散型随机变量分布时,可以采用softmax函数。它可以视作sigmoid函数的扩展:

      表示类别为 的概率。

    3. 当所有输入都加上一个相同常数时,softmax的输出不变。即:

      根据该性质,可以导出一个数值稳定的softmax函数的变体:

    4. softmax函数是argmax函数的软化版本,而不是max函数的软化版本。

    • argmax函数的结果为一个独热向量(只有一个元素为1,其余元素都是0),且不可微。

    • softmax函数是连续可微的。

      当某个输入最大(),且 远大于其他的输入时,对应的位置输出非常接近 1 ,其余的位置的输出非常接近 0 。

    • max函数的软化版本为

  • 假设真实类别为 k ,则softmax 输出的对数似然函数为:

    其中:第一项 不会饱和(它的梯度不会为零),第二项近似为

    为了最大化对数似然函数:第一项鼓励 较大,第二项鼓励所有的 较小。此时意味着:若真实类别为 ,则 较大,其它的 较小。

  • 基于对数似然函数的代价函数为:

    因此代价函数惩罚那个最活跃的预测(最大的 )。如果 ,则代价函数近似为零。

  • 当输入是绝对值较小的负数时, 的计算结果可能为 0 。此时 趋向于负无穷,非数值稳定的。

    因此需要设计专门的函数来计算 ,而不是将 的结果传递给 函数。

  • 除了负对数似然,其他的许多代价函数对softmax函数不适用(如均方误差代价函数)。

    softmax 函数将在很多情况下饱和,饱和意味着梯度消失,而梯度消失会造成学习困难。

    softmax函数饱和时,此时基于softmax函数的代价函数也饱和;除非它们能将softmax转化为成其它形式,如对数形式。

  • softmax 函数饱和的一般化形式:对于softmax函数,它有多个输出值;当输入值之间的差异较大时,某些输出值可能饱和。

    当某个输入最大,且 远大于其他的输入时:将饱和到 1 ,将饱和到 0 。

  • 3.4 其他输出单元

    1. 任何其他类型的输出单元都可以应用到神经网络,这些输出单元通常使用负的对数似然作为代价函数。

      如果定义了一个条件分布 ,则最大似然准则建议使用 作为代价函数。



    本文福利

    可以在 公众号后台 回复关键词:“ DS 获取大量由我平台编辑精心整理的学习资料,如果觉得有用, 请勿吝啬你的留言和赞哦!


    —— 完 ——



    文章须知

    文章作者:华校专 

    责任编辑:周岩 Logic 破茧

    审核编辑:阿春

    微信编辑:破茧

    本文由『运筹OR帷幄』原创发布

    如需转载请在公众号后台获取转载须知

    原文链接:1_deep_forward (huaxiaozhuan.com)





    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/117092