Ainsteinx Logo
Ainsteinx
👤
欢迎使用 Ainsteinx
登录

切换语言

货币

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

权衡短期与长期目标

策略、价值函数,以及已知 MDP 时的规划。

agent 的目标是让期望回报(预期获得的总奖励)最大化。未来的奖励要用 γ 打折,因为“今天的钱比明天的钱更值钱”。

示例用价值迭代(Value Iteration)找出 FrozenLake 的最优策略。即使是最优策略,也只有约四分之三的成功率,因为冰面很滑。

Gₜ = rₜ₊₁ + γ·rₜ₊₂ + γ²·rₜ₊₃ + … V^π(s) = E_π[ Gₜ | sₜ = s ] 状态的价值 Q^π(s,a) = E_π[ Gₜ | sₜ = s, aₜ = a ] 在状态中采取某动作的价值 A^π(s,a) = Q^π(s,a) − V^π(s) 比平均好多少(优势) Bellman: V^π(s) = Σₐ π(a|s) Σₛ' T(s'|s,a) [ R + γ·V^π(s') ]
  • 策略 (π)就是“应对每种情况的计划”,分为确定性和随机性两种
  • 策略评估:计算给定策略的 V
  • 策略改进:根据 V 构造新的贪心策略
  • 策略迭代 / 价值迭代:交替进行两个步骤直到不再变化。价值迭代把评估截断为一轮,因此更快
  • 广义策略迭代(GPI):后面要学的所有方法都是某种形式的“评估 ↔ 改进”

要点

  • V 衡量状态的价值,Q 衡量动作的价值,A 表示比平均好多少
  • 如果已知 MDP,可以用价值/策略迭代直接求出 π*(规划)
deep-rl-ep03-value-iteration.py
import numpy as np
import gymnasium as gym

def value_iteration(P, gamma=0.99, theta=1e-10):
    n_s, n_a = len(P), len(P[0])
    V = np.zeros(n_s)
    while True:
        Q = np.zeros((n_s, n_a))
        for s in range(n_s):
            for a in range(n_a):
                for prob, s2, r, done in P[s][a]:
                    Q[s, a] += prob * (r + gamma * V[s2] * (not done))
        if np.max(np.abs(V - Q.max(axis=1))) < theta:
            break
        V = Q.max(axis=1)                 # Bellman optimality backup
    pi = Q.argmax(axis=1)                 # ນະໂຍບາຍ greedy
    return V, pi

env = gym.make("FrozenLake-v1", is_slippery=True)
V, pi = value_iteration(env.unwrapped.P)
print(np.round(V.reshape(4, 4), 3))
print("π* =", "".join("←↓→↑"[a] for a in pi))

# ທົດສອບນະໂຍບາຍ 1,000 ເກມ
wins = 0
for ep in range(1000):
    s, _ = env.reset(seed=ep)
    done = False
    while not done:
        s, r, term, trunc, _ = env.step(pi[s])
        done = term or trunc
    wins += r
print(f"ອັດຕາສຳເລັດ: {wins / 10:.1f}%")

输出结果

[[0.542 0.499 0.471 0.457]
 [0.558 0.    0.358 0.   ]
 [0.592 0.643 0.615 0.   ]
 [0.    0.742 0.863 0.   ]]
π* = ←↑↑↑←←←←↑↓←←←→↓←
ອັດຕາສຳເລັດ: 75.5%
  • #DeepRL
  • #ReinforcementLearning
  • #PythonສຳລັບຄົນLaos
  • #AI
  • #ບອກຕໍ່ຄວາມຮູ້