有没有一种方法来优化计算的Bernoulli日志的可能性对于许多多样?

0

的问题

我目前有两个火炬张量, px这两个有形状的 (batch_size, input_size).

我谨计算伯努利登录的可能性对于给定的数据,返回一张量的大小 (batch_size)

这里有一个例子什么的我想要做的: 我的公式,用于记录可能性的伯努利随机变量:

\sum_i^d x_{i} ln(p_i) + (1-x_i) ln (1-p_i)

说我有 p张: [[0.6 0.4 0], [0.33 0.34 0.33]] 说我有 x 张量的二进制的投入的基础上那些概率:

[[1 1 0], [0 1 1]]

我想要计算记录的可能性对于每一个样本,这将导致:

[[ln(0.6)+ln(0.4)], [ln(0.67)+ln(0.34)+ln(0.33)]]

才有可能做到这一计算不使用对于循环? 我知道我可以用 torch.sum(axis=1) 做最后的总和之间的日志,但是它可能做到伯努利登录的可能性的计算不使用对于循环? 或者使用最多1循环? 我想矢量化这种操作尽可能多的。 我可以发誓我们可以使用乳胶用于方程式之前,没有什么变化或者是另一个网站吗?

log-likelihood math pytorch
2021-11-24 00:17:07
1

最好的答案

1

虽然不是一个好的做法,可以直接使用该公式上张量如下(工作,因为这些都是件聪明的操作):

import torch
p = torch.tensor([
    [0.6, 0.4, 0],
    [0.33, 0.34, 0.33]
])

x = torch.tensor([
    [1., 1, 0],
    [0, 1, 1]
])

eps = 1e-8
bll1 = (x * torch.log(p+eps) + (1-x) * torch.log(1-p+eps)).sum(axis=1)
print(bll1)
#tensor([-1.4271162748, -2.5879497528])

注意,以避免 log(0) 错误,我已经介绍了一个非常小的恒 eps 在它里面。

一个更好的方式来做到这一点是使用 BCELossnn 模块 pytorch.

import torch.nn as nn
bce = nn.BCELoss(reduction='none')
bll2 = -bce(p, x).sum(axis=1)
print(bll2)
#tensor([-1.4271162748, -2.5879497528])

由于 pytorch 计算公元前作为一种 损失,它预先准备给你式与一个负号. 属性 reduction='none' 说我不希望所计算的损失被减少(平均/总结)跨批次中的任一种方式。 这是最好的使用,因为我们不需要人工照顾的数值的稳定性和错误的处理(如加入 eps 同上。)

你确实可以确认的两个解决方案实际上返回同一张量(最差):

torch.allclose(bll1, bll2)
# True

或张量(不需求和每个行):

torch.allclose((x * torch.log(p+eps) + (1-x) * torch.log(1-p+eps)), -bce(p, x))
# True

随时要求进一步澄清。

2021-11-25 03:42:35

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................