第11章 强化学习:让智能体从行动结果中学习

本章技术主题: 状态、动作、奖励与策略学习。
本章技术实验: 在虚拟房间中比较规则策略与通过试错学习的策略。
家庭项目: “建立家庭空气与用能观察站”第二阶段——虚拟环境中的舒适—节能策略。
跨章位置: 接收第5章的观察问题,但不控制真实设备;结果作为第12章系统安全设计的反例与依据。
技术主线: 观察状态 → 选择动作 → 环境转移 → 获得奖励 → 更新策略 → 独立评估。

学习目标

完成本章学习后,你将能够:

  1. 在家庭空气与用能观察站的虚拟任务中分别定义智能体、环境、状态、动作、奖励、策略和回合。
  2. 说明Q学习如何通过试错更新动作价值,以及探索与利用为什么都需要。
  3. 运行一个完整的表格型Q学习程序,并把学得策略与固定策略基线比较。
  4. 发现奖励漏洞、探索风险和仿真—现实差距,判断强化学习何时不应接管真实动作。

项目导入

本章的技术主题是强化学习,家庭项目是“建立家庭空气与用能观察站”。第一阶段只观察教师提供或已经脱敏的温度、空气质量与用能记录,核对采集时间和变化曲线,不执行控制;本章进入第二阶段,在完全虚拟的房间中让智能体学习“保持舒适,同时减少能源消耗”的策略。虚拟温度被分成五档,智能体每一步可以不动作、升温或降温;环境还会产生随机冷热扰动。智能体不能直接看到未来,只能根据当前状态选择动作,再从环境返回的下一状态和奖励中学习。

强化学习不同于前面章节的监督学习。监督学习通常由数据提供输入和正确标签,模型学习预测;强化学习没有为每一步直接给出“正确动作”,而是由奖励评价行动后的结果。奖励写得不完整,智能体可能找到符合数字却违背真实意图的做法。

本章的“应用中的AI”是从仿真交互中学得的Q表和策略。“开发与学习AI”可以帮助学生解释更新公式、生成测试和分析异常回合,但不能替学生定义真实目标,也不能把仿真高分解释为现实安全。本章不连接空调、加热器、门窗或任何真实设备,所有动作只改变程序中的虚拟状态。

本章成果

考点提示

请重点区分:智能体只是行动主体,不等于使用了强化学习;状态机可以按规则行动,却不从奖励更新策略;奖励是人为设计的学习信号,不是现实价值本身;探索会主动尝试不确定动作,在真实高风险环境中可能不可接受。

第一节 定义虚拟环境中的状态、动作和奖励

一、先把强化学习要素写成合同

观察站的第二阶段把虚拟房间温度简化为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表,并在探索与利用之间平衡。固定策略是重要基线;名称叫智能体、会执行动作的状态机并不自动构成强化学习。奖励漏洞、探索风险和仿真—现实差距决定了课堂策略只能在仿真中使用。

关键术语

目标测试

一、单项选择题

  1. 强化学习中,哪一项负责接收动作并返回下一状态和奖励? A. 环境 B. 标签表 C. 测试答案 D. 用户画像
  2. Q(s,a)主要表示什么? A. 图片像素 B. 状态s选择动作a的长期价值估计 C. 固定温度 D. 设备价格
  3. 为什么训练初期需要探索? A. 发现尚未尝试但可能更好的动作 B. 删除奖励 C. 保证每步安全 D. 取消环境
  4. 下列哪一项本身不构成强化学习? A. 依据奖励更新Q表 B. 在环境中试错学习策略 C. 固定条件状态机按规则动作 D. 比较累计奖励

二、判断并改错

  1. 判断并改错:“仿真平均奖励高,就可以直接把策略接到真实加热设备。”
  2. 判断并改错:“奖励是客观完整的真实目标,智能体无法利用奖励定义的漏洞。”

三、简答与操作题

  1. 用“家庭空气与用能观察站第二阶段”的虚拟房间案例分别解释状态、动作、奖励、策略和回合,并说明第一阶段观察与第二阶段学习的区别。
  2. 写出Q学习更新式中“本步奖励”和“下一状态最大Q值”分别代表的作用。
  3. 设计一个奖励漏洞测试,说明修改什么、预期可能出现什么异常行为、记录哪些指标。
  4. 学得策略平均奖励高于固定策略,但极端状态步数也明显更多。你会怎样判断?写出至少三项后续检查或限制。