当两次迭代“非常相似”时终止梯度下降算法
Terminate Gradient Descent Algorithm when two iterations are “very similar”
我在 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 吗?
您考虑的停止规则有问题:
if (x == x - epsilon*gradient) break
只有当 epsilon * gradient
正好为零时才会满足条件,但是当该数量足够接近零时循环应该停止。因此,例如,如果 espilon=1
并将 eps2
定义为一个小数字 (0.0001),则此
if (abs(gradient(x)) < eps2) break
会起作用。
我在 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 吗?
您考虑的停止规则有问题:
if (x == x - epsilon*gradient) break
只有当 epsilon * gradient
正好为零时才会满足条件,但是当该数量足够接近零时循环应该停止。因此,例如,如果 espilon=1
并将 eps2
定义为一个小数字 (0.0001),则此
if (abs(gradient(x)) < eps2) break
会起作用。