PyTorch中多项分布中随机采样(multinomial)和张量范数(norm)函数使用详解

发布于:2025-05-25 ⋅ 阅读:(17) ⋅ 点赞:(0)

torch.multinomial 是 PyTorch 中用于从多项分布中随机采样的函数,常用于按照给定的概率分布从候选项中抽取若干个索引(如下采样点、选择候选项等)。


函数原型:

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

🔹 参数说明:

参数名 说明
input Tensor,概率分布向量,shape 为 (n,) 或 (batch_size, n),必须为非负
num_samples 要采样的样本数量
replacement 是否放回抽样(True 表示可重复选取)

返回值:

  • 返回一个长整型 Tensor,表示按 input 概率分布采样得到的索引值。
  • shape 为 (num_samples,)(batch_size, num_samples)

示例 1:从概率分布中采样索引

import torch

probs = torch.tensor([0.1, 0.3, 0.6])  # 概率和为 1,不要求必须归一化,但必须非负
sample = torch.multinomial(probs, 2, replacement=False)
print(sample)

可能输出:

tensor([1, 2])  # 表示采样到了索引 1 和 2

示例 2:批量采样

batch_probs = torch.tensor([[0.2, 0.5, 0.3],
                            [0.1, 0.1, 0.8]])

samples = torch.multinomial(batch_probs, 2, replacement=True)
print(samples)

可能输出:

tensor([[1, 2],
        [2, 2]])

常见用途:

用途 描述
点云 / 特征选择 根据得分权重采样下一个子集(如图采样、NMS 替代)
数据增强 / 负样本采样 按照某些权重选取负样本
图神经网络 / 图采样 按节点度分布或图结构对节点采样
RL / 强化学习 根据策略概率分布选择动作(如 policy sampling)

注意事项:

  • input 不必须是归一化的概率(即不要求总和为 1),但 必须是非负的实数
  • 如果 replacement=False,且 num_samples > input 中非零元素个数,将报错。

torch.norm 是 PyTorch 中用于计算张量范数(norm)的函数,它支持 各种范数类型(L1、L2、无穷范数、Frobenius 范数等),可以灵活指定维度、保持维度形状。


一、函数定义

torch.norm(input, p='fro', dim=None, keepdim=False, out=None, dtype=None) → Tensor
参数 说明
input 输入张量(Tensor)
p 范数类型,常见如 'fro'、1、2、float(‘inf’) 等
dim 指定在哪个维度上计算范数(可为 int 或 tuple)
keepdim 是否保留计算后的维度(True/False)
dtype 设置返回的精度,如 torch.float32
out 可选,输出结果张量(in-place 操作)

二、常用范数类型说明(p 参数)

p 类型 定义 / 含义
'fro' Frobenius 范数(矩阵) √(sum(x[i,j]²)),默认值
2 L2 范数 Euclidean norm:√(x₁² + x₂² + …)
1 L1 范数 sum( x₁ + x₂ + …)
float('inf') ∞ 范数 max( x₁ , x₂ , …)
-float('inf') -∞ 范数 min( x₁ , x₂ , …)

三、示例代码

示例 1:向量的 L2 范数(欧几里得范数)

import torch

x = torch.tensor([3.0, 4.0])
norm = torch.norm(x, p=2)
print(norm)  # 输出: tensor(5.0000)

示例 2:矩阵 Frobenius 范数(默认)

A = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
frob = torch.norm(A)  # 等价于 torch.norm(A, p='fro')
print(frob)  # 输出: tensor(5.4772)

计算公式:

∥ A ∥ F = 1 2 + 2 2 + 3 2 + 4 2 = 30 ≈ 5.4772 \|A\|_F = \sqrt{1^2 + 2^2 + 3^2 + 4^2} = \sqrt{30} \approx 5.4772 AF=12+22+32+42 =30 5.4772


示例 3:对某一维计算 L1 范数

B = torch.tensor([[1.0, -2.0], [-3.0, 4.0]])
l1 = torch.norm(B, p=1, dim=1)
print(l1)  # 输出: tensor([3., 7.])

含义:
按行计算 L1 范数
行1: |1| + |−2| = 3
行2: |−3| + |4| = 7


示例 4:保留维度 keepdim=True

x = torch.tensor([[3.0, 4.0]])
l2 = torch.norm(x, p=2, dim=1, keepdim=True)
print(l2)  # 输出: tensor([[5.]])

保留维度,输出形状仍为 (1, 1)


示例 5:计算批次向量的 L2 范数

batch = torch.tensor([[3., 4.], [5., 12.]])  # shape: [2, 2]
norms = torch.norm(batch, p=2, dim=1)
print(norms)  # 输出: tensor([ 5., 13.])

四、常见注意事项

注意点 说明
默认行为 torch.norm(x) 默认执行 Frobenius 范数(适用于 2D)
对于向量建议明确 pdim 防止错误推断维度
float('inf')-float('inf') 支持极大/极小范数
不支持高阶范数如 p=3 你可以设置任意 p(实数)用于计算,但并不用于某些特殊范数名

五、总结表

用法示例 含义
torch.norm(x) Frobenius norm(2D)
torch.norm(x, p=2) L2 范数
torch.norm(x, p=1, dim=1) 每行 L1 范数
torch.norm(x, p=float('inf')) 向量最大值(∞ 范数)
torch.norm(x, p=2, dim=0, keepdim=True) L2 范数 + 保留维度

网站公告

今日签到

点亮在社区的每一天
去签到