8 深度模型的训练

8.1 学习的优化不同于普通的优化

  • 经验风险最小化
    • 直接的学习目标做不到直接优化, 只能优化一个间接目标
    • 避免过拟合
    • 某些损失函数不可导,比如 0-1 loss
  • 代理损失函数和提早停止
    • 对于 0-1 loss,经常用 log-likelihood 替代
    • 替代损失函数可以比原损失函数更 robust
  • Batch 和 minibatch 算法
    • 目标函数往往是对训练样本的求和
    • 把全部训练样本都考虑进来的话,计算量太大
    • 随机取出少量样本进行平均
    • 算法的收敛往往不要求提供精确的梯度
    • 许多训练样本是冗余的,本来也没有提供多少信息
    • 使用全部样本的方法叫 batch 或者 deterministic
    • 每次随机取一个样本的方法叫 stochastic 或者 online 方法
      • Online 方法一般是用来描述训练样本来自数据流的情形
    • 每次随机取一部分样本的方法叫 minibatch 或者 minibatch stochastic 方法,或者就叫 stochastic 方法
      • Stochastic gradient descent (SGD)
    • Minibatch 的大小与下述因素有关
      • 较大的 batch 给出的梯度更准确,但计算量更大
      • 如果 batch 太小,多核架构的利用率不高,所以不能太小
      • 如果一个 batch 里的所有样本被并行处理,则内存占用正比于 batch 大小
      • 有些硬件架构对于大小为 2 的指数的 batch 效率较高
      • 小的 batch 自带正则化效果
        • 小 batch 会添加噪声,起到正则化的作用
        • 泛化误差在 batch size 为 1 时最好
        • 但 batch size 太小会导致运算量加大许多,因为较大的噪声要求较小的学习率
      • 不同方法使用 minibatch 的不同信息
        • 只依赖梯度的方法比较强壮
        • 依赖 Hessian 矩阵的二阶方法需要较大的 minibatch
        • 与条件数太大的矩阵的逆相乘导致误差放大
      • 对样本要随机化,避免采样过程里的相关性
      • 多个 minibatch 同步进行: 异步并行分布式计算
      • Minibatch stochastic 方法看上去像在线方法,所以可以最小化泛化误差
        • 仅当样本不被重复使用时这种解读才成立
        • 多个 epoch 能带来其它好处,所以可以接受
        • 样本数多则只用一个 epoch

8.2 神经网络优化的挑战

  • 传统的机器学习做法:仔细设计目标函数和约束条件来让优化问题是凸优化
  • 病态条件 (ill-conditioning)
    • 参见第四章
    • 优化凸函数时也会遇到
    • 最常见的是 Hessian 矩阵的病态
    • 导致 SGD “卡住”
    • 二阶项高于一阶项意味着出现了病态
    • 监控 \(g^\trsps g\) 和 \(g^\trsps H g\)
      • 许多情形下,梯度的模在整个学习期间并不显著变小,而 \(g^\trsps H g\) 却增长超过一个数量级
      • 结果是,虽然梯度很大,但由于曲率更大,所以学习速度很慢
  • 其它场景下处理病态条件的方法不一定适用,比如牛顿法就需要大改才能用
  • 局部极值
    • 凸优化问题等价于寻找局部极小的问题
    • 神经网络几乎一定会有多个极小值,但这不一定是个大问题
    • 模型识别问题 (model identifiability)
      • 如果只要训练数据足够大,就能够唯一确定模型参数,则称为可识别
      • 包含隐变量的模型不可识别,因为把隐变量交换一下模型还是等价的
        • 权重空间对称性:对于神经网络,把每层各单元的权重矢量做排列,不会影响结果。如果有 \(m\) 层,每层 \(n\) 个单元,则一共有 \(n!^m\) 种等价的排列方式。
        • 输入和输出的权重和偏置的放缩不变形:极小值对应 \((m\times n)\) 维双曲面
        • 无限维的局部极小:并不会导致问题
      • 怕的是取值比全局极小大很多的局部极小
        • 对于小神经网络,可以构造出这种来,甚至都没有隐含层
      • 对于实际的神经网络,不清楚是否存在许多比全局极小大许多的局部极小;许多研究者认为这不是个大问题
      • 通过梯度模来判断是否是局部极小导致了问题
        • 如果梯度没有变得很小,则一定不是局部极小导致的问题
        • 如果梯度变得很小,也不一定是局部极小导致的问题
  • 平台,鞍点,以及其它平坦区域
    • 鞍点比局部极小常见多了: 局部极小和局部极大的交叉
    • 低维:局部极小常见;高维:鞍点常见,鞍点与局部极小的数量之比按维度 \(n\) 的指数增长,这是因为局部极小要求 Hessian 矩阵的所有本征值都是正数
    • 许多随机函数的 Hessian 矩阵的本征值为正的概率在到达低 cost 区域时变大,这意味着局部极小拥有小 cost 比拥有大 cost 的可能性较大;拥有大 cost 的临界点更有可能是鞍点;拥有极高 cost 的临界点更有可能是局部极大。
    • 神经网络是否也这样?浅 auto-encoder 不包含 cost 高于全局极小的局部极小,相当于多个矩阵的复合
    • 一阶梯度下降方法:似乎容易逃离鞍点
    • 牛顿法:被设计用来寻找临界点,所以受到鞍点的影响较大; saddle-free 方法可以解决这个问题,不过对于大网络还不能 scale
    • 宽平区域带来的问题更大
  • 悬崖和梯度爆炸
    • 太大的梯度会把参数推得太远,让之前的优化白做了
    • 可以通过 gradient clipping heuristic 避免
  • 长期依赖
    • 当计算图太深时就有问题了:本征值的指数放大和缩小,导致梯度的指数放大和缩小
    • 循环神经网络面临这样的问题,但前馈网络基本上没这个问题
  • 不准确的梯度
  • 局部结构和全局结构不匹配
    • 指向局部极小的方向没有指向全局极小的方向
    • 训练时间取决于训练路径的长度
    • 有可能不存在全局极小: 如果精确匹配训练数据,则会无限逼近但永远达不到最优值 (最优值可能是负无穷)
    • 寻找良好的起始点
  • 优化的极限
    • 相关的理论对神经网络的实际应用影响不大
    • 有些理论结果仅对神经网络输出离散值的情况适用

