花书笔记:第06章 深度前馈网络

  • 深度前馈网络 也叫前馈神经网络多层感知机
  • 深度前馈网络的目标
    定义一个映射 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络 ,并学习参数 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_02 ,使它能够得到最佳近似。例如分类任务,将输入 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_03 映射到一个类别 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_04
  • 前馈神经网络组成结构:输入层 + 隐藏层 + 输出层

6.1 实例:学习 XOR 函数

  • 问题描述1) XOR 问题即,异或问题。给定两个输入 前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_05 取值为 0 或 1;当 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_06时,前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_07 否则 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_08
    2) 数据集 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_09前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_10
  • 定义模型
  1. 上图中左图是对数据集 前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_11前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_12
  2. 对于左图原始空间,线性模型不能够学习到正确的分类模型 (不能用一条直线将两个类别的数据划分开)。
  3. 因此,我们想对原始输入数据做一个映射,转换为类似右图的空间,即 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_13 的映射。此时就可以用线性模型完成划分了。
  4. 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_14

  5. 上图就是我们定义的用于该问题的前馈神经网络,左右两部分是模型的不同画法。
  6. 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_15 之间就是 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_13 的映射,箭头代表了映射权重(参数)。神经网络具有学习能力,所以我们希望网络能够学习参数 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_17 使得 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_18
  7. 为什么要使用 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_19
    忽略截距;若前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_19仍为线性函数,则 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_21 也为线性,则 前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_22 。令 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_23,则 前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_24 仍为线性模型,肯定不能满足期望。
    所以,我们在 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_13 映射中加入了 激活函数 整流线性单元(ReLU)前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_26 ,来使其变为非线性模型
  8. 第 5 步可以学将 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_27 映射到 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_28 空间了,接下来我们也想学习线性模型 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_29,使得能够正确划分映射到 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_28
  9. 从上面的步骤可以看出,该模型的函数形式为:

前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_31

前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_32

  • 选择损失函数注:式 6.1 该问题选用了 均方误差(MSE) 作为损失函数,但是对于 二进制数据问题建模,在应用领域 MSE 通常不合适,加合适的方法在6.2.2.2节 。本文在此处使用 MSE 是为了简化数学问题。
  • 求解花书给出了该问题解的参数 (参数由网络学习得到):

    验证一下这个解是否能够正确划分数据集;以及先来了解一下神经网络的正向传输过程。
    前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_33
    首先,输入层向隐藏层传输 (前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_34) ,计算 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_35
    前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_36
    然后,隐藏层向输出层传输 (前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_37),计算 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_38
    前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_39
    可看出网络的预测值与实际值相同

6.2 基于梯度的学习

  • 基于梯度学习的主要步骤:
    定义代价函数;梯度计算;反向传播(更新参数)

6.2.1 代价函数

6.2.1.1 使用最大似然条件分布
  • 大多数神经网络使用最大似然来训练,该方法会得到一个完整的概率分布
  • 使用最大似然的优势是,确定了模型 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_40 后,代价函数 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_41
  • 最大似然的代价函数
  • 上式就是最大似然的代价函数 负对数似然
  • 它与训练数据和模型分布间的交叉熵等价。
  • 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_42
  • 代价函数的具体形式取决于 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_43
  • 例:求代价函数前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_44
    前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_45
    所以带入 式 6.12,
    前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_46
