《强化学习:原理与Python实现》笔记——第一章

第1章 初识强化学习

强化学习(Reinforcement Learning)来源于行为心理学,表示生物为了趋利避害而更频繁实施对自己有利的策略。

1.1 强化学习及其关键元素

在人工智能领域中,强化学习是一类特定的机器学习问题。
在一个强化系统中,决策者可以观察环境,并根据观测作出行动。在行动之后,能够获得奖励。
强化学习通过与环境的交互来学习如何最大化奖励。

强化学习系统的两个关键要素:

  • 奖励:强化学习系统的目标,包括正奖励和负奖励。
  • 策略:强化学习的学习对象就是策略。决策者根据不同的观测采用不同的动作,这种从观测到动作的关系称为策略。

强化学习与监督、非监督学习存在本质区别

  • 与监督学习对比:对于监督学习,学习者知道每个动作的正确答案,通过对比来学习;对于强化学习,学习者不知道每个动作的正确答案,只能通过奖励信号来学习。
  • 与非监督学习对比:非监督学习旨在发现数据之间隐含的结构;而强化学习有着明确的数值目标,即奖励。所以,非监督学习一般用于聚类。

1.2 强化学习的应用

基于强化学习的人工智能已经有许多成功的应用。例如:

  1. 电动游戏:吃豆人、星际争霸、Flappy Bird等。
  2. 棋盘游戏:Alpha Go、Alpha Zero。
  3. 自动驾驶:基于强化学习的控制策略可以帮助开发自动驾驶的算法。

1.3 智能体 / 环境接口

  • 智能体:是强化学习系统中的决策者和学习者,可以做出决策和接受奖励信号。
  • 环境:是强化系统中除智能体以外的所有事物,是智能体交互的对象。

智能体 / 环境接口的核心思想在于分隔主观可以控制的部分和客观不能改变的部分。
注意:强化学习问题不一定要借助智能体 / 环境接口来研究。

智能体 / 环境接口中,智能体与环境的交互主要有三个环节:

  1. 智能体获得环境的观测(observation),记为 O O O
  2. 智能体根据观测,决定对环境施加的动作(action),记为 A A A
  3. 环境受智能体动作的影响,改变自己的状态(state),记为 S S S ,并给与奖励(reward),记为 R R R
  • 在这三个环节中,观测 O O O 、动作 A A A 和奖励 R R R 是智能体直接可以观测到的。

绝大多数的强化学习问题是按时间顺序或因果顺序发生的,其特点是具有先后顺序,并且先前的状态和动作会影响后续的状态等。这样的问题,我们引入时间指标 t t t ,记 t t t 时刻的状态为 S t S_t St ,观测为 O t O_t Ot ,动作为 A t A_t At ,奖励为 R t R_t Rt

1.4 强化学习的分类

强化学习可以按任务、算法进行分类。

1.4.1 按任务分类

  • 单智能体任务和多智能体任务
  • 回合制任务和连续性任务
  • 离散时间环境和连续时间环境
  • 离散动作空间和连续动作空间
  • 确定性环境任务和非确定性环境任务
  • 完全可观测环境和非完全可观测环境

1.4.2 按算法分类

  • 同策学习(on policy)和异策学习(off policy):同策学习是边决策边学习,决策者也是学习者。异策学习是通过之前的历史进行学习,学习者和决策者不需要相同。
  • 有模型学习(model-based)和无模型学习(model-free):在学习过程中,如果用到了环境的数学模型,则是有模型学习;反之,则是无模型学习。
  • 回合更新(Monte Carlo update)和时序差分更新(temporal difference update):回合制更新是在回合结束后利用整个回合的信息进行更新学习;而时序差分学习更新不需要等到回合结束,而是综合利用现有的信息和估计进行更新学习。
  • 基于价值(value based)和基于策略(policy based):基于价值的强化学习定义了状态或动作的价值函数,来表示到达某种状态或执行某种动作后可以得到的回报。基于策略的强化学习不需要定义价值函数,它可以为动作分配概率分布,按照概率分布来执行动作。
  • 深度强化学习算法非深度强化学习:如果强化学习算法用到了深度学习,则可称为深度强化学习算法。例如,很多电动游戏AI需要读取屏幕显示并据此做出决策,对屏幕数据的解读可以采用卷积神经网络这一深度学习算法。

1.5 如何学习强化学习

1.5.1 学习路线

预备知识
概率论、微积分、深度学习、Python
Markov决策过程
Gym库

1.5.2 学习资源

推荐Richard Sutton等在2018年出版的《Reinforcement Learning: An Introduction (第2版)》

1.6 案例:基于Gym库的智能体 / 环境交互

