在 PyTorch 中使用反向传播和梯度下降寻找参数
Finding parameters with backpropagation and gradient descent in PyTorch
我正在试验 PyTorch、自微分和梯度下降
为此,我想估计会在参数函数中对任意线性产生特定值的参数。
我的代码在这里:
import torch
X = X.astype(float)
X = np.array([[3.], [4.], [5.]])
X = torch.from_numpy(X)
X.requires_grad = True
W = np.random.randn(3,3)
W = np.triu(W, k=0)
W = torch.from_numpy(W)
W.requires_grad = True
out = 10 - (X@torch.transpose(X, 1,0) * W).sum()
out
是:
我的objective是通过W
的梯度调整W
使out
接近0(在[-.00001 , 0.0001]
的区间内)。
我应该如何从这里开始用 pytorch 实现这个目标?
更新
@Umang:这就是我 运行 你建议的代码时得到的结果:
实际上算法是发散的。
# your code as it is
import torch
import numpy as np
X = np.array([[3.], [4.], [5.]])
X = torch.from_numpy(X)
X.requires_grad = True
W = np.random.randn(3,3)
W = np.triu(W, k=0)
W = torch.from_numpy(W)
W.requires_grad = True
# define parameters for gradient descent
max_iter=100
lr_rate = 1e-3
# we will do gradient descent for max_iter iteration, or convergence till the criteria is met.
i=0
out = compute_out(X,W)
while (i<max_iter) and (torch.abs(out)>0.01):
loss = (out-0)**2
W = W - lr_rate*torch.autograd.grad(loss, W)[0]
i+=1
print(f"{i}: {out}")
out = compute_out(X,W)
print(W)
我们定义了一个损失函数,使其最小值位于所需点和 运行 梯度下降。在这里,我使用了平方误差,但您也可以使用其他具有所需最小值的损失函数。
我正在试验 PyTorch、自微分和梯度下降
为此,我想估计会在参数函数中对任意线性产生特定值的参数。
我的代码在这里:
import torch
X = X.astype(float)
X = np.array([[3.], [4.], [5.]])
X = torch.from_numpy(X)
X.requires_grad = True
W = np.random.randn(3,3)
W = np.triu(W, k=0)
W = torch.from_numpy(W)
W.requires_grad = True
out = 10 - (X@torch.transpose(X, 1,0) * W).sum()
out
是:
我的objective是通过W
的梯度调整W
使out
接近0(在[-.00001 , 0.0001]
的区间内)。
我应该如何从这里开始用 pytorch 实现这个目标?
更新
@Umang:这就是我 运行 你建议的代码时得到的结果:
实际上算法是发散的。
# your code as it is
import torch
import numpy as np
X = np.array([[3.], [4.], [5.]])
X = torch.from_numpy(X)
X.requires_grad = True
W = np.random.randn(3,3)
W = np.triu(W, k=0)
W = torch.from_numpy(W)
W.requires_grad = True
# define parameters for gradient descent
max_iter=100
lr_rate = 1e-3
# we will do gradient descent for max_iter iteration, or convergence till the criteria is met.
i=0
out = compute_out(X,W)
while (i<max_iter) and (torch.abs(out)>0.01):
loss = (out-0)**2
W = W - lr_rate*torch.autograd.grad(loss, W)[0]
i+=1
print(f"{i}: {out}")
out = compute_out(X,W)
print(W)
我们定义了一个损失函数,使其最小值位于所需点和 运行 梯度下降。在这里,我使用了平方误差,但您也可以使用其他具有所需最小值的损失函数。