将正态分布转换为 softmax
Converting normal distribution to softmax
我在 github 上找到了一个很好的强化学习示例,我想使用它。我的问题是输出是一个正态分布层(下面的代码),因为它用于连续动作空间,而我想将它用于离散动作空间,其中模型有 4 个输出,我 select 一个这些输出作为对环境的行动。
作为快速测试,我 argmax
对正态分布层的输出进行了测试,然后对反向传播进行了 selected 操作。
env_action = np.argmax(action)
action = np.zeros(ppo.a_dim) # turn action into one-hot representation
action[env_action] = 1
它工作得很好,但显然只做 argmax
会使代理表现得贪婪而不会探索。
那么(我意识到这很老套)我可以这样做吗:
nd_actions = self.sess.run([self.sample_op], {self.state: state})
rescale_nd = scale(nd_actions, 0, 1)
probs = tf.nn.softmax(rebase_nd)
action = np.random.choice(4, p=probs.numpy()[0])
这样做有什么本质上的错误吗?我知道最好将网络的输出层明显更改为 softmax,但不幸的是,这样做需要大量重写代码,所以作为概念证明,我想测试一下这是否有效.
l1 = tf.layers.dense(self.state, 400, tf.nn.relu, trainable=trainable,
kernel_regularizer=w_reg, name="pi_l1")
l2 = tf.layers.dense(l1, 400, tf.nn.relu, trainable=trainable, kernel_regularizer=w_reg, name="pi_l2")
mu = tf.layers.dense(l2, self.a_dim, tf.nn.tanh, trainable=trainable,
kernel_regularizer=w_reg, name="pi_mu_out")
log_sigma = tf.get_variable(name="pi_log_sigma_out", shape=self.a_dim, trainable=trainable,
initializer=tf.zeros_initializer(), regularizer=w_reg)
norm_dist = tf.distributions.Normal(loc=mu * self.a_bound, scale=tf.exp(log_sigma))
我找到了一个输出分布层,它提供了我正在寻找的东西,现在我不需要重新编写大量代码 - 万岁!
a_logits = tf.layers.dense(l2, self.a_dim, kernel_regularizer=w_reg, name="pi_logits")
dist = tf.distributions.Categorical(logits=a_logits)
我在 github 上找到了一个很好的强化学习示例,我想使用它。我的问题是输出是一个正态分布层(下面的代码),因为它用于连续动作空间,而我想将它用于离散动作空间,其中模型有 4 个输出,我 select 一个这些输出作为对环境的行动。
作为快速测试,我 argmax
对正态分布层的输出进行了测试,然后对反向传播进行了 selected 操作。
env_action = np.argmax(action)
action = np.zeros(ppo.a_dim) # turn action into one-hot representation
action[env_action] = 1
它工作得很好,但显然只做 argmax
会使代理表现得贪婪而不会探索。
那么(我意识到这很老套)我可以这样做吗:
nd_actions = self.sess.run([self.sample_op], {self.state: state})
rescale_nd = scale(nd_actions, 0, 1)
probs = tf.nn.softmax(rebase_nd)
action = np.random.choice(4, p=probs.numpy()[0])
这样做有什么本质上的错误吗?我知道最好将网络的输出层明显更改为 softmax,但不幸的是,这样做需要大量重写代码,所以作为概念证明,我想测试一下这是否有效.
l1 = tf.layers.dense(self.state, 400, tf.nn.relu, trainable=trainable,
kernel_regularizer=w_reg, name="pi_l1")
l2 = tf.layers.dense(l1, 400, tf.nn.relu, trainable=trainable, kernel_regularizer=w_reg, name="pi_l2")
mu = tf.layers.dense(l2, self.a_dim, tf.nn.tanh, trainable=trainable,
kernel_regularizer=w_reg, name="pi_mu_out")
log_sigma = tf.get_variable(name="pi_log_sigma_out", shape=self.a_dim, trainable=trainable,
initializer=tf.zeros_initializer(), regularizer=w_reg)
norm_dist = tf.distributions.Normal(loc=mu * self.a_bound, scale=tf.exp(log_sigma))
我找到了一个输出分布层,它提供了我正在寻找的东西,现在我不需要重新编写大量代码 - 万岁!
a_logits = tf.layers.dense(l2, self.a_dim, kernel_regularizer=w_reg, name="pi_logits")
dist = tf.distributions.Categorical(logits=a_logits)