【问题标题】:Terminate Gradient Descent Algorithm when two iterations are “very similar”当两次迭代“非常相似”时终止梯度下降算法
【发布时间】:2018-04-20 02:31:07
【问题描述】:

我在 R 中实现了梯度下降算法来找到函数 f(x)=1−xe−x 的最小值,它工作得非常好,给我 [1] 1 作为输出,但一直迭代直到所有 30.000 次迭代结束,即使迭代之间只有微小的变化(小数点后面有很多位)。

如何在代码中添加一些函数,以便在最后两次迭代非常相似时立即终止它?

这是我的代码:

# learning rate
epsilon = 0.02

# set up a number of iteration
iter = 30000

# define the gradient of f(x) with given f'(x)
gradient = function(x) return(-exp(-x) + x * exp(-x))

# randomly initialize the x
x = 8

# create a vector to contain all xs for all steps
x.All = vector("numeric",iter)

# gradient descent method to find the minimum
for(i in 1:iter){
  x = x - epsilon*gradient(x)
  x.All[i] = x
  print(x)
}

我尝试了添加以下内容但没有效果。

round (x, digits = 3)
if (x == x - epsilon*gradient) {
break}

我想浮点数 x 永远不会等于 x - epsilon*gradient 吗?

【问题讨论】:

  • 我永远不会说永远。但是,对于这种情况,最好使用类似abs(old_x - new_x) <= small_value 这样的条件来终止 for 循环。

标签: r terminate gradient-descent


【解决方案1】:

您考虑的停止规则有问题:

if (x == x - epsilon*gradient) break

仅当epsilon * gradient 正好为零时才会满足条件,但当该数量足够接近零时,循环应该停止。因此,例如,如果 espilon=1 并将 eps2 定义为一个小数(0.0001),则

if (abs(gradient(x)) < eps2) break

会起作用的。

【讨论】:

  • 完美运行。新语法在达到“iter”数量之前停止迭代,当它足够接近时。我刚刚将你的 if 语句集成到我的 for 语句中。
猜你喜欢
  • 2020-10-17
  • 2016-06-13
  • 2019-02-27
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2017-07-17
相关资源
最近更新 更多