强化学习组队学习task01——基础

一、强化学习基础

强化学习讨论的问题是一个 智能体(agent) 怎么在一个复杂不确定的环境(environment)里面去极大化它能获得的奖励。
在这里插入图片描述
在强化学习过程中,agent 跟 environment 一直在交互。Agent 在环境里面获取到状态,agent 会利用这个状态输出一个 action,一个决策。然后这个决策会放到环境之中去,环境会通过这个 agent 采取的决策,输出下一个状态以及当前的这个决策得到的奖励。Agent 的目的就是为了尽可能多地从环境中获取奖励。

强化学习和监督学习的对比:

  1. 强化学习输入的序列的数据并不是像监督学习里面这些样本都是独立的。
  2. 学习者 并没有被告诉每一步正确的行为应该是什么。他们不得不自己去发现哪些行为可以使得它最后得到这个奖励,只能通过不停地尝试来发现最有利的行为。
  3. agent 通过不断地试错来获取reward。Exploration 和 exploitation 是强化学习非常核心的一个问题。Exploration 是尝试一些新的行为,这些行为可能会使你得到更高的奖励,也有可能一无所有。Exploitation 是采取已知的可以获得最大奖励的行为,重复执行这个 action 就可以了。因此,我们需要在 exploration 和 exploitation 之间取得一个权衡
  4. 在强化学习过程中,没有非常强的 supervisor,只有一个奖励信号(reward signal) 。Agent因为没有得到即时反馈,学习就非常困难。当采取一个行为过后,在强化学习里面,环境可能会告诉你这个行为是错误的,但是它并没有告诉你正确的行为是什么。而且更困难的是,它可能是在一两分钟过后告诉你错误,它再告诉你之前的行为到底行不行。所以这也是强化学习和监督学习不同的地方。

强化学习的特征:

  1. 具有trial-and-error exploration特征,即通过不断探索环境来获得对环境的理解
  2. 强化学习 agent 获得的奖励具有延迟性。
  3. 在训练过程中,时间非常重要,因为得到的数据都是有这个时间关联的
  4. agent 的行为会影响它随后得到的数据,如果在训练过程中agent的模型很快死掉了,那会使我们采集到的数据是非常糟糕的。所以如何让 agent 的行为一直稳定地提升是重要的问题

强化学习的一些例子:象棋/围棋、预测股票、玩游戏等

二、序列决策过程(Sequential Decision Making)

1.奖励(rewards)

奖励是由环境给的一个反馈信号,这个信号指定了这个 agent 在某一步采取了某个策略是否得到奖励。强化学习的目的就是为了极大化 agent 可以获得的奖励,agent在这个环境里面存在的目的就是为了极大它的期望积累的奖励。

一些奖励的例子:下象棋的奖励是最后能赢,玩游戏的奖励是获得分数等

2.序列决策过程

在强化学习环境里,agent 的目的是选取一系列动作来极大化它的奖励,所以这些动作必须有长期影响。但在这个过程里面,它的奖励其实是被延迟了,就是说现在采取的某一步决策可能要等很久过后才知道这一步到底产生了什么样的影响。强化学习里一个重要的课题就是近期奖励和远期奖励的 trade-off。怎么让 agent 取得更多的长期奖励是强化学习的问题。

在跟环境的交互过程中,agent 会获得很多观测。在每一个观测会采取一个动作,它也会得到一个奖励。所以历史是观测、行为、奖励的序列:
在这里插入图片描述

Agent 在采取当前动作的时候会依赖于它之前得到的这个历史,所以你可以把整个游戏的状态看成关于这个历史的函数:
在这里插入图片描述

  • 状态(state) 是对世界的完整描述,不会隐藏世界的信息。
  • 观测(observation) 是对状态的部分描述,可能会遗漏一些信息。

在 deep RL 中,我们几乎总是用一个实值的向量、矩阵或者更高阶的张量来表示状态和观测。举个例子,我们可以用 RGB 像素值的矩阵来表示一个视觉的观测,我们可以用机器人关节的角度和速度来表示一个机器人的状态。

