↓ Skip to main content
  1. Posts/

从监督学习到强化学习:没有 Label,模型如何学会决策?

·7538 words·16 mins
Note: This article is available in Chinese only. 本文暂无英文版本。 View original

起因
#

最近开始看 MIT 6.S191 的 Lecture 5——Deep Reinforcement Learning。

过去几个月写了不少笔记,从 RNN 到 Transformer,从 VAE 到 GAN,基本都属于 supervised 或 self-supervised 的范畴。之前梳理训练信号来源的那篇,整理了四种学习范式——supervised、unsupervised、semi-supervised、self-supervised——的核心区别在于训练信号是谁提供的。

那篇的最后,我的结论是:模型训练时,究竟从哪里得到"应该往哪个方向优化"的信号? 这个问题比"有没有 label"更有解释力。

进入强化学习之后,我碰到了一个更麻烦的情况。

Supervised learning 的训练信号来自外部标注的 target。Self-supervised learning 虽然没有人工标注,但能从数据自身构造出 target。它们的训练循环都是:有 input,有 target(不管来源),有 loss,有 gradient,有 update。

但强化学习的场景里,根本没有人告诉模型"在当前状态下,正确的动作是什么"。

那它到底怎么训练?

这个问题困扰了我一段时间。这篇是我试图把它想通的记录。

预测不等于决策
#

先从一个我比较熟悉的场景说起。

假设有一个金融预测模型。输入是当前的市场特征 \(x_t\),输出是对未来收益率的预测 \(\hat{r}_{t+1}\):

$$ x_t \xrightarrow{f_\theta} \hat{r}_{t+1} $$

如果未来收益率的真实值 \(r_{t+1}\) 在训练时可以拿到(比如用历史数据回测),这就是一个标准的 supervised learning 任务。有 input,有 target,有 loss,能训练。

但真实的交易系统远不止预测收益率。

它还需要回答:要不要买?买多少?当前已经持有多少仓位?交易成本是多少?如果现在买入,之后的风险暴露会怎么变?之前整理量化交易系统的那篇拆过这个问题——预测模型只是整个系统的一个环节,从 Alpha 到执行之间还有风险模型、成本模型和组合构建。

也就是说,能预测明天涨跌,不等于能自动做出完整的交易决策。

换一个更直观的例子。

假设你在玩一个网格寻路游戏。Agent 在一个 5×5 的网格里,需要从起点走到终点。每一步可以选择上、下、左、右。地图上有陷阱,踩到就扣分;有障碍物,不能穿过。

如果这是一个分类问题,每个格子都有一个标准答案:“在这个位置应该向右走”。模型看标签学就行了。

但在实际的寻路过程中,没有人给每一步贴标签。而且,当前走哪一步不是孤立的——向右走一步之后,你所处的位置变了,后续能走的路也全变了。一个动作的好坏,取决于它带来的后续局面。

预测(Prediction)是一次性的判断:输入一组特征,给出一个预测值。决策(Decision)是连续的选择:当前动作会改变未来局面,进而影响后续所有决策。

有些问题只需要学会预测就够了。有些问题需要学习一整套连续的行动策略。强化学习处理的是后者。

一个网格世界
#

为了让后面的概念有一个具体的载体,我先定义一个非常简单的例子,后续所有讨论都围绕它展开。

5×5 的网格世界:

  • S(左下角):Agent 的起点。
  • G(右上角):终点,到达后获得 +10 奖励。
  • X(中间):陷阱,踩入扣 -10 奖励。
  • ##:障碍物,不可进入。
  • 每移动一步,扣 -1(鼓励尽快到达终点)。
  • 动作空间:上、下、左、右。碰到边界或障碍物则停留原地(仍然扣 -1)。
  • Agent 到达 G 或踩入 X 后本轮结束。
Grid World 环境

这个环境很小,但已经足够展示后面要讨论的所有核心概念。

Agent 和 Environment 的反馈循环
#

有了具体的环境,可以正式说说 Reinforcement Learning(强化学习)到底在做什么了。

一句话:强化学习研究的是,一个智能体如何通过与环境不断交互,学习到能够最大化长期累计奖励的决策策略。

