OpenAI GYM CarRacing DQN: 深度 Q 学习训练自驾车
- 引言
- DQN 算法原理
- Q 值和 Bellman 方程
- DQN 结构
- 训练过程设计
- 经验回放(Experience Replay)
- 目标网络(Target Network)
- 训练循环
- 训练结果和模型演变
- 400 轮训练后
- 500 轮训练后
- 600 轮训练后
- 总结
引言
在强化学习领域,训练一个能够自动驾驶的 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 学习为解决复杂环境中的决策问题提供了一种强大而灵活的方法,为自动驾驶领域的研究和应用提供了新的思路。