Ainsteinx Logo
Ainsteinx
👤
ຍິນດີຕ້ອນຮັບສູ່ Ainsteinx
ເຂົ້າສູ່ລະບົບ

ປ່ຽນພາສາ

ສະກຸນເງິນ

ໜ້າທຳອິດ
ບົດຄວາມ
ບໍລິການ
ບົດ 06 · RL ແບບຕາຕະລາງ

ປັບປຸງພຶດຕິກຳຂອງ agent

SARSA, Q-learning ແລະ Double Q-learning.

ເພື່ອປັບປຸງ policy ໂດຍບໍ່ຮູ້ MDP ຕ້ອງຮຽນ Q(s,a) ແທນ V (ເພາະປຽບທຽບ action ໄດ້ໂດຍກົງ) ແລະ ຕ້ອງສຳຫຼວດໄປພ້ອມ. ທຸກວິທີເຮັດຕາມແບບ GPI: ປະເມີນ Q → ເລືອກ action ທີ່ດີຂຶ້ນ → ວົນຊ້ຳ.

Q-learning ໃນໂຄດຮຽນຈາກການລອງຫຼິ້ນລ້ວນໆ ແຕ່ໄດ້ policy ດຽວກັບ value iteration ໃນບົດ 3 ທີ່ຕ້ອງຮູ້ MDP ທັງໝົດ.

SARSA (on-policy): Q(s,a) ← Q(s,a) + α [ r + γ·Q(s',a') − Q(s,a) ] Q-learning (off-policy): Q(s,a) ← Q(s,a) + α [ r + γ·maxₐ' Q(s',a') − Q(s,a) ]
  • On-policy (SARSA): ຮຽນຄ່າຂອງ policy ທີ່ໃຊ້ຫຼິ້ນຢູ່ ລວມທັງການສຸ່ມສຳຫຼວດ
  • Off-policy (Q-learning): ຫຼິ້ນດ້ວຍ policy ໜຶ່ງ ແຕ່ຮຽນຄ່າຂອງ policy ທີ່ດີທີ່ສຸດ
  • Double Q-learning: ໃຊ້ Q 2 ຊຸດ ເພື່ອແກ້ບັນຫາການປະເມີນຄ່າສູງເກີນຈາກການໃຊ້ max
  • GLIE: ຕ້ອງສຳຫຼວດທຸກທາງບໍ່ສິ້ນສຸດ ແຕ່ຄ່ອຍໆກາຍເປັນ greedy

ສິ່ງທີ່ຄວນຈື່

  • Prediction = ປະເມີນ policy, Control = ຊອກ policy ທີ່ດີທີ່ສຸດ
  • Double learning ຈະກັບມາໃຊ້ໃນ Double DQN ແລະ TD3
deep-rl-ep06-q-learning.py
import numpy as np
import gymnasium as gym

env = gym.make("FrozenLake-v1", is_slippery=True)
n_s, n_a = env.observation_space.n, env.action_space.n
Q = np.zeros((n_s, n_a))
rng = np.random.default_rng(0)
gamma, alpha = 0.99, 0.1
n_episodes = 20000

for ep in range(n_episodes):
    eps = max(0.01, 1.0 - ep / (0.8 * n_episodes))     # epsilon ຫຼຸດລົງເລື້ອຍໆ
    s, _ = env.reset(seed=ep)
    done = False
    while not done:
        a = rng.integers(n_a) if rng.random() < eps else int(np.argmax(Q[s]))
        s2, r, term, trunc, _ = env.step(a)
        target = r + gamma * Q[s2].max() * (not term)    # off-policy: ໃຊ້ max
        Q[s, a] += alpha * (target - Q[s, a])
        s, done = s2, term or trunc

pi = Q.argmax(axis=1)
wins = 0
for ep in range(1000):
    s, _ = env.reset(seed=100000 + ep)
    done = False
    while not done:
        s, r, term, trunc, _ = env.step(pi[s])
        done = term or trunc
    wins += r
print("π =", "".join("←↓→↑"[a] for a in pi))
print(f"ອັດຕາສຳເລັດ: {wins / 10:.1f}%")

ຜົນລັບ

π = ←↑↑↑←←←←↑↓←←←→↓←
ອັດຕາສຳເລັດ: 73.4%
  • #DeepRL
  • #ReinforcementLearning
  • #PythonສຳລັບຄົນLaos
  • #AI
  • #ບອກຕໍ່ຄວາມຮູ້