首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >梯度下降实现

梯度下降实现
EN

Stack Overflow用户
提问于 2012-02-07 00:49:28
回答 2查看 6.2K关注 0票数 4

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

代码语言:javascript
复制
1 to m {  
 theta(j):=theta(j)-step*derivative (for all j)  
} 

我的问题是,即使成本函数变得越来越小,测试表明它并不好。如果我稍微改变一下步长,改变迭代次数,代价函数的值会大一点,但结果是好的。这是一种过度的“症状”吗?我如何知道哪一个是正确的?:)

正如我所说的,即使成本函数更加最小化,测试表明它也不是很好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-07 14:51:08

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

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

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

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

  • 增加噪音。这降低了你已经找到的参数的精度,这可能会“模糊”出局部最小值。然后,搜索可以跳出与噪声相比较小的局部最小值,同时仍然陷入更深的最小值。添加噪声的一种众所周知的方法是simulated annealing
  • 增加了动力。除了使用当前渐变来定义步骤外,还可以按照与上一步相同的方向继续。如果你把上一步的一小部分作为动量项,就会有继续前进的趋势,这可能会使搜索超过局部最小值。通过使用分数,步数会呈指数衰减,所以步长不好不是大问题。当用于训练神经网络时,这一直是对梯度下降的一种流行的修改,其中梯度下降被称为反向传播。
  • 使用混合搜索。首先使用全局搜索(例如,遗传算法,各种蒙特卡罗方法)找到一些好的起点,然后应用梯度下降来利用函数中的梯度信息。

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

票数 17
EN

Stack Overflow用户

发布于 2012-02-07 03:56:52

可能发生的事情有很多:

  • 你的step可能是一个糟糕的选择
  • 你的导数可能偏离
  • 你的“期望值”可能是错误的
  • 你的梯度下降可能只是收敛很慢<代码>H29<代码>F210

我会尝试增加游程长度,并使用各种步长绘制游程。步子越小,呃步子越大,避免问题的机会就越大。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9163801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档