之前的一次机器学习会议中,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会有两个结构一样的模型,一个是eval network,另一个是target network。target network的参数会保持一段时间,其目的是为了避免算法发散。DQN的算法在一定时间之后,eval network的参数值会更新到target network。
理解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()
DQN的另一个变种叫double DQN方法,二者的区别主要在神经网络目标值的计算,Double DQN选择最佳action a’的时候使用的是eval network,这样可以有效防止过估计。
此外,gym和Baseline的确是强化学习的好帮手,后边准备多研究研究。
发表评论