我正在使用迁移学习为斯坦福大学汽车数据集构建ResNet-18
分类模型。我想实现label smoothing来惩罚过度自信的预测并提高泛化能力。TensorFlow
在CrossEntropyLoss
中有一个简单的关键字参数。有人为PyTorch
构建了一个类似的函数吗?
我正在使用迁移学习为斯坦福大学汽车数据集构建ResNet-18
分类模型。我想实现label smoothing来惩罚过度自信的预测并提高泛化能力。TensorFlow
在CrossEntropyLoss
中有一个简单的关键字参数。有人为PyTorch
构建了一个类似的函数吗?
8条答案
按热度按时间zyfwsgd61#
多类神经网络的泛化和学习速度通常可以通过使用软目标来显著提高,软目标是硬目标的加权平均和标签上的均匀分布。以这种方式平滑标签可以防止网络变得过于自信,并且标签平滑已用于许多最先进的模型,包括图像分类,语言翻译和语音识别。
Label Smoothing已经在
Tensorflow
的交叉熵损失函数BinaryCrossentropy,CategoricalCrossentropy中实现了。但目前PyTorch
中还没有Label Smoothing的正式实现。不过,关于它的讨论正在进行中,希望能提供一个正式的包。下面是讨论线程:Issue #7455。这里我们将带来一些
PyTorch
从业者提供的Label Smoothing(LS)的最佳实现。基本上,LS的实现方式有很多种,请参考这篇具体的讨论,一种在这里,另一种在这里。这里我们将带来2种独特的实现方式,每种方式有两个版本;所以总共是4选项一:CrossEntropyLossWithProbs
通过这种方式,它接受
one-hot
目标向量。用户必须手动平滑他们的目标向量。这可以在with torch.no_grad()
范围内完成,因为它暂时将所有requires_grad
标志设置为false。此外,我们还在
self. smoothing
上添加了Assert复选标记,并在此实现上添加了损失加权支持。Shital已经在这里公布了答案。这里我们指出这个实现与Devin Yang的上述实现类似。然而,这里我们提到他的代码最小化了一点
code syntax
。检查
选项二:标签平滑交叉熵损失
这样,它接受目标向量并使用不手动平滑目标向量,而是内置模块负责标签平滑。它允许我们根据
F.nll_loss
实现标签平滑。(a). Wangleiofficial:Source -(AFAIK),Original Poster
(b). Datasaurus:来源-添加了权重支持
此外,我们稍微减少了代码编写,使其更加简洁。
检查
更新:Officially Added
mf98qq942#
我一直在寻找从
_Loss
派生的选项,就像PyTorch中的其他损失类一样,并尊重基本参数,如reduction
。不幸的是,我找不到直接的替代品,所以最后我自己写了一个。我还没有完全测试这个,但是:其他选项:
lo8azlld3#
据我所知没有
以下是PyTorch实现的两个示例:
LabelSmoothingLoss
模块用于机器翻译attention-is-all-you-need-pytorch
,重新实现Google的Attention is all you need papercwxwcias4#
从1.10.0版开始,Pytorch正式支持
torch.nn.CrossEntropyLoss
中的标签平滑和软目标。zzzyeukh5#
标签平滑PyTorch实现参考:https://github.com/wangleiofficial/label-smoothing-pytorch
snvhrwxg6#
目前在PyTorch中还没有正式的实现,但已经提出了作为高优先级Feature Request #7455,并在TorchVision Issue #2980中单独提出。
在其他库中有许多实现:
NMTCritierion()._smooth_label()
snorkel.classification.cross_entropy_with_probs()
LabelSmoothingLoss()
以及一些非官方的实现/代码片段:
ResNet50 v1.5
TensorFlow / Keras implementation
tf.keras.losses.CategoricalCrossentropy(label_smoothing)
hivapdat7#
当前最上面的帖子在传递权重时并不完全正确。请注意,PyTorch文档指定当传递权重和
reduction='mean'
时,将考虑权重进行归一化:所以减少应该是
而不是
完整地,通过此修复:
oymdgrw78#
请注意,标签平滑有不同的配方。
1.来自原始论文https://arxiv.org/pdf/1512.00567.pdf的规范公式,其中平滑的真实分布是one-hot向量和均匀分布的线性组合:
1.另一种流行的公式,其中平滑的真实分布具有不同的形式:
规范公式用于Pytorch的实现中。它也对应于Innat's answer中的选项2。第二个公式在许多开源实现中提供,包括上述answer中的选项1。