R:执行梯度下降

R: Performing Gradient Descent

我正在使用 R 编程语言。

我想了解更多关于优化算法的知识,作为学习练习 - 我想尝试 使用 R 编程语言使用(著名的)梯度下降算法优化数学函数。

例如,我想尝试“优化”(即找出产生“y”的最小可能值的“x1 和 x2”的值)以下函数(此函数称为 Rastrign 函数,由于其不规则和复杂的形状,是测试优化算法的流行函数):

我首先在R中定义了这个函数:

   Rastrigin <- function(x)
    {
        return(20 + x[1]^2 + x[2]^2 - 10*(cos(2*pi*x[1]) + cos(2*pi*x[2])))
    }

然后,我尝试做一些研究,看看在 R 中是否有任何标准和通用的梯度下降实现。例如,我发现了 (base) R 中的“optim()”函数,它提供多种流行的优化算法选择,例如“BFGS”、“模拟退火”和“Nelder-Meade”。例如,下面我使用了“BFGS”算法的变体来优化 Rastrign 函数:

#run BFGS optimization algorithm:

optim(par = c(2,2), Rastrigin, lower = c(-5,-5), upper = c(5,5), method = "L-BFGS-B")


$par
[1] 5.453531e-15 5.453531e-15

$value
[1] 0

$counts
function gradient 
       7        7 

$convergence
[1] 0

$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"

根据上述代码的结果,BFGS 算法似乎能够通过返回非常接近真实最小值的 x1 和 x2 值成功找到该函数的最小值(使用三角函数,我们可以看出如果"x1 = x2 = 0", f(x1,x2) = 20 + 0 + 0 - 10*(cos(0) + cos(0)) = 20 - 10*2 = 20 - 20 = 0 ).

我的问题:我试图在 R 中寻找一个允许您执行梯度下降优化的标准函数,但我找不到任何东西。

有谁知道R中有没有梯度下降优化的标准函数?有人可以告诉我怎么做吗?

谢谢!

参考文献:

如评论中所述,(我刚刚了解到)“梯度下降”与“最速下降”相同:

library(pracma)

> steep_descent(c(1, 1), Rastrigin)

$xmin
[1] 0.9949586 0.9949586

$fmin
[1] 1.989918

$niter
[1] 3