概念理解
1、强化学习智能体的组成成分和关键概念
1.1 对于一个强化学习智能体,它可能有一个或多个如下的组成成分。
-
策略(policy):智能体会用策略来选取下一步的动作。(两种:随机性策略(选择动作后是否有概率进入其他状态)和确定性策略(采取最优可能的概率))。
-
价值函数(value function):我们用价值函数来对当前状态进行评估。价值函数用于评估智能体进 入某个状态后,可以对后面的奖励带来多大的影响。价值函数值越大,说明智能体进入这个状态越有利。
状态价值函数:
动作价值函数
γ \gamma γ 为折扣因子,近端奖励大,远端奖励小,短视效应。 -
模型(model):模型表示智能体对环境的状态进行理解,它决定了环境中世界的运行方式。 (状态转移概率(下一步概率取决于当前步和动作,奖励函数))
有了策略、价值函数和模型后,有一下 MDP 过程。
Policy-based RL and Value-based RL 理解
对于以下环境要求智能体从起点(start)开始,然后到达终点(goal)的位置。每走一步,我们就会得到 −1 的奖励。我们可以采取的动作是往上、下、左、右走:
-
采取基于策略的强化学习(policy-based RL)方法,当学习好了这个环境后,在每一个状态,我们都会得到一个最佳的动作。如图 1.17 所示,比如我们现在在起点位置,我们知道最佳动作是往右走;在第二格的时候,得到的最佳动作是往上走;第三格是往右走…通过最佳的策略,我们可以最快地到达终点。
-
如果换成基于价值的强化学习(value-based RL)方法,利用价值函数作为导向,我们就会得到另外一种表征,每一个状态会返回一个价值。
1.2 强化学习智能体的类型
- 基于策略和基于价值的强化学习方法有什么区别?
- 基于价值迭代的方法只能应用在不连续的、离散的环境下(如围棋或某些游戏领域),对于动作集合规模庞大、动作连续的场景(如机器人控制领域),其很难学习到较好的结果(此时基于策略迭代的方法能够根据设定的策略来选择连续的动作)。
- 基于价值的强化学习算法有Q学习(Q-learning)、 Sarsa 等,而基于策略的强化学习算法有策略梯度(Policy Gradient,PG)算法等。此外,演员-评论员算法(是否只能在离散环境下使用???)同时使用策略和价值评估来做出决策。
- 有模型强化学习智能体与免模型强化学习智能体
有模型强化学习是指根据环境中的经验,构建一个虚拟世界,同时在真实环境和虚拟世界中学习;免模型强化学习是指不对环境进行建模,直接与真实环境进行交互来学习到最优策略。 - 智能体执行动作前,是否能对下一步的状态和奖励进行预测,如果能,就能够对环境进行建模,从而采用有模型学习。
- 免模型强化学习通常属于数据驱动型方法,需要大量的采样来估计状态、动作及奖励函数,从而优化动作策略。
1.3 关键问题
学习(learning)和规划(planning)是序列决策的两个基本问题。
- 在强化学习中,环境初始时是未知的,智能体不知道环境如何工作,它通过不断地与环境交互,逐渐改进策略。
- 在规划中,环境是已知的,智能体被告知了整个环境的运作规则的详细信息。智能体能够计算出一个完美的模型,并且在不需要与环境进行任何交互的时候进行计算。智能体不需要实时地与环境交互就能知道未来环境,只需要知道当前的状态,就能够开始思考,来寻找最优解。
1.4 探索和利用
若仅为获知每个摇臂的期望奖励,则可采用仅探索(exploration-only)法:将所有的尝试机会平均分配给每个摇臂(即轮流按下每个摇臂),最后以每个摇臂各自的平均吐币概率作为其奖励期望的近似估计。若仅为执行奖励最大的动作,则可采用仅利用(exploitation-only)法:按下目前最优的(即到目前为止平均奖励最大的)摇臂,若有多个摇臂同为最优,则从中随机选取一个。(固步自封选择 广泛探索后选择(可能有探索停止情况若有限情况)))
1.5 实验
```python
import gym
import numpy as np
class SimpleAgent: # define an agent for car move
def __init__(self, env):
pass
def decide(self, observation): # decision process
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(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 = gym.make('MountainCar-v0')
env.seed(3) # 设置随机种子,让结果可复现
agent = SimpleAgent(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))
episode_reward = play(env, agent, render=True)
print('回合奖励 = {}'.format(episode_reward))
episode_rewards = [play(env, agent) for _ in range(100)]
print('平均回合奖励 = {}'.format(np.mean(episode_rewards)))