Policy gradient і REINFORCE

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

Timothée Carayol

Principal Machine Learning Engineer, Komment

Відмінності від DQN

  • REINFORCE: Монте-Карло, не Temporal Difference
    • Оновлення наприкінці епізоду, а не на кожному кроці
    • Можна оновлювати після кількох епізодів
  • Без функції значення
  • Без цільової мережі
  • Без epsilon-greedy
  • Без повторного відтворення досвіду

Зображення, що представляють: функцію значення дії Q, повторне відтворення досвіду, epsilon-greedy та фіксовані q-цілі — складені один на одного та перекреслені

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

Структура циклу навчання REINFORCE

 

for episode in range(num_episodes):

# 1. Initialize episode
while not done:
# 2. Select action
# 3. Play action and obtain next state and reward
# 4. Add (discounted) reward to return
# 5. Update state
# 6. Calculate loss
# 7. Update policy network by gradient descent
Глибоке навчання з підкріпленням у Python

Вибір дії

 

from torch.distributions import Categorical

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)
return action.item(), log_prob.reshape(1)
action, log_prob = select_action( policy_network, state)

 

  • Отримати ймовірності з мережі
  • Вибрати одну дію випадково
  • Повернути дію та відповідні логймовірності

 

Індекс вибраної дії: 1
Логймовірність вибраної дії: -1.38
Глибоке навчання з підкріпленням у Python

Обчислення втрат

 

Згадайте теорему градієнта політики:

Теорема градієнта політики: градієнт J(pi_theta) за тета дорівнює сподіванню за траєкторіями tau під pi_theta від повної винагороди епізоду, помноженої на суму градієнтів логймовірностей дій, підсумованих за всіма діями в траєкторії.

Функція втрат REINFORCE для епізоду: L(theta) дорівнює мінус повній винагороді епізоду, помноженій на суму логймовірностей дій.

У Python:

  • $R_{\tau}$ як episode_return
  • Вектор $\log\pi_\theta(a_t|s_t)$ як episode_log_probs
loss = -episode_return * episode_log_probs.sum()
Глибоке навчання з підкріпленням у Python

Цикл навчання REINFORCE

for episode in range(50):
  state, info = env.reset(); done = False; step = 0;
  episode_log_probs = torch.tensor([])

R = 0
while not done: step += 1 action, log_prob = select_action(policy_network, state)
next_state, reward, terminated, truncated, _ = env.step(action) done = terminated or truncated
R += (gamma ** step) * reward
episode_log_probs = torch.cat((episode_log_probs, log_prob))
state = next_state
loss = - R * episode_log_probs.sum()
optimizer.zero_grad(); loss.backward(); optimizer.step()
Глибоке навчання з підкріпленням у Python

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

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

Preparing Video For Download...