多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Q-Network 或深 Q 网络(DQN)的 Q-Learning 在 DQN 中,我们将 Q-Table 替换为神经网络(Q-Network),当我们使用探索状态及其 Q 值连续训练时,它将学会用最佳动作进行响应。因此,为了训练网络,我们需要一个存储游戏内存的地方: 1. 使用大小为 1000 的双端队列实现游戏内存: ```py memory = deque(maxlen=1000) ``` 1. 接下来,构建一个简单的隐藏层神经网络模型,`q_nn`: ```py from keras.models import Sequential from keras.layers import Dense model = Sequential() model.add(Dense(8,input_dim=4, activation='relu')) model.add(Dense(2, activation='linear')) model.compile(loss='mse',optimizer='adam') model.summary() q_nn = model ``` Q-Network 看起来像这样: ```py _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_1 (Dense) (None, 8) 40 _________________________________________________________________ dense_2 (Dense) (None, 2) 18 ================================================================= Total params: 58 Trainable params: 58 Non-trainable params: 0 _________________________________________________________________ ``` 执行游戏的一集的`episode()`函数包含基于 Q-Network 的算法的以下更改: 1. 生成下一个状态后,将状态,操作和奖励添加到游戏内存中: ```py action = policy(state_prev, env) obs, reward, done, info = env.step(action) state_next = discretize_state(obs,s_bounds,n_s) # add the state_prev, action, reward, state_new, done to memory memory.append([state_prev,action,reward,state_next,done]) ``` 1. 使用 bellman 函数生成并更新`q_values`以获得最大的未来奖励: ```py states = np.array([x[0] for x in memory]) states_next = np.array([np.zeros(4) if x[4] else x[3] for x in memory]) q_values = q_nn.predict(states) q_values_next = q_nn.predict(states_next) for i in range(len(memory)): state_prev,action,reward,state_next,done = memory[i] if done: q_values[i,action] = reward else: best_q = np.amax(q_values_next[i]) bellman_q = reward + discount_rate * best_q q_values[i,action] = bellman_q ``` 1. 训练`q_nn`的状态和我们从记忆中收到的`q_values`: ```py q_nn.fit(states,q_values,epochs=1,batch_size=50,verbose=0) ``` 将游戏玩法保存在内存中并使用它来训练模型的过程在深度强化学习文献中也称为**记忆重放**。让我们按照以下方式运行基于 DQN 的游戏: ```py learning_rate = 0.8 discount_rate = 0.9 explore_rate = 0.2 n_episodes = 100 experiment(env, policy_q_nn, n_episodes) ``` 我们获得 150 的最大奖励,您可以通过超参数调整,网络调整以及使用折扣率和探索率的速率衰减来改进: ```py Policy:policy_q_nn, Min reward:8.0, Max reward:150.0, Average reward:41.27 ``` 我们在每一步计算和训练模型;您可能希望在剧集之后探索将其更改为训练。此外,您可以更改代码以丢弃内存重放,并为返回较小奖励的剧集再训练模型。但是,请谨慎实现此选项,因为它可能会减慢您的学习速度,因为初始游戏会更频繁地产生较小的奖励。