Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【论文笔记】Multi-Sample Dropout for Accelerated Training and Better Generalization

【论文笔记】Multi-Sample Dropout for Accelerated Training and Better Generalization

作者头像
致Great
发布于 2022-03-04 02:45:11
发布于 2022-03-04 02:45:11
53100
代码可运行
举报
文章被收录于专栏:自然语言处理自然语言处理
运行总次数:0
代码可运行

论文简介:训练更快,泛化更强的Dropout:Multi-Sample Dropout 论文标题:Multi-Sample Dropout for Accelerated Training and Better Generalization 论文链接:https://arxiv.org/pdf/1905.09788.pdf 论文作者:{Hiroshi Inoue}

论文简介

本文阐述的也是一种 dropout 技术的变形——multi-sample dropout。传统 dropout 在每轮训练时会从输入中随机选择一组样本(称之为 dropout 样本),而 multi-sample dropout 会创建多个 dropout 样本,然后平均所有样本的损失,从而得到最终的损失。这种方法只要在 dropout 层后复制部分训练网络,并在这些复制的全连接层之间共享权重就可以了,无需新运算符。通过综合 M 个 dropout 样本的损失来更新网络参数,使得最终损失比任何一个 dropout 样本的损失都低。这样做的效果类似于对一个 minibatch 中的每个输入重复训练 M 次。因此,它大大减少了训练迭代次数。

Multi-Sample Dropout

图 1 是一个简单的 multi-sample dropout 实例,作图为我们经常在炼丹中用到的“流水线”Dropout,在图片中这个 multi-sample dropout 使用了 2 个 dropout 。该实例中只使用了现有的深度学习框架和常见的操作符。如图所示,每个 dropout 样本都复制了原网络中 dropout 层和 dropout 后的几层,图中实例复制了「dropout」、「fully connected」和「softmax + loss func」层。在 dropout 层中,每个 dropout 样本使用不同的掩码来使其神经元子集不同,但复制的全连接层之间会共享参数(即连接权重),然后利用相同的损失函数,如交叉熵,计算每个 dropout 的损失,并对所有 dropout 样本的损失值进行平均,就可以得到最终的损失值。

该方法以最后的损失值作为优化训练的目标函数,以最后一个全连接层输出中的最大值的类标签作为预测标签。当 dropout 应用于网络尾段时,由于重复操作而增加的训练时间并不多。值得注意的是,multi-sample dropout 中 dropout 样本的数量可以是任意的,而图 1 中展示了有两个 dropout 样本的实例。

另外需要注意的是,神经元在推理过程中是不会被忽略的。只计算一个 dropout 样本的损失是因为 dropout 样本在推理时是一样的,这样做可以对网络进行修剪以消除冗余计算。要注意的是,在推理时使用所有的 dropout 样本并不会严重影响预测性能,只是稍微增加了推理时间的计算成本。

Pytorch实现

https://github.com/lonePatient/multi-sample_dropout_pytorch 在初始化方法中,定义了一个ModuleList,包含多个Dropout, 在forward中,对样本进行多次dropout,最后对out求平均,对loss求平均。其中,dropout_num为超参数,表示Multi-Sample中,Multi的具体值,核心代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  self.dropouts = nn.ModuleList([nn.Dropout(dropout_p) for _ in range(dropout_num)])

