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

ປ່ຽນພາສາ

ສະກຸນເງິນ

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

ບັນລຸເປົ້າໝາຍໄດ້ດີ ແລະ ໄວຂຶ້ນ

SARSA(λ), Q(λ), Dyna-Q: ໃຊ້ຂໍ້ມູນໃຫ້ຄຸ້ມຂຶ້ນ.

ບົດນີ້ເຮັດໃຫ້ agent ໃຊ້ຂໍ້ມູນໄດ້ຄຸ້ມຄ່າຂຶ້ນ (sample efficient) ດ້ວຍ 2 ທາງ: ສົ່ງ credit ໄວຂຶ້ນ ແລະ ຮຽນ model ແລ້ວວາງແຜນ.

ໃນໂຄດ Dyna-Q: ຫຼັງຈາກພົບເປົ້າໝາຍຄັ້ງທຳອິດ ການວາງແຜນ 20 ຮອບຕໍ່ກ້າວຊ່ວຍສົ່ງລາງວັນກັບຄືນໄວຫຼາຍ. ພຽງເກມຖັດມາ agent ກໍຍ່າງເສັ້ນທາງສັ້ນທີ່ສຸດ (6 ກ້າວ) ໄດ້ແລ້ວ.

ສົ່ງ credit ໄວຂຶ້ນ: SARSA(λ), Q(λ)ໃຊ້ eligibility traces ສົ່ງລາງວັນກັບໄປຫາຫຼາຍ state ທີ່ຜ່ານມາພ້ອມກັນ. λ=1 ໃຫ້ credit ທຸກ state ໃນເກມ
ຮຽນ model ແລ້ວວາງແຜນ: Dyna-Qຈື່ວ່າ "ເຮັດ a ໃນ s ແລ້ວໄປ s' ໄດ້ r" ແລ້ວໃຊ້ model ນີ້ອັບເດດ Q ເພີ່ມ ໂດຍບໍ່ຕ້ອງຫຼິ້ນຈິງ

Trajectory sampling ຄ້າຍກັບ Dyna-Q ແຕ່ຈິນຕະນາການເປັນເສັ້ນທາງຕໍ່ເນື່ອງຈາກ state ປັດຈຸບັນ. ວິທີແບບ model-based ເໝາະກັບງານທີ່ເກັບຂໍ້ມູນແພງ ເຊັ່ນ ຫຸ່ນຍົນຈິງ.

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

  • Effective = ແກ້ບັນຫາໄດ້, Efficient = ໃຊ້ຂໍ້ມູນໜ້ອຍ
  • ບົດຕໍ່ໄປເພີ່ມ "ສຸ່ມ": state ຫຼາຍຈົນເຫັນບໍ່ຄົບ
deep-rl-ep07-dyna-q.py
import numpy as np
import gymnasium as gym

env = gym.make("FrozenLake-v1", is_slippery=False)
n_s, n_a = env.observation_space.n, env.action_space.n
Q = np.zeros((n_s, n_a))
model = {}                       # (s, a) -> (r, s2, term)  ໂມເດວທີ່ຮຽນຈາກປະສົບການ
rng = np.random.default_rng(0)
gamma, alpha, eps, n_planning = 0.95, 0.5, 0.1, 20

def update(s, a, r, s2, term):
    target = r + gamma * Q[s2].max() * (not term)
    Q[s, a] += alpha * (target - Q[s, a])

for ep in range(30):
    s, _ = env.reset(seed=ep)
    done, steps = False, 0
    while not done:
        if rng.random() < eps or Q[s].max() == Q[s].min():
            a = rng.integers(n_a)
        else:
            a = int(np.argmax(Q[s]))
        s2, r, term, trunc, _ = env.step(a)
        update(s, a, r, s2, term)                  # 1) ຮຽນຈາກປະສົບການຈິງ
        model[(s, a)] = (r, s2, term)              # 2) ບັນທຶກລົງໂມເດວ
        keys = list(model)
        for _ in range(n_planning):                # 3) "ຈິນຕະນາການ" ຈາກໂມເດວ
            ps, pa = keys[rng.integers(len(keys))]
            update(ps, pa, *model[(ps, pa)])
        s, done, steps = s2, term or trunc, steps + 1
    if r == 1:
        print(f"ເກມທີ {ep:2d}: ໄປຮອດເປົ້າໝາຍໃນ {steps} ກ້າວ")

ຜົນລັບ

ເກມທີ 20: ໄປຮອດເປົ້າໝາຍໃນ 43 ກ້າວ
ເກມທີ 21: ໄປຮອດເປົ້າໝາຍໃນ 7 ກ້າວ
ເກມທີ 22: ໄປຮອດເປົ້າໝາຍໃນ 6 ກ້າວ
ເກມທີ 23: ໄປຮອດເປົ້າໝາຍໃນ 6 ກ້າວ
ເກມທີ 24: ໄປຮອດເປົ້າໝາຍໃນ 6 ກ້າວ
ເກມທີ 25: ໄປຮອດເປົ້າໝາຍໃນ 6 ກ້າວ
ເກມທີ 26: ໄປຮອດເປົ້າໝາຍໃນ 7 ກ້າວ
ເກມທີ 28: ໄປຮອດເປົ້າໝາຍໃນ 6 ກ້າວ
ເກມທີ 29: ໄປຮອດເປົ້າໝາຍໃນ 6 ກ້າວ
  • #DeepRL
  • #ReinforcementLearning
  • #PythonສຳລັບຄົນLaos
  • #AI
  • #ບອກຕໍ່ຄວາມຮູ້