Ainsteinx Logo
Ainsteinx
👤
欢迎使用 Ainsteinx
登录

切换语言

货币

首页
博客
服务
第 07 课 · 表格型强化学习

更有效、更高效地实现目标

SARSA(λ)、Q(λ)、Dyna-Q:让每个样本发挥更大价值。

本课通过两种方式提高 agent 的样本效率:更快地分配功劳(credit),以及学习模型来做规划。

在 Dyna-Q 代码中,第一次到达目标后,每步 20 次规划更新会迅速把奖励传播回去。到下一局,agent 就已经能走最短路径(6 步)了。

更快分配功劳:SARSA(λ)、Q(λ)用资格迹把奖励同时传回最近经过的多个状态
学习模型并规划:Dyna-Q记住“在 s 做 a 会到 s' 并得到 r”,再用这个模型额外更新 Q,无需真实试玩

轨迹采样与 Dyna-Q 类似,但从当前状态出发想象连续的路径。基于模型的方法适合数据采集昂贵的任务,例如真实机器人。

要点

  • 有效 = 能解决问题;高效 = 用的数据少
  • 接下来加入“采样性”:状态多到无法全部见到
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
  • #ບອກຕໍ່ຄວາມຮູ້