【问题标题】:How to define the policy in the case of continuous action space that sum up to 1?在连续动作空间总和为 1 的情况下如何定义策略?
【发布时间】:2019-08-24 02:51:06
【问题描述】:

我目前正在使用策略梯度方法研究连续状态-动作空间问题。

环境动作空间被定义为在每个时间步上总和为 1 的比率。因此,在这种情况下,使用高斯策略似乎并不合适。

我所做的是尝试调整 softmax 策略(以确保策略网络输出总和为 1),但我很难确定要使用的损失函数以及最终的梯度以更新网络参数。

到目前为止,我已经尝试过贴现收益加权均方误差,但结果并不令人满意。

在这种特殊情况下是否有任何其他策略可以使用?或者有什么想法可以使用哪个损失函数?

这是我的策略网络(在我的代理类中)在 tensorflow 中的实现。

def policy_network(self):
        self.input = tf.placeholder(tf.float32,
                                    shape=[None, self.input_dims],
                                    name='input')
        self.label = tf.placeholder(tf.float32, shape=[None, self.n_actions], name='label')
        # discounted return
        self.G = tf.placeholder(tf.float32, shape=[
            None,
        ], name='G')

        with tf.variable_scope('layers'):
            l1 = tf.layers.dense(
                inputs=self.input,
                units=self.l1_size,
                activation=tf.nn.relu,
                kernel_initializer=tf.contrib.layers.xavier_initializer())
            l2 = tf.layers.dense(
                inputs=l1,
                units=self.l2_size,
                activation=tf.nn.relu,
                kernel_initializer=tf.contrib.layers.xavier_initializer())
            l3 = tf.layers.dense(
                inputs=l2,
                units=self.n_actions,
                activation=None,
                kernel_initializer=tf.contrib.layers.xavier_initializer())

            self.actions = tf.nn.softmax(l3, name='actions')

        with tf.variable_scope('loss'):
            base_loss = tf.reduce_sum(tf.square(self.actions - self.label))
            loss = base_loss * self.G

        with tf.variable_scope('train'):
            self.train_op = tf.train.AdamOptimizer(self.lr).minimize(loss)

【问题讨论】:

    标签: python tensorflow reinforcement-learning


    【解决方案1】:

    在我看来,您可能想尝试二维高斯或多元高斯。 https://en.wikipedia.org/wiki/Gaussian_function

    例如,您可以预测 2D-Gaussian 的 4 个参数 (x_0, x_1, sigma_0, sigma_1),您可以在 2D-Gaussian 平面上生成一对数字,例如 (2, 1.5),然后您可以使用 softmax 来产生所需的动作softmax([2, 1.5])=[0.62245933 0.37754067]

    然后你可以计算这对数字在 2D-Gaussian 平面上的概率,然后你可以用它来计算负对数概率、优势等,从而制作损失函数并更新梯度。

    【讨论】:

      【解决方案2】:

      您是否考虑过使用狄利克雷分布?您的网络可以输出浓度参数alpha > 0,然后您可以使用它们生成总和为 1 的样本。 PyTorchTF 都支持此分发,您可以从它们那里采样和获取 logProb。在这种情况下,除了获取您的样本之外,由于它是一个概率分布,您还可以了解它的方差,这可以作为代理置信度的衡量标准。对于 3 维的动作,alpha={1,1,1} 基本上意味着您的代理没有任何偏好,而拥有alpha={100,1,1} 则意味着它非常确定大部分权重应该转到第一个维度。


      根据评论编辑:

      当您使用 Dirichlet 分布时,Vanilla REINFORCE 将很难优化策略。问题是,在普通策略梯度中,您可以通过梯度裁剪和自适应学习率等来控制您在网络参数空间中更改策略的速度。但是,最重要的是控制概率空间中的变化率.一些网络参数可能会比其他参数更改更多的概率。因此,即使您控制学习率以限制网络参数的增量,您也可能会大大改变 Dirichlet 分布的方差,如果您认为这对您的网络来说是有意义的。为了最大化你的行为的对数概率,你的网络可能更多地关注于减少方差而不是改变你的分布模式,这会在探索和学习有意义的策略时伤害你。缓解此问题的一种方法是通过限制新策略分布与旧策略分布的 KL 散度来限制策略概率分布的变化率。 TRPO或PPO是解决这个问题和解决约束优化问题的两种方法。

      在实践中确保alpha > 1 也可能很好。您可以通过在您的神经网络输出上使用 softplus ln(1+exp(x)) + 1 轻松实现这一点,然后再将其输入您的 Drichlet 发行版。还要监控到达您的图层的渐变并确保它存在。

      您可能还希望将分布的熵添加到您的目标函数中,以确保进行足够的探索并防止分布具有非常低的方差(非常高的 alpha)。

      【讨论】:

      • 感谢您的回复。我已经实施了您的方法,但代理似乎没有学到任何东西。事实上,学习曲线非常糟糕。我想知道他们是否有一些调试 REINFORCE 的方法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      相关资源
      最近更新 更多