腾讯互娱Turing Lab从创建开始,每周在内部进行分享读书会,对业界的技术研究和应用进行讨论。在此通过公众号形式把相关有趣内容也推送给对新技术和业界趋势感兴趣的朋友。
和大量的所谓技术公众号不同,尽管以AI为重心,但我们的分享不局限于AI论文,而是涉猎所有前沿技术领域,和自动化流程、数据处理、人工智能、架构设计相关的有趣内容均会分享,希望各位在周末闲暇时有空阅读了解。
分享人:许家誉 腾讯互娱 研究员
1. 概述强化学习的主要作用是在复杂未知情况下,控制agent实现某个具体的目标。强化学习可以解决做出一系列决策的问题,例如训练算法完成某个游戏,如何控制机器人在复杂的环境中运动等。强化学习和标准的监督式学习之间的区别在于,它并不需要出现正确的输入/输出对,也不需要精确校正次优化的行为。强化学习更加专注于在线规划,需要在探索(在未知的领域)和遵从(现有知识)之间找到平衡。
OpenAI Gym是一个用于开发和比较强化学习算法的工具。它无需对agent的先验知识,并且采用python作为主要开发语言,因此可以简单的和TensorFlow等深度学习库进行开发集成,可以直观的将学习结果用画面直观的战术出来。例如Gy'm cartpole-v0游戏就是模拟倒立摆,通过左右调整使其不落下,传统我们是使用pid等算法进行控制实现。
2. Gym入门安装gym
pip3 install gym
Gym安装完成后,可以通过以下例子使其运行起来。其中env.step根据action行为返回observation,reward,done, info四个值。Observation是一个四维的向量,表示小车的位置,小车的速度,木棒的角度,木棒的速度。每一个环境都有 action_space,observation_space,他们的类型都是Space。Discrete空间允许随机确定的非负数,在这个案例中就是0,1,如果我们随机进行控制,系统只能维持约10 time steps的平衡。
import gymenv = gym.make("CartPole-v0") #使用CarPole环境进行强化学习observation = env.reset() #初始化环境for _ in range(1000): env.render() #环境渲染并显示出来 action = env.action_space.sample() # 随机化agent行动,在这个环境中只有0,1两个值,分别是向左1牛顿,向右1牛顿的力量 observation, reward, done, info = env.step(action) if done: observation = env.reset()env.close()
3. 利用Q Learning实现小杆的平衡控制
Q Learning是强化学习算法中value-based的算法,Q即为Q(s,a)就是在某一时刻的 s 状态下(s∈S),采取动作a (a∈A)动作能够获得收益的期望,环境会根据agent的动作反馈相应的回报reward r,所以算法的主要思想就是将State与Action构建成一张Q-table来存储Q值,然后根据Q值来选取能够获得最大的收益的动作。
倒立摆游戏比较复杂,原因在于倒立摆的连续状态是无穷多个,人工智能 Q-learning 方法需要有限个状态形成知识。因此我们只需要将连续状态打散为离散状态即可。整体策略分为观察期,贪心期及验证期三种。观察期系统采用随机运动,构建初始的Q Table,当获取到足够多的初始信息后,采用一定的贪心策略,逐步完善整个表。最后经过训练采用Q Learning可以将倒立摆维持超过200个time steps。代码如下:
importgym
importnumpy as np
env = gym.make('CartPole-v0')
eplision =0.01
q_table =np.zeros((256,2))
defbins(clip_min, clip_max, num):
return np.linspace(clip_min,clip_max, num + 1)[1:-1]
defdigitize_state(observation):
cart_pos, cart_v, pole_angle, pole_v =observation
digitized = [np.digitize(cart_pos,bins=bins(-2.4, 2.4, 4)),
np.digitize(cart_v,bins=bins(-3.0, 3.0, 4)),
np.digitize(pole_angle,bins=bins(-0.5, 0.5, 4)),
np.digitize(pole_v,bins=bins(-2.0, 2.0, 4))]
return sum([x * (4 ** i) for i, x in enumerate(digitized)])
#------------观察期--------------#
for _ in range(1000):
observation = env.reset()
s = digitize_state(observation)
while True:
action = env.action_space.sample()
observation_, reward, done, info =env.step(action)
if done:reward = -200
s_ =digitize_state(observation_)
action_ = env.action_space.sample()
q_table[s,action] = reward +0.85*q_table[s_,action_]
s,action = s_,action_
if done:break
print('观察期结束')
#------------贪心策略期--------------#
for epicode in range(1000):
observation = env.reset()
s = digitize_state(observation)
while True:
eplision = epicode / 1000
action = q_table[s].argmax()if np.random.random() < eplision else env.action_space.sample()
observation_, reward, done, info =env.step(action)
if done:reward = -200
s_ =digitize_state(observation_)
action_ = q_table[s_].argmax()if np.random.random() < eplision else env.action_space.sample()
q_table[s,action] = reward +0.85*q_table[s_,action_]
s,action = s_ ,action_
if done:break
print('贪心策略期结束')
#------------验证期--------------#
scores =[]
for _ in range(100):
score = 0
observation = env.reset()
s = digitize_state(observation)
while True:
action = q_table[s].argmax()
observation_, reward, done, info =env.step(action)
score += reward
s = digitize_state(observation_)
env.render()
if done:
scores.append(score)
break
print('验证期结束\n验证成绩:%s'%np.max(scores))
4. 总结通过OpenAI Gym库可以快速验证强化学习的可用性,除了采用Q learning算法外,还可以通过神经网络DQN等算法进行强化学习。通过游戏的最终表现,可以直观看出强化算法的学习结果的好坏,从而为实际算法调整提供参考。Gym库中的游戏较为简单,经过验证后的强化学习算法还可以运用到普通游戏中,从而实现游戏的自动运行及测试。
参考文件:
https://gym.openai.com/
https://github.com/openai/gym