针对 Deep Q Learning 可能无法收敛的问题,这里提出了一种  fix target 的方法,就是冻结现实神经网络,延时更新参数。

这个方法的初衷是这样的:

1. 之前我们每个(批)记忆都会更新参数,这是一种实时更新神经网络参数的方法,这个方法有个问题,就是每次都更新,由于样本都是随机的,可能存在各种不正常现象,比如你考试得了90分,妈妈奖励了你,但是也有可能是考了90分,被臭骂一顿,因为别人都考了95分以上,当然这只是个例子,正是各种异常现象,可能导致损失忽小忽大,参数来回震荡,无法收敛。

2. fix target 方法搭了2个神经网络,一个是估计,一个是现实,估计神经网络实时更新,而现实神经网络暂时冻结,q估计用估计神经网络,q现实用现实神经网络,冻结现实神经网络,就是我先不动,然后派很多人去做尝试,回来给我汇报,我根据汇报总结经验,然后再行动,这是我们正常的处事逻辑,这样显得神经网络更稳重,容易收敛。

核心代码如下

def _build_net(self):# ------------------ build evaluate_net ------------------self.s = tf.placeholder(tf.float32, [None, self.n_features], name='s')  # inputself.q_target = tf.placeholder(tf.float32, [None, self.n_actions], name='Q_target')  # for calculating losswith tf.variable_scope('eval_net'):# n_l1 第一隐层的神经元个数   w b 初始化c_names, n_l1, w_initializer, b_initializer = \['eval_net_params', tf.GraphKeys.GLOBAL_VARIABLES], 10, \tf.random_normal_initializer(0., 0.3), tf.constant_initializer(0.1)  # config of layers# first layer. collections is used later when assign to target netwith tf.variable_scope('l1'):w1 = tf.get_variable('w1', [self.n_features, n_l1], initializer=w_initializer, collections=c_names)b1 = tf.get_variable('b1', [1, n_l1], initializer=b_initializer, collections=c_names)l1 = tf.nn.relu(tf.matmul(self.s, w1) + b1)# second layer. collections is used later when assign to target netwith tf.variable_scope('l2'):w2 = tf.get_variable('w2', [n_l1, self.n_actions], initializer=w_initializer, collections=c_names)b2 = tf.get_variable('b2', [1, self.n_actions], initializer=b_initializer, collections=c_names)self.q_eval = tf.matmul(l1, w2) + b2with tf.variable_scope('loss'):self.loss = tf.reduce_mean(tf.squared_difference(self.q_target, self.q_eval))with tf.variable_scope('train'):self._train_op = tf.train.RMSPropOptimizer(self.lr).minimize(self.loss)# ------------------ build target_net ------------------self.s_ = tf.placeholder(tf.float32, [None, self.n_features], name='s_')    # inputwith tf.variable_scope('target_net'):# c_names(collections_names) are the collections to store variablesc_names = ['target_net_params', tf.GraphKeys.GLOBAL_VARIABLES]# first layer. collections is used later when assign to target netwith tf.variable_scope('l1'):w1 = tf.get_variable('w1', [self.n_features, n_l1], initializer=w_initializer, collections=c_names)b1 = tf.get_variable('b1', [1, n_l1], initializer=b_initializer, collections=c_names)l1 = tf.nn.relu(tf.matmul(self.s_, w1) + b1)# second layer. collections is used later when assign to target netwith tf.variable_scope('l2'):w2 = tf.get_variable('w2', [n_l1, self.n_actions], initializer=w_initializer, collections=c_names)b2 = tf.get_variable('b2', [1, self.n_actions], initializer=b_initializer, collections=c_names)self.q_next = tf.matmul(l1, w2) + b2def store_transition(self, s, a, r, s_):# 存储记忆,固定大小的记忆库if not hasattr(self, 'memory_counter'):self.memory_counter = 0transition = np.hstack((s, [a, r], s_))# replace the old memory with new memoryindex = self.memory_counter % self.memory_sizeself.memory[index, :] = transitionself.memory_counter += 1def choose_action(self, observation):# q learning 选择动作 e贪心observation = observation[np.newaxis, :]if np.random.uniform() < self.epsilon:actions_value = self.sess.run(self.q_eval, feed_dict={self.s: observation})action = np.argmax(actions_value)else:action = np.random.randint(0, self.n_actions)return actiondef learn(self):# 每隔一定步数更新,代表积累了一定的经验才进行总结,这样显得不那么武断,对应到神经网络,就是更新效率高,容易收敛if self.learn_step_counter % self.replace_target_iter == 0:     # 更新神经网络参数
            self.sess.run(self.replace_target_op)print('\ntarget_params_replaced\n')##### 取样本## memory 是 初始化一个 memory_size 的数据表,当记忆大于这个表时,表已被填满,随机从表中选择记忆即可,## 当记忆小于这个表时,表未被填满,只能从记忆里随机选样本if self.memory_counter > self.memory_size:sample_index = np.random.choice(self.memory_size, size=self.batch_size)else:sample_index = np.random.choice(self.memory_counter, size=self.batch_size)batch_memory = self.memory[sample_index, :]##### 训练神经网络# 利用神经网络 计算 q_next 下个状态的q值,q_eval 当前状态的q值q_next, q_eval = self.sess.run([self.q_next, self.q_eval], feed_dict={self.s_: batch_memory[:, -self.n_features:],   # 下一个状态self.s: batch_memory[:, :self.n_features],     # 当前状态
            })q_target = q_eval.copy()        # q_eval 是q 估计### 更新 q learning 的 q表## 每个真实实验有个动作和奖励batch_index = np.arange(self.batch_size, dtype=np.int32)eval_act_index = batch_memory[:, self.n_features].astype(int)   # 动作reward = batch_memory[:, self.n_features + 1]                   # 奖励## 更新q表q_target[batch_index, eval_act_index] = reward + self.gamma * np.max(q_next, axis=1)        # q 现实# 注意这里的动作当前状态选择的动作,而不是下个状态基于贪心的动作# train eval network_, self.cost = self.sess.run([self._train_op, self.loss],feed_dict={self.s: batch_memory[:, :self.n_features],self.q_target: q_target})self.cost_his.append(self.cost)# increasing epsilonself.epsilon = self.epsilon + self.epsilon_increment if self.epsilon < self.epsilon_max else self.epsilon_maxself.learn_step_counter += 1

