当前位置:   article > 正文

Deep Q-Learning深度增强学习_deep q learning learning rate

deep q learning learning rate

Deep Q-Learning深度增强学习(代码篇)

搭建DQN

初始化

  1. #动作数量
  2. self.n_actions
  3. #状态数量
  4. self.n_features
  5. #learning_rate学习速率
  6. self.lr
  7. #Q-learning中reward衰减因子
  8. self.gamma
  9. #e-greedy的选择概率最大值
  10. self.epsilon_max
  11. #更新Q现实网络参数的步骤数
  12. self.replace_target_iter
  13. #存储记忆的数量
  14. self.memory_size
  15. #每次从记忆库中取的样本数量
  16. self.batch_size = batch_size
  17. self.epsilon_increment = e_greedy_increment
  18. self.epsilon = 0 if e_greedy_increment is not None else self.epsilon_max
  19. #学习的步骤
  20. self.learn_step_counter
  21. #记忆库,此刻的n_feature + 下一步的n_feature + reward + action
  22. self.memory = np.zeros((self.memory_size, n_features * 2 + 2))
  23. #利用Q目标的参数替换Q估计中的参数
  24. t_params = tf.get_collection('target_net_params')
  25. e_params = tf.get_collection('eval_net_params')
  26. #生成了一个tensorflow操作列表[tf.assign(t1,e1), tf.assign(t2,e2), tf.assign(t3,e3)]
  27. self.replace_target_op = [tf.assign(t, e) for t, e in zip(t_params, e_params)]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

构建神经网络

构造Q估计神经网络

  1. def _build_net(self):
  2. #输入
  3. self.s = tf.placeholder(tf.float32, [None, self.n_features], name='s')
  4. #Q现实输入
  5. self.q_target = tf.placeholder(tf.float32, [None, self.n_actions], name='Q_target')
  6. with tf.variable_scope('eval_net'):
  7. #collection
  8. c_names = ['eval_net_params', tf.GraphKeys.GLOBAL_VARIABLES]
  9. #神经元数量
  10. n_l1 = 10
  11. #权值
  12. w_initializer = tf.random_normal_initializer(0., 0.3)
  13. #偏置
  14. b_initializer = tf.constant_initializer(0.1)
  15. #第一层神经元
  16. with tf.variable_scope('l1'):
  17. w1 = tf.get_variable('w1', [self.n_features, n_l1], initializer=w_initializer, collections=c_names)
  18. b1 = tf.get_variable('b1', [1, n_l1], initializer=b_initializer, collections=c_names)
  19. l1 = tf.nn.relu(tf.matmul(self.s, w1) + b1)
  20. #第二层神经元
  21. with tf.variable_scope('l2'):
  22. w2 = tf.get_variable('w2', [n_l1, self.n_actions], initializer=w_initializer, collections=c_names)
  23. b2 = tf.get_variable('b2', [1, self.n_actions], initializer=b_initializer, collections=c_names)
  24. self.q_eval = tf.matmul(l1, w2) + b2
  25. #基于Q估计与Q现实,构造loss-function
  26. with tf.variable_scope('loss'):
  27. self.loss = tf.reduce_mean(tf.squared_difference(self.q_target, self.q_eval))
  28. #训练
  29. with tf.variable_scope('train'):
  30. self._train_op = tf.train.RMSPropOptimizer(self.lr).minimize(self.loss)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

构造Q现实神经网络(该段代码紧接着上段,属于_build_net()函数)

  1. #输入
  2. self.s_sub = tf.placeholder(tf.float32, [None, self.n_features], name='s_sub')
  3. with tf.variable_scope('target_net'):
  4. #collection
  5. c_names = ['target_net_params', tf.GraphKeys.GLOBAL_VARIABLES]
  6. #第一层神经元
  7. with tf.variable_scope('l1'):
  8. w1 = tf.get_variable('w1', [self.n_features, n_l1], initializer=w_initializer, collections=c_names)
  9. b1 = tf.get_variable('b1', [1, n_l1], initializer=b_initializer, collections=c_names)
  10. l1 = tf.nn.relu(tf.matmul(self.s_, w1) + b1)
  11. #第二层神经元
  12. with tf.variable_scope('l2'):
  13. w2 = tf.get_variable('w2', [n_l1, self.n_actions], initializer=w_initializer, collections=c_names)
  14. b2 = tf.get_variable('b2', [1, self.n_actions], initializer=b_initializer, collections=c_names)
  15. self.q_next = tf.matmul(l1, w2) + b2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