这个定义里的几个关键角色:

  • Agent(智能体):做出决策的主体。在网格世界里就是那个走格子的家伙。
  • Environment(环境):Agent 存在并与之交互的外部世界。在网格世界里就是整个地图——包括格子布局、陷阱位置、奖励规则。
  • State(状态),记作 \(s_t\):某一时刻环境的完整描述。在网格世界里就是 Agent 当前所在的格子坐标。
  • Action(动作),记作 \(a_t\):Agent 在当前状态下选择的行为。上、下、左、右中的一个。
  • Reward(奖励),记作 \(r_{t+1}\):Agent 执行动作 \(a_t\) 之后,环境返回的一个标量反馈。

交互的时序是这样的:

  1. Agent 观察当前状态 \(s_t\)。
  2. Agent 根据某种策略选择动作 \(a_t\)。
  3. Environment 响应这个动作,产生下一个状态 \(s_{t+1}\)。
  4. Agent 收到奖励 \(r_{t+1}\)。
  5. 进入下一轮:Agent 观察 \(s_{t+1}\),选择 \(a_{t+1}\),如此循环。

整篇文章统一一个记号约定:执行 \(a_t\) 后收到的奖励写作 \(r_{t+1}\),下标比动作多 1。不同教材有不同写法,这里选这种是因为它更清楚地表达了"奖励是动作的结果"这一因果关系。

监督学习与强化学习的反馈机制对比

对比上图:监督学习的链路是 input → model → prediction → loss(与外部 label 比较) → gradient → update。强化学习的链路是一个循环——Agent 行动,环境反馈,Agent 再行动。没有一个外部提供的"正确答案"在旁边等着做比较。

需要补充一点:State 和 Observation(观测)严格来说不总是相同的。在很多实际问题中,Agent 看到的只是环境的部分信息,不是完整状态。这篇为了教学方便,先假设 Agent 能拿到足够描述当前局面的完整状态信息。

Reward 不是 Label
#

到这里可能会有一个疑问:Reward 虽然不是人工标注的 label,但它确实是一个来自环境的信号,告诉 Agent 做得好不好。那 Reward 算不算某种 label?

我一开始也觉得 Reward 和 Label 有点像。后来发现差别很大。

在 supervised learning 里,Label 直接告诉模型"正确答案是什么"。

一张图片 → Label 是"猫"。

模型输出"狗"→ Loss 很大 → 调整参数让输出更接近"猫"。

每个样本都有一个明确的目标。模型只需要让自己的输出逼近这个目标就行。

但在强化学习的网格世界里:

Agent 在某个格子,选择向右走,移动到了新的位置,收到奖励 -1。

这个 -1 告诉 Agent 什么了?它说的是:你移动了一步,付出了一步的代价。

它没有说“在这个位置,正确的动作是向右”。也没有说"向右走比向左走好"。更没有说"你接下来应该怎么走"。

Reward 评价的是结果,不直接指示最优动作。

更麻烦的是 Delayed Reward(延迟奖励)。

回到网格世界。假设 Agent 走了 7 步,最终成功到达终点拿到 +10。前 6 步每步都是 -1,最后一步才拿到大的正奖励。

那么,前面哪一步贡献了最终的成功?

第 1 步选择绕开陷阱、第 3 步选择避开障碍物——这些动作在当时只收到了 -1 的奖励,看起来并不突出。但如果没有这些"看起来不怎么样"的动作,Agent 根本到不了终点。

这就是 Credit Assignment(功劳分配)问题:当最终结果好或坏的时候,究竟应该把功劳或责任归给前面的哪些动作?

Reward 不像 Label 那样给每个样本一个明确的优化目标。它可能在很多步之后才出现,而且不告诉你是前面哪个动作导致了这个结果。

当然,这不是说 RL 的 Reward 总是延迟的或者总是稀疏的。有些环境每一步都给 Reward(比如我们的网格世界每步 -1),有些只在终局给。但即使每步都有 Reward,单步 Reward 仍然不等于"当前动作的正确答案"——因为一个动作的真正价值取决于它引发的后续所有结果,而不只是当前收到的那一个数字。

不能只看眼前的 Reward
#

上一节说到,一个动作好不好不能只看当前 Reward。那应该怎么评价?

用网格世界的例子对比两条路径:

路径 A:Agent 走最短路径直奔终点方向,4 步后踩到了陷阱。

StepReward
1-1
2-1
3-1
4-10(陷阱)
总计-13

路径 B:Agent 绕路避开陷阱和障碍物,7 步后到达终点。

StepReward
1~6-1 each
7+10(终点)
总计+4
两条路径的逐步 Reward 与最终 Return