在 agent 的内部也有一个函数来更新这个状态。根据 agent 的状态跟环境的状态是否相同,可以将环境分为两类:

  • full observability:agent 的状态跟环境的状态等价的时候,就是全部可以观测。
  • partially observed: agent 得到的观测只能得到一部分信息,而并不能包含所有环境运作的状态。在这种情况下面,强化学习通常被建模成一个部分可观测马尔可夫决策过程 (POMDP) 的问题。
    • 部分可观测马尔可夫决策过程:是一个马尔可夫决策过程的泛化。POMDP 依然具有马尔可夫性质,但是假设智能体无法感知环境的状态 ,只能知道部分观测值 。比如在自动驾驶中,智能体只能感知传感器采集的有限的环境信息。POMDP 可以用一个 7 元组描述。

3.动作空间(Action Spaces)

不同的环境允许不同种类的动作。在给定的环境中,有效动作的集合经常被称为动作空间。动作空间主要分为两类:

  1. 离散动作空间(discrete action spaces) ,像 Atari 和 Go 这样的环境,在这个动作空间里,agent 的动作数量是有限的。
  2. 连续动作空间(continuous action spaces) 。在其他环境,比如在物理世界中控制一个 agent,在这个环境中就,动作是实值的向量。

例如走迷宫机器人如果只有东南西北这 4 种移动方式,则其为离散动作空间;如果机器人向360度中的任意角度都可以移动,则为连续动作空间。

4.Agent的主要组成部分

(1)决策(policy)

agent 会用决策函数来选取下一步的动作,它其实是一个函数,把输入的状态变成行为。这里有两种 policy:

  1. stochastic policy(随机性策略):就是一个π函数,当输入一个状态的时候,输出是一个概率。这个概率就是所有行为的一个概率,然后可以进一步对这个概率分布进行采样,得到真实的你采取的行为。比如说这个概率可能是有 70% 的概率往左,30% 的概率往右,那么通过采样就可以得到一个 action。
    在这里插入图片描述
  2. deterministic policy(确定性策略):就是说这里有可能只是采取它的极大化,采取最有可能的动作。你现在这个概率就是事先决定好的。从 Atari 游戏来看的话,policy function 的输入就是游戏的一帧,它的输出决定你是往左走或者是往右走。
    在这里插入图片描述

通常情况下,强化学习一般使用 随机性策略 。随机性策略有很多优点:

  • 在学习时可以通过引入一定随机性来更好地探索环境;
  • 随机性策略的动作具有多样性,这一点在多个智能体博弈时也非常重要。采用确定性策略的智能体总是对同样的环境做出相同的动作,会导致它的策略很容易被对手预测

(2)价值函数(value function)

用价值函数来对当前状态进行估价,也就是说进入现在这个状态,可以对后面的收益带来多大的影响。当这个价值函数大的时候,说明你进入这个状态越有利。

下图为价值函数,里面有一个 discount factor。我们希望尽可能在短的时间里面得到尽可能多的奖励。所以通过把 discount factor 放到价值函数的定义里面,后面得到的奖励价值函数的定义其实是一个期望。

Gt为折扣因子和奖励的乘积。
Eπ是期望,有个小角标是π函数,就是已知某个 policy function到底可以得到多少的奖励。
在这里插入图片描述
对于奖励函数,另外还有一个 Q 函数。Q 函数里面包含两个变量:状态和动作。所以未来可以获得多少的奖励,它的期望取决于当前的状态和当前的行为。Q 函数是强化学习算法在学习的一个函数。因为当得到这个 Q 函数过后,进入某一种状态,它最优的行为其实就可以通过这个 Q 函数来得到。
在这里插入图片描述

(3)模型

模型决定了下一个状态会是什么样的,也就是说下一步的状态取决于你当前的状态以及你当前采取的行为。它由两个部分组成,
一个是probability,它这个转移状态之间是怎么转移的。
在这里插入图片描述

另一个是奖励函数,当你在当前状态采取了某一个行为,可以得到多大的奖励。
在这里插入图片描述

