2012-02-06 121 views
4

我已经实现了批处理和随机梯度下降。虽然我遇到了一些问题。这是随机的规则:梯度下降实现

1 to m { 
theta(j):=theta(j)-step*derivative (for all j) 
} 

我的问题是,即使成本函数变得越来越小,测试说它不好。如果我稍微改变步骤并更改迭代次数,那么成本函数的值有点大,但结果是可以的。这是一个过度的“症状”吗?我怎么知道哪一个是正确的? :)

正如我所说,即使成本函数更小,测试说它不好。

+0

“不好”是什么意思? – 2012-02-06 16:52:04

+0

@ MichaelJ.Barber例如,期望值为0.35,我得到0.65。这是一个区别。但是,通过不同的步数和迭代次数,我可以得到0.35。问题是,当我获得正确的参数时,我怎么能在更大的范围内知道? – Andrew 2012-02-06 16:53:22

+0

@ MichaelJ.Barber,尽管成本函数值较小(它更小),但测试值与正确的测试值相差很远,而价值成本函数中的较大值则为测试示例提供了正确的值。 – Andrew 2012-02-06 16:59:18

回答

17

渐变下降是一种用于最小化函数的局部搜索方法。当它在参数空间中达到最小值时,将无法继续。这使得梯度下降(和其他局部方法)容易陷入局部最小值,而不是达到全局最小值。当地的最低标准可能会或可能不会成为您尝试实现的良好解决方案。期待什么取决于你想尽量减少的功能。

特别是,高维NP-完全问题可能会非常棘手。它们通常具有指数级的许多局部最优性,其中许多与成本方面的全局最优性几乎一样好,但参数值与全局最优值正交。这些是问题:您通常不希望能够找到全局最优值,而只是寻找足够好的局部最小值。这些也是相关问题:许多有趣的问题都只是这些属性。

我建议首先测试一个简单问题的梯度下降实现。您可以尝试在多项式中找到最小值。由于这是一个单参数问题,因此您可以绘制沿多项式曲线的参数值的进度。你应该能够看到是否有严重错误,并且还可以观察搜索如何陷入局部最小值。您还应该能够看到最初的参数选择可能非常重要。

为了处理更难的问题,你可以修改你的算法来帮助它避开局部最小值。一些常见方法:

  • 增加噪音。这会降低您找到的参数的精确度,从而可以“模糊”出局部最小值。然后搜索可跳出局部最小值,与噪声相比较小,但仍然陷入更深的最小值。众所周知的增加噪音的方法是simulated annealing

  • 增加势头。在使用当前渐变定义该步骤的同时,还要继续与上一步相同的方向。如果你把上一步的一小部分作为动量项,那么就有继续前进的趋势,这可能会使搜索超过局部最小值。通过使用一个分数,这些步骤会成倍地衰减,所以差的步骤不是一个大问题。当用于训练神经网络时,这种梯度下降总是一种流行的修改,其中梯度下降被称为反向传播。

  • 使用混合搜索。首先使用全局搜索(例如,遗传算法,各种蒙特卡洛方法)来找到一些好的起点,然后应用梯度下降来利用函数中的梯度信息。

我不会推荐使用哪个。相反,我会建议做一些小小的研究,看看别人在解决与你正在做什么有关的问题时所做的一切。如果纯粹是一种学习体验,动力可能是最容易工作的。

+0

你能推荐一些阅读杂交GA与梯度下降 – Alex 2014-11-13 11:32:08

0

有很多事情可以回事:

  • step可能是一个不错的选择
  • 您的衍生物可能会关闭
  • 你的“期望值”可能会被误认为
  • 你的梯度下降可能会慢慢收敛

我会尝试增加运行leng th,并且剧情以各种步骤值运行。一个更小的步骤将有更好的机会避免呃太大的问题。

+0

如果问题来自于局部最小值卡住,那么*更大的步长实际上可能是更好的选择。这将是必要的实验。 – 2012-02-07 06:54:36

+0

对,我甚至没有考虑过陷入局部最低点。但是,如果这是问题,那么最好先做一些梯度下降以外的事情。 – comingstorm 2012-02-07 20:07:42

+0

太扫地了,我会说。基于渐变的方法已经成功地使用了很多次 - 渐变具有很多信息。难题很难,所以我们应该尝试不同的方法。无论如何,不​​管我们使用什么方法,我们都不会在大多数情况下找到全局最优化。 – 2012-02-08 07:57:29