序言
首马备赛篇——伤后半年的第二次挑战,目标依然是破三。
昨日赛后,明显状态好转,之前还是心理作用大一些。默认自己不行,就真的不行了。
尽管事难如愿,但开始自我怀疑的时候,就已经失败了。
常想一二,不思八九。
老家伙们该退场了。
文章目录
- 序言
- 20241030
20241030
晚上九点下去摇了会儿,一共8K多,把月跑量补到180K,月均配4’10",明后台风登陆,这个月大概率是凑不到200K了。
逮到DGL,她是真的马不停蹄,练得太狠了,昨天参加800米、3000米、4×400米三项,今天又是5组800米间歇,我给她带了一组,前后还有一共3K多的慢跑,真佩服年轻人的精力。
PS:这次校运会照片真的不少,有5000多张,学校难得做了回人事。
DQN进阶之Nature DQN:
在NIPS2013中,DQN的目标Q值计算公式:
y j = { R j i s e n d j i s t r u e R j + γ max a ′ Q ( ϕ ( S j ′ ) , A j ′ , w ) i s e n d j i s f a l s e y_j=\left\{\begin{aligned} &R_j&& isend_j is true\\ &R_j+\gamma \max_{a'}Q(\phi(S_j'), A_j', w)&& isend_j is false \end{aligned}\right. yj=⎩ ⎨ ⎧RjRj+γa′maxQ(ϕ(Sj′),Aj′,w)isendjistrueisendjisfalse
这里目标Q值的计算使用到了当前要训练的Q网络参数来计算 Q ( ϕ ( S j ′ ) , A j ′ , w ) Q(\phi(S_j'), A_j', w) Q(ϕ(Sj′),Aj′,w),而实际上,我们又希望通过 y j y_j yj来后续更新Q网络参数,这样两者循环依赖,迭代起来相关性太强,不利于算法收敛。因此,一个改进版的Nature DQN尝试用两个Q网络来减少目标Q值计算和要更新Q网络参数之间的依赖关系。
Nature DQN使用了两个Q网络,一个当前Q网络
Q Q Q用来选择动作,更新模型参数,另一个目标Q网络 Q ′ Q' Q′用于计算目标Q值。目标Q网络的网络参数不需要迭代更新,而是每隔一段时间从当前Q网络 Q Q Q,复制过来,即延时更新,这样可以减少目标Q值和当前的Q值相关性。
要注意的是,两个Q网络的结构是一模一样的。这样才可以复制网络参数。
首先是Q网络,上一篇的DQN是一个三层的神经网络,而这里我们有两个一样的三层神经网络,一个是当前Q网络,一个是目标Q网络,网络的定义部分如下:代码
def create_Q_network(self):# input layerself.state_input = tf.placeholder("float", [None, self.state_dim])# network weightswith tf.variable_scope('current_net'):W1 = self.weight_variable([self.state_dim,20])b1 = self.bias_variable([20])W2 = self.weight_variable([20,self.action_dim])b2 = self.bias_variable([self.action_dim])# hidden layersh_layer = tf.nn.relu(tf.matmul(self.state_input,W1) + b1)# Q Value layerself.Q_value = tf.matmul(h_layer,W2) + b2with tf.variable_scope('target_net'):W1t = self.weight_variable([self.state_dim,20])b1t = self.bias_variable([20])W2t = self.weight_variable([20,self.action_dim])b2t = self.bias_variable([self.action_dim])# hidden layersh_layer_t = tf.nn.relu(tf.matmul(self.state_input,W1t) + b1t)# Q Value layerself.target_Q_value = tf.matmul(h_layer,W2t) + b2t
对于定期将目标Q网络的参数更新的代码如下面两部分:
t_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='target_net')e_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='current_net')with tf.variable_scope('soft_replacement'):self.target_replace_op = [tf.assign(t, e) for t, e in zip(t_params, e_params)]
def update_target_q_network(self, episode):# update target Q netowrkif episode % REPLACE_TARGET_FREQ == 0:self.session.run(self.target_replace_op)#print('episode '+str(episode) +', target Q network params replaced!')
此外,注意下我们计算目标Q值的部分,这里使用的目标Q网络的参数,而不是当前Q网络的参数:
# Step 2: calculate yy_batch = []Q_value_batch = self.target_Q_value.eval(feed_dict={self.state_input:next_state_batch})for i in range(0,BATCH_SIZE):done = minibatch[i][4]if done:y_batch.append(reward_batch[i])else :y_batch.append(reward_batch[i] + GAMMA * np.max(Q_value_batch[i]))