Gradient theo chính sách và REINFORCE

Deep Reinforcement Learning bằng Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

Khác biệt so với DQN

  • REINFORCE: Monte Carlo, không phải Temporal Difference
    • Cập nhật cuối mỗi tập, không phải mỗi bước
    • Hoặc cập nhật sau nhiều tập
  • Không có hàm giá trị
  • Không có mạng mục tiêu
  • Không epsilon-greedy
  • Không replay kinh nghiệm

Hình ảnh biểu thị: hàm giá trị hành động Q, replay kinh nghiệm, epsilon-greediness và q-target cố định được xếp chồng và gạch chéo

Deep Reinforcement Learning bằng Python

Cấu trúc vòng lặp huấn luyện REINFORCE

 

for episode in range(num_episodes):

# 1. Khởi tạo tập
while not done:
# 2. Chọn hành động
# 3. Thực thi và lấy trạng thái, phần thưởng kế
# 4. Cộng phần thưởng (chiết khấu) vào tổng lợi tức
# 5. Cập nhật trạng thái
# 6. Tính loss
# 7. Cập nhật mạng chính sách bằng hạ dốc
Deep Reinforcement Learning bằng Python

Chọn hành động

 

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)

 

  • Lấy xác suất từ mạng
  • Lấy mẫu một hành động
  • Trả về hành động và log-prob tương ứng

 

Chỉ số hành động được lấy mẫu: 1
Log-prob của hành động đã lấy mẫu: -1.38
Deep Reinforcement Learning bằng Python

Tính loss

 

Nhắc lại định lý gradient theo chính sách:

Định lý gradient theo chính sách: Gradient của J(pi_theta) theo theta bằng kỳ vọng trên các quỹ đạo tau theo pi_theta của lợi tức tập nhân với tổng gradient của log xác suất hành động, cộng trên mọi hành động trong quỹ đạo.

Hàm loss REINFORCE cho một tập: L(theta) bằng âm lợi tức tập nhân với tổng log xác suất hành động.

Trong Python:

  • $R_{\tau}$ là episode_return
  • Vector $\log\pi_\theta(a_t|s_t)$ là episode_log_probs
loss = -episode_return * episode_log_probs.sum()
Deep Reinforcement Learning bằng Python

Vòng lặp huấn luyện 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 bằng Python

Ayo berlatih!

Deep Reinforcement Learning bằng Python

Preparing Video For Download...