自适应对数Softmax与损失¶
- class torch.nn.AdaptiveLogSoftmaxWithLoss(in_features, n_classes, cutoffs, div_value=4.0, head_bias=False, device=None, dtype=None)[源代码]¶
高效的softmax近似。
如在 由Edouard Grave、Armand Joulin、Moustapha Cissé、David Grangier和Hervé Jégou撰写的关于GPU高效softmax近似的论文中所述。
自适应softmax是一种用于训练具有大输出空间的模型的近似策略。当标签分布高度不平衡时,它最为有效,例如在自然语言建模中,单词频率分布大致遵循齐夫定律。
自适应softmax根据标签的频率将它们分成几个簇。每个簇可能包含不同数量的目标。 此外,包含较少频率标签的簇为这些标签分配较低维度的嵌入,从而加快了计算速度。 对于每个小批次,仅评估至少存在一个目标的簇。
这个想法是,那些经常被访问的集群(比如第一个,包含最频繁标签的集群),也应该计算成本低廉——也就是说,包含少量分配的标签。
我们强烈建议查看原始论文以获取更多详细信息。
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方法。- Parameters
- Returns
output 是一个大小为
N的张量,包含每个样本计算的目标对数概率loss 是一个标量,表示计算的负对数似然损失
- Return type
NamedTuple包含output和loss字段
- Shape:
输入: 或
目标: 或 其中每个值满足
输出1: 或
output2:
标量