CarRacing DQN: 深度 Q 学习训练自驾车

2024-01-07 22:46:31

引言

在强化学习领域,训练一个能够自动驾驶的 CarRacing 2D 代理是一个引人入胜的挑战。在本博客中,我们将深入研究使用 TensorFlow 和 Keras 实现的深度 Q 学习(DQN)的代码,以训练一个能够在 CarRacing 的虚拟赛道上导航的模型。
在这里插入图片描述

DQN 算法原理

Q 值和 Bellman 方程

Q 值(状态-动作对的期望累积奖励)由 Bellman 方程定义:
[ Q(s,a) = r(s,a) + \gamma \max Q(s’, A) ]

  • (s) 是当前状态
  • (a) 是采取的动作
  • (r(s,a)) 是在状态 (s) 采取动作 (a) 后的奖励
  • (s’) 是下一个状态
  • (A) 是动作空间
  • (\gamma) 是折扣率,用于衡量未来奖励的重要性

DQN 结构

DQN 将 Q 学习与深度学习相结合,将 Q 表替换为神经网络。模型的结构如下:

model = Sequential()
model.add(Conv2D(filters=6, kernel_size=(7, 7), strides=3, activation='relu', input_shape=(96, 96, self.frame_stack_num)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(filters=12, kernel_size=(4, 4), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(216, activation='relu'))
model.add(Dense(len(self.action_space), activation=None))
model.compile(loss='mean_squared_error', optimizer=Adam(lr=self.learning_rate, epsilon=1e-7))
  • 输入是三个连续的顶视图图像,每个为 96x96 像素
  • 卷积层和最大池化层用于捕捉图像特征
  • 全连接层输出每个动作的 Q 值

训练过程设计

经验回放(Experience Replay)

为了打破数据间的时序相关性,采用经验回放,将先前的经验存储在经验池中,并从中随机抽样用于训练。

def memorize(self, state, action, reward, next_state, done):
    self.memory.append((state, self.action_space.index(action), reward, next_state, done))

目标网络(Target Network)

引入目标网络,减缓目标的变化,提高训练的稳定性。

def update_target_model(self):
    self.target_model.set_weights(self.model.get_weights())

训练循环

def replay(self, batch_size):
    minibatch = random.sample(self.memory, batch_size)
    train_state = []
    train_target = []
    for state, action_index, reward, next_state, done in minibatch:
        target = self.model.predict(np.expand_dims(state, axis=0))[0]
        if done:
            target[action_index] = reward
        else:
            t = self.target_model.predict(np.expand_dims(next_state, axis=0))[0]
            target[action_index] = reward + self.gamma * np.amax(t)
        train_state.append(state)
        train_target.append(target)
    self.model.fit(np.array(train_state), np.array(train_target), epochs=1, verbose=0)

在每次训练循环中,从经验池中随机选择批量数据,计算目标 Q 值,并更新模型权重。

训练结果和模型演变

通过训练,我们观察到模型逐渐学会在赛道上导航:

400 轮训练后

模型在学习中遇到急转弯时的困难,偶尔偏离赛道。

500 轮训练后

模型变得更加熟练,减少了错误,驾驶更加平稳。

600 轮训练后

模型在贪婪获取奖励时变得鲁莽,导致在急转弯时离开赛道。

总结

本博客深入剖析了使用 DQN 算法训练自驾车代理的过程。通过经验回放和目标网络的应用,模型逐渐学会优化 Q 值以实现更好的导航策略。深度 Q 学习为解决复杂环境中的决策问题提供了一种强大而灵活的方法,为自动驾驶领域的研究和应用提供了新的思路。

文章来源:https://blog.csdn.net/qq_36315683/article/details/135417404
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。