Эпизоды Keras-RL, возвращающие одинаковые значения после подгонки модели
Поэтому я создал пользовательскую среду с использованием OpenAI Gym. Я внимательно слежу за примерами keras-rl DQNAgent для примера CartPole, что приводит к следующей реализации:
nb_actions = env.action_space.n
# Option 1 : Simple model
model = Sequential()
model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
model.add(Dense(nb_actions))
model.add(Activation('linear'))
# Next, we build a very simple model.
#model = Sequential()
#model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
#model.add(Dense(16))
#model.add(Activation('relu'))
#model.add(Dense(16))
#model.add(Activation('relu'))
#model.add(Dense(16))
#model.add(Activation('relu'))
#model.add(Dense(nb_actions, activation='linear'))
#model.add(Activation('linear'))
# Finally, we configure and compile our agent. You can use every built-in Keras optimizer and # even the metrics!
memory = SequentialMemory(limit=50000, window_length=1)
policy = BoltzmannQPolicy()
dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10, target_model_update=1e-2, policy=policy)
dqn.compile(Adam(lr=1e-3), metrics=['mae'])
# Okay, now it's time to learn something! We visualize the training here for show, but this # slows down training quite a lot. You can always safely abort the training prematurely using # Ctrl + C.
dqn.fit(env, nb_steps=2500, visualize=False, verbose=2)
# After training is done, we save the final weights.
dqn.save_weights('dqn_{}_weights.h5f'.format(ENV_NAME), overwrite=True)
# Finally, evaluate our algorithm for 5 episodes.
dqn.test(env, nb_episodes=10, visualize=False)
Так что все выглядит так, как я ожидал до вызова функции dqn.test. Пример вывода из dqn.fit выглядит следующим образом:
... 1912/2500: эпизод 8, продолжительность: 1,713 с, шаг эпизода: 239, шаг в секунду: 139, награда за эпизод: -78,774, средняя награда: -0,330 [-27928,576, 18038,443], среднее действие: 0,657 [0,000, 2,000], среднее наблюдение: 8825,907 [5947,400, 17211,920], потеря: 7792970.500000, mean_absolute_error: 653,732361, среднее_q: 1,000000
2151/2500: эпизод: 9, продолжительность: 1.790 с, шаги эпизода: 239, шаг в секунду: 134, награда за эпизод: -23335.055, средняя награда: -97.636 [-17918.534, 17819.400], среднее действие: 0.636 [0.000, 2.000], среднее наблюдение: 8825,907 [5947,400, 17211,920], потеря: 8051206,500000, mean_absolute_error: 676,335266, среднее_q: 1,000000
2390/2500: эпизод: 10, продолжительность: 1.775 с, шаги эпизода: 239, шаг в секунду: 135, награда за эпизод: 16940.150, средняя награда: 70.879 [-25552.948, 17819.400], среднее действие: 0.611 [0.000, 2.000], среднее наблюдение: 8825,907 [5947,400, 17211,920], потеря: 8520963,000000, mean_absolute_error: 690.176819, mean_q: 1,000000
Поскольку различные награды различны, мне кажется, что примерка работает так, как ожидалось. Но когда метод dqn.test запущен, он продолжает генерировать одинаковые выходные данные для каждого эпизода. В случае данных, которые я использую, отрицательные вознаграждения - это плохо, а положительные вознаграждения - это хорошо.
Вот результат запуска тестового метода:
Тестирование на 10 эпизодов
- Эпизод 1: награда: -62996,100, шаги: 239
- Эпизод 2: награда: -62996.100, шаги: 239
- Эпизод 3: награда: -62996.100, шаги: 239
- Эпизод 4: награда: -62996.100, шаги: 239
- Эпизод 5: награда: -62996.100, шаги: 239
- Эпизод 6: награда: -62996.100, шаги: 239
- Эпизод 7: награда: -62996.100, шаги: 239
- Эпизод 8: награда: -62996.100, шаги: 239
- Эпизод 9: награда: -62996.100, шаги: 239
- Эпизод 10: награда: -62996.100, шаги: 239
Это приводит меня к двум вопросам:
1) Почему за каждый эпизод награды одинаковы?
2) Почему модель может рекомендовать ряд действий, которые приводят к ужасным вознаграждениям?
2 ответа
Я бы проверил объект env и посмотрел, есть ли у него там вычисления вознаграждений.
Мне интересно, если функция.fit по какой-то причине не исследует пространство состояний.
Недавно я делал проект RL (лунный аппарат) с открытым ИИ-тренажерным залом и Keras, хотя я не использовал агента DQN и другие Keras, встроенные в RL. Я просто построил простую сеть feedforwad. Проверьте эту ссылку GitHub, посмотрите, полезно ли это? https://github.com/tianchuliang/techblog/tree/master/OpenAIGym
Я нашел репозиторий github, который почти соответствует вашему коду, однако, когда вы его запускаете, значение не остается прежним. Вот он: https://github.com/Anonymous-Ol/Keras-RL-Examples