强化学习 课件 第5章 强化学习的实验环境与工具_第1页
强化学习 课件 第5章 强化学习的实验环境与工具_第2页
强化学习 课件 第5章 强化学习的实验环境与工具_第3页
强化学习 课件 第5章 强化学习的实验环境与工具_第4页
强化学习 课件 第5章 强化学习的实验环境与工具_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章

强化学习的实验环境与工具北京大学余欣航目录实验环境Gym实验工具TensorFlow实验环境GymGym简介Gym(/)是OpenAI推出的强化学习实验环境库:提供了强化学习中与智能体(agent)交互的环境(environment)用于构建、评估和比较强化学习算法的工具库兼容TensorFlow、Theano、Keras等框架下编写的程序除了依赖的少量商业库外,整个项目是开源免费的Gym简介Gym库内置了上百种强化学习的实验环境:经典控制环境简单文本环境算法环境二维方块(Box2D)环境Atari游戏环境机械控制环境……Gym的安装Gym支持Windows系统、Linux系统和macOS系统在Anaconda3环境里安装Gym库(要求Python版本为3.5+)安装Gym库(安装版本为0.15.3):pipinstallgym==0.15.3……Gym中的环境查看Gym库里包含的环境fromgymimportenvsenv_spaces=envs.registry.all()env_ids=

[env_space.idforenv_spaceinenv_spaces]print(env_ids)Gym库里的环境每一个环境都有一个形如“xxxxx_vd”的ID,如“CartPole-v0”、“LunarLander-v2”等,ID中包含名称和版本号悬崖寻路问题(CliffWalking)目标是从起点移动到终点可以采取上、下、左、右四种动作进行移动到达除悬崖以外的方格奖励为-1到达悬崖奖励为-100并返回起点离开方格的动作会保持当前状态不动并奖励-1加载环境importgym#加载CliffWalking-v0环境env=gym.make('CliffWalking-v0’)#以图形化的方式显示当前的环境状态env.render()使用make()函数加载gym库中的”悬崖寻路”环境如果需要加载其它环境,只需将make函数中的参数换成其它环境的ID即可加载环境”悬崖寻路“问题的环境描述起点

终点

悬崖

奖励描述

状态空间和动作空间每个环境都定义了自己的状态空间和动作空间加载环境之后使用环境的observation_space属性查看状态空间,使用环境的action_space属性查看动作空间#查看环境的观测空间print(‘状态空间:',env.observation_space)#查看环境的动作空间print('动作空间:',env.action_space)输出观测空间和动作空间观测空间和动作空间即可以是离散空间(取值是有限个离散的值)也可以是连续空间(取值是连续的)离散空间一般用Discrete()表示,连续空间一般用Box()表示例如“CliffWalking-v0“环境的观测空间是Discrete(48),表示该环境有48个状态,动作空间是Discrete(4),表示该环境有4个动作智能体有48个状态,在每个状态,智能体有上下左右四个动作可以选择环境对象的step()函数环境对象的step()函数接收智能体的动作并返回以下四个参数:observations:代表对特定环境的观测值reward:执行当前行动所获得的奖励值done:布尔型变量,表示该回合是否完成了任务info:其它信息,例如状态间的转移概率每个时间步,智能体都会选择一个动作,然后返回结果和奖励值环境对象的step()函数fortinrange(10):

#在动作空间中随机选择一个动作action=env.action_space.sample()

#执行一个动作observation,reward,done,info=env.step(action)

print("action:{},observation:{},reward:{},done:{},info:{}".format(action,observation,reward,done,info))Gym中常用函数使用make()函数加载环境对象使用reset()函数重置环境对象使用render()函数以图形化的方式显示当前的环境状态使用action_space.sample()函数从环境的动作空间随机选择一个动作使用step()函数使智能体执行一个动作使用close()函数关闭环境Sarsa算法流程回顾

使用Sarsa寻找最佳策略设置算法参数以及初始化Q表importnumpyasnp##学习率设置alpha=

0.8##折扣因子设置gamma=

0.95##迭代轮数num_episodes=

600##创建一个48行4列的空的Q表q_table=np.zeros([env.observation_space.n,env.action_space.n])使用Sarsa寻找最佳策略

def

epsilon_greedy(state,epsilon):

##探索

ifnp.random.uniform(0,

1)

<epsilon:

returnenv.action_space.sample()

##利用

else:

returnnp.argmax(q_table[state,:])使用Sarsa寻找最佳策略

使用Sarsa寻找最佳策略

##进行循环

while

True:

##在状态下执行动作,返回奖励和下一状态next_state,reward,done,_=env.step(action)

##根据𝜀-greedy选择下一动作next_action=epsilon_greedy(next_state,

0.1)

##更新Q值q_table[state,action]

+=alpha*

(reward+gamma*q_table[next_state,next_action]

-q_table[state,action])

##更新当前状态和行为state=next_stateaction=next_action

##若达到终止状态,结束循环

ifdone:

break使用Sarsa寻找最佳策略迭代完成后,根据Q表找出最佳策略best_route_value=

[]##初始化状态next_state=env.reset()

