2-1 Mini-batch 梯度下降

Mini-batch 梯度下降( Mini-batch gradient descent)

机器学习的应用是一个高度依赖经验的过程,伴随着大量迭代的过程,你需要训练诸多模型,才能找到合适的那一个,优化算法能够帮助你快速训练模型。

向量化能够让你有效地对所有m个样本进行计算,允许你处理整个训练集。

我们要把训练样本放大巨大的矩阵X当中去,${\rm{X}} = [{x^{(1)}}{x^{(2)}}{x^{(3)}}...{x^{(m)}}]$,Y也是如此,$Y = [{y^{(1)}}{y^{(2)}}{y^{(3)}}...{y^{(m)}}]$,所以X的维数是$({n_x},m)$,Y的维数是$(1,m)$。

向量化能够让你相对较快地处理所有m个样本。如果m很大的话,处理速度仍然缓慢。比如说,如果m是 500 万或者更大的一个数,在对整个训练集执行梯度下降法时,你要做的是,你必须处理整个训练集,然后才能进行一步梯度下降法,然后你需要再重新处理 500 万个训练样本,才能进行下一步梯度下降法。所以如果你在处理完整个 500 万个样本的训练集之前,先让梯度下降法处理一部分,你的算法速度会更快。

可以把训练集分割为小一点的子集训练,这些子集被取名为 mini-batch,假设每一个子集中只有 1000 个样本,那么把其中的${x^{(1)}}$到${x^{(1000)}}$ 取出来,将其称为第一个子训练集,也叫做 mini-batch,然后你再取出接下来的 1000 个样本,从${x^{(1000)}}$到${x^{(2000)}}$,然后再取 1000个样本,以此类推。

${x^{(1)}}$到${x^{(1000)}}$用${x^{\{ 1\} }}$表示;

${x^{(1000)}}$到${x^{(2000)}}$用${x^{\{ 2\} }}$表示。

如果你的训练样本一共有 500 万个,每个 mini-batch 都有 1000 个样本,也就是说,你有 5000 个mini-batch,因为 5000 乘以 1000 就是 5000 万。你共有 5000 个 mini-batch,所以最后得到是${x^{\{ 5000\} }}$,对Y也要进行相同处理,你也要相应地拆分Y的训练集,所以这是${Y^{\{ 1\} }}$,一直到${Y^{\{ 5000\} }}$。mini-batch 的数量组成了${X^{\{ {\rm{t}}\} }}$和${Y^{\{ {\rm{t}}\} }}$,这就是 1000 个训练样本,包含相应的输入输出对。${x^{\{ 1\} }}$,${x^{\{ 2\} }}$以此类推。因此所有的子集维数都是$({n_x},1000)$ ,而这些${Y^{\{ {\rm{t}}\} }}$的维数都是$(1,1000)$。

batch 梯度下降法指的是我们之前讲过的梯度下降法算法,就是同时处理整个训练集,这个名字就是来源于能够同时看到整个 batch 训练集的样本被处理,这个名字不怎么样,但就是这样叫它。

相比之下,mini-batch 梯度下降法,你每次同时处理的单个的 mini-batch${X^{\{ {\rm{t}}\} }}$和${Y^{\{ {\rm{t}}\} }}$,而不是同时处理全部的X和Y训练集。

在训练集上运行 mini-batch 梯度下降法,你运行 for t=1……5000,因为我们有 5000 个各有 1000 个样本的组,在 for 循环里你要做得基本就是对${X^{\{ {\rm{t}}\} }}$和${Y^{\{ {\rm{t}}\} }}$执行一步梯度下降法。假设你有一个拥有 1000 个样本的训练集,而且假设你已经很熟悉一次性处理完的方法,你要用向量化去几乎同时处理 1000 个样本。

首先对输入也就是${X^{\{ {\rm{t}}\} }}$执行前向传播,然后执行${Z^{[1]}} = {W^{[1]}}{X^{\{ {\rm{t}}\} }} + {b^{[1]}}$ ,然后执行${A^{[1]}} = {g^{[1]}}({Z^{[1]}})$。之所以用大写的Z是因为这是一个向量。${A^{[L]}} = {g^{[L]}}({Z^{[L]}})$ ,这就是你的预测值。注意这里你需要用到一个向量化的执行命令,这个向量化的执行命令,一次性处理 1000 个而不是 500 万个样本。

接下来你要计算损失成本函数J,因为子集规模是 1000,$J = \frac{1}{{1000}}\sum\nolimits_{i = 1}^l {L({{\hat y}^{(i)}},{y^{(i)}})}$,这里${L({{\hat y}^{(i)}},{y^{(i)}})}$ 指的是来自于 mini-batch${X^{\{ {\rm{t}}\} }}$和${Y^{\{ {\rm{t}}\} }}$中的样本。

如果你用到了正则化,你也可以使用正则化的术语:

${J^{\{ t\} }} = \frac{1}{{1000}}\sum\nolimits_{i = 1}^l {L({{\hat y}^{(i)}},{y^{(i)}})}  + \frac{\lambda }{{2*1000}}\sum\nolimits_l {\left\| {w[l]} \right\|} _F^2$,其实跟之前我们执行梯度下降法如出一辙,除了你现在的对象不是X和Y而是${X^{\{ {\rm{t}}\} }}$和${Y^{\{ {\rm{t}}\} }}$,接下来,你执行反向传播来计算${J^{\{ t\} }}$的梯度,你只是使用${X^{\{ {\rm{t}}\} }}$和${Y^{\{ {\rm{t}}\} }}$,然后你更新加权值:

${W^{[l]}}: = {W^{[l]}} - ad{W^{[l]}}$

${b^{[l]}}: = {b^{[l]}} - ad{b^{[l]}}$

使用 batch 梯度下降法,一次遍历训练集只能让你做一个梯度下降,使用 mini-batch 梯度下降法,一次遍历训练集,能让你做 5000 个梯度下降。当然正常来说你想要多次遍历训练集,还需要为另一个 while 循环设置另一个 for 循环。所以你可以一直处理遍历训练集,直到最后你能收敛到一个合适的精度。

如果你有一个丢失的训练集, mini-batch 梯度下降法比 batch 梯度下降法运行地更快,所以几乎每个研习深度学习的人在训练巨大的数据集时都会用到。

posted @ 2018-09-13 21:57  刘-皇叔  阅读(541)  评论(0编辑  收藏  举报