第十二课小测答案

已知:

\[ 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左右
0QQ
1QQ
2QQ
3QQ
4QQ

每个:

\[ 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] \]

请思考:

  1. 如果不探索,应该执行哪个动作?
  2. 这里神经网络输出的三个数字是什么含义?
  3. 为什么机器人不能像简单 Q-Learning 一样建立完整 Q-Table?
  4. \(Q_\theta\) 里的 \(\theta\) 是什么?
  5. 如果当前预测 Q=12,而 Bellman Target=20,平方损失是多少?
  6. DQN 相比 Q-Table 最关键的优势是什么?

下一课我们就讲:

\[ \boxed{\text{Replay Buffer 经验回放}} \]

以及一个特别重要的问题:

为什么神经网络不能只拿刚刚连续发生的机器人数据,一条接一条直接训练?

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