(强化学习)DQN实战CartPole游戏

本文介绍强化学习中的一个经典算法——DQN(deep Q network),它于2013年在论文《Playing Atari with Deep Reinforcement Learning》中首次出现,2015年,一篇发表在Nature的论文《Human-level control through deep reinforcement learning》又一次向人们证实了它在游戏中超出人类的表现,下面是对它的简单介绍和代码实现。

算法

DQN是一种Value-Based的方法,即根据动作产生的价值来决定选择哪个动作。它是将深度神经网络和Q-learing相结合,克服Q-learing在面对状态空间很大时效率变得很低得问题,DQN其实是用一种近似的方式来求Q函数,即用神经网络来近似。
其算法如下图:
在这里插入图片描述

DQN与Q-learning的一个区别是采用了经验回放(Experience Replay),即从过去的经验中学习,就像人从记忆中学习那样。由于强化学习是序列决策问题,序列数据前一个状态直接影响后一个状态,因此其数据集并不服从独立同分布的特性,为解决这个问题。采用了经验回放的方法:引入经验池(replay-buffer),在游戏过程中,将探索环境得到的数据先存储起来,然后再随机采样,可以降低了这种序列数据之间的相关性,同时,经验回放还使得样本可重用,从而提高学习效率

Agent在每一步采取action的策略为ε-greedy,即每个状态有ε的概率进行探索,采取随机动作,1-ε的概率根据Q值采取最优动作(选取当前状态下获得Q值最大的那个动作)

上图算法中,γ为折扣因子(discount factor),取值在0到1之间,表明了未来的回报相对于当前回报的重要程度,γ取0时,相当于只考虑立即回报不考虑长期回报,γ为1时,将长期回报和立即回报看得同等重要。

在训练的时候,DQN中有两个结构一样的Q网络,这里一个我们称它为Q,它是用来和环境做互动的网络,并且在互动中产生训练所需的数据,另一个叫Q_target,是我们最后想要学习到的目标网络,两个网络的区别在于参数更新频率不同,Q网络的参数在训练过程中不断在更新,而Q_target网络的参数在固定的时间用Q的参数来更新。其过程为:Q和环境做互动,产生经验数据,存入经验池(Replay-buffer)中,然后从经验池中随机抽样batch个经验,当前时刻的回报和下一状态的Q价值估计(选择所有action中得到的最大的那个Q价值)相加作为了目标价值,即为算法中的y,y类似于监督学习中的标签,通过y值来优化更新Q网络中的参数,每隔一定的步数,将Q中的参数复制到Q_target中,不断的这样循环直到训练结束。

之所以需要两个这样的网络是因为,两个网络可以实现将其中一个网络固定住,即Q_target,使得计算出的标签y是固定的,有利于对Q的优化,让Q去逼近y值;而如果只有一个Q网络,目标Q和评估用的Q是同一个,那么会导致标签的y值变化,导致训练不稳定。
在这里插入图片描述

实践

使用DQN玩一个OPENAI的gym中的CartPole游戏。
Cartpole游戏如下图所示,有一个一维方向的底座可以左右滑动,正中心有一个通过铰链链接的直杆,直杆可以左右摆动,agent通过左右移动底座使得杆子能够保持直立而不倒下。
在这里插入图片描述

代码如下:
导入gym库,没有安装的需要pip install gym来安装,设置模型超参数如下,可按自己需求更改。

# -*- coding: utf-8 -*-
import tensorflow as tf
import gym
import numpy as np
import random as ran

#设置实验的环境
env = gym.make('CartPole-v0')

#经验池
REPLAY_MEMORY = []
#批次大小
MINIBATCH = 50
#输入,即为某个时刻的环境状态
INPUT = env.observation_space.shape[0]
#输出,这个环境中即为左右两个动作
OUTPUT = env.action_space.n
#优化算法中的学习率
LEARNING_LATE = 0.001
#折扣因子
DISCOUNT = 0.99
#保存模型的路径
model_path= "./save/model.ckpt"
x = tf.placeholder(dtype=tf.float32, shape=(None, INPUT), name='x')
y = tf.placeholder(dtype=tf.float32, shape=(None, OUTPUT), name='y')

设置Q网络,网络为3层全连接神经网络。

# 与环境互动的Q网络
with tf.variable_scope('eval_net'):

    W1 = tf.get_variable('W1', shape=[INPUT, 200], initializer=tf.contrib.layers.xavier_initializer())
    W2 = tf.get_variable('W2', shape=[200, 200], initializer=tf.contrib.layers.xavier_initializer())
    W3 = tf.get_va
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值