图示如下

转载于:https://www.cnblogs.com/yanshw/p/10563026.html

强化学习10-Deep Q Learning-fix target相关推荐

  1. 深度强化学习(Deep Reinforcement Learning)的资源

    深度强化学习(Deep Reinforcement Learning)的资源 2015-04-08 11:21:00|  分类: Torch |  标签:深度强化学习   |举报 |字号 订阅 Goo ...

  2. [PARL强化学习]Sarsa和Q—learning的实现

    [PARL强化学习]Sarsa和Q-learning的实现 Sarsa和Q-learning都是利用表格法再根据MDP四元组<S,A,P,R>:S: state状态,a: action动作 ...

  3. 深度强化学习—— 译 Deep Reinforcement Learning(part 0: 目录、简介、背景)

    深度强化学习--概述 翻译说明 综述 1 简介 2 背景 2.1 人工智能 2.2 机器学习 2.3 深度学习 2.4 强化学习 2.4.1 Problem Setup 2.4.2 值函数 2.4.3 ...

  4. 【强化学习】Deep Q Network深度Q网络(DQN)

    1 DQN简介 1.1 强化学习与神经网络 该强化学习方法是这么一种融合了神经网络和Q-Learning的方法,名字叫做Deep Q Network. Q-Learning使用表格来存储每一个状态st ...

  5. 【强化学习】Deep Deterministic Policy Gradient(DDPG)算法详解

    1 DDPG简介 DDPG吸收了Actor-Critic让Policy Gradient 单步更新的精华,而且还吸收让计算机学会玩游戏的DQN的精华,合并成了一种新算法,叫做Deep Deterini ...

  6. Deep Q learning: DQN及其改进

    Deep Q Learning Generalization Deep Reinforcement Learning 使用深度神经网络来表示 价值函数 策略 模型 使用随机梯度下降(SGD)优化los ...

  7. CNNs and Deep Q Learning

    前面的一篇博文介绍了函数价值近似,是以简单的线性函数来做的,这篇博文介绍使用深度神经网络来做函数近似,也就是Deep RL.这篇博文前半部分介绍DNN.CNN,熟悉这些的读者可以跳过,直接看后半部分的 ...

  8. 初探强化学习(10)强化学习中的一些术语(non-stationray,sample efficiency,planning和Learnin,Reward,off-policy和on-policy )

    1. 关于stationray 参考博客. Stationary or not 根据环境是否稳定.可以将强化学习问题分为stationary.non-stationary. 1.1 stationar ...

  9. 深度学习(19): Deep Reinforcement learning(Policy gradientinteract with environment)

    Deep Reinforcement learning AL=DL+RL Machine 观察到环境的状态,做出一些行为对环境产生影响,环境根据machine的改变给予一个reward.正向的acti ...

  10. 【强化学习】竞争深度Q网络(Dueling DQN)求解倒立摆问题 + Pytorch代码实战

    文章目录 一.倒立摆问题介绍 二.竞争深度Q网络简介 三.详细资料 四.Python代码实战 4.1 运行前配置 4.2 主要代码 4.3 运行结果展示 4.4 关于可视化的设置 一.倒立摆问题介绍 ...

