如何计算伯努利熵?

数据挖掘 机器学习 统计数据 强化学习 优化 可能性
2022-02-27 11:43:54

我正在阅读 openai 基线中的 gail 实现代码。他们将伯努利熵计算为对手网络损失函数中的损失之一。

在他们的代码中,他们实现了伯努利熵

def logsigmoid(a):
'''Equivalent to tf.log(tf.sigmoid(a))'''
return -tf.nn.softplus(-a)

def logit_bernoulli_entropy(logits):
ent = (1.-tf.nn.sigmoid(logits))*logits - logsigmoid(logits)
return ent

还有另一个 openai 实现的参考,它是相同的代码,但我看不到任何解释。

我检查了计算伯努利熵的方程是:

plogp(1p)log(1p)

我认为后一个方程是计算伯努利熵的正确方法,但第一个方程也应该是正确的,因为它是在 openai 的实现中编写的。我看不出有什么相似之处,这两个表达之间有什么关系吗?

1个回答

很好的观察,是的,它们实际上是计算伯努利随机变量熵的等效方法。

首先,你必须注意到在 openai 代码中,我们没有值p传递给函数,而不是我们有logit(p)定义为:

logit(p)=logp1p=log(p)log(1p)

另外,要记住两个公式。第一个是 sigmoid 函数,它是:

sigmoid(x)=11+ex

第二个是 logit 的 sigmoid,即:

sigmoid(logit(p))=11+1pp=p

(即logit函数的反函数是sigmoid函数)

现在我们准备从第一个方程(在代码中使用)到第二个方程(计算伯努利熵的通用方程)

entropy=(1sigmoid(logit(p)))logit(p)log(sigmoid(logit(p)))

=(1p)logit(p)log(p)=(1p)(log(p)log(1p))log(p)

=(1p)log(p)(1p)log(1p)log(p)

=plog(p)(1p)log(1p)=entropy

因此,代码中使用的公式等同于您提供的第二个公式。