You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch对数归一化原理及计算疑惑求解

PyTorch Categorical的logits参数误解与转换原理

你遇到的问题核心是混淆了Categorical分布的两个关键参数:probs和logits,以及对文档中“归一化”逻辑的误解。

1. 参数的本质区别

  • probs:接收已经归一化的概率分布(要求沿最后一维的和为1),PyTorch不会对其做额外的归一化处理。
  • logits:接收未归一化的对数概率(可以是任意实数),PyTorch会通过softmax函数将其转换为合法的概率分布(和为1)。

2. 你的代码问题分析

你将[0.6, 0.4](已经归一化的概率)传给了logits参数,这相当于告诉PyTorch:“这是一组未归一化的对数概率,请转换为合法概率”。此时:

  • PyTorch会计算softmax(logits)得到概率分布:
    softmax(0.6) = exp(0.6) / (exp(0.6) + exp(0.4)) ≈ 1.8221 / 3.3139 ≈ 0.55
    softmax(0.4) ≈ 1.4918 / 3.3139 ≈ 0.45
    
  • 你给出的m.logits结果[-0.5108, -0.9163],其实是np.log([0.6, 0.4])的结果——这说明你大概率是误将probs参数写成了logits,因为当传入probs=input_tensor时,logits属性会返回对应概率的对数(log(probs)),这正好匹配你看到的输出。

3. 文档中“归一化”的实际含义

文档中提到的“logits会被归一化使得最终概率和为1”,指的是PyTorch会对传入的未归一化logits执行softmax操作,得到合法的概率分布。当前主流版本中,logits属性返回的是传入的原始值。

4. 正确用法示例

传入归一化概率(用probs参数)

import torch
from torch import distributions as dist

input_probs = torch.tensor([0.6, 0.4])
m = dist.Categorical(probs=input_probs)
print(m.probs)   # 输出: tensor([0.6000, 0.4000])(原始概率)
print(m.logits)  # 输出: tensor([-0.5108, -0.9163])(概率的对数)

传入未归一化logits(用logits参数)

import torch
from torch import distributions as dist

input_logits = torch.tensor([1.0, 0.0])
m = dist.Categorical(logits=input_logits)
print(m.logits)  # 输出: tensor([1.0000, 0.0000])(原始logits)
print(m.probs)   # 输出: tensor([0.7311, 0.2689])(softmax转换后的概率)

内容的提问来源于stack exchange,提问作者MM360

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:34:50