梯度下降实施

时间:2012-02-06 16:49:28

标签: algorithm gradient

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

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

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

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

2 个答案:

答案 0 :(得分:17)

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

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

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

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

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

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

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

我不会建议使用哪种方法。相反,我建议做一些研究,看看别人对你正在做的事情有什么问题。如果它纯粹是一种学习体验,那么动力可能是最容易实现的。

答案 1 :(得分:0)

有很多事情可以发生:

  • 您的step可能是一个糟糕的选择
  • 您的衍生品可能已关闭
  • 您的“预期价值”可能会被误认为
  • 你的渐变下降可能会很慢收敛

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

相关问题