细数一行代码改变结局的炼丹骚操作

文 | 陀飞轮&圈圈&年年的铲屎官

源 | 知乎


tips总结

知乎答主:陀飞轮

谈一下自己知道的。尽量避开优化器、激活函数、数据增强等改进。。先上完整列表:

Deep Learning: Cyclic LR、Flooding

Image classification: ResNet、GN、Label Smoothing、ShuffleNet

Object Detection: Soft-NMS、Focal Loss、GIOU、OHEM

Instance Segmentation: PointRend

Domain Adaptation: BNM

GAN: Wasserstein GAN

Deep Learning

Standard LR -> Cyclic LR

SNAPSHOT ENSEMBLES: TRAIN 1, GET M FOR FREE

每隔一段时间重启学习率,这样在单位时间内能收敛到多个局部最小值,可以得到很多个模型做集成。

#CYCLE=8000, LR_INIT=0.1, LR_MIN=0.001
scheduler = lambda x:
((LR_INIT-LR_MIN)/2)*(np.cos(PI*(np.mod(x-1,CYCLE)/(CYCLE)))+1)+LR_MIN

Without Flooding -> With Flooding

Do We Need Zero Training Loss After Achieving Zero Training Error?

Flooding方法:当training loss大于一个阈值时,进行正常的梯度下降;当training loss低于阈值时,会反过来进行梯度上升,让training loss保持在一个阈值附近,让模型持续进行“random walk”,并期望模型能被优化到一个平坦的损失区域,这样发现test loss进行了double decent!

flood = (loss - b).abs() + b


Image classification

VGGNet -> ResNet

Deep Residual Learning for Image Recognition

ResNet相比于VGGNet多了一个skip connect,网络优化变的更加容易

H(x) = F(x) + x

BN -> GN

Group Normalization

在小batch size下BN掉点严重,而GN更加鲁棒,性能稳定。

x = x.view(N, G, -1)
mean, var = x.mean(-1, keepdim=True), x.var(-1, keepdim=True)
x = (x - mean) / (var + self.eps).sqrt()
x = x.view(N, C, H, W)

Hard Label -> Label Smoothing

Bag of Tricks for Image Classification with Convolutional Neural Networks

label smoothing将hard label转变成soft label,使网络优化更加平滑。

targets = (1 - label_smooth) * targets + label_smooth / num_classes

MobileNet -> ShuffleNet

ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

将组卷积的输出feature map的通道顺序打乱,增加不同组feature map的信息交互。

channels_per_group = num_channels // groups
x = x.view(batch_size, groups, channels_per_group, height, width)
x = torch.transpose(x, 1, 2).contiguous()
x = x.view(batch_size, -1, height, width)


Object Detection

NMS -> Soft-NMS

Improving Object Detection With One Line of Code

Soft-NMS将重叠率大于设定阈值的框分类置信度降低,而不是直接置为0,可以增加召回率。

#以线性降低分类置信度为例
if iou > threshold:weight = 1 - iou

CE Loss -> Focal Loss

Focal Loss for Dense Object Detection

Focal loss对CE loss增加了一个调制系数来降低容易样本的权重值,使得训练过程更加关注困难样本。

loss = -np.log(p) # 原始交叉熵损失, p是模型预测的真实类别的概率,
loss = (1-p)**GAMMA * loss # GAMMA是调制系数

IOU -> GIOU

Generalized Interp over Union: A Metric and A Loss for Bounding Box Regression

GIOU loss避免了IOU loss中两个bbox不重合时Loss为0的情况,解决了IOU loss对物体大小敏感的问题。

#area_C闭包面积,add_area并集面积
end_area = (area_C - add_area)/area_C    #闭包区域中不属于两个框的区域占闭包区域的比重
giou = iou - end_area

Hard Negative Mining -> OHEM

Training Region-based Object Detectors with Online Hard Example Mining

OHEM通过选择损失较大的候选ROI进行梯度更新解决类别不平衡问题。

#只对难样本产生的loss更新
index = torch.argsort(loss.sum(1))[int(num * ohem_rate):]
loss = loss[index, :]


Instance Segmentation

Mask R-CNN -> PointRend

PointRend: Image Segmentation as Rendering

