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 ∥A∥F=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) |
对于向量建议明确 p 和 dim | 防止错误推断维度 |
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 范数 + 保留维度 |