エントロピー・ボーナスとPPO

Pythonで学ぶDeep Reinforcement Learning

Timothée Carayol

Principal Machine Learning Engineer, Komment

エントロピー・ボーナス

 

 

  • 方策勾配は決定的ポリシーに崩壊し得る
  • 解決策: エントロピー・ボーナスを追加
  • エントロピーは分布の不確実性を測る!

巨大な岩が目前にあり前進できない火星探査車。

Pythonで学ぶDeep Reinforcement Learning

確率分布のエントロピー

 

離散確率変数Xのエントロピー(ビット)は H(X) = - Σ_x p(x) log_2 p(x) と定義される

  • $\log_2$ の代わりに $\ln$ なら単位はナット(nats)
  • $1\ nat = \frac{1}{\ln 2}\ bit \approx 1.44\ bit$

4つの行動に一様な確率0.25の確率的ポリシー。エントロピーは2ビット。

4つの行動のうち2つに等確率、他は0。エントロピーは1ビット。

1つの行動に確率1が集中。エントロピーは0ビット。

Pythonで学ぶDeep Reinforcement Learning

エントロピー・ボーナスの実装

def select_action(policy_network, state):
  action_probs = policy_network(state)
  action_dist = Categorical(action_probs)
  action = action_dist.sample()
  log_prob = action_dist.log_prob(action)

# Obtain the entropy of the policy entropy = action_dist.entropy()
return (action.item(), log_prob.reshape(1), entropy)
  • Actor損失: actor_loss -= c_entropy * entropy
  • 注意: Categorical.entropy() はナット単位。ビットにするには math.log(2) で割る
Pythonで学ぶDeep Reinforcement Learning

PPOの学習ループ

for episode in range(10):
  state, info = env.reset()
  done = False
  while not done:
    action, action_log_prob, entropy = select_action(actor, state)
    next_state, reward, terminated, truncated, _ = env.step(action)
    done = terminated or truncated
    actor_loss, critic_loss = calculate_losses(critic, action_log_prob, action_log_prob,
                                               reward, state, next_state, done)
    actor_loss -= c_entropy * entropy
    actor_optimizer.zero_grad(); actor_loss.backward(); actor_optimizer.step()
    critic_optimizer.zero_grad(); critic_loss.backward(); critic_optimizer.step()
    state = next_state
Pythonで学ぶDeep Reinforcement Learning

バッチ更新によるPPOへ

 

  • 各ステップ更新: PPO目的関数を活かし切れていない
  • 各ステップでは $\theta$ は実際には $\theta_{old}$ と一致
  • 完全なPPOはこれを分離:
    • パラメータ更新(ミニバッチ)
    • ポリシー更新(ロールアウト)
Pythonで学ぶDeep Reinforcement Learning

Passons à la pratique !

Pythonで学ぶDeep Reinforcement Learning

Preparing Video For Download...