完全なDQNアルゴリズムの実装
ついにこの時が来ました!前提となる準備はすべて整いました。ここではDQNアルゴリズムをフル実装し、Lunar Landerエージェントの学習に使います。つまり、Experience Replay だけでなく、Decayed Epsilon-Greediness と Fixed Q-Targets も用いるということです。
Decayed Epsilon Greediness を実装した select_action() 関数と、前の演習で作成した update_target_network() 関数は用意されています。あとはそれらの関数をDQNの学習ループに組み込み、損失の計算でターゲットネットワークを正しく使えていることを確認するだけです。
時間とともに \(\varepsilon\) の値を減衰させるために、新しいステップカウンタ total_steps を管理する必要があります。この変数は初期値0で初期化済みです。
この演習はコースの一部です
Pythonで学ぶDeep Reinforcement Learning
演習の手順
select_action()を使って Decayed Epsilon Greediness を実装し、エージェントの行動を選びます。エピソードをまたいだ累計であるtotal_stepsを使用してください。- TDターゲットを計算する前に、勾配の追跡をオフにします。
- 次状態を得たら、次状態のQ値を取得します。
- 各ステップの最後にターゲットネットワークを更新します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
for episode in range(10):
state, info = env.reset()
done = False
step = 0
episode_reward = 0
while not done:
step += 1
total_steps += 1
q_values = online_network(state)
# Select the action with epsilon greediness
action = ____(____, ____, start=.9, end=.05, decay=1000)
next_state, reward, terminated, truncated, _ = env.step(action)
done = terminated or truncated
replay_buffer.push(state, action, reward, next_state, done)
if len(replay_buffer) >= batch_size:
states, actions, rewards, next_states, dones = replay_buffer.sample(64)
q_values = online_network(states).gather(1, actions).squeeze(1)
# Ensure gradients are not tracked
with ____:
# Obtain the next state Q-values
next_q_values = ____(next_states).amax(1)
target_q_values = rewards + gamma * next_q_values * (1-dones)
loss = nn.MSELoss()(q_values, target_q_values)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# Update the target network weights
____(____, ____, tau=.005)
state = next_state
episode_reward += reward
describe_episode(episode, reward, episode_reward, step)