梯度下降法优化 Rosenbrock 函数

a <- 1
b <- 5

rosenbrock <- function(x) {
  x1 <- x[1]
  x2 <- x[2]
  (a - x1)^2 + b * (x2 - x1^2)^2
}

num_iterations <- 1000   # 迭代次数为1000

lr <- 0.01   # 学习率(步长)0.01

# 初始化一个张量,初始值为 (-1, 1),并允许计算梯度。
x <- torch_tensor(c(-1, 1), requires_grad = TRUE)

for (i in 1:num_iterations) {
  # 每100次迭代,输出当前的迭代次数。
  if (i %% 100 == 0) cat("Iteration: ", i, "\n")

  value <- rosenbrock(x)   # 计算当前 x 处的 Rosenbrock 函数值,并在每100次迭代时输出该值。
  if (i %% 100 == 0) {
    cat("Value is: ", as.numeric(value), "\n")
  }
  # 计算函数关于 x 的梯度。
  value$backward()
  if (i %% 100 == 0) {
    cat("Gradient is: ", as.matrix(x$grad), "\n")
  }
  # 使用 with_no_grad 块更新 x 的值:x$sub_(lr * x$grad),即沿梯度的反方向更新 x。
  with_no_grad({
    x$sub_(lr * x$grad)
    x$grad$zero_()   # x清零,用于下次迭代
  })
}
x

展开/折叠结果
Iteration:  100 
Value is:  3.176291e-05
Gradient is:  -0.002168588 -0.004486442
Iteration:  200 
Value is:  1.453024e-05
Gradient is:  -0.001461957 -0.003031492 
Iteration:  300 
Value is:  6.658438e-06
Gradient is:  -0.0009882869 -0.0020504
Iteration:  400 
Value is:  3.055203e-06
Gradient is:  -0.0006686524 -0.001388192
Iteration:  500 
Value is:  1.40284e-06
Gradient is:  -0.0004510169 -0.0009411573
Iteration:  600 
Value is:  6.444936e-07
Gradient is:  -0.0003067786 -0.0006371737
Iteration:  700 
Value is:  2.964038e-07
Gradient is:  -0.000207768 -0.0004321337
Iteration:  800 
Value is:  1.363231e-07
Gradient is:  -0.0001404032 -0.0002932549
Iteration:  900 
Value is:  6.276184e-08
Gradient is:  -9.749157e-05 -0.0001978874
Iteration:  1000 
Value is:  2.8892e-08
Gradient is:  -6.644445e-05 -0.0001341105
> x
torch_tensor
 0.9998
 0.9997
[ CPUFloatType{2} ][ requires_grad = TRUE ]

评论

发表评论

了解 数据控|突破是我们的每一步 的更多信息

立即订阅以继续阅读并访问完整档案。

继续阅读