强化学习之DQN笔记

之前的一次机器学习会议中,LeCun表示强化学习或者弱监督学习会是机器学习最重要的发展方向。相比于强监督学习,强化学习更符合人类的学习过程。AlphaGo已经向人类展示出了强化学习的强大,之前看OpenAI机器人和职业玩家solo Dota2游戏,AI的游戏水平强大到令人吃惊。

Q-learning是一种比较常见的强化学习方法,其实现方式是通过一个表(Q-Table)存放状态S和行动A的reward。然而,Q-Table是有缺陷的,对于状态空间巨大的问题就显得无能为力了。为了解决这类问题,有人提出了使用深度神经网络来实现Q函数,这种方法就是deep QNetwork。使用DNN来表示Q函数与使用Q-Table还是有一些区别的,Q-Table实现了S, A =》reword的映射。而DQN中的深度神经网络实现的其实是S => [A]的映射,这里[A]就是各种action的reward向量。

DQN的算法如下所示:

dqn

普通DQN会有两个结构一样的模型,一个是eval network,另一个是target network。target network的参数会保持一段时间,其目的是为了避免算法发散。DQN的算法在一定时间之后,eval network的参数值会更新到target network。

dqn_loss

理解DQN的关键就是深度神经网络的误差。从右侧分支来看,根据target network选取Q值最大的action,以及对应的maxQ(a’)。衰减系数乘以这个最大值,再加上r,即可得到神经网络的目标值。目标值与Q(ai)的平方误差就是DNN的的误差。有这个误差,就可以train这个神经网络了。

利用TensorFlow和gym,就可以玩DQN的了。其实程序主干也比较简单,主要都是抄了一遍莫凡的代码,还停留在学习的阶段。

import gym
from RL_brain import DeepQNetwork

env = gym.make('CartPole-v0')
env = env.unwrapped

print(env.action_space)
print(env.observation_space)
print(env.observation_space.high)
print(env.observation_space.low)

RL = DeepQNetwork(n_actions=env.action_space.n,
                  n_features=env.observation_space.shape[0],
                  learning_rate=0.01, e_greedy=0.9,
                  replace_target_iter=100, memory_size=2000,
                  e_greedy_increment=0.001)

total_steps = 0

for i_episode in range(100):
    observation = env.reset()
    ep_r = 0
    while True:
        env.render()
        action = RL.choose_action(observation)
        observation_, reward, done, info = env.step(action)
        x, x_dot, theta, theta_dot = observation_
        r1 = (env.x_threshold - abs(x))/env.x_threshold - 0.8
        r2 = (env.theta_threshold_radians - abs(theta))/env.theta_threshold_radians - 0.5
        reward = r1 + r2

        RL.store_transition(observation, action, reward, observation_)

        ep_r += reward
        if total_steps > 1000:
            RL.learn()
        if done:
            print('episode: ', i_episode,
                  'ep_r: ', round(ep_r, 2),
                  ' epsilon: ', round(RL.epsilon, 2))
            break

        observation = observation_
        total_steps += 1

RL.plot_cost()

其他部分详见https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/tree/master/contents/5_Deep_Q_Network

DQN的另一个变种叫double DQN方法,二者的区别主要在神经网络目标值的计算,Double DQN选择最佳action a’的时候使用的是eval network,这样可以有效防止过估计。

此外,gym和Baseline的确是强化学习的好帮手,后边准备多研究研究。

发表评论