DQN——深度Q-Learning轻松上手

in #cn-stem5 years ago

之前的文章简单介绍了深度Q-learning的理论以及Q-learng的实战,这篇文章我们就来实践一下与深度学习相结合的Q-learning——Deep Q-learning。

同样的,为了方便与读者交流,所有的代码都放在了这里:

https://github.com/zht007/tensorflow-practice

1. Q-learning与深度学习回顾

在Q-learning中我们需要建立一张Q表,这张Q表记录着每个状态S和A对应的Q值:Q(S,A),根据这张表智能体就可以通过相应的策略(比如epsilon greedy),来指导行动。

Q-Learning的过程就是不断跟新Q表的过程:
Q[s, a]+= learning_rate } *({ td_target }-Q[s, a])
其中:
td_target =R[t+1] + discout_factor * max(Q[s'])
s‘代表下一个状态

深度学习就是建立一个多层的神经网络,通过训练和学习,我们可以用这个神经网络完成输入特征值输出结果;以实现分类、预测和感知等功能。

2. 深度Q-Learning的优势

Q-learning依赖Q表,对于状态有限的问题,比如之前文章介绍的21点游戏以及格子世界等,能轻松应对。但是对于连续性状态,或者状态特别多的问题,我们需要建立一个超大的Q表,这无疑对计算机的存储器容量的要求提出非常高的要求。即便我们能够建立这个超级庞大的Q表,训练起来也是非常困难。

为了解决这个问题,我们可以用神经网络来替代Q表,输入状态S和A,输出预测的Q值,智能体同样可以根据这个Q值结合相应的策略(比如epsilon greedy),来指导行动。接着我们通过训练和更新神经网络,达到更新行动策略的目的。

这种用神经网络或者其他函数替代Q表的方法我们叫做值函数近似(Value Function Approximation),在之前的文章中也有所介绍了。

通过与深度学习的结合,我们就把强化学习的问题转换成了类似于监督学习(Supervised Learning)的问题了。只不过在监督学习中,我们用标签或已知的数据来修正神经网络,在深度Q-learning中,我们用td_target来修正神经网络。

3. Target 和 Prediction 网络

与监督学习中标签永远是固定的,所以神经网络迭代的过程也是稳定的。然而在DQN中,td_target是随着神经网络中参数的更新而更新的,这就意味着神经网络很有可能会出现无法收敛和不稳定的问题。

为了解决这个问题,我们需要暂时固定一个网络,我们叫这个网络为Target网络,这个网络产生的稳定的"标签"来更新另外一个神经网络的参数。另一个网络就叫做Prediction 网络

4. 记忆回放(Experience Replay)

Q-learning 还有一个缺点是,智能体每行动一步,Q表就更新了,该状态下的行动,奖励,和下一个状态的结果(s, a, r, s') 就被抛弃了。DQN中使用记忆库存储很长一段时间的(s, a, r, s')序列。在训练的过程中随机抽取其中的数据对Prediction 网络进行更新。

由于两个神经网络的结构完全相同,经过若干次迭代后,将Predction 网络的参数复制给Target 网络,如此循环,便完成了DQN的迭代。

5. Keras实践DQN

从头写DQN的确是一件很繁琐的任务,不过开源的keras-rl 库让一切变得非常简单,仅需几步,我们就可以用DQN来玩open gym中的游戏啦。

以下代码均参考官方github的example with MIT License。

5.1 安装 Keras-rl库

pip 安装

pip install keras-rl

或者从github安装

git clone https://github.com/keras-rl/keras-rl.git
cd keras-rl
python setup.py install

当然 gym 和 h5py 依赖库也需要安装

pip install h5py
pip install gym

5.2 初始化gym

import 必要的库

import numpy as np
import gym

from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten
from keras.optimizers import Adam

from rl.agents.dqn import DQNAgent
from rl.policy import EpsGreedyQPolicy
from rl.memory import SequentialMemory

初始化gym 环境,这里用经典的CartPole游戏

ENV_NAME = 'CartPole-v0'

# Get the environment and extract the number of actions.
env = gym.make(ENV_NAME)

nb_actions = env.action_space.n

5.3 Keras搭建深度神经网络

Keras搭建神经网络非常简单,就不多讲了,需要注意的是,输入的shape是(1,observation_space)

model = Sequential()
model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(nb_actions))
model.add(Activation('linear'))
print(model.summary())

5.4 配置智能体

memory就是之前提到的记忆库,epsilon greedy 的策略,Keras自带的Adam优化器。

memory = SequentialMemory(limit=50000, window_length=1)
policy = EpsGreedyQPolicy()
dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10,
               target_model_update=1e-2, policy=policy)
dqn.compile(Adam(lr=1e-3), metrics=['mae'])

5.5 训练和验证

与Keras 一样,我们调用dqn的fit方法进行训练,传入环境,循环步数就可以了,当然我们也可以开启动画,只不过这样会拖慢训练进度。

H = dqn.fit(env, nb_steps=10000, visualize=False, verbose=2)

验证的时候我们可以开启动画,看看训练效果

dqn.test(env, nb_episodes=5, visualize=True)

img

当然我们也可以画出奖励与训练步数的关系图,可以看到当迭代到2000到4000步的时候,我们就可以得到比较好的奖励数值了

image-20190523173123723

最后,由于keras-rl完全兼容open gym的环境,所以如果想玩其他游戏比如Mountain car, 仅需要将 ENV_NAME 改个名字就可以了,至于如何调整参数和神经网络的结构就留给读者自己探索了。

ENV_NAME = 'MountainCar-v0'

参考资料

[1] Reinforcement Learning: An Introduction (2nd Edition)

[2] David Silver's Reinforcement Learning Course (UCL, 2015)

[3] Github repo: Reinforcement Learning


相关文章

强化学习——MC(蒙特卡洛)玩21点扑克游戏

强化学习实战——动态规划(DP)求最优MDP

强化学习——强化学习的算法分类

强化学习——重拾强化学习的核心概念

AI学习笔记——Sarsa算法

AI学习笔记——Q Learning

AI学习笔记——动态规划(Dynamic Programming)解决MDP(1)

AI学习笔记——动态规划(Dynamic Programming)解决MDP(2)

AI学习笔记——MDP(Markov Decision Processes马可夫决策过程)简介

AI学习笔记——求解最优MDP


同步到我的简书
https://www.jianshu.com/u/bd506afc6fc1

Sort:  

帅哥/美女!想要参加活动但是不知道从何开始?关注寻宝团@cn-activity每日整理社区活动!如果不想再收到我的留言,请回复“取消”。



This post has been voted on by the SteemSTEM curation team and voting trail. It is elligible for support from @curie.

If you appreciate the work we are doing, then consider supporting our witness stem.witness. Additional witness support to the curie witness would be appreciated as well.

For additional information please join us on the SteemSTEM discord and to get to know the rest of the community!

Please consider setting @steemstem as a beneficiary to your post to get a stronger support.

Please consider using the steemstem.io app to get a stronger support.

Congratulations @hongtao! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You received more than 100 as payout for your posts. Your next target is to reach a total payout of 250

You can view your badges on your Steem Board and compare to others on the Steem Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP

You can upvote this notification to help all Steem users. Learn how here!

Coin Marketplace

STEEM 0.18
TRX 0.16
JST 0.032
BTC 63885.91
ETH 2742.94
USDT 1.00
SBD 2.65