Бонус за энтропию и PPO

Глубокое обучение с подкреплением на Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

Бонус за энтропию

 

 

  • Алгоритмы policy gradient могут вырождаться в детерминированные стратегии
  • Решение: добавить бонус за энтропию
  • Энтропия измеряет неопределённость распределения!

Марсоход не может двигаться дальше из-за большого камня прямо перед ним.

Глубокое обучение с подкреплением на 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() возвращает значение в натах; разделите на 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...