Почему моя модель RL не ведет себя так же после загрузки в pytorch? - PullRequest
0 голосов
/ 03 октября 2018

Я обучаю несколько простых нейронных сетей для обучения подкреплению в Pytorch.В конце обучения я сохраняю модель следующим образом:

torch.save(self.policy_NN.state_dict(), self.model_fname)

На данный момент все идет хорошо.Затем позже, в другом сценарии, я загружаю его снова, вот так:

self.policy_NN.load_state_dict(torch.load(model_fname))

И затем просто разыгрываю эпизод, как будто тренировка никогда не прекращалась (за исключением того, что я больше не занимаюсь изучением DQN, этопросто жадное действие в каждой точке).Поэтому я ожидаю, что он будет вести себя в основном так же, как когда я его сохранял.

Однако всякий раз, когда я загружаю его, он ведет себя совершенно по-другому, до такой степени, что кажется, что он не учился вообще, прежде чем я его сохранил.Например, если я посмотрю на последние 1000 временных шагов учебного сеанса, он получит много наград, но после загрузки он не получит ничего.

Я подтвердил (выполнив print(self.policy_NN.state_dict()))что вес и смещение фактически одинаковы при сохранении модели и при ее повторной загрузке.

Что может происходить?Есть ли в сети что-то еще, что не может быть каким-то образом спасено?

1 Ответ

0 голосов
/ 04 октября 2018

Dropout и некоторые другие слои ведут себя по-разному в режимах eval и train.Вы можете переключаться между ними с помощью model.train() и model.eval().

Я помню, что читал, что RL, как правило, страдает от хрупкого обучения, когда изменение входных данных даже незначительно вызывает дико различную производительность.Например, когда вы тренировали алгоритм в игре Atari и просто смещали экран вправо на один пиксель, сеть теряла все приросты производительности.

Возможно, вы захотите проверить, что в обоих режимах ваша среда ведет себя одинаково.

...