机器学习数学基础-优化-5

优化方法
  • 为什么要用优化算法:
    • 维度多维,不好直接求导
    • 有时候需要区分局部最优和全局最优
线性规划
  • 线性规划(Linear Programming):看这个视频就行了
    • 一组决策变量
    • 一个线性目标函数
    • 一组线性的约束条件
梯度下降法
  • 函数的梯度是一个矢量,用grad表示(gradient), 也可以用 ∇f(x)表示(nabla)。表示函数在某一点上的倒数,方向为切线方向。
  • 负∇f(x)为下降最快的方向,沿着它走可以快速达到极小点
  • 对于任意点ak,可以定义ak负梯度搜索单位向量为 sk=-∇J(ak)/|∇J(ak)|
  • 步长(学习率)的选择:
    • 太小,则算法收敛慢
    • 太大,可能导致发散
梯度下降的实现方式
  • BGD(Batch Gradient Descent) 批量梯度下降
    • 使用整个训练集的数据来计算梯度
    • 计算起来非常慢,遇到很大量的数据集会非常棘手
    • 不能投入新数据实时更新模型
    • 如何实现
      • 定义迭代次数(epoch)
      • 计算梯度向量(params gradient)
      • 沿着梯度的方向更新参数params
      • learning rate决定每一步迈多大
        for i in range(epochs):
          params_grad = evaluate_gradient(lossfunction, data, params)
          params = params - learning_rate * params_grad
  • SGD(Stochastic Gradient Descent) 随机梯度下降
    • 每次更新的时候对每个样本进行梯度更新
    • 训练速度快,但是准确度下降,并不是全局最优
    • 包含一定随机性,但是从期望上来看,等于正确的导数
      for i in range(epoch):
        np.random.shuffle(data)
        for example in data:
            params_grad = evaluate_gradient(lossfunction, example, params)
            params = params - learning_rate *params_grad
  • MBGD (Mini-Batch Gradient Descent) 小批量梯度下降
    • 每次利用一小批样本
    • 降低了参数更新时候的方差,收敛更稳定
    • 可以充分利用矩阵的操作进行有效率的梯度计算
      for i in range(epoch):
      np.random.shuffle(data)
      for batch in get_batches(data, batch_size=50):
        params_grad = evaluate_gradient(lossfunction, batch, params)
        params = params - learning_rate *params_grad
牛顿法[待续]
  • 本质上是为了寻找极值点的位置
  • 牛顿法的收敛速度更快
  • 简单理解:在局部上看,用一个二次函数近似代替目标函数f(x),然后用近似函数的极小值作为f(x)的近似极小点
  • 前置:
    • 泰勒公式:在函数x0处计算该函数的n阶导数
    • 黑塞(Hesse)矩阵
  • 本质上看:牛顿法是二阶收敛,梯度下降是一阶收敛。所以牛顿法会更快
    • 梯度下降:当前所属位置寻找坡度最大的地方向下走,梯度下降法只考虑了局部最优,没有全局思想
    • 牛顿法:不仅会考虑坡度足够大,还会考虑走了一步之后坡度是否会变的更大

img

  • 优点:
    • 收敛速度快,通过二次曲面来拟合,为二阶收敛
  • 缺点:
    • 需要计算Hesse矩阵
    • 计算量大
    • 可能导致牛顿方向不是下降的(梯度不一定总是下降的)

拟牛顿法[待续]

共轭方向法(Conjugate orientation method)[待续]
  • 介于最速下降法和牛顿法之间的一类方法
共轭梯度法[待续]
  • 待续
Adam方法【待续】
  • 待续