1. 理论部分
1.1 初探强化学习
- 什么是强化学习?
维基百科定义
:强化学习(Reinforcement learning, RL)是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益。强化学习是除了监督学习和非监督学习之外的第三种基本的机器学习方法。个人理解
:强化学习又名增强学习,源于行为心理学,表示生物为了趋利避害而更频繁实施对自身有利的策略。以专业术语来说,强化学习是研究智能体在与复杂且不确定的环境进行交互时,如何使获得的累计奖励最大化的一类算法。强化学习的目标,是寻找一个给定的马尔可夫决策过程的最优策略。
- 强化学习可以解决什么问题?如何解决?
强化学习一般用以解决智能决策 (序贯决策) 问题,找寻一个决策序列,使得目标函数最优。智能决策问题是那些需要连续不断地做出决策,才能实现最终目标的问题。在强化学习中,智能体通过与环境的不断交互来学习状态到动作的映射关系,以期获得最大化的累积回报。
- 强化学习的特征
- 试错探索:智能体通过试错探索环境来理解环境。
- 延迟奖励:智能体借助延迟的奖励信号来学习。奖励有正负,正强化和负强化都能够起到强化的效果。
- 时序数据:强化学习的数据间具备较强的时间关联性,不是独立同分布的。
- 动作影响数据:强化学习没有所谓现有的数据集,数据都是在训练过程中产生的,这意味着智能体的行为将会影响它的数据。
- 强化学习、监督学习和非监督学习

监督学习、无监督学习和强化学习是机器学习的三大方法。
强化学习
:通过智能体与环境的交互来寻找最优策略。不存在正确答案,通过奖励信号来学习,关注更长远的性能。监督学习
:学习带标签数据中的固有规则。监督学习解决的是智能感知的问题, 在大量差异化的输入及其标签上进行学习。监督学习的思想是学习带标签数据的抽象特征并分类。监督学习使用的数据是独立同分布的。监督学习重点关注模型的泛化性能。无监督学习
: 寻找无标签数据中的隐藏模式,旨在发现数据间的隐含结构,一般用于聚类等任务。非监督学习无标签无奖励值,只有数据特征 。非监督学习的训练数据是独立同分布的,数据间无前后依赖关系。
监督学习算法的上限是人类的表现,标签源于人类标注决定了它永远不可能超越人类。强化学习则潜力无限,它在环境里面自己探索学习,这让它可以获得超越人类的表现,如 AlphaGo 击败人类最强围棋选手。
1.2 强化学习基础

