torch.multinomial()函数用法

6 篇文章 0 订阅
5 篇文章 0 订阅

目录

参数解释

input

num_samples

replacement

true含义

false含义

generator与out--略

返回值

示例

示例1 replacement=True

示例2 replacement=False


在OpenAI联合创始人Andrej Karpathy的教程<The spelled-out intro to language modeling: building makemore>中,提到了函数torch.multinomial()。这个函数形式如下:

torch.multinomial(input, num_samples, replacement=False, *, generator=None, out=None)

参数解释

input

input是一个tensor,我们用下面的例子解释input的意义:

想象n个小球,排成一行。小球按照排列次序,依次编号为0,1,2...n-1。我们随机从中取一个小球,取到i号小球的几率是p(i)。那么p(i)可以排成一个数列。p(0),p(1),p(2)......p(n-1)

d981fc6df71d4848bcc66cd7160517ac.jpeg

把input的任一行想象成n个小球,元素i表示i号小球被取到的概率。假如有很多行这样的小球排成阵列,则input也就变成了一个tensor。

num_samples

我们可以把一行里所有的n个小球取出来,也可以只取一部分。取小球的数量等于num_samples

replacement

replacement是布尔型,可以是True或者False。默认值false

true含义

我们把一个小球取出后,可以再放回去,下次还可能再摸出来。

true的情况下,num_sample的取值可以大于input的列数,因为同一个球可以被重复抓取。

false含义

取出小球后,不再放回去。

注意,假如replacement=false,那么num_samples必须小于等于input的列数。原因如下:既然在false情况下,每抓一次小球就少一个,那么抓取的小球数num_samples肯定不能超过input的列数,因为input列数就是一行的小球总数。

generator与out--略

返回值

返回一个tensor。tensor的行数与input的行数相同--有多少行小球,返回值就有多少行。返回值的列数等于num_samples。返回值的每一行描述对该行小球进行num_samples 次抓取的结果:抓取的第一个球是几号、第二号球是几号、....直到抓完第num_samples个小球是几号。返回值的每一行的抓取结果,遵循input对应行的概率分布。

显然,每一次抓取的结果是随机的,所以调用一次multinomial函数的结果也是随机的。但是大量重复调用multinomial函数之后,统计其返回值,你会发现统计规律。

示例

示例1 replacement=True

f24319c20d9b4be7a97c0b17b1f434e6.jpeg

返回值r的各个元素,表示被抓的小球的编号。比如[3,2,2]表示第一次抓取3号球,第二次抓取2号,第三次还是抓2号。

我们仔细看一下最后一次抓取的结果:抓取30次,共出现3次0,这正与0号球的被抓概率10%相符(p=[1,0,5,4] 故0号元素的概率是1/(1+0+5+4)=10%)。

2出现16次,16/30 = 53.3%    2号球概率是p[2]/(1+0+5+4)=50%  两者基本相符

3出现11次,11/30=36.7%      3号球概率是p[3]/(1+0+5+4)=40%   基本相符

示例2 replacement=False

20c8b5406eea4a14b68cc6e562d0ef84.jpeg

 可见,在replacement=false时,抓取次数不能超过input的列数。其实在num_samples=4时,就已经不对了:r=torch.multinomial(p,4,False)

既然p[1]=0,说明1号球根本不可能被抓到。但是因为抓取次数必须是4,所以在2号,0号,3号抓完之后,只剩1号球可抓。所以返回了[2,0,3,1]

 

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`torch.multinomial()`函数是PyTorch中的一个函数,用于从多项式分布中抽取样本。多项式分布是一种离散概率分布,它描述了在一系列独立的重复试验中,每个试验有多个可能的结果,每个结果发生的概率是固定的,且每个试验之间的结果是相互独立的。在深度学习中,多项式分布通常用于对分类问题进行建模。 `torch.multinomial()`函数的语法如下: ```python torch.multinomial(input, num_samples, replacement=False, *, generator=None, out=None) -> LongTensor ``` 其中,参数`input`是一个张量,表示多项式分布的概率分布。参数`num_samples`是一个整数,表示要抽取的样本数量。参数`replacement`是一个布尔值,表示是否进行有放回的抽样。如果为`True`,则进行有放回的抽样;如果为`False`,则进行无放回的抽样。参数`generator`是一个随机数生成器,用于生成随机数。参数`out`是一个输出张量,用于存储抽样结果。 以下是一个使用`torch.multinomial()`函数从多项式分布中抽取样本的例子: ```python import torch # 定义一个包含五个类别的多项式分布 probs = torch.tensor([0.1, 0.2, 0.3, 0.25, 0.15]) # 将分布转化成二维形式 probs_2d = probs.view(1, -1) # 抽取三个样本 samples = torch.multinomial(probs_2d, 3) print(samples) # tensor([[2, 3, 2]]) ``` 上述代码中,我们首先定义了一个包含五个类别的多项式分布,然后将其转化成二维形式。接着,我们使用`torch.multinomial()`函数从中抽取了三个样本,并将结果存储在`samples`张量中。最后,我们输出了`samples`张量的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值