始める無料で始める

完全な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)
コードを編集して実行