Policy gradient dan REINFORCE

Deep Reinforcement Learning dengan Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

Perbedaan dengan DQN

  • REINFORCE: Monte Carlo, bukan Temporal Difference
    • Update di akhir episode, bukan tiap langkah
    • Bisa update tiap beberapa episode
  • Tanpa fungsi nilai
  • Tanpa target network
  • Tanpa epsilon-greediness
  • Tanpa experience replay

Gambar yang merepresentasikan: fungsi nilai aksi Q, experience replay, epsilon-greediness, dan fixed q-targets, ditumpuk lalu disilang

Deep Reinforcement Learning dengan Python

Struktur loop pelatihan REINFORCE

 

for episode in range(num_episodes):

# 1. Inisialisasi episode
while not done:
# 2. Pilih aksi
# 3. Jalankan aksi, ambil state berikut & reward
# 4. Tambah reward (terdiskonto) ke return
# 5. Perbarui state
# 6. Hitung loss
# 7. Perbarui policy network dengan gradient descent
Deep Reinforcement Learning dengan Python

Pemilihan aksi

 

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)

 

  • Ambil probabilitas dari network
  • Sampling satu aksi
  • Kembalikan aksi dan log-prob terkait

 

Index aksi yang diambil: 1
Log-prob aksi yang diambil: -1.38
Deep Reinforcement Learning dengan Python

Perhitungan loss

 

Ingat teorema policy gradient:

Teorema policy gradient: Gradien J(pi_theta) terhadap theta sama dengan ekspektasi atas trajektori tau yang mengikuti pi_theta dari return episode dikalikan jumlah gradien log probabilitas aksi, dijumlahkan untuk semua aksi dalam trajektori.

Fungsi loss REINFORCE untuk satu episode: L(theta) sama dengan minus return episode dikali jumlah log probabilitas aksi.

Dalam Python:

  • $R_{\tau}$ sebagai episode_return
  • Vektor $\log\pi_\theta(a_t|s_t)$ sebagai episode_log_probs
loss = -episode_return * episode_log_probs.sum()
Deep Reinforcement Learning dengan Python

Loop pelatihan 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()
Deep Reinforcement Learning dengan Python

Ayo berlatih!

Deep Reinforcement Learning dengan Python

Preparing Video For Download...