第11章 强化学习:让智能体从行动结果中学习
本章技术主题: 状态、动作、奖励与策略学习。
本章技术实验: 在虚拟房间中比较规则策略与通过试错学习的策略。
家庭项目: “建立家庭空气与用能观察站”第二阶段——虚拟环境中的舒适—节能策略。
跨章位置: 接收第5章的观察问题,但不控制真实设备;结果作为第12章系统安全设计的反例与依据。
技术主线: 观察状态 → 选择动作 → 环境转移 → 获得奖励 → 更新策略 → 独立评估。
学习目标
完成本章学习后,你将能够:
- 在家庭空气与用能观察站的虚拟任务中分别定义智能体、环境、状态、动作、奖励、策略和回合。
- 说明Q学习如何通过试错更新动作价值,以及探索与利用为什么都需要。
- 运行一个完整的表格型Q学习程序,并把学得策略与固定策略基线比较。
- 发现奖励漏洞、探索风险和仿真—现实差距,判断强化学习何时不应接管真实动作。
项目导入
本章的技术主题是强化学习,家庭项目是“建立家庭空气与用能观察站”。第一阶段只观察教师提供或已经脱敏的温度、空气质量与用能记录,核对采集时间和变化曲线,不执行控制;本章进入第二阶段,在完全虚拟的房间中让智能体学习“保持舒适,同时减少能源消耗”的策略。虚拟温度被分成五档,智能体每一步可以不动作、升温或降温;环境还会产生随机冷热扰动。智能体不能直接看到未来,只能根据当前状态选择动作,再从环境返回的下一状态和奖励中学习。
强化学习不同于前面章节的监督学习。监督学习通常由数据提供输入和正确标签,模型学习预测;强化学习没有为每一步直接给出“正确动作”,而是由奖励评价行动后的结果。奖励写得不完整,智能体可能找到符合数字却违背真实意图的做法。
本章的“应用中的AI”是从仿真交互中学得的Q表和策略。“开发与学习AI”可以帮助学生解释更新公式、生成测试和分析异常回合,但不能替学生定义真实目标,也不能把仿真高分解释为现实安全。本章不连接空调、加热器、门窗或任何真实设备,所有动作只改变程序中的虚拟状态。
本章成果
- 一份家庭空气与用能观察站第二阶段的虚拟状态、动作、转移、奖励和终止条件说明。
- 一张“状态—动作—环境反馈—奖励—策略更新”的交互闭环图。
- 一个完整可运行的表格型Q学习程序及固定策略比较结果。
- 一份奖励漏洞、探索风险和仿真迁移测试记录。
- 一张说明仿真结论范围和禁止真实接管条件的判断卡。
考点提示
请重点区分:智能体只是行动主体,不等于使用了强化学习;状态机可以按规则行动,却不从奖励更新策略;奖励是人为设计的学习信号,不是现实价值本身;探索会主动尝试不确定动作,在真实高风险环境中可能不可接受。
第一节 定义虚拟环境中的状态、动作和奖励
一、先把强化学习要素写成合同
观察站的第二阶段把虚拟房间温度简化为0至4五个状态:0为很冷,1为偏冷,2为舒适,3为偏热,4为很热。动作有三个:保持、升温、降温。环境接收动作后,再叠加一次随机外界扰动,得到下一状态。智能体的目标是在若干步中获得较高累计奖励。第一阶段的真实或样例观察记录可以帮助提出仿真范围,但不得直接当作自动控制许可。
| 要素 | 本项目定义 | 需要警惕的简化 |
|---|---|---|
| 智能体 | 选择保持、升温或降温的程序 | 不代表真实设备控制器 |
| 环境 | 计算温度变化和奖励的虚拟房间 | 忽略湿度、房间大小和设备延迟 |
| 状态 | 0—4的温度档位 | 离散档位丢失精确温度和变化速度 |
| 动作 | 保持、升温、降温 | 假定每次动作效果相同 |
| 奖励 | 舒适收益减能源成本 | 数字不能覆盖噪声、维护和安全 |
| 策略 | 每个状态下选择动作的方法 | 高仿真得分不等于现实可用 |
| 回合 | 重置后连续运行30步 | 只是一次模拟过程 |
每一步可以写成四元记录:“当前状态、选择动作、获得奖励、下一状态”。例如当前偏冷状态1,选择升温,环境扰动为0,下一状态变为2;若舒适收益为2、动作能耗成本为0.3,本步奖励为1.7。这条记录不是正确答案,而是智能体更新判断的经验。
家庭阳台温室可以作为同一方法的变体:把状态改为虚拟温室温度档位,把动作解释为“保持、虚拟保温、虚拟通风”,奖励写成适宜区间收益减动作成本。学生必须重新说明光照、湿度、设备延迟等被省略因素,不能把房间策略改几个名称就接到真实风扇、加热器或遮阳设备。
二、状态必须包含作决策所需的信息
本章只用当前温度档位作为状态,隐含假设是:知道当前档位后,预测下一步不再需要更早历史。这便于观察Q学习,却未必符合真实房间。若刚刚连续升温和刚刚快速降温都显示为状态2,设备余热可能使两种情况的下一步不同。此时可以把温度变化方向或上一动作加入状态,也可以使用能够处理序列的模型。
增加状态不是越多越好。五档温度与三个上一动作组合后,状态数量会扩大;每个状态—动作组合都需要足够经验。数据不足时,Q表中许多位置几乎没有被访问,策略会变得不稳定。设计者要在信息充分和学习难度之间取舍,并记录哪些现实因素被省略。
环境转移也需要单独验证。同一状态选择同一动作,因为随机扰动不同,下一状态可能不同;Q值学习的是多次经验下的长期平均,而不是保证每次得到同一结果。学生可固定一个状态和动作重复运行100次,统计各下一状态出现次数,再与程序设定的扰动概率比较。若实际分布明显异常,应先修复环境,不能让智能体在错误仿真中继续追求高分。
三、奖励决定模型会追求什么
本项目在下一状态为2时给2分;偏离2越远,舒适部分越低;使用升温或降温动作再扣除0.3分。这样同时表达舒适与节能。但0.3只是课堂假设,不是实际电费,也没有包含设备磨损。
若只奖励舒适、不惩罚能源,智能体可能频繁动作;若能源惩罚过大,它可能宁愿长期不舒适;若只奖励“设备关闭”,最佳数字策略会是不做任何事。强化学习不会理解设计者未写进奖励的价值,这类利用奖励定义缺口取得高分的现象称为奖励漏洞。
还要规定回合何时结束。本项目固定30步后终止,使不同策略可以比较相同长度的累计奖励。若只在发生严重偏离后提前结束,却没有给出足够负奖励,智能体甚至可能主动让回合结束以逃避后续成本。
累计奖励把一个回合内的多步结果相加,适合比较长期表现,但不能代替轨迹检查。两个策略可能累计奖励相同:一个始终接近舒适,另一个在舒适和极端状态之间大幅摆动。评价表因此还应记录每回合动作次数、极端状态步数、最长连续不舒适时间和最差回合。平均值与最坏情形共同呈现,才不会让少数高分回合掩盖风险。
四、固定策略是必要基线
在学习前先写固定策略:偏冷就升温,偏热就降温,舒适就保持。它不根据奖励修改规则,因此不是强化学习。还可以设置“始终保持”基线,观察完全节能但不主动调节的结果。
固定策略简单、可解释,可能已经在本仿真中表现很好。学得策略只有在多次独立回合中稳定达到更高奖励,并且没有增加极端状态次数,才显示出进一步研究价值。若强化学习没有超过固定策略,应保留简单方法,而不是因为“会学习”就优先采用。
第二节 让智能体在试错中学习策略
一、从动作价值到Q表
Q表的行对应状态,列对应动作。表中数值Q(s,a)表示在状态s选择动作a,并在以后继续行动时可能获得的累计收益。开始时所有值为0,智能体没有经验。
获得一次转移后,Q学习把当前估计向“本步奖励加下一状态最佳价值”移动:
新Q值 = 旧Q值 + 学习率 × [奖励 + 折扣因子 × 下一状态最大Q值 - 旧Q值]
学习率控制一次经验改变旧判断的幅度;折扣因子控制对未来奖励的重视程度。数值设置会影响学习速度和稳定性,不存在对所有任务都最好的固定值。
如果智能体永远选择当前Q值最大的动作,它可能一直重复早期偶然选择,无法发现更好的动作。探索是以一定概率尝试其他动作,利用则选择当前认为最好的动作。训练开始时探索较多,积累经验后逐步降低,但不能把随机探索直接搬到高风险现实设备。
二、运行完整Q学习程序
下面程序实现五状态、三动作的虚拟环境,训练Q表,并用100个新回合比较学得策略、固定策略和始终保持策略。随机种子固定,便于重复实验。
import numpy as np
class VirtualRoom:
def __init__(self, seed=7):
self.rng = np.random.default_rng(seed)
self.state = 2
self.step_count = 0
def reset(self):
self.state = int(self.rng.integers(0, 5))
self.step_count = 0
return self.state
def step(self, action):
action_change = [0, 1, -1][action]
disturbance = int(self.rng.choice([-1, 0, 1], p=[0.20, 0.60, 0.20]))
self.state = int(np.clip(self.state + action_change + disturbance, 0, 4))
comfort_reward = 2.0 if self.state == 2 else -float(abs(self.state - 2))
energy_cost = 0.3 if action != 0 else 0.0
reward = comfort_reward - energy_cost
self.step_count += 1
terminated = self.step_count >= 30
return self.state, reward, terminated
def train_q_learning(episodes=4000):
env = VirtualRoom(seed=7)
q_table = np.zeros((5, 3), dtype="float32")
rng = np.random.default_rng(11)
learning_rate = 0.15
discount = 0.95
for episode in range(episodes):
state = env.reset()
epsilon = max(0.05, 1.0 - episode / 3000)
terminated = False
while not terminated:
if rng.random() < epsilon:
action = int(rng.integers(0, 3))
else:
action = int(np.argmax(q_table[state]))
next_state, reward, terminated = env.step(action)
target = reward
if not terminated:
target += discount * float(np.max(q_table[next_state]))
q_table[state, action] += learning_rate * (target - q_table[state, action])
state = next_state
return q_table
def learned_policy(q_table, state):
return int(np.argmax(q_table[state]))
def fixed_policy(state):
if state < 2:
return 1
if state > 2:
return 2
return 0
def always_hold_policy(state):
return 0
def evaluate(policy, seed, episodes=100):
env = VirtualRoom(seed=seed)
rewards = []
extreme_steps = []
for _ in range(episodes):
state = env.reset()
total_reward = 0.0
extremes = 0
terminated = False
while not terminated:
action = policy(state)
state, reward, terminated = env.step(action)
total_reward += reward
extremes += int(state in (0, 4))
rewards.append(total_reward)
extreme_steps.append(extremes)
return float(np.mean(rewards)), float(np.mean(extreme_steps))
q_table = train_q_learning()
learned_result = evaluate(lambda state: learned_policy(q_table, state), seed=101)
fixed_result = evaluate(fixed_policy, seed=101)
hold_result = evaluate(always_hold_policy, seed=101)
print("Q表:\n", np.round(q_table, 2))
print("学得策略动作:", np.argmax(q_table, axis=1).tolist())
print("学得策略 平均奖励/极端状态步数:", learned_result)
print("固定策略 平均奖励/极端状态步数:", fixed_result)
print("始终保持 平均奖励/极端状态步数:", hold_result)
动作编号0、1、2分别表示保持、升温和降温。训练阶段使用逐步降低的探索率;评价阶段完全按策略行动,不再随机探索。平均奖励之外,程序还统计进入很冷或很热状态的步数,防止一个单一总分掩盖极端状态。
学生不必默写代码,但应能指出环境转移、奖励、探索判断和Q值更新分别在哪里。开发与学习AI可以逐行解释某一次更新,学生则用手算核对。下一阶段应规划一份完整Actor-Critic Notebook作为拓展数字资源,用于观察状态较多或连续动作时,策略网络和价值网络如何替代表格;它不是本章第一次实验的前置要求。
三、控制变量理解学习过程
可以只改变一个变量重新训练。例如把能源成本从0.3改为0.8,观察策略是否更倾向保持;把探索最低值从0.05改为0,观察不同随机种子下结果是否更不稳定;把扰动概率增大,观察固定策略和学得策略的差异。
每次应记录Q表、五个状态选择的动作、平均奖励和极端状态步数。单次训练优于基线不能说明稳定,至少使用多个随机种子重复,并报告结果范围。若不同种子形成完全不同策略,说明数据经验不足、奖励不清或任务本身存在多个近似方案。
第三节 检查奖励漏洞、探索风险与仿真迁移
一、主动寻找奖励漏洞
奖励测试可以故意制造缺陷。第一种只奖励接近舒适档,不扣能源,观察动作是否过多;第二种把能源惩罚设得极高,观察智能体是否拒绝调节;第三种只在回合结束时计算温度,观察中间极端状态是否被忽略。发现高分同时伴随不合理行为,就是奖励没有表达完整目标的证据。
不能只修改奖励直到某次曲线“好看”。每次修改要先写预期行为,再用固定测试种子比较平均奖励、动作次数、极端状态和最差回合。开发与学习AI可以列出可能漏洞,但学生要回到轨迹逐步检查,确认问题真实存在。
二、探索在现实中可能付出代价
仿真中的随机升温或降温只改变数字。真实环境的错误动作可能造成能源浪费、设备损坏或人员风险。强化学习的探索机制意味着系统可能主动尝试尚未验证的行动,因此不能把课堂策略直接连接真实设备。
若未来研究低风险现实应用,也要先经过离线数据验证、仿真压力测试、动作白名单、幅度限制、人工批准、紧急停止和可回退控制器。对高温、高压、交通、医疗和人身安全相关系统,课堂实验不提供自动控制路径。
一个程序被称为“智能体”,或能够根据状态执行动作,并不自动意味着强化学习。只有当它通过与环境交互获得奖励,并依据这些经验更新策略,才具有本章所说的强化学习过程。固定条件规则、工作流和状态机仍然可能是更安全、更合适的方案。
三、认识仿真—现实差距
虚拟房间假定每次升温都增加一档、扰动概率固定、状态完全可见。真实房间存在测量误差、动作延迟、空间差异、季节变化、门窗开合和设备老化。仿真中没有出现的因素会让策略失效,这称为仿真—现实差距。
本章结论只能是“在家庭空气与用能观察站第二阶段的给定仿真假设下,学得策略达到某种表现”。判断卡需列出第一阶段观察数据怎样被使用、仿真省略了什么、策略是否超过固定基线、奖励漏洞测试结果、探索是否关闭,以及禁止接入哪些设备。阳台温室变体也遵守同一边界。即使学得策略得分最高,也只说明值得继续研究,不代表获得真实部署许可。
本章小结
强化学习通过智能体与环境交互学习策略。家庭空气与用能观察站第一阶段负责观察,第二阶段才在虚拟环境中研究舒适—节能策略;家庭阳台温室只是可重新定义状态、动作和奖励的变体。状态描述当前信息,动作影响环境,奖励评价行动结果,回合组织一段连续经验。Q学习用奖励和下一状态价值更新Q表,并在探索与利用之间平衡。固定策略是重要基线;名称叫智能体、会执行动作的状态机并不自动构成强化学习。奖励漏洞、探索风险和仿真—现实差距决定了课堂策略只能在仿真中使用。
关键术语
- 智能体:观察状态并选择动作的决策主体。
- 环境:接收动作、改变状态并返回奖励的外部过程。
- 状态:智能体作决策时获得的环境信息表示。
- 动作:智能体可以选择并施加给环境的操作。
- 奖励:环境对一步行动结果给出的数值学习信号。
- 策略:从状态到动作选择的方法。
- 回合:从环境重置到终止的一段连续交互。
- 探索与利用:尝试不确定动作与选择当前最优动作之间的权衡。
- Q学习:通过转移经验估计状态—动作长期价值的方法。
- 奖励漏洞:智能体利用奖励定义缺口取得高分却违背真实目标的现象。
目标测试
一、单项选择题
- 强化学习中,哪一项负责接收动作并返回下一状态和奖励? A. 环境 B. 标签表 C. 测试答案 D. 用户画像
- Q(s,a)主要表示什么? A. 图片像素 B. 状态s选择动作a的长期价值估计 C. 固定温度 D. 设备价格
- 为什么训练初期需要探索? A. 发现尚未尝试但可能更好的动作 B. 删除奖励 C. 保证每步安全 D. 取消环境
- 下列哪一项本身不构成强化学习? A. 依据奖励更新Q表 B. 在环境中试错学习策略 C. 固定条件状态机按规则动作 D. 比较累计奖励
二、判断并改错
- 判断并改错:“仿真平均奖励高,就可以直接把策略接到真实加热设备。”
- 判断并改错:“奖励是客观完整的真实目标,智能体无法利用奖励定义的漏洞。”
三、简答与操作题
- 用“家庭空气与用能观察站第二阶段”的虚拟房间案例分别解释状态、动作、奖励、策略和回合,并说明第一阶段观察与第二阶段学习的区别。
- 写出Q学习更新式中“本步奖励”和“下一状态最大Q值”分别代表的作用。
- 设计一个奖励漏洞测试,说明修改什么、预期可能出现什么异常行为、记录哪些指标。
- 学得策略平均奖励高于固定策略,但极端状态步数也明显更多。你会怎样判断?写出至少三项后续检查或限制。