每次从粗粒度预测出来的mask中选择TopN个最不确定的位置进行细粒度预测,以非常的少的计算代价下获得巨大的性能提升。

points = sampling_points(out, x.shape[-1] // 16, self.k, self.beta)
coarse = point_sample(out, points, align_corners=False)
fine = point_sample(res2, points, align_corners=False)
feature_representation = torch.cat([coarse, fine], dim=1)

Domain Adaptation

EntMin -> BNM

Towards Discriminability and Diversity: Batch Nuclear-norm Maximization under Label Insufficient Situations

类别预测的判别性与多样性同时指向矩阵的核范数,可以通过最大化矩阵核范数(BNM)来提升预测的性能。

L_BNM = -torch.norm(X,'nuc')


GAN

GAN -> Wasserstein GAN

Wasserstein GAN

WGAN引入了Wasserstein距离,既解决了GAN训练不稳定的问题,也提供了一个可靠的训练进程指标,而且该指标确实与生成样本的质量高度相关。

Wasserstein GAN相比GAN只改了四点:
判别器最后一层去掉sigmoid
生成器和判别器的loss不取对数
每次更新把判别器参数的绝对值按阈值截断
使用RMSProp或者SGD优化器

知乎答主:圈圈

  1. relu:用极简的方式实现非线性激活,还缓解了梯度消失
    x = max(x, 0)

  2. normalization:提高网络训练稳定性
    x = (x - x.mean()) / x.std()

  3. gradient clipping:直击靶心 避免梯度爆炸
    hhhgrad [grad > THRESHOLD] = THRESHOLD # THRESHOLD是设定的最大梯度阈值

  4. dropout:随机丢弃,抑制过拟合,提高模型鲁棒性
    x = torch.nn.functional.dropout(x, p=p, training=training) # 哈哈哈调皮了,因为实际dropout还有很多其他操作,不够仅丢弃这一步确实可以一行搞定
    x = x * np.random.binomial(n=1, p=p, size=x.shape) # 这里p是想保留的概率,上面那是丢弃的概率

  5. skip connection(residual learning):提供恒等映射的能力,保证模型不会因网络变深而退化
    F(x) = F(x) + x

  6. focal loss:用预测概率对不同类别的loss进行加权,缓解类别不平衡问题
    loss = -np.log(p) # 原始交叉熵损失, p是模型预测的真实类别的概率
    loss = (1-p)**GAMMA * loss # GAMMA是调制系数

  7. attention mechanism:用query和原始特征的相似度对原始特征进行加权,关注想要的信息
    attn = torch.softmax(torch.matmul(q, k), dim) #用Transformer里KQV那套范式为例
    v = torch.matmul(attn, v)

  8. subword embedding(char或char ngram):基本解决OOV(out of vocabulary)问题、分词问题。这个对encode应该比较有效,但对decode不太友好
    x = [char for char in sentence] # char-level

知乎答主:年年的铲屎官

  1. 只改1行代码,bleu提高2个点。用pytorch的时候,计算loss,使用最多的是label_smoothed_cross_encropy或者cross_encropy,推荐把设置reduction为'sum',效果可能会比默认的reduction='mean'好一些(我自己的尝试是可以提高2个BLEU左右),以最常用的cross_entropy为例:
    from torch import nn self.criterion = nn.CrossEntropyLoss(ignore_index=pad_id) # reduction默认为'mean'
    改为:
    from torch import nn self.criterion = nn.CrossEntropyLoss( ignore_index=pad_id, reduction='sum')
    发生的变化,实际上就是计算一个sequence的所有token,其loss是否平均(字不好看,请见谅~):

    我的理解(不对请轻喷),这个trick之所以在一些任务中有用,是因为其在多任务学习中平衡了不同的loss的权重,至少在我自己做的image caption任务中看到的结果是这样的。

  2. beam search添加length_penalty
    这一点多亏 @高一帆 的提醒,解码阶段,如果beam search不加任何约束,那么很容易导致生成的最终序列长度偏短,效果可能还不如greedy search。原因的话就是beam size大于1,比较容易在不同的beam中生成较短的序列,且短序列得分往往比长序列高。举个例子的话请看下图(假设beam size为2):

    那么我们需要对较短的序列进行惩罚,我们只需一行代码就可以改善这个问题:
    # 假设原始生成序列的最终累积得分为accumulate_score,length_penalty是超参数,默认为1 accumulate_score /= num_tokens ** length_penalty

  3. 假设encoder输出为encoder_out,是一个tensor(比如一个768的embedding,而非一组embedding),那么我们喂给rnn的输入,input除了上一步的  , 拼接上encoder_out,效果会涨不少。即:

    我自己的实验,每一个timestep给rnn的输入都拼接encoderout,bleu提高3个点(数据量4万)。

  4. 针对多层rnn,比如多层lstm,input feeding也是一个能提高模型表现的trick。就是lstm的第一层,其输入除了前一时刻的输出,还有最高一层前一时刻的隐状态  ,用图来表示就是:
    变为:



表现在代码上,就是:
input = torch.cat((y[t-1], hiddens[t-1]), dim=1) # 原始的只有y[t-1]

后台回复关键词【入群

加入卖萌屋NLP/IR/Rec与求职讨论群

有顶会审稿人、大厂研究员、知乎大V和妹纸

等你来撩哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐收藏 | 美团技术团队的书单

4月23日对于世界文学而言是一个具有象征性意义的日子。1616年的这一天,塞万提斯、莎士比亚、印卡加西拉索德拉维加几位大师相继与世长辞。此外,这一天也是其他一些著名作家的出生和去世的日期,例如:莫里斯德吕翁、哈尔多尔K拉克斯…

论文浅尝 | 采用多层注意力机制的事件检测

笔记整理:杨帆,浙江大学计算机学院硕士,研究方向知识图谱。动机事件编码(event encoding)之前的工作集中在提取实体,检测触发单词以及匹配预定义的模板,这些方法存在以下缺点:首先它…

无需人工!无需训练!构建知识图谱 BERT一下就行了!

文:Sherry今天给大家带来的是一篇号称可以自动建立知识图谱的文章《Language Models are Open Knowledge Graphs》,文中提出了一个叫Match and Map(MAMA)的模型,无需人工!无需训练!只需语料和预…

LeetCode 557. 反转字符串中的单词 III(栈)

文章目录1. 题目信息2. 解题2.1 栈2.2 STL reverse()1. 题目信息 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例 1:输入: "Lets take LeetCode contest" 输出: "steL ekat edoCteeL tse…

美团OCTO万亿级数据中心计算引擎技术解析

美团点评自研的 OCTO 数据中心(简称 Watt)日均处理万亿级数据量,该系统具备较好的扩展能力及实时性,千台实例集群周运维成本低于10分钟。本文将详细阐述 Watt 计算引擎的演进历程及架构设计,同时详细介绍其全面提升计算…

中文实体命名识别工具使用汇总:Stanza、LAC、Ltp、Hanlp、foolnltk、NLTK、BosonNLP

实体命名识别相关知识Stanford CoreNLP 命名实体识别一、简介:二、java版本使用三、python版本使用NLTK 命名实体识别一、简介:二、搭建环境三、nltk使用1、英文实体命名初体验2、使用nltk来处理中文资料结巴分词使用foolnltk 命名实体识别一、简介二、p…

论文浅尝 | 基于知识图谱中图卷积神经网络的推荐系统

笔记整理:王若旭,浙江大学在读硕士,研究方向为关系抽取,零样本学习。本文发表于 www2019,参考链接:https://arxiv.org/pdf/1905.04413.pdf为了解决推荐系统中协同过滤方法面对的数据稀疏和冷启动的问题&…

NeurIPS 2020 | Glance and Focus: 通用、高效的神经网络自适应推理框架

文 | rainforest wang源 | 知乎本文主要介绍我们被NeurIPS 2020会议录用的一篇文章:Glance and Focus: a Dynamic Approach to Reducing Spatial Redundancy in Image Classification代码和预训练模型已经在Github上面放出:https://link.zhihu.com/?tar…

如何下载Android源码(非常详细,含自动恢复下载,编译,运行模拟器说明)

今天终于把代码下载完成,特此开一篇博文记录一下。上图: 为了下载这些源码,历时5天5夜,说为什么这么长时间,是因为太容易中断了,有时候下一晚上可能就一直没在下,在你入睡的时候它就自己断了&am…

NumPy快速入门-- Less 基础/线性代数

文章目录1. 广播(Broadcasting)规则2. 使用索引数组索引3. 使用布尔值作为数组索引4. ix_()函数5. 线性代数 简单数组操作6. 技巧和提示6.1 “自动”整形6.2 矢量堆叠1. 广播(Broadcasting)规则 Broadcasting允许通用函数以有意义…

Intel PAUSE指令变化影响到MySQL的性能,该如何解决?

MySQL得益于其开源属性、成熟的商业运作、良好的社区运营以及功能的不断迭代与完善,已经成为互联网关系型数据库的标配。可以说,X86服务器、Linux作为基础设施,跟MySQL一起构建了互联网数据存储服务的基石,三者相辅相成。本文将分…

会议 | CCKS 2019 全国知识图谱与语义计算大会在杭州隆重召开

本文转载自公众号:中国中文信息学会。2019 年全国知识图谱与语义计算大会(CCKS 2019)于 8 月 24 日至 27 日在杭州召开,由中国中文信息学会语言与知识计算专业委员会主办,浙江大学承办。本次会议主题是“知识智能”。大会吸引了来自海内外的八…

Hystrix 简介和使用

Hystrix一、概念二、使用1. 环境搭建2. 服务降级3. 异常熔断4. 自定义异常熔断器5.Hystrix仪表盘监控三、测试1. 异常熔断2. 超时熔断3. 熔断器获得异常4. 异常忽略5. 自定义异常熔断器一、概念 故障蔓延:由于一个服务变慢或没有响应导致大量请求堆积,进…

android中如何使用一张图片适配不同尺寸的APP引导页

在我们平常开发的过程中在做引导页适配的时候,有时候会犯难,怎么样作图可以将各种不同尺寸分辨率的手机都适配好也就是不变形不拉伸,官方给的说法也只是做多套图去适配不同的分辨率,遇到全屏展示引导这种问题的时候就有些力不从心…

还在用Tensorboard?机器学习实验管理平台大盘点

文 | SisyphusBJ源 | Pytorch Lightningwandb.aicomet.mlneptune.aiallegro trainsmlflowguild.aisacredtest-tubetensorboard相信很多同学看到上面这个列表的第一印象是懵的。我们先看下机器学习实验管理平台 到底是做神马滴:一句话概括就是:&#xff0…

论文浅尝 | 利用图 Transformer 实现基于知识图谱的文本生成

论文笔记整理:谭亦鸣,东南大学博士生,研究方向为跨语言知识图谱问答。来源:NAACL2019链接:https://arxiv.org/pdf/1904.02342.pdf本文关注如何从信息抽取结果(特别是知识图谱)出发,生…

LeetCode 230. 二叉搜索树中第K小的元素(中序遍历)

文章目录1. 题目信息2. 解题2.1 中序递归2.2 中序循环写法1. 题目信息 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。 示例 1:输入: root …

Apache Doris在美团外卖数仓中的应用实践

序言 美团外卖数据仓库技术团队负责支撑日常业务运营及分析师的日常分析,由于外卖业务特点带来的数据生产成本较高和查询效率偏低的问题,他们通过引入Apache Doris引擎优化生产方案,实现了低成本生产与高效查询的平衡。并以此分析不同业务场景…

Feign 简介和使用

声明式服务消费Feign一、简介二、使用Feign实现服务消费者三、实现普通的服务提供者四、Feign服务调用测试五、Feign消费者测试负载均衡服务熔断一、简介 Feign是Netflix公司开发的一个声明式的REST调用客户端; Ribbon负载均衡、Hystrix服务熔断是我们Spring Cloud…

论文浅尝 | 面向自动问题生成的跨语言训练

论文笔记整理:谭亦鸣,东南大学博士生,研究方向为跨语言知识图谱问答。来源:ACL 2019链接:https://128.84.21.199/pdf/1906.02525.pdf动机现有问题生成方法需要大量的“文本-问题”有标注数据对作为训练数据集&#xff…