AdaptiveLogSoftmaxWithLoss¶
- class paddle.nn. AdaptiveLogSoftmaxWithLoss ( in_features, n_classes, cutoffs, div_value=4.0, head_bias=False, name=None ) [源代码] ¶
AdaptiveLogSoftmaxWithLoss 是一种高效的策略,通常用于自然语言处理任务中的语言模型训练,尤其是在处理具有大量词汇且标签分布显著不平衡的语料库时。
AdaptiveLogSoftmaxWithLoss 将标签按照频率划分为多个组,每个组包含的目标数量不同,且在频率较低的标签所在的组中会采用较低维度的嵌入,从而显著减少计算量。
在每个训练的小批量中,只有当至少有一个目标标签出现时,相应的组才会被计算。这种方法的设计理念是,频繁访问的组(如包含最常见标签的初始组)应该具有较低的计算成本。
对于参数 cutoffs
,按升序排序的整数序列。它控制组的数量和目标分配到组的方式。例如,设置 cutoffs = [10, 100, 1000]
意味着前 10 个目标将分配到 AdaptiveLogSoftmaxWithLoss 的 head
,目标 11, 12, ..., 100 将分配到第一个组,而目标 101, 102, ..., 1000 将分配到第二个组,而目标 1001, 1002, ..., n_classes - 1 将分配到第三个组。
对于参数 div_value
,用于计算每个附加组的大小,其值为 \(\left\lfloor \frac{\text{in\_features}}{\text{div\_value}^{\text{idx}}} \right\rfloor\),其中 idx
是组索引(对于较不频繁的单词,组索引较大,索引从 \(1\) 开始)。
对于参数 head_bias
,如果设置为 True,将在 AdaptiveLogSoftmaxWithLoss 的 head
上添加偏置项。详细信息请参阅论文:https://arxiv.org/abs/1609.04309 。
参数¶
in_features (int): 输入 Tensor 的特征数量。
n_classes (int): 数据集中类型的个数。
cutoffs (Sequence): 用于将 label 分配到不同存储组的截断值。
div_value (float, 可选): 用于计算组大小的指数值。默认值:4.0。
head_bias (bool, 可选): 如果为
True
,AdaptiveLogSoftmaxWithLoss 的head
添加偏置项。默认值:False
.name (str, 可选): 具体用法请参见 Name,一般无需设置,默认值为 None。
形状¶
input (Tensor): - 输入 Tensor,形状为
[N, in_features]
,N
是批尺寸。label (Tensor): - 目标值,形状为
[N]
。output1 (Tensor): - 形状为
[N]
。output2 (Scalar): - 标量,无形状
返回¶
用于计算自适应 softmax 的可调用对象。
代码示例¶
>>> import paddle
>>> import paddle.nn as nn
>>> paddle.seed(2024)
>>> input = paddle.randn([3, 5], dtype="float32")
>>> target = paddle.full((3,), 1, dtype='int64')
>>> asfm = nn.AdaptiveLogSoftmaxWithLoss(in_features=5, n_classes=3, cutoffs=[
2], div_value=2.0, head_bias=False)
>>> out, loss = asfm(input, target)
>>> print(out)
Tensor(shape=[3], dtype=float32, place=Place(cpu), stop_gradient=False,
[-1.04691017, -0.42341536, -1.16909981])
>>> print(loss)
Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=False,
0.87980843)
>>> out = asfm.log_prob(input)
>>> print(out)
Tensor(shape=[3, 3], dtype=float32, place=Place(cpu), stop_gradient=False,
[[-1.13710010, -1.04691017, -1.11403584],
[-1.51841831, -0.42341536, -2.07040048],
[-4.25405550, -1.16909981, -0.39282480]])
>>> out = asfm.predict(input)
>>> print(out)
Tensor(shape=[3], dtype=float32, place=Place(cpu), stop_gradient=True,
[1., 1., 2.])