【发布时间】:2020-05-18 13:25:04
【问题描述】:
我正在尝试训练一个模型,但它不起作用,因为当我调用以下命令时权重没有更新:
self.optimizer = Adam(self.PPO.parameters(), lr=0.1, eps=epsilon)
total_loss = Variable(policy_loss + 0.5*value_loss - entropy_loss.mean() * 0.01, requires_grad=True)
self.optimizer.zero_grad()
(total_loss * 10).backward()
self.optimizer.step()
当我打印权重时,它们都是相同的(损失不为零,学习率设置为 0.1),当我比较它们时(即使在每个参数上调用 clone())它总是返回 True . Total loss 也有 grad_fn 属性...优化器是在我的代理类的构造函数中创建的。
我的代码基于此存储库: https://github.com/andreiliphd/tennis-ppo/blob/master/agent.py
这是我的代理构造函数:
def __init__(self, PPO, learning_rate, epsilon, discount_rate, entropy_coefficient, ppo_clip, gradient_clip,
rollout_length, tau):
self.PPO = PPO
self.learning_rate = learning_rate
self.epsilon = epsilon
self.discount_rate = discount_rate
self.entropy_coefficient = entropy_coefficient
self.ppo_clip = 0.2
self.gradient_clip = 5
self.rollout_length = rollout_length
self.tau = tau
self.optimizer = Adam(self.PPO.actor.parameters(), lr=0.1, eps=epsilon)
self.device = torch.device('cpu')
这是我的 PPO 类,它创建了两个具有前向功能的网络和一些隐藏层
class PPO(nn.Module):
def __init__(self, state_shape, action_num, mlp_layers, device=torch.device('cpu')):
super(PPO, self).__init__()
self.state_shape = state_shape
self.action_num = action_num
self.mlp_layers = mlp_layers
self.device = torch.device('cpu')
layer_dims = [np.prod(self.state_shape)] + self.mlp_layers
self.actor = PPO_Network(state_shape, action_num, layer_dims, True)
self.actor = self.actor.to(device)
self.critic = PPO_Network(state_shape, 1, layer_dims, False)
self.critic = self.critic.to(device)
self.to(device)
非常欢迎任何关于为什么会发生这种情况的迹象,以及我所忽略的内容。 :) 如果需要,我可以提供更多信息或代码。
【问题讨论】: