【问题标题】:Gradient descent implementation梯度下降实现
【发布时间】:2012-02-06 16:49:28
【问题描述】:

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

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

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

正如我所说,即使成本函数被最小化,但测试表明它并不好。

【问题讨论】:

  • @MichaelJ.Barber 例如,期望值为 0.35,我得到 0.65。这是一个区别。但是,使用不同的步骤和迭代次数,我可以得到 0.35。问题是,当我获得正确的参数时,我如何才能在更大的范围内知道?
  • @MichaelJ.Barber 并且即使成本函数值更小(它更小),测试值也离正确的值很远,而价值稍大的成本函数提供了正确的值用于测试示例。
  • 您应该将您的 cmets 编辑到您的问题中。谈谈如何初始化参数和正在优化的函数可能也会有所帮助。

标签: algorithm gradient


【解决方案1】:

梯度下降是一种用于最小化函数的局部搜索方法。当它在参数空间中达到局部最小值时,它将无法继续前进。这使得梯度下降(和其他局部方法)容易陷入局部最小值,而不是达到全局最小值。对于您要实现的目标,局部最小值可能是也可能不是很好的解决方案。期望什么取决于您尝试最小化的功能。

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

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

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

  • 添加噪音。这会降低您找到的参数的精度,这可能会“模糊”局部最小值。然后搜索可以跳出与噪声相比较小的局部最小值,同时仍被困在更深的最小值中。一种众所周知的添加噪声的方法是simulated annealing

  • 增加动力。除了使用当前梯度来定义步骤外,还要沿与上一步相同的方向继续。如果您将上一步的一小部分作为动量项,则有继续前进的趋势,这可能会使搜索超过局部最小值。通过使用分数,步数呈指数衰减,因此差的步数不是大问题。当用于训练神经网络时,这一直是对梯度下降的流行修改,其中梯度下降被称为反向传播。

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

我不会推荐使用哪个。相反,我建议做一些研究,看看其他人对与你正在处理的问题相关的问题做了什么。如果它纯粹是一种学习体验,那么动量可能是最容易上手的。

【讨论】:

  • 你能推荐一些关于混合遗传算法和梯度下降的阅读
【解决方案2】:

可能会发生很多事情:

  • 你的step 可能是个糟糕的选择
  • 您的衍生产品可能已关闭
  • 您的“预期值”可能有误
  • 您的梯度下降可能只是收敛缓慢

我会尝试增加运行长度,并绘制具有各种步长值的运行。较小的步骤将有更好的机会避免,呃,步骤太大的问题。

【讨论】:

  • 如果问题来自陷入局部最小值,更大的步长实际上可能是更好的选择。有必要进行实验。
  • 对,我什至没有考虑过陷入局部最小值。但如果这是问题所在,那么最好首先做一些梯度下降以外的事情。
  • 太笼统了,我想说。基于梯度的方法已经成功使用了很多次——梯度有很多的信息。困难的问题很难,所以我们应该尝试不同的方法。无论如何,无论我们使用什么方法,在大多数情况下,我们都不会找到全局最优值。
猜你喜欢
  • 1970-01-01
  • 2016-09-25
  • 2014-03-14
  • 2012-05-22
  • 2021-02-20
  • 2011-07-04
  • 2019-08-08
  • 2015-07-10
  • 2020-11-15
相关资源
最近更新 更多