高效的 softmax 近似。
如 Edouard Grave, Armand Joulin, Moustapha Cissé, David Grangier, and Hervé Jégou 的《Efficient softmax approximation for GPUs》中所述。
自适应 Softmax 是一种用于训练具有大输出空间的模型的近似策略。当标签分布高度不平衡时,它最为有效,例如在自然语言建模中,其中单词频率分布大致遵循 齐夫定律。
自适应 Softmax 根据频率将标签划分为几个簇。这些簇可能包含不同数量的目标。此外,包含不频繁标签的簇会为这些标签分配较低维度的嵌入,这会加快计算速度。对于每个小批量,仅评估至少包含一个目标的簇。
其思想是,经常访问的簇(例如第一个簇,包含最频繁的标签)也应该计算成本低廉——即,包含少量分配的标签。
我们强烈建议您仔细阅读原始论文以获取更多详细信息。
cutoffs 应为按递增顺序排序的整数序列。它控制簇的数量以及目标到簇的划分。例如,设置 cutoffs = [10, 100, 1000] 意味着前 10 个目标将被分配到自适应 Softmax 的“头部”,目标 11, 12, ..., 100 将被分配到第一个簇,目标 101, 102, ..., 1000 将被分配到第二个簇,而目标 1001, 1002, ..., n_classes - 1 将被分配到最后一个(第三个)簇。
div_value 用于计算每个附加簇的大小,其大小为 ⌊div_valueidxin_features⌋, 其中 idx 是簇索引(不频繁单词的簇具有较大的索引,索引从 1 开始)。
head_bias 如果设置为 True,则在自适应 Softmax 的“头部”添加一个偏置项。有关详细信息,请参阅论文。在官方实现中设置为 False。
警告
传递给此模块的标签应根据其频率进行排序。这意味着最频繁的标签应由索引 0 表示,最不频繁的标签应由索引 n_classes - 1 表示。
注意
此模块返回一个 NamedTuple,其中包含 output 和 loss 字段。有关详细信息,请参阅进一步的文档。
注意
要计算所有类的对数概率,可以使用 log_prob 方法。
- 参数
in_features (int) – 输入张量的特征数
n_classes (int) – 数据集中的类别数
cutoffs (Sequence) – 用于将目标分配到其桶的截止值
div_value (float, optional) – 用于作为指数计算簇大小的值。默认为 4.0
head_bias (bool, optional) – 如果为 True,则在自适应 Softmax 的“头部”添加偏置项。默认为 False
- 返回
-
- 返回类型
NamedTuple,包含 output 和 loss 字段
- 形状
输入:(N,in_features) 或 (in_features)
目标:(N) 或 (),其中每个值满足 0<=target[i]<=n_classes
输出1:(N) 或 ()
输出2:Scalar
-
forward(input_, target_)[源代码]
执行前向传播。
- 返回类型
_ASMoutput
-
log_prob(input)[源代码]
计算所有 n_classes 的对数概率。
- 参数
input (Tensor) – 一个小批量示例
- 返回
每个类别 c 的对数概率,范围为 0<=c<=n_classes,其中 n_classes 是传递给 AdaptiveLogSoftmaxWithLoss 构造函数的参数。
- 返回类型
张量
- 形状
输入:(N,in_features)
输出:(N,n_classes)
-
predict(input)[源代码]
为输入小批量中的每个示例返回概率最高的类别。
这等同于 self.log_prob(input).argmax(dim=1),但在某些情况下更有效。
- 参数
input (Tensor) – 一个小批量示例
- 返回
每个示例中概率最高的类别
- 返回类型
output (Tensor)
- 形状
-
-
reset_parameters()[源代码]
根据 __init__ 中使用的初始化重置参数。