best_route_value.append(next_state)while

True:

action=np.argmax(q_table[next_state,

:])next_state,_,done,_=env.step(action)

best_route_value.append(next_state)

ifdone:

breakbest_route_value[36,24,12,0,1,2,3,4,5,6,7,8,9,10,11,23,35,47]Q-learning算法流程回顾

使用Q-learning寻找最佳策略设置算法参数以及初始化Q表importnumpyasnp##学习率设置alpha=

0.8##折扣因子设置gamma=

0.95##迭代轮数num_episodes=

600##创建一个48行4列的空的Q表q_table_learning=np.zeros([env.observation_space.n,env.action_space.n])使用Q-learning寻找最佳策略

def

epsilon_greedy(state,epsilon):

##探索

ifnp.random.uniform(0,

1)

<epsilon:

returnenv.action_space.sample()

##利用

else:

returnnp.argmax(q_table_learning[state,:])使用Q-learning寻找最佳策略进行迭代,首先初始化状态##进行迭代foriinrange(num_episodes):

##初始化状态state=env.reset()

使用Q-learning寻找最佳策略

##进行循环

while

True:

##根据𝜀-greedy选择动作action=epsilon_greedy(state,

0.5)

##在状态下执行动作,返回奖励和下一状态next_state,reward,done,_=env.step(action)

##更新Q值q_table_learning[state,action]

+=alpha*

(reward+gamma*max(q_table_learning[next_state])

-q_table_learning[state,action])

##更新当前状态state=next_state

##若达到终止状态,结束循环

ifdone:

break使用Q-learning寻找最佳策略迭代完成后,根据Q表找出最佳策略best_route_value_learning=

[]##初始化状态next_state=env.reset()

best_route_value_learning.append(next_state)while

True:

action=np.argmax(q_table_learning[next_state,

:])next_state,_,done,_=env.step(action)

best_route_value_learning.append(next_state)

ifdone:

breakbest_route_value_learning[36,24,25,26,27,28,29,30,31,32,33,34,35,47]##初始化环境s=env.reset()d=

Falsewhiled!=

True:

##每次选择最优动作a=np.argmax(Q[s,:])s1,r,d,_=env.step(a)s=s1

##展示每一步的游戏进程env.render()…………使用Q-learning寻找最佳策略展示每一步的游戏进程Sarsa会选择较为安全的路径;Q-learning会选择步数最少的最优路径整体来看,Sarsa每轮迭代的累积奖励略高于Q-learning,但算法稳定性不如Q-learningSarsa和Q-learning的对比SarsaQ-learning实验工具TensorFlowTensorFlow简介TensorFlow是一个运用数据流图进行数值计算的开源软件库:灵活的架构可以在多种平台上展开计算用于构建强化学习算法中机器学习或深度学习模型的构建、训练和调试官方网站:/中文社区:/张量(Tensor)张量是一个数据容器0维张量:标量1维张量:向量2维张量:矩阵3维张量:彩色图像……数据流图数据流图又称为计算图,是TensorFlow的基本计算框架,用于定义深度学习的网络结构TensorFlow中的基本数据流图为静态图,即一旦创建不支持动态修改TensorFlow中亦引入了动态图机制(Eager)数据流图图中包含一些操作(Operation)对象,称为计算节点Tensor对象则是表示在不同的操作间的数据节点在定义图的时候定义不同的名称域并在其中定义变量和Operation,方便后续查找常量、变量常量:数值不能改变的Tensor,一旦被赋值,就不能改变使用tf.constant()函数创建TensorFlow常量

#创建一个常量x x=tf.constant(10)变量:数值可变的Tensor,用于计算图中其它操作的输入使用tf.Variable()函数创建TensorFlow变量#定义一个服从正态分布的变量赋给w,并将其命名为weightw=tf.Variable(tf.random_normal([3,2],stddev=

0.1),name=‘weight’)变量范围在复杂的神经网络结构中,层与层之间的连接、节点与节点之间的连接会存在许多的变量或操作,会导致变量出现混乱不清使用_scope()或tf.variable_scope()设置变量范围,可以降低复杂性,通过将相关层的变量或操作集中在一个范围内有助于更好的理解模型importtensorflowastf#重置计算图tf.reset_default_graph()withtf.name_scope("layer1"):a=tf.constant(1,name=

'a')

print(a.name)

withtf.name_scope("layer1-1"):b=tf.constant(2,name=

'b')

print(b.name)输出变量范围使用tf.variable_scope()设置变量范围importtensorflowastf#重置计算图tf.reset_default_graph()withtf.variable_scope("layer1"):a=tf.Variable(1,name="a")

print(a.name)

withtf.variable_scope("layer1-1"):b=tf.Variable(2,name="b")

print(b.name)输出占位符占位符是只定义类型和维度但不赋值的Tensor使用tf.placeholder()函数创建TensorFlow占位符#创建一个维度为3x2,类型为float类型的占位符y=tf.placeholder(shape=[3,2],dtype="float")占位符有一个shape参数,用于指定数据的维度,如果shape设置为None,则在运行时可以输入任意维度的数据激活函数、损失函数