如上图所示,强化学习主要由智能体 (Agent)、环境 (Environment)、状态 (State)、动作(Action) 和奖励(Reward) 组成。智能体与环境的交互是一个序列决策过程,智能体在当前状态 S t S_t St 选择一个动作 A t A_t At,执行动作,进入下一状态 S t + 1 S_{t+1} St+1, 同时得到即时奖励 R t + 1 R_{t+1} Rt+1。如此循环,绩效选择动作,进入新的状态并获得相应奖励值。在强化学习中,这一过程一般被建模成一个马尔科夫决策过程 (Markov Decision Process,MDP)。
智能体
:强化学习中的决策者和学习者,它可以做出决策和接受奖励。环境
:强化学习系统中除智能体外的所有事物,它是智能体交互的对象。环境本身可以是确定性的或者不确定性的,可以是已知的或是未知的。我们可以选择对环境进行建模或者不建模。状态
与观测
:状态是对环境的完整描述,环境受智能体动作的影响。观测是以智能体的视角,对状态的部分描述,可能会遗漏环境中的一些信息。奖励
:环境给智能体的一种标量反馈信号。奖励是智能体的学习目标,智能体被期待能够最大化一段时间里的总奖励。策略
:从状态到动作的映射,智能体依据策略选择动作。策略是强化学习的学习对象,强化学习通过改进策略以期最大化总奖励。价值函数
v π ( s ) v_π(s) vπ(s):智能体在状态 s s s 下依据策略 π π π 执行动作后的价值,用以评估一个状态的好坏。这个价值一般用累积回报的期望来描述(累积回报是个随机变量,无法作为价值函数的定义)。即时奖励 R t + 1 R_{t+1} Rt+1 高并不代表后续的奖励值也高,因此价值函数 v π ( s ) v_π(s) vπ(s) 需要综合考虑当前奖励和后续奖励,通常被定义为:
v π ( s ) = E π ( R t + 1 + γ R t + 2 + γ 2 R t + 3 + . . . ∣ S t = s ) = E π [ ∑ k = 0 ∞ γ k R t + k + 1 ∣ S t = s ] v_π(s)=\mathbb{E}_π(R_{t+1}+γR_{t+2}+γ^2R_{t+3}+... |S_t=s)=\mathbb{E}_π[\sum^{\infty}_{k=0}\gamma^k R_{t+k+1}|S_t=s] vπ(s)=Eπ(Rt+1+γRt+2+γ2Rt+3+...∣St=s)=Eπ[k=0∑∞γkRt+k+1∣St=s]
其中 γ ∈ [ 0 , 1 ] γ \in [0, 1] γ∈[0,1] 为奖励衰减因子,控制着即时奖励在累积回报中的占比。状态转化模型
P s s ′ a P^a_{ss^′} Pss′a:在状态 s s s 下选取动作 a a a 转至下一个状态 s ′ s^′ s′ 的概率。探索-利用困境
(exploration-exploitation dilemma):选择一个新动作以期获得更高回报,还是选择当前已知能够产生最大回报的动作?关于探索和利用的平衡,一般使用探索因子 ϵ ∈ [ 0 , 1 ] ϵ \in [0, 1] ϵ∈[0,1] 来控制。
1.3 强化学习简史
- 两个关键时间节点
- 1998 年之前:表格型强化学习算法;
- 1998 年:强化学习导论第一版出版, 系统总结了之前强化学习算法的各种进展;
- 1998 年至 2013 年:发展出各种直接策略搜索的方法;
- 2013 年:DQN 算法的提出;
- 2013 年之后:深度强化学习,深度学习感知能力和强化学习决策能力的结合。
- 三条主线
- 主线 1:试错学习。模仿心理学上动物的学习方式。
- 主线 2:最优控制。动态规划法,通过求解贝尔曼方程来间接解决最优控制问题,存在“维数灾难”问题。
- 主线 3:时间差分法 (第一次研究热潮)。Q-learning 算法成功将最优控制与时间差分法结合。DQN 算法首次将深度学习与强化学习结合,开创了深度强化学习这一全新分支,重新掀起强化学习的研究热潮。
1.4 强化学习应用
![]() | ![]() |
---|---|
行走智能体 | 机械臂抓取 |
![]() | ![]() |
机械臂翻魔方 | 穿衣智能体 |
2. 实验部分
2.1 Gym
OpenAI 是一个非盈利的人工智能研究公司。Open AI 公布了非常多的学习资源以及算法资源,他们之所以叫 Open AI,就是他们把所有开发的算法都进行开源。OpenAI 的 Gym 是一个研究和比较强化学习相关算法的开源工具包,其中包含了许多经典的仿真环境和各种数据。Gym 库提供了许多问题和环境(或游戏)的接口,而用户无需过多了解游戏的内部实现,通过简单地调用就可以用来测试和仿真。可通过如下语句查询 Gym 库中注册了哪些环境:
from gym import envs
env_specs = envs.registry.values()
env_ids = [env_spec.id for env_spec in env_specs]
for env_name in env_ids:
print(env_name)

2.2 小车上山 (MountainCar-v0)

小车上山的环境如上图所示,一个小车在一段范围内行驶。在任一时刻,在水平方向看,小车位置的范围是 [-1.2, 0.6],速度的范围是 [-0.07, 0.07]。在每个时刻,智能体可以对小车施加 3 种动作中的一种:向左施力、不施力、向右施力。智能体施力和小车的水平位置会共同决定小车下一时刻的速度。当某时刻小车的水平位置大于 0.5 时,控制目标成功达成,回合结束。控制的目标是让小车以尽可能少的步骤达到目标。一般认为,如果智能体在连续 100 个回合中的平均步数 ≤110,就认为问题解决了。在这个环境中,每一步的奖励都是 -1,回合的回报值就是总步数的负数。下面给出实例代码:
# coding=utf-8
import gym
from gym import envs
import numpy as np
def env_info(env):
print("观测空间 = {}".format(env.observation_space))
print("动作空间 = {}".format(env.action_space))
print("观测范围 = {} ~ {}".format(env.observation_space.low, env.observation_space.high))
print("动作数 = {}".format(env.action_space.n))
class BespokeAgent:
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
def play_montecarlo(env, agent, render=False, train=False):
episode_reward = 0. # 初始化回合总奖励
observation = env.reset(seed=0) # seed保证结果精确复现
while True:
if render: # 界面渲染
env.render()
action = agent.decide(observation) # 动作选择
next_observation, reward, done, _ = env.step(action) # 执行动作
episode_reward += reward # 累积回报
if train: # 训练
agent.learn(observation, action, reward, done)
if done: # 回合结束
break
observation = next_observation
return episode_reward # 返回累积回报
if __name__ == "__main__":
env = gym.make('MountainCar-v0') # 构建环境
env_info(env) # 环境信息
agent = BespokeAgent(env) # 智能体
for _ in range(100):
episode_rewards = play_montecarlo(env, agent)
print('平均回合奖励 = {}'.format(np.mean(episode_rewards)))
env.close() # 关闭环境
- 结果

【参考】
- Datawhale 强化学习教程;
- 《Easy RL:强化学习教程》(王琦,杨毅远,江季);
- Sutton RS, Barto AG. Reinforcement learning: An introduction. MIT press; 2018 Nov 13.
- 《强化学习:原理与Python实现》(肖智清);
- 刘建平强化学习系列博客;