【发布时间】:2022-01-06 20:11:45
【问题描述】:
我正在学习策略梯度,但我很难理解梯度如何通过随机操作。来自here:It is not possible to directly backpropagate through random samples. However, there are two main methods for creating surrogate functions that can be backpropagated through。
他们有一个score function的例子:
probs = policy_network(state)
# Note that this is equivalent to what used to be called multinomial
m = Categorical(probs)
action = m.sample()
next_state, reward = env.step(action)
loss = -m.log_prob(action) * reward
loss.backward()
我试图创建一个示例:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.distributions import Normal
import matplotlib.pyplot as plt
from tqdm import tqdm
softplus = torch.nn.Softplus()
class Model_RL(nn.Module):
def __init__(self):
super(Model_RL, self).__init__()
self.fc1 = nn.Linear(1, 20)
self.fc2 = nn.Linear(20, 30)
self.fc3 = nn.Linear(30, 2)
def forward(self, x):
x1 = self.fc1(x)
x = torch.relu(x1)
x2 = self.fc2(x)
x = torch.relu(x2)
x3 = softplus(self.fc3(x))
return x3, x2, x1
# basic
net_RL = Model_RL()
features = torch.tensor([1.0])
x = torch.tensor([1.0])
y = torch.tensor(3.0)
baseline = 0
baseline_lr = 0.1
epochs = 3
opt_RL = optim.Adam(net_RL.parameters(), lr=1e-3)
losses = []
xs = []
for _ in tqdm(range(epochs)):
out_RL = net_RL(x)
mu, std = out_RL[0]
dist = Normal(mu, std)
print(dist)
a = dist.sample()
log_p = dist.log_prob(a)
out = features * a
reward = -torch.square((y - out))
baseline = (1-baseline_lr)*baseline + baseline_lr*reward
loss = -(reward-baseline)*log_p
opt_RL.zero_grad()
loss.backward()
opt_RL.step()
losses.append(loss.item())
这似乎神奇地工作得很好,我不明白渐变是如何通过的,因为他们提到它不能通过随机操作(但后来不知何故)。
现在由于梯度无法通过我尝试替换的随机操作
mu, std = out_RL[0] 和 mu, std = out_RL[0].detach() 导致错误:
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn。如果梯度不通过随机操作,我不明白为什么要在操作之前分离张量。
【问题讨论】:
-
我觉得这个页面有助于解释这一点:discuss.pytorch.org/t/…
标签: python pytorch reinforcement-learning backpropagation