• 【原创】batch-GD, SGD, Mini-batch-GD, Stochastic GD, Online-GD -- 大数据背景下的梯度训练算法


    机器学习中梯度下降(Gradient Descent, GD)算法只需要计算损失函数的一阶导数,计算代价小,非常适合训练数据非常大的应用。

    梯度下降法的物理意义很好理解,就是沿着当前点的梯度方向进行线搜索,找到下一个迭代点。但是,为什么有会派生出 batch、mini-batch、online这些GD算法呢?

    原来,batch、mini-batch、SGD、online的区别在于训练数据的选择上:

      batch mini-batch Stochastic Online
    训练集 固定 固定 固定 实时更新
    单次迭代样本数 整个训练集 训练集的子集 单个样本 根据具体算法定
    算法复杂度 一般
    时效性 一般(delta 模型) 一般(delta 模型)
    收敛性 稳定 较稳定 不稳定 不稳定

    1. batch GD

    每次迭代的梯度方向计算由所有训练样本共同投票决定,

    batch GD的损失函数是:

    [J( heta ) = frac{1}{{2m}}sumlimits_{i = 1}^m {{{({h_ heta }({x^{(i)}}) - {y^{(i)}})}^2}} ]

    训练算法为:

    [egin{array}{l}
    repeate{ \
    heta : = heta - alpha frac{1}{m}sumlimits_{i = 1}^m ( {h_ heta }({x^{(i)}}) - {y^{(i)}})x_j^{(i)}\
    }
    end{array}]

    什么意思呢,batch GD算法是计算损失函数在整个训练集上的梯度方向,沿着该方向搜寻下一个迭代点。”batch“的含义是训练集中所有样本参与每一轮迭代。

    2. mini-batch GD

    batch GD每一轮迭代需要所有样本参与,对于大规模的机器学习应用,经常有billion级别的训练集,计算复杂度非常高。因此,有学者就提出,反正训练集只是数据分布的一个采样集合,我们能不能在每次迭代只利用部分训练集样本呢?这就是mini-batch算法。

    假设训练集有m个样本,每个mini-batch(训练集的一个子集)有b个样本,那么,整个训练集可以分成m/b个mini-batch。我们用(omega )表示一个mini-batch, 用({Omega _j})表示第j轮迭代中所有mini-batch集合,有:

    [Omega  = { {omega _k}:k = 1,2...m/b} ]

    那么, mini-batch GD算法流程如下:

    [egin{array}{l}
    repeate{ \
    { m{ }}repeate{ \
    { m{ for each }}{omega _k}{ m{ in }}Omega :\
    { m{ }} heta : = heta - alpha frac{1}{b}sumlimits_{i = 1}^b ( {h_ heta }({x^{(i)}}) - {y^{(i)}}){x^{(i)}}\
    { m{ }}} for(k = 1,2...m/b)\
    }
    end{array}]

    3. Stochastic GD (SGD)

     随机梯度下降算法(SGD)是mini-batch GD的一个特殊应用。SGD等价于b=1的mini-batch GD。即,每个mini-batch中只有一个训练样本。

    4. Online GD

    随着互联网行业的蓬勃发展,数据变得越来越“廉价”。很多应用有实时的,不间断的训练数据产生。在线学习(Online Learning)算法就是充分利用实时数据的一个训练算法。

    Online GD于mini-batch GD/SGD的区别在于,所有训练数据只用一次,然后丢弃。这样做的好处是可以最终模型的变化趋势。比如搜索广告的点击率(CTR)预估模型,网民的点击行为会随着时间改变。用batch算法(每天更新一次)一方面耗时较长(需要对所有历史数据重新训练);另一方面,无法及时反馈用户的点击行为迁移。而Online Leaning的算法可以实时的最终网民的点击行为迁移。

    Ref:

    1. http://en.wikipedia.org/wiki/Gradient_descent

  • 相关阅读:
    vue 5 父子组件及组件间数据传递 学习代码片段
    微信小程序设置数组对象的值
    微信小程序样式拼接 类名三元运算 以及条件拼接
    超简易 消息通知滚动 pc移动适用
    js 批量监听-序号的闭包问题
    docker基础
    mysql
    mongodb
    django-restframework_认证
    SSM 整合
  • 原文地址:https://www.cnblogs.com/richqian/p/4549590.html
Copyright © 2020-2023  润新知