正则化技巧:标签平滑(Label Smoothing)以及在 PyTorch 中的实现
来源:DeepHub IMBA
本文约1200字,建议阅读5分钟
在这篇文章中,我们研究了标签平滑,这是一种试图对抗过度拟合和过度自信的技术。
过拟合和概率校准是训练深度学习模型时出现的两个问题。深度学习中有很多正则化技术可以解决过拟合问题;权重衰减、早停机制和dropout是都是最常见的方式。Platt缩放和保序回归可以用于模型校准。
但是有没有一种方法可以同时对抗过度拟合和过度自信呢?
标签平滑是一种正则化技术,它扰动目标变量,使模型对其预测的确定性降低。它被视为一种正则化技术,因为它限制了softmax 函数的最大概率使最大概率不会比其他标签大得多(过度自信)。
在本文中,我们将解释标签平滑的原理,实现了一个使用这种技术的交叉熵损失函数,并评估了它的性能。
标签平滑
我们有一个多类分类问题。在此类问题中,目标变量通常是一个one-hot向量,其中正确类别的位置为1,其他位置为0。这是与二元分类不同的任务因为在二分类中只有两个可能的类,但是在多标签分类中,一个数据点中可以有多个正确的类。因此,多标签分类问题的需要检测图像中存在的每个对象。
标签平滑将目标向量改变少量 ε。因此,我们不是要求我们的模型为正确的类别预测 1,而是要求它为正确的类别预测 1-ε,并将所有其他类别预测为 ε。
带有标签平滑的交叉熵损失函数转化为下面的公式。
在这个公式中,ce(x) 表示 x 的标准交叉熵损失(例如 -log(p(x))),ε 是一个小的正数,i 是正确的类,N 是类的数量。
直观地说,标签平滑将正确类的概率值限制为更接近其他类的概率值。通过这种方式,它被用作正则化技术和对抗模型过度自信的方法。
PyTorch 实现
在 PyTorch 中实现标签平滑交叉熵损失函数非常简单。在这个例子中,我们使用 fast.ai 课程的一部分代码。
首先,让我们使用一个辅助函数来计算两个值之间的线性组合:
def linear_combination(x, y, epsilon):return epsilon*x + (1-epsilon)*y
接下来,我们使用 PyTorch nn.Module实现一个新的损失函数
import torch.nn.functional as Fdef reduce_loss(loss, reduction='mean'):return loss.mean() if reduction=='mean' else loss.sum() if reduction=='sum' else lossclass LabelSmoothingCrossEntropy(nn.Module):def __init__(self, epsilon:float=0.1, reduction='mean'):super().__init__()self.epsilon = epsilonself.reduction = reductiondef forward(self, preds, target):n = preds.size()[-1]log_preds = F.log_softmax(preds, dim=-1)loss = reduce_loss(-log_preds.sum(dim=-1), self.reduction)nll = F.nll_loss(log_preds, target, reduction=self.reduction)return linear_combination(loss/n, nll, self.epsilon)
我们现在可以在我们的代码中使用这个类。对于这个例子,我们使用标准的 fast.ai pets 例子。
from fastai.vision import *
from fastai.metrics import error_rate# prepare the data
path = untar_data(URLs.PETS)
path_img = path/'images'
fnames = get_image_files(path_img)bs = 64
np.random.seed(2)
pat = r'/([^/]+)_\d+.jpg$'
data = ImageDataBunch.from_name_re(path_img, fnames, pat, ds_tfms=get_transforms(), size=224, bs=bs) \.normalize(imagenet_stats)# train the model
learn = cnn_learner(data, models.resnet34, metrics=error_rate)
learn.loss_func = LabelSmoothingCrossEntropy()
learn.fit_one_cycle(4)
我们将数据转换为可供模型使用的格式,并使用 ResNet ,我们自定义的类作为损失。经过四轮训练后,结果总结如下。
我们得到了只有 7.5% 的错误率,这对于十行左右的代码来说是可以接受的,因为我们使用的都是默认设置。
我们可以调整很多东西来使我们的模型表现得更好。不同的优化器、超参数、模型架构等。
总结
在这篇文章中,我们研究了标签平滑,这是一种试图对抗过度拟合和过度自信的技术。
我们看到了何时使用它以及如何在 PyTorch 中实现它。然后,我们训练了一个计算机视觉模型,用十行代码识别不同品种的猫和狗。
模型正则化和校准是两个重要的概念。更好地理解这些概念可以帮你成为一个更好的深度学习实践者。
编辑:于腾凯
校对:林亦霖
正则化技巧:标签平滑(Label Smoothing)以及在 PyTorch 中的实现相关推荐
- 标签平滑 Label smoothing / Temperature Softmax
标签平滑 Label smoothing 逻辑 为什么有效 Temperature Softmax 近期在查看一些训练技巧,无意中发现了标签平滑 Label smoothing,非常简单却有效的一个技 ...
- 标签平滑 label smoothing
文章目录 简介 什么是label smoothing label smoothing作用 torch实现label smoothing 简介 label smoothing其实是机器学习和深度学习上比 ...
- 标签平滑Label Smoothing
Lable Smoothing 是分类问题中错误标注的一种解决方法. 对于分类问题,特别是多分类问题,常常把向量转换成one-hot-vector(独热向量) one-hot带来的问题:(对于独热的简 ...
- 深度学习--TensorFlow(7)拟合(过拟合处理)(数据增强、提前停止训练、dropout、正则化、标签平滑)
目录 拟合 1.拟合情况 2.抵抗过拟合方法 过拟合处理(防止过拟合): 一.数据增强 1.设置图像生成器 2.载入图片 3.图像转三维数据 4.三维转四维 5.生成图片(用图像生成器) 代码 二.提 ...
- Label Smoothing 标签平滑 (Label smooth regularization, LSR)
Lable Smoothing 是分类问题中错误标注的一种解决方法.是一种正则化方法, 为了降低模型过拟合(overfitting) 出自inception v3,Transformer中就用到了 我 ...
- [轻笔记] label smoothing(标签平滑)
看google AI最新的开源代码,发现有个技巧--label smoothing,网上查到的公式与代码中的公式不一样,于是做个笔记,并对见到的觉得有问题的关于label smoothing的博客也列 ...
- 垃圾分类、EfficientNet模型、数据增强(ImageDataGenerator)、混合训练Mixup、Random Erasing随机擦除、标签平滑正则化、tf.keras.Sequence
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 垃圾分类.EfficientNet模型.数据增强(ImageD ...
- 【AI面试】hard label与soft label,Label Smoothing Loss 和 Smooth L1 Loss
往期文章: AI/CV面试,直达目录汇总 [AI面试]NMS 与 Soft NMS 的辨析 [AI面试]L1 loss.L2 loss和Smooth L1 Loss,L1正则化和L2正则化 在一次询问 ...
- Label Smoothing介绍及其代码实现
一.标签平滑(Label Smoothing)介绍 标签平滑(Label Smoothing)的原理其实很简单,它大部分的用处用一句话总结就是: 修改数据集的标签来增加扰动,避免模型的判断过于自信从而 ...
- label smooth标签平滑的理解
今天我们来聊一聊label smooth这个tricks,标签平滑已经成为众所周知的机器学习或者说深度学习的正则化技巧.标签平滑--label smooth regularization作为一种简单的 ...
最新文章
- mysql数据库性别男用1存储那性别女用什么呢?
- 腾讯数据解读:95后基本不爱用微信,98%都是成年人,社交应用存在巨大机会...
- debian 安装php gd2,如何在Debian Linux中为PHP安装Ioncube
- Luogu P1280 Niko的任务【线性dp】By cellur925
- Hibernate-----5、持久化对象
- 支持XML和JSON数据的图表控件FusionCharts XT
- 有效管理云计算成本的多个措施
- 基于Flume的美团日志收集系统
- Atitit 智能云网络摄像机的前世今生与历史 优点 密码默认888888
- ISO27001:2013体系认证
- 项目管理学习——PMP 5A高分通过备考经验分享
- 【电路设计】AD17使用及PCB绘制总结
- 编译原理实验三 自下而上语法分析
- 考研英语 - word-list-11
- Visual Studio Code最新1.66.0版下载
- Apache Ignite详解
- 【coolshell酷壳】简明 Vim 练级攻略
- 【转载】基于LLVM Pass实现控制流平坦化
- 不等式视角下的策略梯度算法
- 灰流丽能无效融合么_游戏王:史上最强融合卡片,不可阻挡,无法逆转!