实际上,我想问你如何定义梯度下降的终止条件。
我可以基于迭代次数来停止它,即考虑参数值进行100次迭代吗?
还是应该等两个参数值'new'和'old'的差异小到可以说?这肯定会花费很多时间。
什么是最好的方法?就我而言,即使一次迭代也要花费大量时间。在这种情况下,如果我等待第二种情况,我想可能甚至要花几周的时间。
因此,我应该使用哪种方法。如何解决这种情况?
ftolabs
ftolrel
xtolabs
实际上,我想问你如何定义梯度下降的终止条件。
我可以基于迭代次数来停止它,即考虑参数值进行100次迭代吗?
还是应该等两个参数值'new'和'old'的差异小到可以说?这肯定会花费很多时间。
什么是最好的方法?就我而言,即使一次迭代也要花费大量时间。在这种情况下,如果我等待第二种情况,我想可能甚至要花几周的时间。
因此,我应该使用哪种方法。如何解决这种情况?
ftolabs
ftolrel
xtolabs
Answers:
好问题。我在文献中已经看到许多停止规则,并且每种情况都有其优缺点,具体取决于上下文。optim
例如,R中的函数至少具有三个不同的停止规则:
maxit
即预定的最大迭代次数。我在文献中看到的另一个类似的选择是超时之前的最大秒数。如果您只需要一个近似的解决方案,这可能是非常合理的。实际上,有些模型(尤其是线性模型)的早期停止类似于将高斯优先放在参数值上。一个常客会说您有一个“ L2规范”,而不是先验的,但他们也会认为这样做是合理的。我只是略读了这篇文章,但是它讨论了提前停止和正则化之间的关系,可能会帮助您了解更多信息。但是简短的说法是,是的,尽早停止可能是一件值得尊敬的事情,具体取决于您的
abstol
,即当函数“足够接近”到零时停止。这可能与您无关(听起来不像您期望的是零),因此我将跳过它。
reltol
,就像您的第二个建议一样-当改善低于阈值时停止。我实际上不知道这方面有多少理论,但是您可能会倾向于获得比最小迭代次数少的最小值。如果这对您很重要,那么可能值得运行更多迭代的代码。
停止规则的另一系列与优化验证数据集(或交叉验证)而不是训练数据上的成本函数有关。根据要使用模型的目的,您可能希望在达到训练数据的局部最小值之前停下来,因为这可能涉及过度拟合。我很确定Trevor Hastie已经写了关于这样做的好方法,但是我不记得被引用了。
在合理的时间内找到较低最小值的其他可能选择包括:
随机梯度下降,一次只需要估算一小部分数据的梯度(例如,“纯” SGD的一个数据点,或小型迷你批次)。
更高级的优化功能(例如,牛顿型方法或共轭梯度),该功能使用有关目标函数曲率的信息来帮助您指向更好的方向,并在下坡时采用更好的步长。
更新规则中的“动量”一词,使优化程序在下坡时做得更好,而不是在目标函数中限制峡谷墙。
我在网上找到的这些讲义中都讨论了这些方法。
希望这可以帮助!
编辑哦,您也可以尝试获得更好的起始值(例如,通过解决问题的简单版本),以便从“热启动”到达到最佳迭代所需的迭代次数更少。
reltol
(即,当不再有“改进”时)的意思。第一个改进意味着降低成本函数。因此,我假设您的意思是,当成本函数停止下降得足够少(或开始增加)时,暂停一秒钟,对吗?一个人实际上并没有做“ |旧-新|” 更新规则的类型,对不对?
abstol
仅当您采用成本函数的梯度公差而不是成本函数本身的公差时,此参数才有意义。在局部优化器中,梯度的值为零;但不是函数的值。