强化学习第十三课:为什么 Q-Table 到机器人这里会失效?
第十二课小测答案
已知:
\[ Q(s',a_1)=10 \]\[ Q(s',a_2)=70 \]\[ Q(s',a_3)=30 \]
由于探索,实际下一动作:
\[ a'=a_3 \]
并且:
\[ r=4 \]\[ \gamma=0.9 \]
1. Q-Learning 的 TD Target
Q-Learning 使用:
\[ \max_{a'}Q(s',a') \]
所以:
\[ \max(10,70,30)=70 \]
于是:
\[ Target_Q = 4+0.9\times70 \]\[ =4+63 \]
所以:
\[ \boxed{Target_Q=67} \]
2. SARSA 的 TD Target
SARSA 使用实际选到的:
\[ a'=a_3 \]
所以:
\[ Q(s',a_3)=30 \]
于是:
\[ Target_{\text{SARSA}} = 4+0.9\times30 \]\[ =4+27 \]
所以:
\[ \boxed{Target_{\text{SARSA}}=31} \]
3. 为什么二者不同?
因为:
Q-Learning 使用“下一状态最好的动作价值”。
而:
SARSA 使用“当前 Policy 实际选择的下一动作价值”。
所以:
\[ 70\neq30 \]
Target 自然不同。
4. 哪一个使用实际下一动作 \(a_3\)?
\[ \boxed{\text{SARSA}} \]
5. Q-Learning 为什么是 Off-Policy?
因为产生数据时可以使用:
\[ \epsilon\text{-greedy} \]
但学习目标却使用:
\[ \max Q \]
代表更贪心的目标策略。
所以:
\[ \boxed{\text{行为策略和目标策略可以不同}} \]
6. SARSA 为什么是 On-Policy?
因为:
它按照当前行为策略实际选择出的 \(a_{t+1}\) 来更新。
所以采数据和被评价的是同一套策略。
\[ \boxed{\text{On-Policy}} \]
7. PPO、DQN、SAC 分别是什么?
\[ \boxed{\text{PPO:On-Policy}} \]\[ \boxed{\text{DQN:Off-Policy}} \]\[ \boxed{\text{SAC:Off-Policy}} \]
这三个后面都会详细学,现在先建立分类。
第十三课:为什么 Q-Table 到机器人这里会失效?
现在我们正式开始:
\[ \boxed{\text{Q-Learning}\rightarrow\text{DQN}} \]
这是第一次真正进入:
深度学习 + 强化学习。
1. Q-Learning 当前是怎么存知识的?
之前的简单环境只有:
State:
0 1 2 3 4
Action:
左 右
所以 Q 表只有:
\[ 5\times2=10 \]
个格子。
非常简单:
| State | 左 | 右 |
|---|---|---|
| 0 | Q | Q |
| 1 | Q | Q |
| 2 | Q | Q |
| 3 | Q | Q |
| 4 | Q | Q |
每个:
\[ Q(s,a) \]
直接存在表里。
2. 但是换成机械臂会发生什么?
假设只有一个关节。
关节角可以:
\[ 0^\circ\sim180^\circ \]
如果每:
\[ 1^\circ \]
算一个 State,就有:
\[ 181 \]
个状态。
似乎还能接受。
3. 两个关节呢?
假设:
\[ \theta_1=0\sim180^\circ \]\[ \theta_2=0\sim180^\circ \]
状态数量:
\[ 181\times181 \]
约:
\[ 32761 \]
已经明显增大。
4. 六轴机械臂呢?
如果每个关节都只有 181 个可能角度:
\[ 181^6 \]
我们算个数量级:
\[ 181^6\approx3.5\times10^{13} \]
也就是大约:
\[ 35\,000\,000\,000\,000 \]
三十多万亿个状态。
而且这还只是:
关节角。
还没加入:
关节速度
夹爪状态
物体位置
物体姿态
障碍物
视觉
……
所以 Q-Table 几乎直接爆炸。
5. 更糟的是连续状态
真实机械臂角度不是只有:
30°
31°
32°
它可能是:
\[ 30.123^\circ \]\[ 30.124^\circ \]\[ 30.125^\circ \]
理论上连续变量可能有:
无限多个取值。
那么 Q-Table 根本无法把每种状态都列出来。
6. 相机图像更夸张
假设输入一张:
\[ 640\times480 \]
RGB 图片。
每个像素有:
R
G
B
三个通道。
输入数字数量:
\[ 640\times480\times3 \]
也就是:
\[ 921600 \]
个数。
你不可能建立:
每一种可能图片对应一行的 Q 表。
这就是 Q-Table 在视觉机器人里完全不可行的根本原因。
7. 那怎么办?
关键思想来了:
不要记住每一个状态的 Q 值,而是学习一个函数。
也就是:
\[ \boxed{ Q(s,a) } \]
不再存在表里,而是通过一个函数算出来。
例如:
\[ Q(s,a)=f(s,a) \]
而这个函数可以由:
神经网络
来表示。
8. 这就是 Function Approximation
中文:
函数逼近。
我们不再要求:
遇到 state 1 → 查表
遇到 state 2 → 查表
而是:
State
↓
神经网络
↓
预测 Q 值
所以即使来了一个:
从来没见过的 State
神经网络也可以根据学到的规律:
给它估计一个 Q 值。
这就是神经网络最重要的优势之一:
\[ \boxed{\text{Generalization 泛化}} \]
9. 举一个直观例子
假设训练时见过:
\[ \text{物体距离}=5.0\text{ cm} \]
和:
\[ 6.0\text{ cm} \]
但测试时遇到:
\[ 5.4\text{ cm} \]
Q-Table:
如果没专门建立 5.4 这一格,就不知道怎么办。
神经网络:
因为 5.4 和 5、6 很相似,可以估计一个合理 Q。
这就是:
泛化能力。
10. DQN 的核心思想
DQN:
Deep Q-Network
就是:
\[ \boxed{ \text{用深度神经网络逼近 }Q(s,a) } \]
记成:
\[ \boxed{ Q_\theta(s,a) } \]
这里:
\[ \theta \]
就是:
神经网络参数。
例如:
weights
biases
11. 和之前的 \(\pi_\theta\) 很像
之前 Policy:
\[ \pi_\theta(a|s) \]
表示:
用神经网络参数 \(\theta\) 表示 Policy。
现在:
\[ Q_\theta(s,a) \]
表示:
用神经网络参数 \(\theta\) 表示 Q 函数。
所以要分清:
Policy Network
输出:
动作/动作概率。
Q Network
输出:
动作价值。
DQN 用的是:
\[ \boxed{Q\ Network} \]
12. DQN 的输入和输出是什么?
假设动作只有三个:
左
右
不动
给网络输入:
\[ s \]
例如:
物体位置
机械臂位置
夹爪状态
神经网络输出:
\[ [ Q(s,\text{左}), Q(s,\text{右}), Q(s,\text{不动}) ] \]
例如:
\[ [2.1,\ 8.7,\ -1.3] \]
那么:
\[ \arg\max Q \]
就是:
向右。
13. 图示
State s
│
▼
┌─────────────┐
│ Neural Net │
│ Qθ │
└─────────────┘
│ │ │
▼ ▼ ▼
左Q 右Q 不动Q
2.1 8.7 -1.3
│
▼
argmax
│
▼
向右
这就是 DQN 最核心结构。
14. 那它怎么训练?
以前 Q-Table:
\[ Q(s,a) \leftarrow Q(s,a)+\alpha\delta \]
直接修改一个表格里的数字。
现在没有表格了。
我们只有神经网络:
\[ Q_\theta(s,a) \]
所以不能直接:
把某一个格子从 20 改成 25。
而是要:
修改神经网络参数 \(\theta\)。
这时深度学习里的:
\[ \boxed{\text{Loss Function}} \]
就要登场了。
15. DQN 的训练目标
假设神经网络当前预测:
\[ Q_\theta(s,a)=30 \]
Bellman 告诉我们 Target:
\[ y=50 \]
那神经网络:
预测 30
但是:
目标是 50。
这就是一个普通的预测误差问题。
所以可以定义:
\[ \boxed{ L(\theta) = (y-Q_\theta(s,a))^2 } \]
16. 每个符号是什么?
\[ L \]
Loss:
损失函数。
表示:
网络预测得有多错。
\[ y \]
Target:
Bellman 给我们的目标值。
\[ Q_\theta(s,a) \]
神经网络当前预测的 Q 值。
平方:
\[ (\cdot)^2 \]
是为了:
- 消除正负号
- 错得越多,惩罚越大
17. 数字例子
预测:
\[ Q_\theta=30 \]
目标:
\[ y=50 \]
Loss:
\[ L=(50-30)^2 \]\[ =20^2 \]
所以:
\[ \boxed{L=400} \]
说明误差很大。
如果训练后:
\[ Q_\theta=48 \]
那么:
\[ L=(50-48)^2 \]\[ =4 \]
Loss 变小了。
于是我们希望通过训练:
\[ \boxed{L\downarrow} \]
也就是:
让网络预测的 Q 越来越接近 Bellman Target。
18. 这就是深度学习进入 RL 的地方
DQN 大致变成:
State
↓
神经网络预测 Q
↓
执行动作
↓
获得 Reward 和 next State
↓
Bellman 算 Target
↓
Target 与预测 Q 比较
↓
产生 Loss
↓
反向传播
↓
更新 θ
↓
Q 网络越来越准确
这时候:
Q-Learning + Neural Network
真正结合了。
19. 但直接这样做会出问题
你可能觉得:
那 DQN 不就是 Q-Learning 换个神经网络吗?
核心思想确实如此。
但直接这么做会非常不稳定。
主要两个问题后面必须解决:
\[ \boxed{\text{Replay Buffer}} \]
以及:
\[ \boxed{\text{Target Network}} \]
这两样东西正是经典 DQN 能稳定训练的重要设计。
所以下一课,我们不会马上上完整 PyTorch,而先讲:
为什么“连续拿刚刚发生的数据训练神经网络”会出问题?
然后引出 Replay Buffer。
第十三课核心总结
Q-Table 的最大问题:
\[ \boxed{\text{状态空间太大/连续时无法枚举}} \]
解决:
\[ \boxed{\text{Function Approximation}} \]
用神经网络:
\[ \boxed{Q_\theta(s,a)} \]
代替 Q-Table。
网络输入:
\[ s \]
输出:
\[ Q(s,a_1),Q(s,a_2),\ldots \]
训练目标:
\[ y=r+\gamma\max_{a'}Q(s',a') \]
损失:
\[ \boxed{ L=(y-Q_\theta(s,a))^2 } \]
于是:
\[ \boxed{ Q\text{-Learning} + Deep\ Neural\ Network \rightarrow DQN } \]
第十三课小测
假设一个 DQN 控制机器人,有三个离散动作:
向左
向右
夹爪闭合
当前 State 输入网络后输出:
\[ [Q_{\text{左}},Q_{\text{右}},Q_{\text{闭合}}] = [5,12,3] \]
请思考:
- 如果不探索,应该执行哪个动作?
- 这里神经网络输出的三个数字是什么含义?
- 为什么机器人不能像简单 Q-Learning 一样建立完整 Q-Table?
- \(Q_\theta\) 里的 \(\theta\) 是什么?
- 如果当前预测 Q=12,而 Bellman Target=20,平方损失是多少?
- DQN 相比 Q-Table 最关键的优势是什么?
下一课我们就讲:
\[ \boxed{\text{Replay Buffer 经验回放}} \]
以及一个特别重要的问题:
为什么神经网络不能只拿刚刚连续发生的机器人数据,一条接一条直接训练?
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)