+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

随着时间的流逝,DQN培训的速度明显降低

发布于2021-03-02 15:34     阅读(516)     评论(0)     点赞(27)     收藏(3)


0

1

2

3

4

5

我正在乒乓球馆环境中训练DQN,以复制原始DQN“人为控制...”文件。我的算法可以在较小的测试环境中很好地工作并收敛,但是当在pong上进行测试时,训练在每次迭代中都会极大地减慢速度(从1秒的100帧开始到100k迭代后的10秒/ 100帧)。这是我的模型和训练功能:

模型:

def create_model(self):
    """
    Creates Q approximation model

    :param state: state placeholder
    :return: Sequential model used to predict Q values
    """
    # Action Space
    num_actions = self.env.action_space.n

    # Functional API
    state_shape = list(self.env.observation_space.shape)
    inputs = tf.keras.Input(dtype=tf.uint8,
                            shape=(state_shape[0], state_shape[1], state_shape[2] * self.config.state_history))
    x = tf.cast(inputs, tf.float32) / self.config.high
    x = tf.keras.layers.Conv2D(32, (8, 8), strides=(4, 4), activation='relu')(x)
    x = tf.keras.layers.Conv2D(64, (4, 4), strides=(2, 2), activation='relu')(x)
    x = tf.keras.layers.Conv2D(64, (3, 3), strides=(1, 1), activation='relu')(x)
    x = tf.keras.layers.Flatten()(x)
    x = tf.keras.layers.Dense(512, activation='linear')(x)
    outputs = tf.keras.layers.Dense(num_actions, activation='linear')(x)

    model = tf.keras.Model(inputs=inputs, outputs=outputs)

    return model

训练功能:

@tf.function
def update_weights(self, states, actions, rewards, next_states, done_masks):
    
    # Target Q value (Labels)
    q_samp = tf.where(done_masks, rewards,
                      rewards + self.config.gamma * tf.reduce_max(self.target_model(next_states, training=True),
                                                                  axis=1))
    actions_one_hot = tf.one_hot(actions, self.num_actions)
    
    with tf.GradientTape() as tape:
        # Calculate Model Output (Predictions)
        logits = self.model_1(states, training=True)
        q = tf.reduce_sum(tf.multiply(logits, actions_one_hot), axis=1)
        
        # Mean Squared Error Loss
        loss = tf.reduce_mean(tf.math.squared_difference(q_samp, q))

    # Calculate Gradients and clip by norm value
    grads = tape.gradient(loss, self.model_1.trainable_weights)
    grads = [tf.clip_by_norm(grad, self.config.clip_val) for grad in grads]
    
    # Apply gradients to model
    self.opt.apply_gradients(zip(grads, self.model_1.trainable_weights))

    return loss, grads

一些附加说明

  • 这不仅仅是培训步骤。甚至env.step(action)以结束时间更新环境,与开始相比花费的时间是原来的5倍。

  • update_weights()除self外,所有输入均为tf张量。除了self.target_model的权重会定期更新之外所有自我属性都不会更改我已经测试过,没有发现任何痕迹。

  • 当数据集应该仅接近5 GB时,它也会占用大量内存(〜25 + GB)。知道我在做什么错吗?

  • 注释掉会tf.function阻止训练从一开始就将步伐的速度减慢〜50%。


解决方案


暂无回答

0

1

2

3

4

5

6



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/869881/d184837bd7e7b45e9292/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

27 0
收藏该文
已收藏

评论内容:(最多支持255个字符)