存储状态信息

  1. def store_transition(self, s, a, r, s_):
  2. if not hasattr(self, 'memory_counter'):
  3. self.memory_counter = 0
  4. #状态信息list ==> [x, y]
  5. #[action, reward]动作与奖励信息合并为list
  6. #下一步状态信息 ==> [x_next, y_next]
  7. transition = np.hstack((s, [a, r], s_))
  8. #hstack的结果为 ==> [x, y, a, r, x_next, y_next]
  9. #每过memory_size,替换存储值
  10. index = self.memory_counter % self.memory_size
  11. #memory为二维列表,transition为一行向量,插入index行中
  12. self.memory[index, :] = transition
  13. self.memory_counter += 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

选择动作action

  1. def choose_action(self, observation):
  2. # 将observation的list[x, y]转为行向量[[x, y]]
  3. observation = observation[np.newaxis, :]
  4. if np.random.uniform() < self.epsilon:
  5. # 得到每个action的q的估计值
  6. actions_value = self.sess.run(self.q_eval, feed_dict={self.s: observation})
  7. # 选择q值最大的action
  8. action = np.argmax(actions_value)
  9. else:
  10. action = np.random.randint(0, self.n_actions)
  11. return action
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

增强学习过程

  1. def learn(self):
  2. #更换参数
  3. if self.learn_step_counter % self.replace_target_iter == 0:
  4. self.sess.run(self.replace_target_op)
  5. if self.memory_counter > self.memory_size:
  6. sample_index = np.random.choice(self.memory_size, size=self.batch_size)
  7. else:
  8. sample_index = np.random.choice(self.memory_counter, size=self.batch_size)
  9. #从memory中抽取一个记忆值,一个行向量
  10. #[x, y, a, r, x_next, y_next]
  11. batch_memory = self.memory[sample_index, :]
  12. q_next, q_eval = self.sess.run(
  13. [self.q_next, self.q_eval],
  14. feed_dict={
  15. self.s_: batch_memory[:, -self.n_features:], # fixed params
  16. self.s: batch_memory[:, :self.n_features], # newest params
  17. })
  18. q_target = q_eval.copy()
  19. batch_index = np.arange(self.batch_size, dtype=np.int32)
  20. eval_act_index = batch_memory[:, self.n_features].astype(int)
  21. reward = batch_memory[:, self.n_features + 1]
  22. q_target[batch_index, eval_act_index] = reward + self.gamma * np.max(q_next, axis=1)
  23. #训练网络
  24. _, self.cost = self.sess.run([self._train_op, self.loss],
  25. feed_dict={self.s: batch_memory[:, :self.n_features],
  26. self.q_target: q_target})
  27. self.cost_his.append(self.cost)
  28. # increasing epsilon
  29. self.epsilon = self.epsilon + self.epsilon_increment if self.epsilon < self.epsilon_max else self.epsilon_max
  30. self.learn_step_counter += 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

举例说明上述过程

数据结构

  • action=3
  • n_feature=2
  • batch_size=2
q-eval结构
action_0action_1action_2
121
232

行:每一个样本 
列:每一个action对应的Q值

q-next,q-target与q-eval结构相同
batch-index样本索引

一维list ==> [0, 1] #长度:bactch_size

eval_act_index每个样本对应的action的值,也就是每个样本列的索引

一维list ==> [1, 0]

reward每个样本对应的reward的值

一维list ==> [1, 2]


过程

  1. 将q-eval的值赋给q-target
  2. 利用Q-learning算法,计算每一个样本的对应action的q值 
    • 样本0,采取了action=0,真实的q值为-1
    • 样本1,采取了action=2,真实的q值为-2
  3. 更新q-target中的值
action_0action_1action_2
-121
23-2

4. 利用更新后的q-target与q-eval之间的差值进行训练


仿真过程

  1. def run_maze():
  2. # 游戏的每一个回合需要的步数
  3. step = 0
  4. # 游戏的回合
  5. for episode in range(300):
  6. # 初始化观察值
  7. observation = env.reset()
  8. while True:
  9. # 开始环境仿真
  10. env.render()
  11. # 选择动作
  12. action = RL.choose_action(observation)
  13. # 加入动作后,环境进行仿真
  14. # 获取了执行action后,下一步的观测值observation
  15. # 获取了奖励reward
  16. # 游戏是否结束标志done
  17. observation_, reward, done = env.step(action)
  18. # 存储样本
  19. RL.store_transition(observation, action, reward, observation_)
  20. if (step > 200) and (step % 5 == 0):
  21. # 随机抽取样本,网络进行学习
  22. RL.learn()
  23. # 交换观测值
  24. observation = observation_
  25. # 判断游戏是否结束
  26. if done:
  27. break
  28. step += 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/295941
推荐阅读
相关标签
  

闽ICP备14008679号