Бонус ентропії та PPO

Глибоке навчання з підкріпленням у Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

Бонус ентропії

 

 

  • Алгоритми градієнта політики можуть скочуватися до детермінованих політик
  • Рішення: додати бонус ентропії
  • Ентропія вимірює невизначеність розподілу!

Марсохід не може рухатись далі через величезний камінь прямо перед ним.

Глибоке навчання з підкріпленням у Python

Ентропія розподілу ймовірностей

 

Ентропія дискретної випадкової величини X у бітах: H(X) = - сума за x p(x) log_2 p(x)

  • Якщо $\ln$ замість $\log_2$: результат у $nats$.
  • $1\ nat = \frac{1}{\ln 2}\ bit \approx 1.44 \ bit$

Перший із трьох стовпчикових графіків стохастичних політик над 4 діями. Ймовірність кожної дії — 0,25; ентропія 2 біти.

Другий графік: ймовірність порівну на двох діях, 0 на інших; ентропія 1 біт.

Третій графік: уся ймовірність на одній дії з імовірністю 1; ентропія 0 біт.

Глибоке навчання з підкріпленням у Python

Реалізація бонусу ентропії

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_loss -= c_entropy * entropy
  • Примітка: Categorical.entropy() у nats; поділіть на math.log(2) для бітів
Глибоке навчання з підкріпленням у Python

Цикл навчання 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

До PPO з пакетними оновленнями

 

  • Оновлення на кожному кроці: не повністю використовуємо цільову функцію PPO
  • На кожному кроці $\theta$ фактично збігається з $\theta_{old}$.
  • Повні реалізації PPO розділяють:
    • Оновлення параметрів (мініпакети)
    • Оновлення політики (ролаути)
Глибоке навчання з підкріпленням у Python

Давайте потренуємось!

Глибоке навчання з підкріпленням у Python

Preparing Video For Download...