Расходящиеся потери в PPO + ICM с использованием LSTM - PullRequest
0 голосов
/ 12 июля 2019

Я пытался внедрить Proximal Policy Optimization с помощью награды за внутреннее любопытство для полной нейронной сети LSTM.

Потери как в PPO, так и в ICM расходятся, и я хотел бы выяснить, является ли ее ошибка в коде или неправильно выбраннойгиперпараметры.

Код (где может быть неправильная реализация):

  • В модели ICM я также использую первый уровень LSTM для соответствия входным измерениям.
  • В целом ICMнабор данных распространяется сразу, с нулями в качестве начального скрытого (результирующие тензоры отличаются, чем они были бы, если бы я распространял только 1 состояние или пакет и повторно использовал скрытые ячейки)
  • В обработке преимуществ PPO и вознаграждения скидкинабор данных распространяется одна за другой, и скрытые ячейки используются повторно (в точности наоборот, чем в ICM, потому что здесь он использует ту же модель для выбора действий, а этот подход «в реальном времени»)
  • В модели обучения PPOобучается партиями с повторным использованием скрытых ячеек

Я использовал https://github.com/adik993/ppo-pytorch как код по умолчаниюи переработал его для работы в моей среде и использования LSTM

. Я могу предоставить образцы кода позже, если это будет запрошено специально из-за большого количества строк

Гиперпараметры:

def __init_curiosity(self):
        curiosity_factory=ICM.factory(MlpICMModel.factory(), policy_weight=1,
                                      reward_scale=0.1, weight=0.2,
                                      intrinsic_reward_integration=0.01,
                                      reporter=self.reporter)
        self.curiosity = curiosity_factory.create(self.state_converter,
                                                  self.action_converter)
        self.curiosity.to(self.device, torch.float32)
        self.reward_normalizer = StandardNormalizer()

def __init_PPO_trainer(self):
        self.PPO_trainer = PPO(agent = self,
                               reward = GeneralizedRewardEstimation(gamma=0.99, lam=0.95),
                               advantage = GeneralizedAdvantageEstimation(gamma=0.99, lam=0.95),
                               learning_rate = 1e-3,
                               clip_range = 0.3,
                               v_clip_range = 0.3,
                               c_entropy = 1e-2,
                               c_value = 0.5,
                               n_mini_batches = 32,
                               n_optimization_epochs = 10,                               
                               clip_grad_norm = 0.5)
        self.PPO_trainer.to(self.device, torch.float32)

Графики тренировок:

(обратите внимание на большие числа по оси Y)

''

''

''

''

''

''


ОБНОВЛЕНИЕ

На данный момент я переработал обработку LSTM для использования пакетов и скрытой памятина всех местах (как для основной модели, так и для ICM), но проблема все еще присутствует.Я проследил это до выхода из модели ICM, здесь выходные данные расходятся в основном в action_hat тензор.

1 Ответ

0 голосов
/ 13 июля 2019

Обнаружена проблема ... В основной модели я использую softmax для пробных прогонов и log_softmax для обучения в выходном слое, а в соответствии с документацией PyTorch CrossEntropyLoss использует log_softmax внутри, поэтому я рекомендовал использовать NLLLoss , но для расчета потерь модели ICM, у которых нет softmax fnc в выходном слое!Таким образом, переключение обратно на CrossEntropyLoss (которое изначально было в ссылочном коде) решило расхождение потерь ICM.

...