路径 A 前几步的 Reward 和路径 B 一样,都是 -1。如果 Agent 只看眼前的 Reward,这两条路看不出区别——甚至路径 A 因为步数少,早期的累计惩罚更小。

但路径 A 的结局是 -10,总回报 -13。路径 B 虽然多走了几步,总回报却是 +4。

一个动作的价值不能只看它立即产生的 Reward,还要看它引发的整条未来轨迹。

由此引出 Return(回报)。最简单的定义:把一条轨迹上所有 Reward 加起来。

但在更一般的情况下,RL 通常使用折扣累计回报(Discounted Return):

$$ G_t = r_{t+1} + \gamma \, r_{t+2} + \gamma^2 \, r_{t+3} + \cdots = \sum_{k=0}^{\infty} \gamma^k \, r_{t+k+1} $$

其中:

  • \(G_t\) 是从时刻 \(t\) 开始的累计回报。
  • \(r_{t+k+1}\) 是未来第 \(k\) 步收到的 Reward。
  • \(\gamma \in [0, 1)\) 是 Discount Factor(折扣因子),控制未来 Reward 相对于当前的权重。

如果 \(\gamma = 1\)(且轨迹长度有限),就退化成简单的总和。\(\gamma\) 越小,Agent 越"短视";\(\gamma\) 越接近 1,Agent 越重视远期奖励。

还有一点容易被忽略:实际 RL 优化的是 Expected Return(期望累计回报),而不是某一次轨迹上恰好得到的回报。因为环境可能有随机性,策略也可能是随机的,同一个起点出发可能产生不同的轨迹。一次走出 +4 的轨迹不代表策略一定好,一次走出 -13 也不代表策略一定差——重要的是期望值。

这一点在后面金融类比中也很重要:一笔交易赚了钱,不等于这个交易决策的期望价值为正。

Discount Factor 和金融里的折现有什么关系
#

看到 Discount Factor 的公式时,我脑子里第一个反应是:

这不就是金融里现金流折现的思路吗?

金融里的 Present Value(现值)公式:未来第 \(k\) 期的一笔现金流 \(CF_{t+k}\),按折现率 \(i\) 折算到当前的价值是:

$$ PV = \frac{CF_{t+k}}{(1+i)^k} $$

RL 里的折扣回报:未来第 \(k\) 步的 Reward \(r_{t+k+1}\),乘以 \(\gamma^k\):

$$ \gamma^k \cdot r_{t+k+1} $$

把两边放在一起,形式上很像。如果令 \(\gamma = \frac{1}{1+i}\),两个公式结构完全一致——都是用指数衰减的权重降低远期收益对当前评价的贡献。

但想了一下,两者的含义不完全一样。

金融中的折现率 \(i\) 通常反映资金的时间价值、机会成本和风险补偿。一块钱今天到手和一年后到手,价值不同,这背后有经济学的解释。

RL 中的 \(\gamma\) 更多是一个建模参数——它定义了 Agent 应该在多大程度上重视远期奖励。\(\gamma\) 接近 0,Agent 几乎只看当前一步;\(\gamma\) 接近 1,Agent 把很远之后的奖励也当回事。

两者的共同点是形式上的:远期的东西权重更低。但把 RL 的 \(\gamma\) 直接解释成市场利率,或者把金融折现率直接等同于 \(\gamma\),都不太准确。

那 \(\gamma\) 的不同取值到底意味着什么?画一张图比较直观。

下面是 \(\gamma = 0.9\)、\(\gamma = 0.99\)、\(\gamma = 0.999\) 三种情况下,未来第 \(k\) 步 Reward 的权重 \(\gamma^k\):

不同 gamma 值的折扣权重曲线

\(\gamma = 0.9\) 的曲线掉得很快——大约 20 步之后,Reward 的权重已经不到初始值的 15%。\(\gamma = 0.99\) 在 100 步时仍然保留约 37% 的权重。\(\gamma = 0.999\) 则几乎在 100 步内保持平坦。

一个常见的直觉估算:有效折扣期限大约是 \(H_{\text{eff}} \approx \frac{1}{1-\gamma}\)。当 \(\gamma = 0.99\) 时,\(H_{\text{eff}} \approx 100\)——意味着 Agent “大致在意"未来 100 步以内的 Reward。

但这只是量级上的直觉。\(H_{\text{eff}}\) 不是说 Agent 精确地规划到第 100 步然后完全忽略第 101 步。它也不保证 Agent 真的能学到有效利用那么远的信息。