我们有了决策、价值函数、模型这三个成分过后,就形成了一个 马尔可夫决策过程(Markov Decision Process)。这个决策过程可视化了状态之间的转移以及采取的行为。
在这里插入图片描述

5.Agents的种类

有两种方式进行Agents的划分

(1)基于Agents学习的东西

  1. 基于价值函数的 agent:这一类 agent 显式地学习的是价值函数,隐式地学习了它的策略。因为这个策略是从我们学到的价值函数里面推算出来的。
  2. 基于策略的 agent:它直接去学习 policy,就是说直接给它一个 state,它就会输出这个动作的概率。在这个 policy-based agent 里面并没有去学习它的价值函数。
  3. 把这两者结合(Actor-Critic agent):这一类 agent 就把它的策略函数和价值函数都学习了,然后通过两者的交互得到一个最佳的行为。

基于策略迭代和基于价值迭代的强化学习方法的区别:

  • 在基于策略迭代的方法中,智能体会制定一套动作策略(确定在给定状态下需要采取何种动作),并根据这个策略进行操作。强化学习算法直接对策略进行优化,使制定的策略能够获得最大的奖励
  • 在 基于价值迭代 的强化学习方法中,智能体不需要制定显式的策略,它 维护一个价值表格或价值函数 ,并通过这个价值表格或价值函数来选取价值最大的动作。基于价值迭代的方法只能应用在不连续的、离散的环境下(如围棋或某些游戏领域),对于行为集合规模庞大、动作连续的场景(如机器人控制领域),其很难学习到较好的结果(此时基于策略迭代的方法能够根据设定的策略来选择连续的动作)。

基于价值迭代的强化学习算法有 Q-learning、 Sarsa 等,而基于策略迭代的强化学习算法有策略梯度算法等。此外, Actor-Critic 算法同时使用策略和价值评估来做出决策,其中,智能体会根据策略做出动作,而价值函数会对做出的动作给出价值,这样可以在原有的策略梯度算法的基础上加速学习过程,取得更好的效果。

(2)基于是否有模型

  1. 有模型:根据环境中的经验,构建一个虚拟世界,同时在真实环境和虚拟世界中学习;

    我们可以用马尔可夫决策过程来定义强化学习任务,并表示为四元组<S,A,P,R> ,即状态集合、动作集合、状态转移函数和奖励函数。如果这四元组中所有元素均已知,且状态集合和动作集合在有限步数内是有限集,则机器可以对真实环境进行建模,构建一个虚拟世界来模拟真实环境的状态和交互反应。免模型学习通常属于数据驱动型方法,需要大量的采样来估计状态、动作及奖励函数,从而优化动作策略。
    在这里插入图片描述

  2. 免模型:不对环境进行建模,直接与真实环境进行交互来学习到最优策略。

    通常情况下,状态转移函数和奖励函数很难估计,甚至连环境中的状态都可能是未知的,这时就需要采用免模型学习。免模型学习没有对真实环境进行建模,智能体只能在真实环境中通过一定的策略来执行动作,等待奖励和状态迁移,然后根据这些反馈信息来更新行为策略,这样反复迭代直到学习到最优策略。免模型学习的泛化性要优于有模型学习,原因是有模型学习算需要对真实环境进行建模,并且虚拟世界与真实环境之间可能还有差异,这限制了有模型学习算法的泛化性。

目前,大部分深度强化学习方法都采用了免模型学习,这是因为:

  1. 免模型学习更为简单直观且有丰富的开源资料,像 DQN、AlphaGo 系列等都采用免模型学习;
  2. 在目前的强化学习研究中,大部分情况下环境都是静态的、可描述的,智能体的状态是离散的、可观察的(如 Atari 游戏平台),这种相对简单确定的问题并不需
    要评估状态转移函数和奖励函数,直接采用免模型学习,使用大量的样本进行训练就能获得较好的效果。

6.Exploration and Exploitation

Exploration : 尝试不同的行为来得到一个最佳的策略,得到最大奖励的策略。
Exploitation:采取已知的可以得到很大奖励的行为。

