TL; DR - использование генератора не удается, использование списка успешно.почему?
Я пытаюсь вручную изменить параметры моей модели следующим образом:
(1-й код, работает)
delta = r_t + gamma * expected_reward_from_t1.data - expected_reward_from_t.data
negative_expected_reward_from_t = -expected_reward_from_t
self.critic_optimizer.zero_grad()
negative_expected_reward_from_t.backward()
for i, p in enumerate(self.critic_nn.parameters()):
if not p.requires_grad:
continue
p.grad[:] = delta.squeeze() * discount * p.grad
self.critic_optimizer.step()
и кажется, что он сходится к правильному результату в 100% случаев.
Однако
При попытке использовать функцию, подобную этой:
(2-й код, сбой)
def _update_grads(self,delta, discount):
params = self.critic_nn.parameters()
for i, p in enumerate(params):
if not p.requires_grad:
continue
p.grad[:] = delta.squeeze() * discount * p.grad
, а затем
delta = r_t + gamma * expected_reward_from_t1.data - expected_reward_from_t.data
negative_expected_reward_from_t = -expected_reward_from_t
self.critic_optimizer.zero_grad()
negative_expected_reward_from_t.backward()
self._update_grads(delta=delta,
discount=discount)
self.critic_optimizer.step()
, что, похоже, единственное, что я сделал, это поместил self.critic_nn.parameters()
во временныйлокальная переменная params
,
Теперь сеть не сходится.
(3-й код, опять же, работает)
При замене в методе _update_grads
: params = self.critic_nn.parameters()
на params = list(self.critic_nn.parameters())
Теперь снова сходимость восстанавливается.
Это похоже на проблему с ссылками, которая в PyTorchЯ не совсем понимаю.Кажется, я не до конца понимаю, что возвращает параметр ()
Вопрос: почему 1-й и 3-й коды работают, а 2-й не работает?