完整ResNet模型结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ResNet(nn.Module):
    def __init__(self, ResidualBlock, num_classes,dropout_num,dropout_p):
        super(ResNet, self).__init__()
        self.inchannel = 32
        self.conv1 = nn.Sequential(
            nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1, bias=False),
            nn.BatchNorm2d(32),
            nn.ReLU(),
        )
        self.layer1 = self.make_layer(ResidualBlock, 32,  2, stride=1)
        self.layer2 = self.make_layer(ResidualBlock, 64, 2, stride=2)
        self.layer3 = self.make_layer(ResidualBlock, 64, 2, stride=2)
        self.layer4 = self.make_layer(ResidualBlock, 128, 2, stride=2)
        self.fc = nn.Linear(128,num_classes)
        self.dropouts = nn.ModuleList([nn.Dropout(dropout_p) for _ in range(dropout_num)])

    def make_layer(self, block, channels, num_blocks, stride):
        strides = [stride] + [1] * (num_blocks - 1)   #strides=[1,1]
        layers = []
        for stride in strides:
            layers.append(block(self.inchannel, channels, stride))
            self.inchannel = channels
        return nn.Sequential(*layers)

    def forward(self, x,y = None,loss_fn = None):
        out = self.conv1(x)
        out = self.layer1(out)
        out = self.layer2(out)
        out = self.layer3(out)
        out = self.layer4(out)
        feature = F.avg_pool2d(out, 4)
        if len(self.dropouts) == 0:
            out = feature.view(feature.size(0), -1)
            out = self.fc(out)
            if loss_fn is not None:
                loss = loss_fn(out,y)
                return out,loss
            return out,None
        else:
            for i,dropout in enumerate(self.dropouts):
                if i== 0:
                    out = dropout(feature)
                    out = out.view(out.size(0),-1)
                    out = self.fc(out)
                    if loss_fn is not None:
                        loss = loss_fn(out, y)
                else:
                    temp_out = dropout(feature)
                    temp_out = temp_out.view(temp_out.size(0),-1)
                    out =out+ self.fc(temp_out)
                    if loss_fn is not None:
                        loss = loss+loss_fn(temp_out, y)
            if loss_fn is not None:
                return out / len(self.dropouts),loss / len(self.dropouts)
            return out,None

Bert如何使用Multi-Sample Dropout

于BERT家族模型使用了很多Dropout,采用上述实现过于复杂,一种更简单的实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for step, (input_ids, attention_mask, token_type_ids, y) in enumerate(tk):
    input_ids, attention_mask, token_type_ids, y = input_ids.to(device), attention_mask.to(
        device), token_type_ids.to(device), y.to(device).long()
    with autocast(): 
        for i in range(batch_n_iter):
            output = model(input_ids, attention_mask, token_type_ids).logits
            loss = criterion(output, y) / CFG['accum_iter']
            SCALER.scale(loss).backward()
        SCALER.step(optimizer)
        SCALER.update()
        optimizer.zero_grad()
  • 其中,batch_n_iter为超参数,表示Multi-Sample中,Multi的具体值。

如果大家用抱抱脸的话,可以按照下面模板设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class multilabel_dropout():
    # Multisample Dropout 论文: https://arxiv.org/abs/1905.09788
    def __init__(self, HIGH_DROPOUT, HIDDEN_SIZE):
        self.high_dropout = torch.nn.Dropout(config.HIGH_DROPOUT)
        self.classifier = torch.nn.Linear(config.HIDDEN_SIZE * 2, 2)
    def forward(self, out):
        return torch.mean(torch.stack([
            self.classifier(self.high_dropout(p))
            for p in np.linspace(0.1,0.5, 5)
        ], dim=0), dim=0)

Multi-Sample Dropout作用

