そこで、OpenAI Gym を使用してカスタム環境を作成しました。次の実装につながる CartPole の例の DQNAgent の keras-rl の例を厳密にフォローしています。
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、1 秒あたりのステップ数: 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、mean_q: 1.000000
2151/2500: エピソード: 9、期間: 1.790 秒、エピソード ステップ: 239、1 秒あたりのステップ数: 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、mean_q: 1.000000
2390/2500: エピソード: 10、期間: 1.775 秒、エピソード ステップ: 239、1 秒あたりのステップ数: 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
これは私に2つの質問を導きます:
1) 各エピソードの報酬が同じなのはなぜですか?
2) なぜモデルはひどい報酬につながる一連のアクションを推奨するのでしょうか?