q1、学习与规划
学习(learning)和规划(planning)是序列决策的两个基本问题。如下图所示,在强化学习中,环境初始时是未知的,智能体不知道环境如何工作,它通过不断地与环境交互,逐渐改进策略。
学习
在规划中,环境是已知的,智能体已经掌握了环境的所有规则和运行机制。它可以在不与环境交互的情况下,通过计算预先模拟出一个完美的模型。也就是说,智能体只需要知道当前的状态,就可以开始推演未来的变化,找到解决问题的最佳方案。
例如,如下图所示的游戏中,我们明确知道规则。如果选择左边,环境会发生什么变化是完全确定的。因此,智能体可以通过这些已知规则在脑海中“演练”整个决策过程,而无需实际操作或试验。
这种方法是强化学习的一种常见思路。首先,智能体需要学习环境的运行方式,构建一个“环境模型”。然后,它利用这个模型来进行规划,模拟出一系列动作,从而找到实现目标的最优路径。简单来说,就是“先弄清规则,再靠模拟找到最优解”。
规划
2、探索和利用
2.1、 探索和利用的含义
- 探索:尝试不同的动作,从而了解哪些动作可能带来更高的奖励。探索的过程通常是通过“试错”来完成的。
比如,你想找一家好餐馆,就需要去尝试新的餐馆。
- 利用:选择已经知道可以带来高奖励的动作,而不去尝试新的动作。
比如,你去了一家自己喜欢的餐馆,因为你知道它的菜很好吃。
2.2、 探索与利用的权衡
-
探索帮助你发现可能更优的策略,但短期内可能收益较低。
-
利用可以让你直接获得较高的即时奖励,但可能错过更好的策略。
举个例子:
选择餐馆:探索是尝试新的餐馆,可能会找到一家更好的,也可能踩雷;利用是直接去熟悉的餐馆,确保好吃但少了惊喜。
玩游戏:探索是尝试新策略,可能学到更强的招式;利用是重复使用熟悉的策略,但可能无法应对某些对手。
2.3、 强化学习的探索与利用问题
强化学习中,奖励往往在多步动作之后才能观察到。为简化讨论,我们先看单步奖励的情形:
假设有多个动作(如选择不同的餐馆),目标是通过尝试找到能带来最大奖励的动作。
2.4、 K-臂赌博机模型
如下图所示,K-臂赌博机是一种理论模型,用来研究探索与利用的平衡:
-
有 K 个摇臂,每个摇臂对应一个奖励概率,但你并不知道哪个摇臂奖励最高。
-
目标是通过有限的尝试次数,尽可能获得更多奖励。
在这种模型中:
-
纯探索策略:轮流尝试每个摇臂,估计每个摇臂的奖励概率。
-
优点:能很好地估计摇臂的奖励。
-
缺点:浪费了很多尝试机会,无法充分利用奖励更高的摇臂。
-
-
纯利用策略:总是选择当前奖励最高的摇臂。
-
优点:能快速获得高奖励。
-
缺点:可能错过真正最优的摇臂。
-
2.5、 探索与利用的矛盾
-
探索需要花时间去“试错”,可能牺牲短期奖励。
-
利用则专注于当前的最优选择,可能错失长期收益。
-
在有限的尝试次数中,要想获得最大累计奖励,必须在探索和利用之间找到一个折中。
总结:探索是为了了解环境,利用是为了获得奖励。在强化学习中,如何平衡探索与利用是一个关键问题。
3、强化学习实验
强化学习是一个结合理论和实践的机器学习分支。要想深入学习强化学习,既需要掌握其算法背后的数学原理,也需要通过实践去实现和验证这些算法的效果。
3.1、 理论与实践相结合
- 理论部分:理解强化学习中涉及的数学模型(如马尔可夫决策过程、动态规划)和关键算法(如 Q-learning、深度 Q 网络)。
- 实践部分:通过实验来验证算法是否有效,这也是强化学习学习过程中的重要环节。
3.2、 实践中的工具与实现
强化学习实践可以通过编程来实现,目前已有许多成熟的深度学习框架和工具可以辅助实现算法:
-
常用框架:
-
PyTorch:灵活、高效,适合快速迭代开发。
-
TensorFlow:功能强大,支持分布式训练,适合大型项目。
-
Keras:易用性高,适合入门。
-
-
优势:这些工具封装了底层的数学运算和优化过程,开发者可以专注于算法的实现,而不需要从零开始“造轮子”。
3.3、 如何高效学习和实践
-
选择框架:熟练掌握两三种框架即可实现大部分强化学习功能,无需全部精通。
-
动手实践:将强化学习算法应用于不同实验环境,如 OpenAI Gym 提供的标准强化学习环境,进行算法调试和效果评估。
-
理论验证:在实验中观察算法行为是否符合理论预期,同时改进算法以提升效果。
通过理论与实践的结合,可以更好地理解强化学习的本质,并能灵活应用到实际问题中。
3.4、Gym 的基本介绍
-
Gym 是什么:一个环境仿真库,用于测试和开发强化学习算法。
提供多种环境,例如 Atari 游戏和机器人控制等。
包括离散控制(如向上、向下动作)和连续控制(如机器人行走的角度调整)。
-
版本问题:Gym 0.26.0 及之后的版本可能与旧代码不兼容,因此建议安装 0.25.2 版本:
pip install gym==0.25.2
-
图形界面依赖:需要安装
pygame
库来显示图形界面:
pip install pygame
3.4.1、Gym 的核心功能
以下是 Gym 的几个关键方法和属性:
-
初始化环境:
import gym env = gym.make('CartPole-v0') # 创建一个环境 env.reset() # 重置环境,初始化状态
-
随机选择动作:
action = env.action_space.sample() # 在动作空间中随机选择一个动作
-
执行动作:
observation, reward, done, info = env.step(action)
observation
:观测到的状态(如屏幕像素值或物体位置)。reward
:该动作的即时奖励。done
:布尔值,表示游戏是否结束。info
:额外调试信息(正式评测时不能使用)。
-
显示界面
env.render() # 显示当前环境的图形界面
-
关闭环境:
env.close() # 释放资源
3.4.2、 完整代码示例
以 CartPole-v0
环境为例:
import gym
env = gym.make('CartPole-v0') # 创建环境
env.reset() # 重置环境
for _ in range(1000): # 执行 1000 步
env.render() # 显示图形界面
action = env.action_space.sample() # 随机选择一个动作
observation, reward, done, info = env.step(action) # 执行动作
print(observation) # 输出观测到的状态
env.close() # 关闭环境
输出示例:
Step 1: Observation = [ 0.005 0.025 -0.035 0.015]
Step 2: Observation = [ 0.005 0.045 -0.034 0.018]
...
Episode finished after 245 steps
- 每一行是一个观测状态,
CartPole
环境的状态是一个四维向量。
3.4.3、 环境的注册和查看
Gym 提供了许多预定义的环境,可以用以下代码查看所有已注册的环境:
# 输出可用环境 ID
from gym import envs
env_specs = envs.registry.all()
env_ids = [env_spec.id for env_spec in env_specs]
print("Available Gym Environments:")
print(env_ids)
输出示例:
Available Gym Environments:
['CartPole-v1', 'MountainCar-v0', 'Acrobot-v1', ...]
3.4.4、环境的观测空间和动作空间
-
观测空间:描述环境的状态信息,例如屏幕像素或物体位置。
可以是离散的(有限取值)或连续的(无限取值)。
-
动作空间:描述智能体可以采取的动作,例如左右移动。
通过 env.action_space
查看动作空间类型。
通过 env.action_space.sample()
从动作空间中随机取样。
3.4.5、 总结
-
Gym 提供了一个标准化的接口,使得我们可以快速进行强化学习算法的实验。
-
通过
env.step()
方法可以模拟强化学习的基本流程,即 S→A→R→S′。 -
学习如何使用 Gym 的各种环境,是强化学习实践的重要基础。
3.5、小车上山任务 (MountainCar-v0)
3.5.1、任务介绍
-
任务目标:让小车利用左右移动的加速冲上山坡。
-
观测空间:描述环境状态的值范围和维度。
-
是一个长度为 2 的数组,表示小车的位置和速度。
-
类型为
Box
,即连续值。
-
-
动作空间:智能体可以执行的动作集合。
-
动作有 3 种,分别为向左加速、保持不动和向右加速。
-
类型为
Discrete
,即离散值。
-
3.5.2、代码实现与可视化
1. 环境初始化与空间信息打印
import gym
import numpy as np
# 创建 MountainCar 环境
env = gym.make('MountainCar-v0')
# 输出环境的基本信息
print(f"观测空间 = {env.observation_space}") # Box 类型
print(f"动作空间 = {env.action_space}") # Discrete 类型
print(f"观测范围 = {env.observation_space.low} ~ {env.observation_space.high}")
print(f"动作数 = {env.action_space.n}") # 动作取值范围 {0,1,2}
2. 智能体定义
class SimpleAgent:
def __init__(self, env):
pass
def decide(self, observation):
"""基于观测值决策动作"""
position, velocity = observation
# 决策规则(利用经验公式)
lb = min(-0.09 * (position + 0.25) ** 2 + 0.03,
0.3 * (position + 0.9) ** 4 - 0.008)
ub = -0.07 * (position + 0.38) ** 2 + 0.07
if lb < velocity < ub:
action = 2 # 向右加速
else:
action = 0 # 向左加速
return action
def learn(self, *args):
"""学习功能(本例中未实现)"""
pass
3、智能体与环境交互
def play(env, agent, render=False, train=False):
"""让智能体与环境交互一个回合"""
episode_reward = 0 # 初始化回合奖励
observation = env.reset()[0] # 重置环境(新 Gym 版本返回元组)
# 保存轨迹用于可视化
positions = [observation[0]]
while True:
if render: # 是否显示图形界面
env.render()
# 智能体决策动作
action = agent.decide(observation)
# 执行动作,获取环境反馈
next_observation, reward, done, truncated, _ = env.step(action)
episode_reward += reward
positions.append(next_observation[0])
# 如果训练模式为 True,调用学习方法
if train:
agent.learn(observation, action, reward, done)
# 回合结束条件
if done or truncated:
break
observation = next_observation
return episode_reward, positions
4. 环境交互与轨迹可视化
import matplotlib.pyplot as plt
# 创建智能体
agent = SimpleAgent(env)
# 设置随机种子
env.seed(3)
# 智能体与环境交互一个回合,并显示图形界面
episode_reward, positions = play(env, agent, render=True)
print(f"回合奖励 = {episode_reward}")
# 可视化小车位置轨迹
plt.figure(figsize=(10, 5))
plt.plot(range(len(positions)), positions, label="Car Position")
plt.axhline(env.unwrapped.goal_position, color='r', linestyle='--', label="Goal Position")
plt.xlabel("Time Steps")
plt.ylabel("Position")
plt.title("MountainCar Trajectory")
plt.legend()
plt.grid()
plt.show()
# 关闭环境
env.close()
5. 性能评估
# 测试智能体的性能,计算 100 个回合的平均奖励
episode_rewards = [play(env, agent)[0] for _ in range(100)]
print(f"平均回合奖励 = {np.mean(episode_rewards)}")
输出示例
-
环境信息:
观测空间 = Box([-1.2 -0.07], [0.6 0.07], (2,), float32) 动作空间 = Discrete(3) 观测范围 = [-1.2 -0.07] ~ [0.6 0.07] 动作数 = 3
-
回合奖励:
回合奖励 = -105.0
-
轨迹图:
图表显示了小车在回合中的水平位置变化,红色虚线表示目标位置。
-
平均回合奖励:
平均回合奖励 = -106.63
总结
-
环境操作方法:
env.reset()
:重置环境。env.step(action)
:执行动作,获取反馈。env.render()
:显示图形界面。env.close()
:关闭环境。
-
性能评估:
- 学术界一般使用连续 100 回合的平均回合奖励作为性能指标。
- 本例中,智能体在 MountainCar-v0 的表现接近任务解决标准(-110)。
4、关键词
4.1、基本概念
-
强化学习(Reinforcement Learning, RL):
智能体与复杂且不确定的环境交互,尝试使获得的奖励最大化的算法。 -
动作(Action):
智能体基于当前状态输出给环境的行为。 -
状态(State):
智能体从环境中获取的信息,用于感知当前环境。 -
奖励(Reward):
环境给予智能体的反馈信号,指示某个动作的价值以及奖励大小。 -
探索(Exploration):
尝试新的动作,可能获取更高奖励,也可能失败。 -
利用(Exploitation):
重复执行已知能够获得最大奖励的动作。
4.2、扩展概念
-
深度强化学习(Deep Reinforcement Learning, DRL):
使用神经网络拟合价值函数或策略网络,端到端学习方法,无需手动设计特征。 -
全观测和部分观测:
- 全部可观测(Full Observability): 智能体的状态等价于环境状态。
- 完全可观测(Fully Observed): 智能体可观察到环境的所有状态。
- 部分可观测(Partially Observed): 智能体无法观察到环境的全部状态。
-
部分可观测马尔可夫决策过程(Partially Observable Markov Decision Process, POMDP):
马尔可夫决策过程的扩展,假设智能体仅能获得部分观测值,但仍满足马尔可夫性质。
4.3、动作空间
- 动作空间(Action Space):
环境中智能体可采取的动作集合。- 离散动作空间(Discrete Action Space): 动作数量有限。
- 连续动作空间(Continuous Action Space): 动作数量无限或连续变化。
4.4、算法分类
-
基于策略的(Policy-based):
强化学习直接优化策略,制定最优动作以获得最大奖励。 -
基于价值的(Value-based):
通过维护价值表或价值函数,选择能使价值最大化的动作,而不显式制定策略。
4.5、模型结构
-
有模型(Model-based):
学习状态转移模型,用于决策。 -
免模型(Model-free):
不估计状态转移,直接学习价值函数或策略网络来进行决策。
5、习题
1-1 强化学习的基本结构是什么?
答:强化学习的基本结构包括智能体、环境、状态、动作和奖励。智能体通过与环境交互来学习如何做决策,从而最大化奖励。
例子: 例如,在玩棋类游戏时,智能体(棋手)在每个状态(棋盘布局)下选择一个动作(下棋),并根据对手的反应获得奖励(赢得一局或输掉一局)。
1-2 强化学习相对于监督学习为什么训练过程会更加困难?
答:强化学习的训练过程依赖于与环境的交互,奖励可能延迟且不确定,因此智能体需要通过不断尝试来探索最佳策略。而监督学习使用的是已有的标注数据,训练过程较为直接。
例子: 在强化学习中,智能体可能在多次尝试后才知道是否采取了好的动作,而监督学习则可以通过现成的标签直接进行训练。
1-3 强化学习的基本特征有哪些?
答:强化学习的基本特征包括:探索与利用的平衡、状态与动作的反馈、奖励的延迟性和不确定性、长期决策。
例子: 一个机器人学习如何在迷宫中找到出口时,它需要在“尝试新的路线”与“重复成功的路线”之间做出选择,这就是探索与利用的平衡。
1-4 近几年强化学习发展迅速的原因有哪些?
答:强化学习发展迅速的原因包括计算能力的提升、大规模数据的获取、深度学习的结合以及成功的应用实例(如AlphaGo)。
例子: AlphaGo的成功展示了强化学习在复杂决策中的应用,深度学习技术使得强化学习在大规模游戏和实际应用中得以实现。
1-5 状态和观测有什么关系?
答:状态是环境的真实描述,观测是智能体基于当前状态获取的部分信息。
例子: 在自动驾驶中,状态可能包括车辆的速度、位置和周围环境,而观测则是智能体通过摄像头或传感器得到的部分信息,比如看到的路标或行人。
1-6 一个强化学习智能体由什么组成?
答:一个强化学习智能体由感知器(获取状态或观测)、决策器(选择动作)、执行器(执行动作)和学习机制(调整策略)组成。
例子: 一个玩游戏的AI智能体,感知器是它看到的屏幕,决策器是它的算法,用来选择下一步的动作,执行器是它在屏幕上操作的动作,而学习机制则是它不断调整策略的部分。
1-7 根据强化学习智能体的不同,我们可以将其分为哪几类?
答:强化学习智能体可以分为基于策略的、基于价值的、以及基于模型的智能体。
例子: 基于策略的智能体直接学习如何选择动作(如强化学习中的策略梯度方法);基于价值的智能体通过评估每个状态的价值来做决策(如Q-learning);基于模型的智能体学习环境的模型来进行规划(如深度强化学习中的模型预测控制)。
1-8 基于策略迭代和基于价值迭代的强化学习方法有什么区别?
答:基于策略迭代通过不断优化策略来求解最优策略,而基于价值迭代通过更新每个状态的价值来求解最优策略。
例子: 在基于策略迭代中,智能体先制定一个策略,然后不断改善它;在基于价值迭代中,智能体先估计每个状态的价值,然后根据这些估值来选择动作。
1-9 有模型学习和免模型学习有什么区别?
答:有模型学习通过学习环境的转移模型来做决策,而免模型学习直接通过学习价值函数或策略来做决策,不需要估计环境转移。
例子: 有模型学习就像你预先知道天气变化规律,可以计划未来几天的行动;免模型学习则是你每次都需要根据当前天气直接做出决策,而不考虑未来的天气。
1-10 如何通俗理解强化学习?
答:强化学习是通过智能体与环境的互动,尝试不同的动作来学习如何获得最大奖励。它类似于小孩通过玩游戏、做实验不断调整自己的策略,最终获得更好的结果。
例子: 想象一个小孩在玩一个新游戏,开始时不清楚怎么玩,但随着尝试和获得反馈,他会逐步学会最有效的游戏策略。
6、 面试题
1-1 请用一句话谈一下你对于强化学习的认识?
答:强化学习是让智能体通过与环境交互、试错的方式,学习如何最大化长期奖励。
例子: 就像是小孩学会骑自行车,经过多次摔倒和尝试,逐渐掌握了骑行技巧。
1-2 强化学习、监督学习和无监督学习有什么区别?
答:强化学习通过与环境交互学习最优策略,监督学习通过标签数据学习映射关系,无监督学习通过数据中的潜在模式进行学习。
例子: 监督学习就像是老师给出题目和答案,强化学习像是小孩自己通过试错找到答案,而无监督学习像是小孩通过观察现象来自己总结规律。
1-3 强化学习的使用场景有哪些?
答:强化学习常用于需要决策和长期规划的场景,如游戏(如AlphaGo)、机器人控制、自动驾驶、推荐系统等。
例子: 在自动驾驶中,智能体(车)需要根据实时交通情况决定行驶路径,这正是强化学习的应用场景。
1-4 强化学习中所谓的损失函数与深度学习中的损失函数有什么区别?
答:强化学习中的损失函数与奖励信号相关,通过优化策略来最大化长期奖励;而深度学习中的损失函数通常是优化预测误差。
例子: 在深度学习中,我们优化的是预测误差;而在强化学习中,我们优化的是智能体的策略,使得它能够获得更多的奖励。
1-5 有模型和免模型有什么区别?
答:有模型方法通过学习环境的转移模型来预测未来状态,免模型方法则直接通过学习价值函数或策略来做决策,不依赖于环境模型。
例子: 有模型学习就像拥有一张环境的地图,可以提前规划路线;免模型学习则是每次都根据当前的情形做决定,不依赖地图。