关于原理的话,因为发现网上写的很全了,这里偷懒了,大家可以看参考资料,这里主要给大家提供下代码了。

  • 大幅减少训练迭代次数
  • 提高泛化能力
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022.01.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PyTorch使用Tricks:Dropout,R-Dropout和Multi-Sample Dropout等 !!
Dropout是一种在神经网络训练过程中用于防止过拟合的技术。在训练过程中,Dropout会随机地关闭一部分神经元,这样可以使模型更加健壮,不会过度依赖于任何一个特定的神经元,从而提高模型的泛化能力。下面是一些使用技巧:
JOYCE_Leo16
2024/03/19
2730
PyTorch使用Tricks:Dropout,R-Dropout和Multi-Sample Dropout等 !!
NLP实战 | BERT文本分类及其魔改(附代码)
每天给你送来NLP技术干货! ---- 写在前面 本文主要介绍了两种文本分类模型:BERT文本分类基础模型,及基于Bert和TextCNN的魔改模型。在作者实际的有关文本分类的工作中取得了F1值超越Bert基础模型近4%的效果。 1. Baseline:Bert文本分类器 Bert模型是Google在2018年10月发布的语言模型,一经问世就横扫NLP领域11项任务的最优结果,可谓风头一时无二。 有关于Bert中transformer的模型细节,我们在此就不赘述了。感兴趣的朋友,可以看看《The Illus
zenRRan
2022/10/10
6.5K0
NLP实战 | BERT文本分类及其魔改(附代码)
从零开始学Pytorch(十八)之kaggle图像分类
我们将运用在前面几节中学到的知识来参加Kaggle竞赛,该竞赛解决了CIFAR-10图像分类问题。比赛网址是https://www.kaggle.com/c/cifar-10.
墨明棋妙27
2022/09/23
4640
【Pre-Training】Transformers 源码阅读和实践
本文主要针对HuggingFace开源的 transformers,以BERT为例介绍其源码并进行一些实践。主要以pytorch为例 (tf 2.0 代码风格几乎和pytorch一致),介绍BERT使用的Transformer Encoder,Pre-training Tasks和Fine-tuning Tasks。最后,针对预训练好的BERT进行简单的实践,例如产出语句embeddings,预测目标词以及进行抽取式问答。本文主要面向BERT新手,在阅读本文章前,假设读者已经阅读过BERT原论文。
阿泽 Crz
2020/11/25
2.6K0
​一文带你了解:人工智能大模型:技术原理、应用与未来发展
近年来,人工智能领域取得了前所未有的突破,尤其是以GPT(Generative Pre-trained Transformer)、LLaMA、Claude等为代表的大型语言模型(Large Language Models,LLMs)引领了一场技术革命。这些大模型凭借数十亿甚至数千亿参数的规模,展现出了接近人类的语言理解和生成能力,为人工智能的应用开辟了广阔前景。本文将深入探讨AI大模型的技术原理、训练方法、应用场景以及未来发展趋势,并提供丰富的代码示例,帮助读者更好地理解和应用这些技术。
远方2.0
2025/04/04
2590
【关系抽取-R-BERT】模型结构
模型的整体结构 相关代码 import torch import torch.nn as nn from transformers import BertModel, BertPreTrainedMo
西西嘛呦
2021/03/17
9670
训练你自己的自然语言处理深度学习模型,Bert预训练模型下游任务训练:情感二分类
更直观来看:我们的自然语言是用各种文字表示的,经过编码器,以及特征提取就可以变为计算机能理解的语言了
Nowl
2024/01/18
2680
训练你自己的自然语言处理深度学习模型,Bert预训练模型下游任务训练:情感二分类
【AICAMP —— Pytorch】看完就去搭网络!
张量和Numpy中ndarrays的概念很相似,有了这个作为基础,张量也可以被运行在GPU上来加速计算,下面直接可以感受下张量的创建与Numpy有什么样的区别。
灿视学长
2021/05/28
9420
Paddle 基于预训练模型 ERNIE-Gram 实现语义匹配
项目介绍 项目链接:https://aistudio.baidu.com/aistudio/projectdetail/2029701 单机多卡训练参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/02_paddle2.0_develop/06_device_cn.html 支持 star PaddleNLP github https://github.com/PaddlePaddle/PaddleNLP
Michael阿明
2021/09/06
6300
CCF BDCI 剧本角色情感识别:多目标学习开源方案
剧本角色情感识别 比赛链接:https://www.datafountain.cn/competitions/518
致Great
2021/11/24
7180
CCF BDCI 剧本角色情感识别:多目标学习开源方案
torch06:ResNet--Cifar识别和自己数据集
(2)定义训练数据,加餐部分是使用自己的数据集:(可参考:https://blog.csdn.net/u014365862/article/details/80506147)
MachineLP
2019/05/26
6850
点亮BERT:3个步骤进行NLP迁移学习
BERT可能是最流行的NLP迁移学习方法。Huggingface的实现提供了许多不错的功能,并在漂亮的API之后抽象了细节。
代码医生工作室
2019/11/29
1.7K0
Transformers 4.37 中文文档(八十五)
CLIPSeg 模型是由 Timo Lüddecke 和 Alexander Ecker 在使用文本和图像提示进行图像分割中提出的。CLIPSeg 在冻结的 CLIP 模型之上添加了一个最小的解码器,用于零样本和一样本图像分割。
ApacheCN_飞龙
2024/06/26
3440
Transformers 4.37 中文文档(八十五)
使用BERT进行文本分类
准备数据阶段主要需要用到的是datasets.Dataset 和transformers.AutoTokenizer。
lyhue1991
2023/09/05
7310
使用BERT进行文本分类
你还弄不清xxxForCausalLM和xxxForConditionalGeneration吗?
大语言模型目前一发不可收拾,在使用的时候经常会看到transformers库的踪影,其中xxxCausalLM和xxxForConditionalGeneration会经常出现在我们的视野中,接下来我们就来聊聊transformers库中的一些基本任务。
西西嘛呦
2023/04/27
1.5K0
【AI 进阶笔记】单阶多层检测器:SSD
在咱们的日常生活中,找东西有时也是个“高难度操作”。比如,当你急着找手机时,总会翻箱倒柜;同样,计算机在海量图片中寻找目标也需要聪明的算法。SSD(Single Shot MultiBox Detector)就是这样一个能够“一次过”完成目标定位与分类的高效检测器。它的出现让目标检测的速度和精度都得到了大幅提升,简直就像神探夏洛克一次扫视就能锁定罪犯!而且,相比于两阶段检测器,它省去了繁琐的候选区域生成过程,直接“抛砖引玉”,一举将所有目标同时搞定。
繁依Fanyi
2025/04/01
1470
PyTorch 实现 ResNet34 分类(数据cifar10)「建议收藏」
又到整理的时候了,这次参考torchvision里面的resnet34源代码,自己修改了一下,实现cifar10数据集的分类任务。
全栈程序员站长
2022/11/09
7660
PyTorch 实现 ResNet34 分类(数据cifar10)「建议收藏」
【RLHF】想训练ChatGPT?得先弄明白Reward Model怎么训(附源码)
在上一篇文章中,我们已经讲解了如何将强化学习(Reinforcement Learning)和语言模型(Language Model)做结合:
汀丶人工智能
2023/10/11
2K0
【RLHF】想训练ChatGPT?得先弄明白Reward Model怎么训(附源码)
Transformers 4.37 中文文档(三十八)
GPTBigCode 模型是由 BigCode 在SantaCoder: don’t reach for the stars!中提出的。列出的作者包括:Loubna Ben Allal、Raymond Li、Denis Kocetkov、Chenghao Mou、Christopher Akiki、Carlos Munoz Ferrandis、Niklas Muennighoff、Mayank Mishra、Alex Gu、Manan Dey、Logesh Kumar Umapathi、Carolyn Jane Anderson、Yangtian Zi、Joel Lamy Poirier、Hailey Schoelkopf、Sergey Troshin、Dmitry Abulkhanov、Manuel Romero、Michael Lappert、Francesco De Toni、Bernardo García del Río、Qian Liu、Shamik Bose、Urvashi Bhattacharyya、Terry Yue Zhuo、Ian Yu、Paulo Villegas、Marco Zocca、Sourab Mangrulkar、David Lansky、Huu Nguyen、Danish Contractor、Luis Villa、Jia Li、Dzmitry Bahdanau、Yacine Jernite、Sean Hughes、Daniel Fried、Arjun Guha、Harm de Vries、Leandro von Werra。
ApacheCN_飞龙
2024/06/26
5030
Transformers 4.37 中文文档(三十八)
从各大顶会看对比学习在句子表征研究进展
EMNLP2021,简单方法大能量,即仅将标准dropout用作噪声在对比目标中进行预测。
NewBeeNLP
2022/06/06
6690
从各大顶会看对比学习在句子表征研究进展
推荐阅读
相关推荐
PyTorch使用Tricks:Dropout,R-Dropout和Multi-Sample Dropout等 !!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验