一.概述
强化学习是根据奖励信号以改进策略的机器学习方法。策略和奖励是强化学习的核心元素。强化学习试图找到最大化总奖励的策略。强化学习不是监督学习,因为强化学习的学习过程中没有参考答案;强化学习也不是非监督学习,因为强化学习需要利用奖励信号来学习。
强化学习任务常用“智能体/环境”接口建模。学习和决策的部分称为智能体,其它部分称为环境。智能体向环境执行动作,并从环境中得到奖励和反馈。
Python扩展库Gym是OpenAI推出的免费的强化学习试验环境。Gym库的使用方法是:用env=gym.make(环境名)取出环境,用env.reset()初始化环境,用env.step(动作)执行一步环境,用env.render()显示环境,用env.close()关闭环境。
大狗机器人的姿态自适应就是基于深度学习算法,根据环境反馈进行自动姿态调整,以保障能稳定站立并行走。
二.安装
使用Anaconda的小伙伴在联网的情况下可以直接在Anaconda Prompt上执行pip install gym即可安装Gym库。
其它安装的细节可以参考官网:http://gym.openai.com/docs/#getting-started-with-gym
三.案例【基本信息输出】
1 # -*- coding: utf-8 -*-
2 """
3 Created on Mon Nov 4 20:05:03 2019
4
5 @author: Administrator
6 """
7
8 import gym
9
10 env = gym.make('MountainCar-v0')
11 print('观测空间={}'.format(env.observation_space))
12 print('动作空间={}'.format(env.action_space))
13 print('观测范围={}~{}'.format(env.observation_space.low, env.observation_space.high))
14 print('动作数={}'.format(env.action_space.n))
四.执行结果
五.案例【小车自适应翻越小沟】
1 # -*- coding: utf-8 -*-
2 import gym
3 import time
4
5 '''
6 基于强化学习实现小车自适应翻越小沟
7 '''
8 class BespokeAgent:
9 def __init__(self, env):
10 pass
11
12 def decide(self, observation):
13 position, velocity = observation
14 lb = min(-0.09 * (position + 0.25) ** 2 + 0.03, 0.3 * (position + 0.9) ** 4 - 0.008)
15 ub = -0.07 * (position + 0.38) ** 2 + 0.06
16 if lb < velocity < ub:
17 action = 2
18 else:
19 action = 0
20 return action # 返回动作
21
22 def learn(self, *args): # 学习
23 pass
24
25 def play_ones(self, env, agent, render=False, train=False):
26 episode_reward = 0 # 记录回合总奖励,初始值为0
27 observation = env.reset() # 重置游戏环境,开始新回合
28 while True: # 不断循环,直到回合结束
29 if render: # 判断是否显示
30 env.render() # 显示图形界面,可以用env.close()关闭
31 action = agent.decide(observation)
32 next_observation, reward, done, _ = env.step(action) # 执行动作
33 episode_reward += reward # 搜集回合奖励
34 if train: # 判断是否训练智能体
35 break
36 observation = next_observation
37 return episode_reward # 返回回合总奖励
38
39 if __name__ == '__main__':
40 env = gym.make('MountainCar-v0')
41 env.seed(0) # 设置随机数种子,只是为了让结果可以精确复现,一般情况下可以删除
42
43 agent = BespokeAgent(env)
44 for _ in range(100):
45 episode_reward = agent.play_ones(env, agent, render=True)
46 print('回合奖励={}'.format(episode_reward))
47
48 time.sleep(10) # 停顿10s
49 env.close() # 关闭图形化界面
这是经典的“代理程序-环境循环”的实现。每个时间步,代理都选择一个action,并且环境返回一个observation和一个reward。
六.执行结果
七.案例【不倒翁】
1 import gym
2 import time
3
4 '''
5 基于强化学习实现不倒翁特性:自动平衡恢复
6 '''
7 if __name__ == "__main__":
8 env = gym.make('CartPole-v0')
9 for i_episode in range(20):
10 observation = env.reset()
11 for t in range(100):
12 env.render()
13 # print(observation)
14 action = env.action_space.sample()
15 observation, reward, done, info = env.step(action)
16 if done:
17 # print("Episode finished after {} timesteps".format(t + 1))
18 print(observation)
19 time.sleep(1) # 暂停以下,便于观察
20 break
21
22 time.sleep(10) # 停顿10s
23 env.close() # 关闭图形化界面
如果我们想做的比在每个步骤中都采取随机action更好的话,那么最好是真正了解我们的action对环境影响。环境的step功能恰好返回了我们需要的。实际上,step返回四个值,包括:
>observation【对象】:特定于环境的对象,代表对环境的一次观察。例如,机器人的关节角度或者棋盘的状态。
>reward【奖励】:上一个动作获得的奖励。规模因环境而异,但目标始终是增加总奖励。
>done【执行状态】:是否需要重新再次进入环境。当done等于True时表示停止。
>info【结果】:对调试有用的诊断信息。
八.执行结果
图示:
九.可用环境
Gym拥有各种环境,从 简单到复杂,涉及许多不同种类的数据。包括:
>经典控制和玩具文字:完成小规模的任务,大部分来自RL文献。用于入门。
>算法化:执行计算,例如添加多位数和反转顺序。
>Atari:经典的Atari游戏。使用易于安装的Arcade学习环境。
>2D和3D机器人:在仿真中控制机器人。这些任务使用了MuJoCo物理引擎,该引擎设计用于快速而准确的机器人仿真。