优化器不同的优化算法是TensorFlow计算图中解决优化问题的一个Operation,需要在会话中运行常用的优化器:tf.train.GradientDescentOptimizertf.train.MomentumOptimizertf.train.RMSPropOptimizertf.train.AdamOptimizertf.train.AdadeltaOptimizertf.train.AdagradOptimizer……会话执行数据流图中的操作需要使用TensorFlow会话使用tf.Session()函数创建一个会话importtensorflowastf#常见一个常量a和常量ba=tf.constant(3)b=tf.constant(5)#定义一个加法计算c=tf.add(a,b)#创建一个会话sess=tf.Session()#执行定义的操作sess.run(c)#关闭会话sess.close()构建计算图创建session利用传进的数据进行计算TensorBoardTensorBoard是TensorFlow的可视化工具,用于可视化计算图通过将TensorFlow程序输出的日志文件的信息可视化使得程序的理解、调试和优化更加简单高效使用的三个步骤:定义FileWriter对象将需要可视化的graph或数据添加到FileWriter对象中启动TensorBoard服务端程序,在前端查看训练过程状态官方文档:/tensorflow/tensorboardTensorBoardimporttensorflowastf#重置计算图tf.reset_default_graph()#定义常量a、b和加法操作a=tf.constant(3,name=

'a')b=tf.constant(5,name=

'b')c=tf.add(a,b,name=

'add1')#定义常量d、e和加法操作d=tf.constant(2,name=

'd')e=tf.constant(4,name=

'e')f=tf.add(d,e,name=

'add2')#定义乘法操作g=tf.multiply(c,f,name=

'mul')#创建会话withtf.Session()

assess:

#将构建的计算图写入到文件中writer=tf.summary.FileWriter("output",sess.graph)

print(sess.run(g))writer.close()在终端中找到工作目录,然后启动TensorBoard可视化的计算图importtensorflowastf#重置计算图tf.reset_default_graph()withtf.name_scope("part1"):

#定义常量a、b和加法操作a=tf.constant(3,name=

'a')b=tf.constant(5,name=

'b')c=tf.add(a,b,name=

'add1')withtf.name_scope("part2"):

#定义常量d、e和加法操作d=tf.constant(2,name=

'd')e=tf.constant(4,name=

'e')f=tf.add(d,e,name=

'add2')withtf.name_scope("Result"):

#定义乘法操作g=tf.multiply(c,f,name=

'mul')#创建会话withtf.Session()

assess:

#将构建的计算图写入到文件中writer=tf.summary.FileWriter("output",sess.graph)

print(sess.run(g))writer.close()TensorBoard设置变量范围后的可视化计算图值函数近似算法流程回顾

使用值函数近似寻找最佳策略

使用值函数近似寻找最佳策略利用TensorFlow构建值函数模型——定义占位符##载入TensorFlow库importtensorflowastf#重设默认计算图tf.reset_default_graph()##设置输入层占位符,表示状态inputs=tf.placeholder(shape=[1,

48],dtype=tf.float32)##设置预测Q值的占位符,维度为1×4,表示4种不同动作对应的Q值outputs=tf.placeholder(shape=[1,

4],dtype=tf.float32)##设置目标Q值的占位符,维度为1×4target_q=tf.placeholder(shape=[1,

4],dtype=tf.float32)使用值函数近似寻找最佳策略利用TensorFlow构建值函数模型——构建值函数模型def

value_function_model(x):

##设置输出层权重和偏置

withtf.variable_scope('output',reuse=tf.AUTO_REUSE):w=tf.Variable(tf.truncated_normal([48,

4],

0,

0.1))

##前向传播

x=tf.matmul(x,w)

returnx##输出预测Q值predict_q=value_function_model(inputs)##根据Q值,选择最佳动作action_choose=tf.argmax(predict_q,

1)使用值函数近似寻找最佳策略利用TensorFlow构建值函数模型——定义损失函数和优化方法##设置损失函数为MSEloss=tf.reduce_sum(tf.square(target_q-predict_q))##优化方法为梯度下降trainer=tf.train.AdamOptimizer(learning_rate=0.1)updateModel=trainer.minimize(loss)使用值函数近似寻找最佳策略

def

epsilon_greedy(state,episode,num_episodes):

#设置探索率epsilon=np.linspace(0.1,

0,num_episodes,endpoint=False)

#探索,探索率随迭代次数的增加而减少

ifnp.random.uniform(0,

1)

<epsilon[episode]:

returnnp.array([env.action_space.sample()])

#利用

else:

returnsess.run(action_choose,feed_dict={inputs:

np.identity(48)[state:state+1]})使用值函数近似寻找最佳策略进行迭代,初始化变量和状态##创建会话withtf.Session()

assess:

##变量初始化sess.run(tf.global_variables_initializer())

##迭代200次

foriinrange(200):

##初始化环境s=env.reset()使用值函数近似寻找最佳策略训练模型,进行循环,若循环次数达到99或者到达终止状态,结束循环,返回进行下一次迭代j=

0whilej<

99:

j+=

1

##计算

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论