Вопрос к знатокам. Во всех виденных мной версиях класса NoisyLinear (линейный слой реализующий NoisyNetworks) сделана одна фундаментальная ошибка относительно метода описанного в статье. Шум сэмплируется на каждом вызове forward(), хотя, в статье написано что шум меняется только изредка.
Как мне кажется, это довольно существенно, так как если мы сэмплируем шум лишь иногда, мы работаем с ансамблем политик, каждая из которых генерирует нам свою траекторию. Но если мы передергиваем шум на каждый forward(), это уже не получается directed exploration, а по сути тот же самый epsilon-greedy, только параметризованный.
Я пока эти подходы не сравнивал, может кто-то до меня это заметил. Вот, например, две версии NoisyLinear (одна моя, другая из catalyst), и в обоих описанная проблема:
https://github.com/catalyst-team/catalyst/blob/f1a6b7e40b06abaf87de981508ee505bf355681d/catalyst/contrib/modules/noisy.py#L7https://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On/blob/master/Chapter07/lib/dqn_model.py#L9Хотя, как мне кажется, должно быть как-то так:
https://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On-Second-Edition/blob/master/Chapter21/lib/dqn_extra.py#L19