最新文章

  1. Redis 安装详细过程(redis基本使用(服务端和客户端)、修改密码)
  2. 程序人生系列谈:《程序员》带给我的启发故事
  3. Laravel 配置项即时载入的服务提供者
  4. python爬虫入门教程-Python爬虫入门教程——爬取自己的博客园博客
  5. 线段树 区间更新模板
  6. Linux命令: grep命令
  7. C4C Cloud Application Studio做ABSL开发的一些性能方面的最佳实践
  8. android通讯录增删改查,android 通话记录的增删改查 .
  9. Tensorflow2.x代码实现计算Top-k Accuracy
  10. 【人脸识别】FaceNet详解
  11. Netty学习总结(4)——图解Netty之Pipeline、channel、Context之间的数据流向
  12. 《android 解析WebService》
  13. java redis hscan_redis操作之迭代器(scan和hscan)讲解
  14. 整人代码大集合/不要乱使用!
  15. Aria2 安装和使用全教程
  16. Android系统之路(初识MTK) ------ make update-api长按Power键添加Reboot项/内置默认Ringtone/SMS/Notification/Alarm删除系统铃声
  17. Freebie: Material Design UI Kit
  18. 微信公众平台编辑模式
  19. 2021年三季度中国家居用品行业A股上市企业营收排行榜:欧派家居、顾家家居排名前2位,且近五年第三季度的净利润均逐年递增(附热榜TOP61详单)
  20. ue虚幻引擎程序化植物生成器设置——如何快速生成大片森林

热门文章

  1. latex中if语句怎么用_如果 (If) | Python 中的条件控制语句详解
  2. axure轮播图怎么设置循环轮播_Axure教程:轮播图制作步骤详解
  3. 检测到无效的异常处理程序例程。_异常控制流(1):异常概述和基本类型
  4. 安装logstash-7.9.3和filebeat-7.9.3
  5. delphi formshow 刷新_OPPO K7x部分配置和外观公布90Hz刷新率11·4发布
  6. 单刹车信号不合理故障_航班盘旋数十圈返航 天津航空:刹车温度传感器等故障...
  7. 华为魔术2手机拆机图解_荣耀Magic2手机内部做工如何?荣耀Magic2手机拆机
  8. osea/ Overview 概述
  9. php redisson,排查redisson中订阅connection无故消失的问题
  10. 卷积云神经网络_有卷积云的北京天空好美!是不是还有池化云?全连接云?