Files
RL-learning/q_learning/q-learning.md
T

206 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Q-Learning 走迷宫:简明原理与推导
---
## 一、问题:迷宫 = 马尔可夫决策过程(MDP)
五元组 $(S,A,P,R,\gamma)$,本例取值:
| 元素 | 含义 | 取值 |
|------|------|------|
| 状态 S | 智能体所在格子坐标 (r, c) | n×n 网格 |
| 动作 A | 上 / 下 / 左 / 右 | 共 4 个 |
| 转移 P | 在 s 执行 a 后到达 s' 的概率 | 确定性(见下文)|
| 奖励 R | 即时奖励 | +100(到终点)/ −10(撞墙)/ −1(每步)|
| 折扣 γ | 未来奖励的打折系数 | 0.9 |
转移是确定性的:结果由 (s, a) 唯一决定,因此转移概率为退化分布
$$P(s'\mid s,a)=\delta_{s',f(s,a)}$$
其中 $f(s,a)$ 表示"执行 a 后的实际落点"——撞墙或越界时原地不动,即 $f(s,a)=s$。
回报(Return)为折扣累积奖励,$\gamma<1$ 保证收敛:
$$G_t=\sum_{k=0}^{\infty}\gamma^{k}R_{t+k+1}$$
其绝对值的上界为 $|G_t|\le 100/(1-\gamma)$,即收敛有界。目标是最大化起点期望回报:$\pi^{*}=\arg\max_{\pi}\mathbb{E}_{\pi}[G_0]$。
**符号说明**(全文记号约定):
| 符号 | 含义 |
|---|---|
| $t$ | 离散时间步编号(第几步);一条轨迹为 $\cdots\to S_t\to A_t\to R_{t+1}\to S_{t+1}\to A_{t+1}\to R_{t+2}\to\cdots$ |
| $S_t,\ A_t,\ R_{t+1}$ | 第 $t$ 步所处的状态、执行的动作、以及该步之后拿到的即时奖励 |
| 奖励下标 $t{+}1$ | 约定:$R_{t+1}$ 是执行 $A_t$、转移到 $S_{t+1}$ 时得到的奖励,写在引发它的动作之后 |
| 大写 vs 小写 | 大写($S_t,A_t,R_{t+1},G_t$= 随机变量(结局未定);小写($s,a,r$)= 具体取值(已发生的实际值) |
| $s'$ | 走一步之后到达的新状态,即 $S_{t+1}=s'$ |
| $\gamma$ | 折扣因子,$\gamma^{k}$ 给 $k$ 步之后的奖励加权,本例取 0.9 |
| $G_t$ | 回报:从 $t$ 时刻起未来全部奖励的折扣和,"从这里玩到底的打折总分" |
| $\mathbb{E}[\,\cdot\mid\cdot\,]$ | 条件期望:"在竖线右边的前提下,左边量的长期平均" |
| $\pi$ | 策略:每个状态下选各动作的概率规则;$\pi(a\mid s)$ 表示在 $s$ 选 $a$ 的概率 |
---
## 二、价值函数与贝尔曼方程
定义(对策略 $\pi$):
$$V^{\pi}(s)=\mathbb{E}_{\pi}[G_t\mid S_t=s]$$
$$Q^{\pi}(s,a)=\mathbb{E}_{\pi}[G_t\mid S_t=s,A_t=a]$$
**贝尔曼期望方程**:由 $G_t=R_{t+1}+\gamma G_{t+1}$ 与全期望公式(塔性质)可得
$$Q^{\pi}(s,a)=r(s,a)+\gamma\sum_{s'}P(s'\mid s,a)\,V^{\pi}(s')$$
$$V^{\pi}(s)=\sum_{a}\pi(a\mid s)\,Q^{\pi}(s,a)$$
即"状态价值 = 期望即时奖励 + γ × 期望下一状态价值"。
> 用途说明:期望方程**不进** Q-Learning 更新公式(更新用的是下面的 max 版)。它用于:① 作为最优方程的内层成分;② 解任意固定策略的价值——第五节的 $V(d)$ 解析值、热力图数值都由此算出;③ 理解 SARSA 与策略评估。只关心 Q-Learning 更新本身可先跳过。
**贝尔曼最优方程**Q-Learning 直接逼近的):
$$Q^{*}(s,a)=r(s,a)+\gamma\max_{a'}Q^{*}(s',a')$$
(确定性环境下求和 $\sum_{s'}P(s'\mid s,a)\,V(s')$ 退化为直接代入 $s'$。)
**存在唯一解**:定义算子 $(T^{*}Q)(s,a)=r(s,a)+\gamma\max_{a'}Q(s',a')$。因 max 算子非膨胀,$T^{*}$ 是 $\gamma$-压缩映射;由 Banach 不动点定理,$Q^{*}=T^{*}Q^{*}$ 有唯一不动点,且迭代以 $\gamma^{k}$ 速率收敛(值迭代的依据)。
---
## 三、Q-Learning 算法
用单次观测近似期望:
$$Y=r+\gamma\max_{a'}Q(s',a')\approx(T^{*}Q)(s,a)$$
更新公式($\delta_t$ 为 TD 误差):
$$Q(s,a)\leftarrow Q(s,a)+\alpha[r+\gamma\max_{a'}Q(s',a')-Q(s,a)]$$
其中 $\alpha=0.1$$\delta_t=r+\gamma\max_{a'}Q(s',a')-Q(s,a)$。
**符号说明**
| 符号 | 含义 |
|---|---|
| $\leftarrow$ | 赋值:把右端算出的数写进 Q 表的 $(s,a)$ 位置,不是数学等式 |
| $\alpha$ | 学习率(0~1 之间):本次按多大比例采纳误差 |
| $\delta_t$ | TD 误差:新信息与旧预期之差。$\delta_t>0$ 说明实际比预期好,上调;反之下调 |
| $Y=r+\gamma\max_{a'}Q(s',a')$ | TD 目标:一步真实奖励 $r$ + 下一状态最优价值的现有估计("标签" |
| $\max_{a'}$ | 对 $s'$ 处全部 4 个动作的 Q 值取最大,即"假设下一步走最优"——off-policy 的来源 |
| $s',\ a'$ | 到达的新状态、以及在其处设想尝试的动作(只用来查表估值,并不真的执行) |
关键结论:
- **收敛**:需每个 $(s,a)$ 被访问无穷多次,且学习率满足 $\sum\alpha=\infty$、$\sum\alpha^{2}<\infty$Watkins 1992,以概率 1 收敛)。本实现取常数 $\alpha$,确定性环境下无采样噪声,固定 $(s,a)$ 可解析解:
$$Q_k=(1-\alpha)^{k}Q_0+[1-(1-\alpha)^{k}]Y$$
误差以 $(1-\alpha)^{k}$ 几何衰减($\alpha=0.1$ 时约 22 次访问缩小一个数量级);真正的瓶颈是价值逐层传播(层数 = 最短路长 $D$),故迷宫越大越需更多训练。
- **Off-policy**:未来项用 $\max_{a'}Q(s',\cdot)$,与行为策略(含探索)无关,因此收敛到 $Q^{*}$。
- **vs SARSA**SARSA 的未来项用实际执行的 $a'$,逼近 $\mathbb{E}_{a'\sim\pi_\varepsilon}[\cdot]$ 而非 max,收敛到 ε-greedy 策略自身的价值;在带陷阱环境里 SARSA 学出保守绕行,Q-Learning 学理论最优。
- **vs Monte Carlo**MC 等一局结束,用真实回报 $G_t$ 作目标——无偏,但含整局探索噪声(方差大),且必须等回合结束、只有到达过终点的局才有强信号;TD 单步自举——有偏(初期 $Q$ 尚未传开导致系统性低估,$\max$ 算子带来高估),但方差小、每步可学、样本利用率高。实践中 TD 几乎总收敛更快。
- **终止与截断**`terminated`(到达终点,真正的终止状态)时目标值不含 bootstrap 项,仅为 $r$;超时截断 `truncated`(达到 `max_steps`)**不是**终止状态,目标仍含 bootstrap 项——回合只是被强制叫停,未来价值依然存在。
---
## 四、探索:为什么必须乱走
收敛要求每个 $(s,a)$ 被访问无穷多次;纯贪心会永久错过未试探的动作,故需探索。
**ε-greedy**:以概率 $\varepsilon$ 均匀随机选一个动作;以概率 $1-\varepsilon$ 选贪心动作 $a=\arg\max_{a'}Q(s,a')$。
**指数衰减**
$$\varepsilon_{k}=\max(\varepsilon_{\min},\varepsilon_0\lambda^{k})$$
取 $\varepsilon_0=1.0$$\lambda=0.99$$\varepsilon_{\min}=0.05$。到达下限所需局数:
$$k^{*}=\frac{\ln(\varepsilon_{\min}/\varepsilon_0)}{\ln\lambda}=\frac{\ln 0.05}{\ln 0.99}\approx 298$$
即前约 300 局以探索为主,之后以利用为主;保留 5% 下限防止估值固化。
---
## 五、奖励设计的数学
**定理(每步 $-1$ 诱导最短路)**:沿长度 $d$ 的无撞墙路径走到终点(前 $d-1$ 步各 $-1$,末步 $+100$),其价值为
$$V(d)=\gamma^{d-1}(100+\frac{1}{1-\gamma})-\frac{1}{1-\gamma}$$
因 $\gamma^{d-1}$ 随 $d$ 严格递减且括弧内恒正,对任意 $\gamma\in(0,1)$ 有 $d_1<d_2\Rightarrow V(d_1)>V(d_2)$。**结论:最优策略必然是最短路径**。若每步奖励改为 $0$,$V(d)$ 与 $d$ 无关,智能体将随意游荡。
数值(9×9 迷宫,起点到终点 $D=16$$\gamma=0.9$):
| 距终点 $d$ | $V(d)$ | 约值 |
|---|---|---|
| 1 | $100$ | 100.0 |
| 2 | $90-1$ | 89.0 |
| 8 | $100\times 0.9^{7}-(1-0.9^{7})/0.1$ | 41.8 |
| 16(起点)| $100\times 0.9^{15}-(1-0.9^{15})/0.1$ | 12.7 |
价值沿路径单调递减、从 $G$ 向 $S$ 回传——热力图快照记录的就是这个分布逐层填入的过程。
**γ 过小的信号淹没**:传播关键项是 $\gamma^{D}\times 100$。以 15×15$D=28$)为例:
| $\gamma$ | 起点价值 $100\gamma^{27}-(1-\gamma^{27})/(1-\gamma)$ | 观察 |
|---|---|---|
| 0.5 | $\approx -2.0$ | 信号被路费扣光,学不动 |
| 0.9 | $\approx -3.6$ | 收敛慢 |
| 0.99 | $\approx 52.6$ | 信号充足 |
排序定理仍成立,但 $|\Delta V|\sim\gamma^{D}(100+\frac{1}{1-\gamma})$ 过小时与噪声同量级,学习极慢。**路径越长,γ 越应接近 1**。
**撞墙惩罚**:撞墙动作的最优价值满足 $Q^{*}(s,\text{wall})=\gamma V^{*}(s)-10$,只要 $V^{*}(s)>-100$ 就恒小于 $V^{*}(s)$。它压负样本、加速排除错误动作,**不改变**最优策略集合。
---
## 六、迷宫生成与拓扑
- **递归回溯 = DFS 生成树**:房间数 $N=((n+1)/2)^{2}$,通路数 $N-1$。树的性质 ⟹ 任意两房间**唯一路径**(完美迷宫),这是"分支不复杂"的数学根源。
- **为何奇数尺寸**:房间在偶坐标、隔墙在奇坐标;若 $n$ 为偶数,终点 $(n-1,n-1)$ 落在隔墙上,迷宫无解。
- **braid 成环**:迷宫内"两侧都是路的墙"共 $(n^{2}-1)/2$ 堵(9×9 为 40,树用 24,剩 16 可拆)。braid 概率 $p$ 即拆墙概率,等价于给生成树**加弦**;环路数(圈秩)等于 $|E|-|V|+1$。$p=0.3$ 时 9×9 约引入 $0.3\times 16\approx 5$ 个独立环,同一对起终点出现多条路径,Q 表需真正比较选择。
---
## 七、运行与观察
在仓库根目录运行:`python -m q_learning.q_learning --plot`;参数:`--rows/--cols`(默认 9,须为奇数)、`--seed``--episodes`(默认 500)、`--braid`(默认 0)、`--plot`。环境接口遵循 Gymnasium 风格:`reset()` 返回 `(obs, info)``step(a)` 返回 `(obs, r, terminated, truncated, info)`。输出:迷宫、策略箭头、贪心路径、成功率统计;加 `--plot` 生成两张图。
| 图 | 数学对象 | 判读 |
|---|---|---|
| 逐局回报 | $G_0$ 的单次实现(含探索噪声)| 总体上升、波动收窄 |
| 滑动成功率 | 到达概率的频率估计(大数定律)| 趋近 1 |
| 单局步数 | 回合步数 vs BFS 最短步 $D$ | 降到红线即学会最短路 |
| V(s) 快照 | $V(d)$ 分布逐层填入 | 价值从 $G$ 向 $S$ 回传 |
常见问题:
| 现象 | 原因 | 调整 |
|---|---|---|
| 学不到终点 | 信号 $\gamma^{D}R_g$ 被路费淹没 | 增大 γ 或终点奖励 |
| 不收敛 | 传播层数 $D$ 大、覆盖不足 | 增大 `--episodes` |
| 后期退化 | ε 衰减过快破坏覆盖 | 衰减系数调大(0.995)|
| 路径非最短路 | 每步奖励被改为 0 | 保持 $-1$ |
| 结果不可复现 | ε-greedy 随机采样 | 固定 `--seed` |
---
## 八、进阶实验
1. **γ 扫描**$\gamma=0.1/0.5/0.9/0.99$,对照第五节解析值验证"远见"。
2. **ε 扫描**:不同 $\lambda$ 观察覆盖与利用的权衡。
3. **braid 扫描**$p=0/0.15/0.3/0.5$,用圈秩预估环路数,验证步数仍收敛到红线 $D$。
4. **加陷阱**:某些格设为吸收态(踩中 $-50$ 并终止),观察策略绕行;对比 SARSA 的保守路线。
5. **随机风**$P(s'\mid s,a)$ 变为非退化,$\mathbb{E}[\max Q]\ne\max\mathbb{E}[Q]$,随机性真正登场。
6. **迁移 FrozenLake**:套用标准接口,体会表格法边界(状态太多时转 DQN)。
---
## 九、小结
主线一句话:**$Q^{*}$ 是贝尔曼最优算子 $T^{*}$ 的唯一不动点,Q-Learning 用单步样本 $(s,a,r,s')$ 逼近它**;收敛快慢由"信号传播层数 $\gamma^{D}$"和"覆盖是否充分"决定。理解这点后,把格子换成任意可枚举状态、动作换成任意离散集合,同一框架即可迁移。