在连续动作空间总和为 1 的情况下如何定义策略?

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


环境动作空间被定义为在每个时间步必须总和为 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)


弑天下
浏览 111回答 2
2回答

Helenr

你有没有想过使用狄利克雷分布?您的网络可以输出浓度参数alpha > 0,然后您可以使用它们生成总和为 1 的样本。两者都PyTorch支持TF此发行版,您可以从它们中采样和获取logProb。在这种情况下,除了获取您的样本之外,由于它是一个概率分布,您还可以了解它的方差,这可以作为代理置信度的衡量标准。对于 3 维的动作,具有alpha={1,1,1}基本上意味着您的代理没有任何偏好,而具有alpha={100,1,1}意味着它非常确定大部分权重应该转到第一个维度。根据评论编辑:当您使用 Dirichlet 分布时,Vanilla REINFORCE 将很难优化策略。问题是,在普通策略梯度中,您可以通过梯度裁剪和自适应学习率等来控制您在网络参数空间中更改策略的速度。但是,最重要的是控制概率空间中的变化率. 一些网络参数可能会比其他参数更改更多的概率。因此,即使您控制学习率以限制网络参数的增量,您也可能会大大改变 Dirichlet 分布的方差,如果您认为这对您的网络来说是有意义的。为了最大化您的操作的对数概率,您的网络可能更多地关注于减少方差,而不是改变您的分配模式,这会在探索和学习有意义的政策时伤害您。缓解此问题的一种方法是通过限制新策略分布与旧策略分布的 KL 散度来限制策略概率分布的变化率。TRPO 或 PPO 是解决此问题和解决约束优化问题的两种方法。在实践中确保这一点也可能很好alpha > 1。您可以通过在将神经网络输出输入到 Drichlet 分发之前在神经网络输出上使用 softplus 轻松实现这一点ln(1+exp(x)) + 1。还要监视到达您的图层的渐变并确保它存在。您可能还希望将分布的熵添加到您的目标函数中,以确保进行足够的探索并防止分布具有非常低的方差(非常高的 alpha)。

小唯快跑啊

在我的脑海中,您可能想尝试 2D-Gaussian 或 multivariate Gaussian。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]。然后你可以计算这对数字在二维高斯平面上的概率,然后你可以用它来计算负对数概率、优势等,以制作损失函数并更新梯度。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python