几个容易犯的错误认识:

  • \(\gamma\) 越接近 1,Agent 一定学到更好的策略?不一定。\(\gamma\) 太大会让优化目标的方差增大,训练可能更不稳定。
  • \(\gamma = 1\) 不能用?在有限步数的任务里完全可以用 \(\gamma = 1\),这时 Return 就是 Reward 的简单总和。
  • \(\gamma\) 只是在表达"人更喜欢即时满足”?不是。\(\gamma\) 是目标函数的一部分,它参与定义了 Agent 到底在优化什么。

Discount Factor 不是公式中一个可以随意忽略的装饰系数。它直接参与定义了 Agent 应该如何权衡即时奖励与远期奖励——也就是说,\(\gamma\) 的选择,实际上在定义优化目标本身。

Policy:RL 学到的到底是什么
#

前面讲了环境、动作、奖励、回报。但 Agent 做决策的那个东西本身是什么?

答案是 Policy(策略)。

Policy 是 Agent 根据当前状态选择动作的规则。

最简单的形式是确定性策略:

$$ a_t = \pi(s_t) $$

给一个状态,输出一个确定的动作。比如"在位置 (3,1) 时向右走"。

但更一般的形式是随机策略:

$$ a_t \sim \pi_\theta(\cdot \mid s_t) $$

\(\pi_\theta(a \mid s)\) 表示:在状态 \(s\) 下,选择动作 \(a\) 的概率。\(\theta\) 是策略的参数。

举个例子。假设 Agent 在网格的某个位置,策略输出四个动作的概率:

动作概率
Up0.1
Down0.2
Left0.1
Right0.6

然后按这个分布随机采样一个动作执行。

Policy 从状态到动作概率分布

如果 Policy 是一个神经网络,这看起来是不是很眼熟?输入一个 state 的表示,最后一层过 Softmax,输出各个动作的概率——和分类模型的结构几乎一样。

我当时确实冒出过一个疑问:既然 Policy 网络和分类网络长得这么像,那 RL 和 supervised classification 到底差在哪?

差别不在网络结构。差别在训练信号的来源。

分类模型有每个样本的正确 label,通过 cross-entropy loss 直接告诉网络应该输出什么。Policy 网络没有这个东西——没有人告诉它"在这个状态下正确动作是 Right"。它需要通过和环境交互、从 Reward 中间接地发现好的策略。

具体怎么从 Reward 生成可微的训练信号、怎么更新 Policy 的参数——这是后续文章(DQN、Policy Gradient)要回答的问题。这里先不展开。

还需要说明一点:Policy 不一定非要用神经网络表示。它可以是一张查找表(每个状态对应一个动作),可以是一组手写规则,也可以是一个线性模型。强化学习本身不要求 Deep Learning。Deep RL 只是指用深度神经网络来表示 Policy 或其他学习对象。

这一节的核心:RL 的目标是学到一个好的 Policy——一套在不同状态下做出有效决策的规则——而不只是预测未来 Reward 会是多少。

你的行动决定你看到什么
#

在 supervised learning 中,训练数据通常是事先固定好的:一个数据集,模型在上面迭代训练。样本的分布不会因为模型的输出而改变。模型预测一张图片是猫还是狗,不会导致下一张图片变成飞机。

但在 RL 中,情况完全不同。

回到网格世界。Agent 站在起点 (4,0)。

如果它选择向右走,下一步到达 (4,1),然后会看到 (4,1) 周围的环境,面对一组新的动作选择。

如果它选择向上走,下一步到达 (3,0),看到的是完全不同的局面。

不同 Action 导致不同的未来经验

Agent 的动作改变了它下一步所处的状态,从而改变了它后续能观察到的所有经验。

这意味着什么?

Policy 不仅决定 Agent 如何行动,还间接决定了它后续收集到哪些数据。一个保守的策略可能永远只在起点附近转悠,收集到的全是小范围内的经验。一个激进的策略可能很快走到陌生区域,遇到之前没见过的状态。

用更正式的说法:在在线 RL 中,数据的分布依赖于当前的 Policy。Policy 变了,数据分布也跟着变。

这和 supervised learning 有一个根本的结构性差异。Supervised learning 的训练分布一般被假定为固定的。RL 的训练分布和学习过程本身耦合在一起——你学到什么策略,决定了你能看到什么数据,而你看到什么数据,又影响你接下来能学到什么策略。

