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 ]
发表评论