利用自动微分来计算梯度并优化函数

# 加载torch包
library(torch)

# 设置常量a和b
a <- 1
b <- 5

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

# 迭代数2
num_iterations <- 2

# x被初始化为一个值为-1和1的张量k
# 并且requires_grad = TRUE表示需要为该张量计算梯度。
x <- torch_tensor(c(-1, 1), requires_grad = TRUE)

# optimizer使用optim_lbfgs设置
# 这是L-BFGS优化算法的实现
# line_search_fn参数设置为"strong_wolfe",这是一种线搜索方法
optimizer <- optim_lbfgs(x, line_search_fn = "strong_wolfe")

# calc_loss函数用于清零现有的梯度,计算Rosenbrock函数的值
# 显示该值,然后调用backward()来计算梯度。
calc_loss <- function() {
  optimizer$zero_grad()

  value <- rosenbrock(x)
  cat("Value is: ", as.numeric(value), "\n")

  value$backward()
  value
}

# 循环运行指定的迭代次数(num_iterations)
# 在每次迭代中,打印迭代次数并调用optimizer$step(calc_loss)
# 这会使用L-BFGS算法执行一次优化步骤。
for (i in 1:num_iterations) {
  cat("\nIteration: ", i, "\n")
  optimizer$step(calc_loss)
}

评论

发表评论

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

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

继续阅读