当然,需要保持准确:

  • 不是所有 supervised learning 的数据都永远固定——比如 active learning 也会根据模型状态选择新的样本。
  • 也不是所有 RL 都必须实时和环境交互。有一个方向叫 Offline RL(离线强化学习),使用已有的交互数据进行训练,不再收集新数据。但即使在 Offline RL 中,数据分布与收集时使用的策略之间的关系仍然是核心问题。

这里的重点是让自己记住:RL 的数据生成过程和策略之间存在反馈关系。这是 RL 比 supervised learning 更难的一个重要原因。

要不要试一试那个不确定的动作
#

数据分布依赖 Policy 这件事,还引出了 RL 里一个绕不过去的矛盾。

假设 Agent 在网格世界里已经探索了一段时间,积累了一些经验:

  • 向右走:试过 100 次,平均每次最终回报 +3。
  • 向上走:只试过 2 次,两次都碰到了障碍物,回报 -2。

如果 Agent 永远选择目前看起来最好的动作(向右走),它确实能拿到稳定的 +3。但它可能永远不知道:向上走如果绕过障碍物之后,有一条回报 +8 的路径。

只试了 2 次就判定"向上走不行",这个结论可信吗?样本太少,估计的方差很大。也许第 3 次试的时候,会发现向上走其实是更好的选择。

这就是 Exploration vs Exploitation 的核心矛盾:

  • Exploitation(利用):选择目前已知的最优动作,最大化当前预期收益。
  • Exploration(探索):尝试不确定的动作,获取新信息,可能发现更好的策略。

这不是"随机乱试 vs 正确行动"那么简单。

Exploration 是有代价的——每次选择一个不确定的动作,可能会得到很差的结果。但 Exploitation 也有代价——如果永远不探索,你可能一直卡在一个局部最优的策略上,永远不知道有更好的选择存在。

之前讲到 Policy 可以输出概率分布。一个自然的问题是:随机策略是不是天然就在 Exploration?确实,输出概率分布意味着不会每次都选同一个动作,有一定的探索效果。但有随机性不等于"充分探索"——如果概率分布已经非常集中(比如 95% 的概率选向右),其他动作几乎不会被尝试。

Exploration 和 Exploitation 的权衡没有通用的最优解。不同的算法有不同的策略,比如 ε-greedy(大部分时间选最优,小概率随机)、UCB(根据不确定性调整选择)等。具体方法不是这篇的重点。

这里想记住的是:RL 面对的不只是"如何从已有信息做最优决策",还有一个更深的问题——为了在未来做出更好的决策,Agent 现在是否应该主动承担风险、尝试那些尚不确定的动作?

这是 RL 和 supervised learning 的又一个结构性差异。Supervised learning 的核心一般是利用已有数据学习输入到目标的映射。RL 除了学习之外,还需要面对"如何主动获取有用信息"的问题。

写在最后
#

回到最初的问题:没有 Label,模型到底怎么学会决策?

走到这里,至少能给出一个初步的回答了。

RL 的训练信号来自 Reward——环境对 Agent 动作结果的评价。Reward 不直接指示正确动作,但通过累积大量交互经验,Agent 可以逐渐发现哪些 Policy 在长期上获得更高的 Return。

不过,说"逐渐发现"其实回避了最关键的问题。具体怎么发现?

如果一个动作的长期回报要等到几十步甚至更多步之后才能知道,那 Agent 在当前状态下,如何判断不同动作的长期价值?

这个问题的答案是 Value Function 和 Q-Function——把"一个状态(或状态-动作对)的长期期望回报"这件事本身建模为一个可学习的函数。

下一篇就从这里展开:[Q-Function 与 Bellman Equation:如何评价一个动作的长期价值?]

参考资料
#

Related

9 年后重温 CNN:剥掉算子细节后,真正留下了什么

最近在重新过 MIT 6.S191 Lecture 3(卷积神经网络)。2017 年刚接触 CV 那会儿,CNN 算是吃饭的家伙,每天都在调。后来精力逐渐转到 ML Infra,成天跟 GPU 显存、通信拓扑和算子优化打交道,卷积网络的很多具体细节就慢慢生疏了——写个 nn.Conv2d 时 weight 的四维形状到底怎么排、Kaiming 初始化的方差怎么推、感受野怎么算,冷不丁被问到,还得在脑子里卡壳一下。