在刚开始的时候强化学习 agent 不知道采取了某个行为会发生什么,所以只能通过试错去探索。所以 Exploration 就是在试错来理解采取的这个行为到底可不可以得到好的奖励。Exploitation 是说直接采取已知的可以得到很好奖励的行为。所以这里就面临一个 trade-off,怎么通过牺牲一些短期的 reward 来获得行为的理解。

三、强化学习编程实践

在强化学习中,gym是一个很重要的库。

OpenAI 是一个非盈利的人工智能研究公司。Open AI 公布了非常多的学习资源以及这个算法资源,他们之所以叫 Open AI,就是他们把所有开发的算法都 open source出来。

OpenAI Gym 是一个环境仿真库,里面包含了很多现有的环境。针对不同的场景,我们可以选择不同的环境:

  1. 离散控制场景(输出的动作是可数的,比如 Pong 游戏中输出的向上或向下动作):一般使用 Atari 环境评估
  2. 连续控制场景(输出的动作是不可数的,比如机器人走路时不仅有方向,还要角度,角度就是不可数的,是一个连续的量 ):一般使用 mujoco 环境评估
pip install gym

pip直接安装gym即可

CartPole-V0示例

对于CartPole 环境:
两个动作:Cart 往左移还是往右移。
观测:车当前的位置,车当前的往左往右移的速度,杆的角度以及杆的最高点的速度。
奖赏:如果能多保留一步,你就会得到一个奖励
结束条件:这个杆的角度大于某一个角度(没能保持平衡)或者这个车已经出到外面
在这里插入图片描述
代码示例:

import gym # 导入 Gym 的 Python 接口环境包
env = gym.make('CartPole-v0') # 构建实验环境
env.reset() # 重置一个 episode
for _ in range(1000):
	env.render() # 显示图形界面
	action = env.action_space.sample() # 从动作空间中随机选取一个动作
	observation, reward, done, info = env.step(action) # 用于提交动作,括号内是具体的动作
env.close() # 关闭环境

env.action_space.sample() 的含义是,在该游戏的所有动作空间里随机选择一个作为输出。
env.step() 这个方法有四个返回值,分别是 observation 、 reward 、 done 、 info

  • observation(object) 是状态信息,是游戏中观测到的屏幕像素值或者盘面状态描述信息。
  • reward(float) 是奖励值,即 action 提交以后能够获得的奖励值。这个奖励值因游戏的不同而不同,总体原则是,对完成游戏有帮助的动作会获得比较高的奖励值
  • done(boolean) 表示游戏是否已经完成。如果完成了,就需要重置游戏并开始一个新的Episode。
  • info(dict) 是一些比较原始的用于诊断和调试的信息,或许对训练有帮助。

在每个训练中都要使用的返回值有 observation、reward、done。但 observation 的结构会由于游戏的不同而发生变化。

MountainCar-v0(小车上山) 示例

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

智能体是我们自己实现的。decide() 方法实现了决策功能,而 learn() 方法实现了学习功能。 BespokeAgent 类是一个比较简单的类,只能进行决策,并不能有效学习。所以它并不是一个真正意义上的强化学习智能体类。只是用于演示智能体和环境的交互

def play_montecarlo(env, agent, render=False, train=False):
	episode_reward = 0. # 记录回合总奖励,初始化为0
	observation = env.reset() # 重置游戏环境,开始新回合
	while True: # 不断循环,直到回合结束
		if render: # 判断是否显示
			env.render() # 显示图形界面,图形界面可以用 env.close() 语句关闭
		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 # 返回回合总奖励

4 个参数分别是环境类、智能体类、是否要图形化显示、是否训练智能体
返回值 episode_reward ,表示智能体与环境交互一个回合的回合总奖励。

env.seed(0) # 设置随机数种子,只是为了让结果可以精确复现,一般情况下可删去
episode_reward = play_montecarlo(env, agent, render=True)
print('回合奖励 = {}'.format(episode_reward))
env.close() # 此语句可关闭图形界面
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值