↓ 跳过正文
  1. Posts/

几种梯度下降(GD)法的比较(转载)

·1089 字·3 分钟

参考资料

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

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

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

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

1. batch GD

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

batch GD的损失函数是:

$$ J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 $$

训练算法为:

$$ \text{repeat } \{\ \theta := \theta - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) x^{(i)}_j\ \} $$

什么意思呢,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, \ldots, m/b\} $$

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

$$ \text{repeat } \{ \text{repeat } \{ \text{for each } \omega_k \text{ in } \Omega : \theta := \theta - \alpha \frac{1}{b} \sum_{i=1}^{b} (h_\theta(x^{(i)}) - y^{(i)}) x^{(i)} \} \text{ for } (k = 1, 2, \ldots, m/b) \} $$

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 Learning的算法可以实时地跟进网民的点击行为迁移。

相关文章

局部敏感哈希算法(Locality Sensitive Hashing)初探

·2850 字·6 分钟
前言: # 其实有了前文simhash算法的基础,局部敏感hash算法已经不存在理解上的问题了吧。。。毕竟simhash算法应该是局部敏感哈希算法的一种。。所以我就直接转载几篇我认为比较好的文档结合一下好了。。。会把比较重要的概念或者定义标记重点。

archlinux/manjaro 下 安装 qq/tim

·580 字·2 分钟
参考资料:install qq/tim on linux with wine wine运行qq不能输入账号 This tutorial introduces how to install QQ/TIM in Linux with Wine, which had been tested on ArchLinux with Wine 2.4.