在强化学习领域,训练一个能够自动驾驶的 CarRacing 2D 代理是一个引人入胜的挑战。在本博客中,我们将深入研究使用 TensorFlow 和 Keras 实现的深度 Q 学习(DQN)的代码,以训练一个能够在 CarRacing 的虚拟赛道上导航的模型。
Q 值(状态-动作对的期望累积奖励)由 Bellman 方程定义:
[ Q(s,a) = r(s,a) + \gamma \max Q(s’, A) ]
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))
为了打破数据间的时序相关性,采用经验回放,将先前的经验存储在经验池中,并从中随机抽样用于训练。
def memorize(self, state, action, reward, next_state, done):
self.memory.append((state, self.action_space.index(action), reward, next_state, done))
引入目标网络,减缓目标的变化,提高训练的稳定性。
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 值,并更新模型权重。
通过训练,我们观察到模型逐渐学会在赛道上导航:
模型在学习中遇到急转弯时的困难,偶尔偏离赛道。
模型变得更加熟练,减少了错误,驾驶更加平稳。
模型在贪婪获取奖励时变得鲁莽,导致在急转弯时离开赛道。
本博客深入剖析了使用 DQN 算法训练自驾车代理的过程。通过经验回放和目标网络的应用,模型逐渐学会优化 Q 值以实现更好的导航策略。深度 Q 学习为解决复杂环境中的决策问题提供了一种强大而灵活的方法,为自动驾驶领域的研究和应用提供了新的思路。