gpt4 book ai didi

reinforcement-learning - 理解pytorch中正态分布的log_prob

转载 作者:行者123 更新时间:2023-12-03 16:49:32 29 4
gpt4 key购买 nike

我目前正在尝试从具有连续 Action 空间的 openAi 健身房环境中解决 Pendulum-v0。因此,我需要使用正态分布来对我的行为进行采样。我不明白的是 log_prob 使用时的维度:

import torch
from torch.distributions import Normal

means = torch.tensor([[0.0538],
[0.0651]])
stds = torch.tensor([[0.7865],
[0.7792]])

dist = Normal(means, stds)
a = torch.tensor([1.2,3.4])
d = dist.log_prob(a)
print(d.size())

我期待一个大小为 2 的张量(每个 Action 一个 log_prob),但它输出一个大小为(2,2)的张量。

但是,当对离散环境使用分类分布时,log_prob 具有预期大小:
logits = torch.tensor([[-0.0657, -0.0949],
[-0.0586, -0.1007]])

dist = Categorical(logits = logits)
a = torch.tensor([1, 1])
print(dist.log_prob(a).size())

给我一个大小为(2)的张量。

为什么正态分布的 log_prob 大小不同?

最佳答案

如果您查看 source code torch.distributions.Normal 并找到log_prob(value)函数的定义,可以看出计算的主要部分是:

return -((value - self.loc) ** 2) / (2 * var) - some other part
哪里 是包含要计算对数概率的值的变量(在您的情况下, a ), self.loc 是分布的平均值(在你的情况下, 意味着 )和 无功是方差,即标准偏差的平方(在您的情况下, stds **2)。可以看出,这确实是 normal distribution的概率密度函数的对数。 , 减去我上面没有写的一些常数和标准差的对数。
在第一个示例中,您定义了 意味着 标准 为列向量,而 成为行向量
means = torch.tensor([[0.0538],
[0.0651]])
stds = torch.tensor([[0.7865],
[0.7792]])
a = torch.tensor([1.2,3.4])
但是从列向量中减去行向量,代码在 中做的值(value) - self.loc 在 Python 中给出了一个矩阵(尝试!),因此您获得的结果是您定义的两个分布中的每一个以及 中的每个变量的 log_prob 值。 .
如果您想获得没有交叉项的 log_prob,则一致地定义变量,即
means = torch.tensor([[0.0538],
[0.0651]])
stds = torch.tensor([[0.7865],
[0.7792]])
a = torch.tensor([[1.2],[3.4]])
或者
means = torch.tensor([0.0538,
0.0651])
stds = torch.tensor([0.7865,
0.7792])
a = torch.tensor([1.2,3.4])
这就是您在第二个示例中的做法,这就是您获得预期结果的原因。

关于reinforcement-learning - 理解pytorch中正态分布的log_prob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60765000/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com