梯度下降实施

And*_*rew 4 algorithm gradient

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

1 to m {  
 theta(j):=theta(j)-step*derivative (for all j)  
} 
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_*ber 17

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

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

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

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

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

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

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

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