8.3 基本算法

  • 随机梯度下降 (随机 minibatch)
  • 冲量
    • 计算梯度 \(g\),更新速度 \(v \leftarrow \alpha v - \epsilon g\)
    • \(\theta \leftarrow \theta + v\)
  • Nesterov 冲量

8.4 参数初始化策略

8.5 自适应学习率算法

8.6 近似的二阶方法

  • 牛顿法 \[ \theta^\ast = \theta_0 - H^{-1} \nabla_\theta J(\theta_0) \]
  • 共轭梯度法
    • 通过迭代下降对偶方向的办法来避免求 Hessian 矩阵的逆
    • 后一步的搜索方向必定垂直于前一步的搜索方向: 最陡下降法中,令前一步搜索方向为 \(d_{t-1}\),在极小值处,沿着这个方向的导数是 0: \(\nabla_\theta J(\theta) \cdot d_{t-1} = 0\),而下一步的方向是 \(\nabla_\theta J(\theta)\),故如此。之字形搜索路线的效率不高。
    • 令 \(d_t = \nabla_\theta J(\theta) + \beta_t d_{t-1}\),就是共轭梯度法。\(\beta_t\) 控制上一个方向对下一个方向的贡献比例。
    • 如果 \(d_t^\trsps H d_{t-1} = 0\),则称两个方向是共轭的。令 \(g_t = \nabla_\theta J(\theta_t)\),有两种常见的计算 \(\beta_t\) 的方法
      1. Fletcher-Reeves \[ \beta_t = \frac{g_t^\trsps g_t}{g_{t-1}^\trsps g_{t-1}} \]
      2. Polak-Ribière \[ \beta_t = \frac{(g_t - g_{t-1})^\trsps g_t}{g_{t-1}^\trsps g_{t-1}} \]
    • 对于二次曲面,共轭方向保证了沿着之前方向的梯度不增加
    • 对于 k 维参数空间,只需要最多 k 次线搜索就可以到达最小值。
    • 非线性共轭梯度法: 在共轭梯度的基础上,偶尔进行普通的最陡梯度下降
  • BFGS (Broyden–Fletcher–Goldfarb–Shanno)
    • 牛顿法的难点在于求 Hessian 矩阵的逆;准牛顿方法用近似方法来求逆;BFGS 方法就是一种准牛顿法。
    • 通过迭代求得 \(H^{-1}\) 的近似 \(M_t\),由此得到搜索方向 \(\rho_t = M_t g_t\),然后通过线搜索得到步长。
    • 对线搜索的精度要求不高
    • 需要存储 Hessian 矩阵的逆,对于大模型做不到
    • Limited memory BFGS: 不保存上一步的 \(H^{-1}\),而假定它是单位矩阵;或者保存其一部分,存储占用为 \(O(n)\)。

8.7 优化策略和元算法

  • 批量归一化 (batch normalization)
  • 坐标下降 (coordinate decent)
  • Polyak 平均
  • 监督预训练
  • 设计模型来辅助优化
  • 持续方法 (continuation methods) 和课程学习