6.2.1.2 学习条件统计量
  • 该方法不是学习整个概率分布 (前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_47),而是学习给定 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_03 时,前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_49 的某个条件统计量 (如 学习 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_49
  • 泛函
  • 学习条件统计量的代价函数叫做 泛函
  • 泛函是函数到实数的映射,即泛函中包含的函数簇,都对应着一个实数。我们的目的就是找到我们需要的统计量所对应的函数
  • 设计代价泛函的时候要遵循代价泛函在所求函数处取得最小值
  • 从映射中找到的函数,就对应着我们想要的那个统计量。
  • 对函数求解优化时要用到 变分法
  • 两个常见统计量
    最小化均方误差 最小化均方误差可以得到用来预测 对每个 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_03 预测 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_49均值的函数。
    平均绝对误差最小化平均绝对误差可以用来预测 对每个 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_03 预测 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_49中位数的函数。
    与交叉熵对比均方误差 和 平均绝对误差 的代价函数在饱和输出单元 的梯度很小,所以使用梯度优化时往往效果不佳。因此,即使没必要估计整个概率分布 (前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_47),交叉熵代价函数也更受欢迎。

6.2.2 输出单元

本节中讨论的所有问题都在隐藏层的输出特征 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_56

6.2.2.1 用于高斯输出分布的线性单元
  • 该方法处理 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_57 是基于线性变换的,所以成为线性单元。输出层输出结果为:
    前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_58
    因为示是线性,所以该种方法输出层没有使用激活函数
  • 线性输出层常被用来产生条件高斯分布的均值:
    前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_59
    产生条件高斯分布的均值,即 前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_60 符合均值为 前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_61 方差为 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_62
  • 此时最大化似然等价于最小化均方误差,6.2.1.1 节 示例 中已证明。
  • 线性单元不会饱和,所以易于采用基于梯度的优化算法,甚至更多方法。
6.2.2.2 用于 Bernoulli 输出分布的 sigmoid 单元
  • Bernoulli 输出分布主要用于预测二值型 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_63 的值。一般用于二分类问题。该种类型的网络输出只有一个神经元 sigmoid 激活函数 作用于该神经元 。
  • 网络只需要预测 前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_64
  • Bernoulli 输出分布一般与 sigmoid 以及最大似然结合使用:
    前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_65
    前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_66
    前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_67
  • 损失函数前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_68
    前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_69
    编程实现时,为了避免数值问题,最好将负的对数似然写作 前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_70 的函数,而不是 前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_71
6.2.2.3 用于 Multinoulli 输出分布的 softmax 单元
  • 公式
    前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_72
  • 负对数似然(优化目标)
    前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_73
  • softmax 函数用于 n 分类,神经网络输出层也会有 n 个神经元 (n > 2)。
  • 对数似然之外的许多目标函数对 softmax 函数不起作用,所以一般情况下使用对数作为目标函数。
6.2.2.4 其他的输出类型
  • 混合密度网络

    高斯混合输出在 语音生成模型物理运动 中特别有效。

6.3 隐藏单元

如何选择隐藏单元的类型

  • 整流线性单元(ReLU),通常是隐藏单元极好的默认选择。
  • 除非另有说明,否则隐藏单元一般由仿射变换 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_74 和 激活函数 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_75

6.3.1 整流线性单元及其扩展

  • ReLU 激活函数
    前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_76
  • 初始化网络时,可以将偏置 b全都设置成一个小的正值 如 0.1,这可能会使 ReLu函数 在初始时对大多数数据集都处于激活状态,并且允许导数通过。
  • 缺陷
    不能通过基于梯度的方法学习到那些激活为 0 的样本,即 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_77
  • 整流线性单元(ReLU)扩展
  • ReLU 3 个扩展都是基于 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_78
  • 绝对值整流前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_79
    等价于 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_80
    它用于图像中的对象识别,其中寻找在输入照明极性反转下不变的特征是有意义的。
  • 渗漏整流线性单元 是将 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_81
  • 参数化整流线性单元(PReLU)前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_81
  • maxout单元
  • maxout 将 前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_83 划分为了 k 组,并输出每组的最大元素。
    前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_84

6.3.2 logistic sigmoid 与双曲正切函数

  • logistic sigmoid前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_85
  • 双曲正切 (tanh)前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_86
  • 由于 sigmoid 函数饱和性问题,当必须要使用 sigmoid 函数时,tanh 函数通常要比 sigmoid 表现更好,训练更加容易。

6.3.3 其他隐藏单元

  • softmax 单元也可以在隐藏层处使用。将在 10.2节 讲述。
  • 径向基函数(RBF)
    前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_87
    很难优化
  • softplus 函数
    前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_88
    ReLU 的平滑版本,但并不如 ReLU 效果好。
  • 硬双曲正切函数
    前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_89

6.4 架构设计

架构指网络的整体结构,他应该具有多少单元,以及这些单元应该如何连接。

6.4.1 万能近似性质和深度

  • 万能近似定理一个前馈神经网络如果具有线性输出层和至少一层具有任何人“挤压”性质的激活函数的隐藏层,只要给予网络足够数量的隐藏单元它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的 Borel 可测函数。前馈网络的导数也可以任意好地来近似函数地导数。(一个大的 MLP 一定能表示任何函数,但不一定被学习到。)
  • 在很多情况下,使用更深地模型能够减少表示期望函数所需的单元的数量,并且可以减少泛化误差。

6.4.2 其他架构上的考虑

  • 一般的神经网络都是层与层之间的链式结构。但在神经网络构建具有较大的灵活性,并不一定是层间依次连接,有时为了使网络更有利于处理某一领域的问题,也可以进行其他操作。如跳跃链接等。

6.5 反向传播和其他微分算法

  • 前向传播输入 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_03 ,然后传播到每一层的隐藏单元,最终产生输出 前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_91
  • 反向传播根据代价函数 前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_92 计算出的 误差 并从输出层依次反向求梯度更新参数。

6.5.1 计算图

  • 作用:利用计算图表示的运算,更直观,也更容易手动求解梯度进行反向传播。
  • 计算图

6.5.2 微积分的链式法则

  • 前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_93 并且 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_94前馈神经网络时间复杂度分析 前馈神经网络例题_深度学习_95 求解公式如下:

6.5.3 递归的使用链式法则来实现反向传播

前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_96

6.5.4 全连接 MLP 中的反向传播计算

  • 多层MLP的正向传播
  • MLP 的反向传播

6.5.5 符号到符号的导数

  • 采用了计算图以及添加一些额外的节点到计算图中,这些额外的节点提供了我们所需导数的符号描述。
  • 计算图求导该方法的优点是导数可以使用与原始表达式相同的语言来描述。因为导数只是另外一张计算图,我们可以再次运行反向传播。

6.5.6 一般化的反向传播

  • Jacobian矩阵雅可比矩阵,是指函数的一阶偏导数以一定方式排列成的矩阵。如在神经网络中计算图中 z 的每个父节点的梯度组成的矩阵。
  • 一般化的反向传播算法整体流程:

    build_grad 方法:
  • get_operation(V):返回用于计算 V 的的操作符,代表了在计算图中流入 V 的边。
  • get_consumers(V, 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_97):返回一组变量,是计算图 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_97V 的子节点。
  • get_inputs(V, 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_97):返回一组变量,是计算图 前馈神经网络时间复杂度分析 前馈神经网络例题_神经网络_97 的中 V 的父节点。
  • op.bprop(inputs, X, G)
    前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_101
    inputs 是提供给操作的一组输入;前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_102 是操作符对应的函数;输入 X 是指我们想要计算关于他的梯度;G 是操作对于输出的梯度。

6.5.7 实例:用于 MLP 训练的反向传播

  • 架构说明
  1. 本例中 MLP 只具有一个隐层。
  2. 使用小批量梯度下算法(SGD)。
  3. 使用 ReLU 作为隐层激活函数。
  4. 输出层使用线性映射,不使用激活函数。
  5. 输出层代价函数使用 交叉熵 + 正则项
    前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_103
  • MLP 的计算图
  • 根据计算图我们可以去求 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_104前馈神经网络时间复杂度分析 前馈神经网络例题_数据集_105
  • 值得注意的是在求 前馈神经网络时间复杂度分析 前馈神经网络例题_机器学习_106前馈神经网络时间复杂度分析 前馈神经网络例题_前馈神经网络时间复杂度分析_107
  • 计算图的求梯度方法见 6.5.5 节。

6.6 历史小记

  • 交叉熵损失函数 大大提高了具有 sigmoid 和 softmax 输出的模型性能。而均方误差损失时会 存在饱和学习缓慢 的问题。
  • 一般情况下使用整流非线性 比 使用sigmoid 网络性能更好。
  • 神经网络非常小时,sigmoid表现比整流非线性更好。