Gym库(https://gym.openai.com/)是OpenAI推出的强化学习实验环境库。它用Python语言实现了离散时间智能体 / 环境接口中的环境部分。

Gym库内置上百种实验环境,包括以下几类。

  1. 算法环境:包括一些字符串处理等传统计算机算法的实验环境。
  2. 简单文本环境:包括几个用文本表示的简单游戏。
  3. 经典控制环境:包括一些简单几何体的运动,常用于经典强化学习算法的研究。
  4. Atari游戏环境:包括数十个Atari 2600游戏,具有像素化的图形界面,希望玩家尽可能争夺高分。
  5. 二维方块(Box2D)环境:包括一些连续性控制的任务。
  6. MuJoCo环境:利用收费的MuJoCo运动引擎进行连续性控制任务。
  7. 机械控制环境:关于机械臂的抓取和控制等。

1.6.1 安装Gym库

安装Gym前升级Python和pip:

pip install --upgrade pip

最小化安装Gym:

pip install gym

1.6.2 使用Gym库

首先,导入Gym库。

import gym

在导入Gym库后,可以通过make()函数来得到环境对象。每个环境都有一个ID,它是形如“Xxxxx-vd”的Python字符串,如’CartPole-v0’、'Taxi-v2’等。环境最后的部分表示版本号,不同版本的环境可能有不同的行为。使用取出环境’CartPole-v0’的代码为:

env = gym.make('CartPole-v0')

想要查看当前Gym库已经注册了哪些环境,可以使用一下代码:

from gym import envs
env_specs = envs.registry.all()
env_ids = [env_spec.id for env_spec in env_specs]
env_ids

每个环境都定义了自己的观测空间和动作空间。

  • 环境env的观测空间用env.observation_space表示,动作空间用env.action_space表示。
  • 在Gym库中,离散空间用gym.spaces.Dscrete类表示,连续空间用gym.spaces.Box类表示。

接下来使用环境对象env。首先,初始化环境对象env,代码为:

env.reset()

该调用能返回智能体的初始观测,是np.array对象。
环境初始化后就可以使用了。使用环境的核心是环境对象的step()方法。step()方法接收智能体的动作作为参数,并返回以下4个参数。

  1. 观测(observation):np.array对象,表示观测,和env.reset()返回值的意义相同。
  2. 奖励(reward):float类型的值。
  3. 本回合结束(done):bool类型的数值。Gym库里的实验环境大多都是回合制的。
  4. 其他信息(info):dict类型的值,含有调试信息。不一定要使用这个参数。

env.step()的参数需要取自动作空间。可以使用一下语句从动作空间中随机选取一个动作:

action = env.action_space.sample()

每次调用env.step()只会让环境前进一步。所以,env.step()往往放在循环结构里,通过循环调用完成整个回合。
env.reset()env.step()后,可以图形化的方法显示当前环境。

env.render()

使用完环境后,关闭环境:

env.close()

注意:如果绘制了实验的图形界面窗口,那么关闭该窗口的最佳方式是调用env.close()。试图直接关闭图形界面窗口可能会导致内存不能释放,甚至死机。

1.6.3 小车上山

本节选用经典控制任务:小车上山(MountainCar-v0)。这里,主要关注的是Python代码,而非任务本身的描述与求解。

1. 导入环境并查看观测空间和动作空间

import gym
env = gym.make('MountainCar-v0')
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))

运行结果为

观测空间 = Box(-1.2000000476837158, 0.6000000238418579, (2,), float32)
动作空间 = Discrete(3)
观测空间 = [-1.2  -0.07] ~ [0.6  0.07]
动作数 = 3

2. 根据指定确定性策略决定动作的智能体
下段代码中,decide()方法实现了决策功能,learn()方法实现了学习功能。但BespokeAgent类比较简单,只是根据给定的数学表达式进行决策,不能有效地学习。不过,演示智能体和环境的交互已经足够了。

class BespokeAgent:
    def __init__(slef, env):
        pass
    
    def decide(slef, 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.06
        if lb < velocity < ub:
            action = 2
        else:
            action = 0
        return action # 返回动作
        
    def learn(self, *args): # 学习
        pass

agent = BespokeAgent(env)

3. 智能体和环境交互一个回合的代码

  • env是环境类。
  • agent是智能体类。
  • renderbool变量,指示在运行过程中是否图形化显示。
  • trainbool变量,指示在运行过程中是否训练智能体。
  • episode_reward表示智能体与环境交互一个回合的回合总奖励。
def play_montecarlo(env, agent, render=False, train=False):
    episode_reward = 0. # 记录回合总奖励,初始化为0
    observation = env.reset() # 重置游戏环境,开始新回合
    
    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 # 返回回合总奖励
 
 env.seed(0) # 设置随机数种子,是为了让结果可以精确复现,一般可以删去
 episode_reward = play_montecarlo(env, agent, render=True)
 print('回合奖励 = {}'.format(episode_reward))
 env.close() # 此语句可以关闭图形界面

4. 运行100回合求平均以测试性能
小车上山环境有一个参考的回合奖励值-110,如果当连续100个回合的平均值大于-110,则认为这个任务得到解决。

episode_reward = [play_montercarlo(env, agent) for _ in range(100)]
print('平均回合奖励 = {}'.format(np.mean(episode_rewards)))

1.7 本章小结

  • 强化学习是根据奖励信号以改进策略的机器学习方法。策略和奖励是强化学习的核心元素。强化学习试图找到最大化总奖励的策略。
  • 强化学习不是监督学习;强化学习也不是非监督学习。
  • 强化学习可以应用于棋牌运动、自动控制、电动游戏。
  • 强化学习任务常用智能体 / 环境接口建模。学习和决策的部分称为智能体,其他部分为环境。智能体向环境执行动作,从环境得到奖励和反馈。

你可能感兴趣的:(机器学习,强化学习)