2.6 随机梯度下降法

2.6 随机梯度下降法

 我们最后就来看一下随机梯度下降法这个算法吧。

 这是一个效率高的算法吗?

 嗯。不过在介绍它之前,还要说一下,最速下降法除了计算花时间以外,还有一个缺点。

 欸,还有缺点?

 嗯,那就是容易陷入局部最优解。

 这是什么意思呀?

 在讲解回归时,我们使用的是平方误差目标函数。这个函数形式简单,所以用最速下降法也没有问题。现在我们来考虑稍微复杂一点的,比如这种形状的函数(图 2-17)。

图 2-17

 这个函数怎么看起来软绵绵的……

 用最速下降法来找函数的最小值时,必须先要决定从哪个 x 开始找起。之前我用 g(x) 说明的时候是从 x=3 或者 x=-1 开始的,还记得吗?

 你这么一说我想起来了。不过为什么要从 3 或者 -1 开始找呢?

 那是为了讲解,我随便选的。

 这样啊,那实际去解决问题时,也可以随便选个初始值吗?

 选用随机数作为初始值的情况比较多。不过这样每次初始值都会变,进而导致陷入局部最优解的问题。

 我还是不太明白这是什么意思……

 我们假设这张图中标记的位置就是初始值(图 2-18)。

图 2-18

 啊,我好像有点明白了。从这个点开始找,似乎可以求出最小值。

 那你说说,什么情况下反而求不出最小值呢?

 是不是把这里作为初始值的情况(图 2-19)?好像没计算完就会停止。

图 2-19

 没错。这就是陷入局部最优解。

 这个算法虽然简单,但是容易发生各种问题呀。这可是你花费了这么多时间教给我的算法,太遗憾了。

 没事儿,最速下降法也不会白学,随机梯度下降法就是以最速下降法为基础的。

 是这样啊。

 你还记得最速下降法的参数更新表达式吗?

 嗯,就是表达式 2.5.10 吧?

\theta_j:=\theta_j-\eta\sum^n_{i=1}\biggl(f_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)})-y^{(i)}\biggr)x^{(i)}_j\quad\quad\quad\quad(2.6.1)

 对。这个表达式使用了所有训练数据的误差,而在随机梯度下降法中会随机选择一个训练数据,并使用它来更新参数。这个表达式中的 k 就是被随机选中的数据索引。

\theta_j:=\theta_j-\eta\biggl(f_{\boldsymbol{\theta}}(\boldsymbol{x}^{(k)})-y^{(k)}\biggr)x^{(k)}_j\quad\quad\quad\quad(2.6.2)

 \Sigma 变没啦。

 最速下降法更新 1 次参数的时间,随机梯度下降法可以更新 n 次。此外,随机梯度下降法由于训练数据是随机选择的,更新参数时使用的又是选择数据时的梯度,所以不容易陷入目标函数的局部最优解。

 随机选择训练数据来学习这种做法看起来有些敷衍,真的能找到答案吗?

 虽然有些不可思议,但实际上的确会收敛。

 真是不可思议……

 我们前面提到了随机选择 1 个训练数据的做法,此外还有随机选择 m 个训练数据来更新参数的做法。

 这样啊,那具体选择几个是可以由自己决定的吧?

 嗯,设随机选择 m 个训练数据的索引的集合为 K,那么我们这样来更新参数。

\theta_j:=\theta_j-\eta\sum_{k\in K}\biggl(f_{\boldsymbol{\theta}}(\boldsymbol{x}^{(k)})-y^{(k)}\biggr)x^{(k)}_j\quad\quad\quad\quad(2.6.3)

 关于 \sum_{k\in K} 的更多内容,请参考附录 A.1。

 假设训练数据有 100 个,那么在 m=10 时,创建一个有 10 个随机数的索引的集合,例如 K={61,53,59,16,30,21,85,31,51,10\},然后重复更新参数就行了吗?

 就是这样。这种做法被称为小批量(mini-batch)梯度下降法

 这像是介于最速下降法和随机梯度下降法之间的方法。

 不管是随机梯度下降法还是小批量梯度下降法,我们都必须考虑学习率 \eta。把 \eta 设置为合适的值是很重要的。

 那学习率是如何决定的呢?也是随意决定的吗?

 这是一个很难的问题。可以通过反复尝试来找到合适的值,不过,除此之外还有几个办法,你可以研究一下,我觉得会很有意思。

 好呀。不过今天我学到了好多东西,现在有点累了……等我实现的时候要是碰到了问题再去研究好了。

 也好。还没开始做就什么都往脑子里塞,会把头撑破的。

 是啊,谢谢你!

 

上一章 封面 书架 下一章