AdaptiveLogSoftmaxWithLoss¶
- class torch.nn.AdaptiveLogSoftmaxWithLoss(in_features, n_classes, cutoffs, div_value=4.0, head_bias=False, device=None, dtype=None)[source][source]¶
高效的 softmax 近似。
如 Edouard Grave, Armand Joulin, Moustapha Cissé, David Grangier 和 Hervé Jégou 在《Efficient softmax approximation for GPUs》中所述。
自适应 softmax 是一种用于训练具有大型输出空间的模型的近似策略。当标签分布高度不平衡时,例如在自然语言建模中,词频分布大致遵循齐普夫定律(Zipf’s law),这种策略最为有效。
自适应 softmax 根据标签的频率将标签划分为多个簇。这些簇可以包含不同数量的目标。此外,包含不常见标签的簇会为这些标签分配较低维度的嵌入,从而加快计算速度。对于每个 minibatch,仅评估包含至少一个目标的簇。
其理念是,那些被频繁访问的簇(例如第一个簇,包含最常见的标签)也应该计算开销较低——也就是说,它们包含少量被分配的标签。
强烈建议查阅原始论文以获取更多详细信息。
cutoffs
应该是一个按递增顺序排序的整数序列。它控制簇的数量以及目标到簇的划分。例如,设置cutoffs = [10, 100, 1000]
意味着前 10 个目标将被分配到自适应 softmax 的“头部”,目标 11, 12, …, 100 将被分配到第一个簇,目标 101, 102, …, 1000 将被分配到第二个簇,而目标 1001, 1002, …, n_classes - 1 将被分配到最后一个,即第三个簇。div_value
用于计算每个附加簇的大小,其大小由 给出,其中 是簇索引(不常见词的簇索引较大,索引从 开始)。head_bias
如果设置为 True,则会在自适应 softmax 的“头部”添加一个偏置项。详细信息请参阅论文。在官方实现中设置为 False。
警告
作为输入传递给此模块的标签应按其频率排序。这意味着最常见的标签应由索引 0 表示,而最不常见的标签应由索引 n_classes - 1 表示。
注意
此模块返回一个带有
output
和loss
字段的NamedTuple
。详细信息请参阅进一步的文档。注意
要计算所有类别的对数概率,可以使用
log_prob
方法。- 参数
- 返回值
output 是一个大小为
N
的 Tensor,包含为每个示例计算的目标对数概率loss 是一个 Scalar,表示计算出的负对数似然损失
- 返回类型
带有
output
和loss
字段的NamedTuple
- 形状
输入: 或
目标: 或 ,其中每个值满足
输出1: 或
输出2:
Scalar