前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于TF2的DQN算法路径规划

基于TF2的DQN算法路径规划

作者头像
六四零
发布2021-03-25 12:16:07
2.5K0
发布2021-03-25 12:16:07
举报
文章被收录于专栏:小白VREP

DQN算法是一种深度强化学习算法(Deep Reinforcement Learning,DRL),DQN算法是深度学习(Deep Learning)与强化学习(Reinforcement learning)结合的产物,利用深度学习的感知能力与强化学习的决策能力,实现了从感知到动作的端到端(End to End)的革命性算法。DQN算法由谷歌的DeepMind团队在NIPS 2013上首次发表,并在Nature 2015上提出由两个网络组成的Nature DQN。

由于tensorflow2相对于tensorflow1更加简介,因此本文代码部分参照莫烦老师的maze环境,将tensorflow1版本的DQN算法修改为tensorflow2版本的DQN算法。

1.算法原理

DQN算法是Q-Learning算法与卷积神经网络结合,解决了Q-Learning在决策时容易产生维度灾难问题。在Q-Learning中有一个状态动作的表格Q-table,主要进行查表操作,当机器人处于某个状态时,通过查表选择Q值最大的动作来执行。Q-Learning的本质就是不断的对Q-table进行更新操作。

与Q-Learning算法相比,DQN算法做了如下改进:

1.使用卷积神经网络来逼近行为值函数来解决维度灾难的问题;

2.使用target Q network来更新target Q解决相关性的问题;

3.使用经验回访Experience Replay来解决样本相关性及非静态分布问题。

图1 DQN算法的网络结构

DQN算法是Q-Learning在深度学习领域的应用。因此,DQN算法需要有个值函数网络,值网络的主要作用就是在高维空间下对Q-table做函数拟合,一个状态动作对(s, a)对应于一个值函数Q(s, a)。Q(s, a)是通过将状态s输入到神经网络中,然后经过神经网络的近似拟合来得出Q(s, a),然后DQN算法通过e-greedy策略来选择动作a。动作a确定以后,环境对于该动作a会给出一个奖励值r和下一个状态s,依次不断循环,直到训练出一个好的神经网络。

greedy策略是一种贪婪策略,他会选择Q值最大的动作a,但是对于没有出现的状态动作对(s, a),他没有办法进行选择。因此引入了e-greedy策略,e-greedy策略能够兼顾探索(Exploration)和利用(Exploitation),探索能够获取环境中更多的信息,不会拘泥于现有的信息;利用是指从现有的信息中获取最大的奖励。e-greedy策略以e的概率从环境中的所有动作中随机抽取一个,以(1-e)的概率选取Q值最大的动作。正是因为兼顾了探索和利用,强化学习才能表现出类人脑的表现。

图2 环境与智能体交互示意图

Nature DQN中引入了两个结构、初始参数完全相同的网络结构来打乱相关性。Main网络中的参数是通过Loss Function,随着反向传播来进行实时更新的,Target网络中的参数则是通过设定的参数每隔多少步来进行更新(在此期间,参数保持不变),将Main网络中的参数复制到Target网络中。Q(s, a; w)是Main网络输出的Q值,Q(s’, a’; w-)是Target网络输出的Q值。通过两个网络可以降低Q值与目标Q值之间的相关性,提高了算法的稳定性。

图2 DQN两个网络训练示意图

DQN算法跟Q-Learning算法一样,也是一种off-policy的的学习算法,既可以学习当前的经历,也可以学习过去的经历、学习别人的经历。经验池(Experience Replay)用来记录这些学习的经历,在训练的时候,随机拿出一些experience来进行学习,从而打乱经历之间的相关性。

图3 DQN算法流程图

DQN算法的损失函数:

DQN算法的伪代码

2.DQN算法代码

本文代码的环境部分是使用莫烦老师的maze环境,将DQN算法的代码修改为tensorflow2的版本,tensorflow2相对与tensorflow1更加简洁易懂。

NetWork类为DQN算法的网络结构,maze环境中的状态为2,动作为4个方向。为了方便收敛,本文使用了三个全连接层,前两个全连接层使用relu激活函数。

图4 maze环境

定义一个store_transition函数用来存储experience,将数据(s,a,r,a')存入到经验池中,打乱数据之间的关联性。如果self.memory_counter超过经验池的容量,那么从经验池开始覆盖原有部分。

定义一个choose_action函数来选择动作,动作选择遵循e-greedy策略。以(1-e)的概率从环境中的所有动作中随机抽取一个,以e的概率选取Q值最大的动作。

DQN算法在进行训练的时候,首先需要判断Target网络中的参数是否需要更新,如果需要更新,则按照上述公式对Target网络中的参数进行更新。然后从经验池中随机选取minibatch数量的样本来进行训练。随后计算loss进行梯度下降并且更新Main网络的参数。随后增加e的值,减少随机获取动作的概率,提高选取最大Q值动作的概率,最后每隔100个step将loss写入tensorboard,以便实时查看loss的曲线。

源码提取:

链接:https://pan.baidu.com/s/1gWM1ZS0_g-M5SUpwuuIo2A

提取码:xgfd

复制这段内容后打开百度网盘手机App,操作更方便哦

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白VREP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档