复现实验难以达到论文中精度的方法

复现论文实验时经常遇到精度差距,本文探讨了影响因素,如参数优化、网络结构改进和训练调优。建议包括使用更大batch size、16位浮点训练、调整学习率策略、优化ResNet结构、应用label smoothing和知识蒸馏等方法,以提高复现实验的精度。
摘要由CSDN通过智能技术生成

复现论文实验一直是一大难题,或者说复现实验达到论文中精度是一大难题。绝大部分时候我们很难复现到媲美原文的精度,这很大原因是神经网络的参数众多,优化技巧众多,参数初始化等一些列问题,一般论文中对不会对小细节的处理进行描述或者他们有着一些不为人知的“trick”,所以我们很多时候我们达不到他们的实验效果。

之前我曾尝试复现几篇论文的实验,花了很大力气总算搞出来的,但是结果实验结果与原文中精度总有2-3%左右的差距。由于原文没开源代码,按照他论文来所描述的来写代码,难以发现自己哪里出问题了,后来就放弃了。

最近看到一篇有关网络优化的文章,感觉挺有用的,对复现实验代码比较有用,所以写下来了。

一、加快模型训练
主要有两块内容:一块是选用更大的batch size,另一块是采用16位浮点型进行训练。
选用更大的batch size能够在整体上加快模型的训练,但是一般而言如果只增大batch size,效果不会太理想,这部分目前有比较多的研究论文,比如Facebook的这篇:Accurate, Large Minibatch SGD:Training ImageNet in 1 Hour,作者也总结了主要的几个解决方案。

  1. 增大学习率,因为更大的batch size意味着基于每个batch数据计算得到的梯度更加贴近整个数据集(数学上来讲就是方差更小),因此当更新方向更加准确后,迈的步子也可以更大了,一般而言将batch size修改为原来的几倍,那么初始学习率也需要修改为原来的几倍。
  2. 用一个小的学习率先训几个epoch(warmup) 。因为网络的参数是随机初始化的,假如一开始就采用较大的学习率容易出现数值不稳定,这是使用warmup的原因。等到训练过程基本稳定了就可以使用原先设定的初始学习率进行训练了。作者在实现warmup的过程中采用线性增加的策略,举例而言,假设warmup阶段的初始学习率是0,warmup阶段共需要训练m个batch的数据(实现中m个batch共5个epoch),假设训练阶段的初始学习率是L,那么在batch i的学习率就设置为i*L/m。
  3. 每个残差块的最后一个BN层的γ参数初始化为0,我们知道BN层的γ、β参数是用来对标准化后的输入做线性变换的,也就是γx^+β,一般γ参数都会初始化为1,作者认为初始化为0更有利于模型的训练。
  4. 不对bias参数执行weight decay操作,weight decay主要的作用就是通过对网络层的参数(包括weight和bias)做约束(L2正则化会使得网络层的参数更加平滑)达到减少模型过拟合的效果。

采用低精度(16位浮点型)训练是从数值层面来做加速。一般而言现在大部分的深度学习网络的输入、网络参数、网络输出都采用32位浮点型,现在随着GPU的迭代更新(比如V100支持16为浮点型的模型训练),如果能使用16位浮点型参数进行训练,就可以大大加快模型的训练速度,这是作者加速训练最主要的措施,不过目前来看应该只有V100才能支持这样的训练。

二、优化网络结构部分

这部分的优化是以ResNet为例的,Figure1是ResNet网络的结构示意图,简单而言是一个input stem结构、4个stage和1个output部分,input stem和每个stage的内容在第二列展示,每个residual block的结构在第三列展示,整体而言这个图画得非常清晰了。

在这里插入图片描述
关于residual block的改进可以参考Figure2,主要有3点。

  1. ResNet-B,改进部分就是将stage中做downsample的residual block的downsample操作从第一个11卷积层换成第二个33卷积层,如果downsample操作放在stride为2的11卷积层,那么就会丢失较多特征信息(默认是缩减为1/4),可以理解为有3/4的特征点都没有参与计算,而将downsample操作放在33卷积层则能够减少这种损失,因为即便stride设置为2,但是卷积核尺寸够大,因此可以覆盖特征图上几乎所有的位置。
  2. ResNet-C,改进部分就是将Figure1中input stem部分的77卷积层用3个33卷积层替换。这部分借鉴了Inception v2的思想,主要的考虑是计算量,毕竟大尺寸卷积核带来的计算量要比小尺寸卷积核多不少,不过读者如果仔细计算下会发现ResNet-C中3个33卷积层的计算量并不比原来的少,这也是Table5中ResNet-C的FLOPs反而增加的原因。
  3. ResNet-D,改进部分是将stage部分做downsample的residual block的支路从stride为2的11卷积层换成stride为1的卷积层,并在前面添加一个池化层用来做downsample。这部分我个人理解是虽然池化层也会丢失信息,但至少是经过选择(比如这里是均值操作)后再丢失冗余信息,相比stride设置为2的1*1卷积层要好一些。

在这里插入图片描述

三、模型训练调优部分
主要4个调优技巧:

  1. 学习率衰减策略采用cosine函数,这部分的实验结果对比可以参考Figure3,其中(a)是cosine decay和step decay的示意图,step decay是目前比较常用的学习率衰减方式,表示训练到指定epoch时才衰减学习率。(b)是2种学习率衰减策略在效果上的对比。
### 回答1: 漏洞复现实验可以帮助安全研究人员更好地理解和发现软件或系统的漏洞,提高安全意识和技能。通过复现漏洞,可以深入了解漏洞利用的具体过程和原理,掌握相应的漏洞挖掘技术和防御策略。此外,漏洞复现实验还可以帮助安全厂商验证补丁的有效性,为用户提供更加可靠的安全保障。最重要的是,漏洞复现实验可以帮助组织和企业发现和修复漏洞,保护其信息资产和业务安全。 ### 回答2: 漏洞复现实验是指通过模拟攻击者的行为和技术手段,验证某个已被发现的漏洞的存在和危害性,并进一步分析其原理和可能的攻击方法。这项工作具有以下重要的意义: 1. 确认漏洞的存在:通过漏洞复现实验,可以验证该漏洞是否真实存在,从而提高漏洞的可信度。漏洞的复现能够让安全研究人员进一步理解其产生的原因和影响范围,为修复和防御提供基础。 2. 评估漏洞的危害性:漏洞复现实验可以模拟攻击者对系统的实际攻击行为,分析漏洞可能造成的危害和后果。通过评估漏洞的危害性,可以帮助安全研究人员、开发者和管理员判断漏洞的优先级和紧急程度,以优先修复高危漏洞并加强防护措施。 3. 探索漏洞背后的原理与机制:漏洞复现实验可以帮助安全研究人员深入研究漏洞的原理与机制,从而更好地理解其工作原理和攻击方式。对漏洞的深入研究有助于提高对未知漏洞的识别和防御能力,并为安全技术的发展提供宝贵的经验。 4. 验证漏洞修复效果:漏洞复现实验可以验证修复措施的有效性,并避免在未经验证的情况下误认为漏洞已修复。通过对漏洞的反复复现实验,可以确保系统的安全性得到可靠的提升。 综上所述,漏洞复现实验具有重要的意义,可以增强对漏洞的认识和理解,提高系统的安全性,为漏洞修复和防御策略的制定提供参考和指导。 ### 回答3: 漏洞复现实验是指通过模拟实际环境,重现已知漏洞并验证其可利用性。它具有以下几个意义: 1. 发现隐藏的漏洞:漏洞复现实验有助于揭示潜在的安全隐患,通过模拟攻击者对系统进行测试,可以发现之前未被发现的漏洞。这可以帮助组织及时修复漏洞,保护系统的安全性。 2. 检验补丁效果:当漏洞被发现并披露后,漏洞复现实验可以用于验证补丁的效果。这有助于确保补丁修复了漏洞并不会引入其他安全问题。 3. 提供安全教育与意识:漏洞复现实验能够帮助安全团队和开发人员更好地了解漏洞的原理和攻击方式,增强他们对系统安全的重视和意识。通过研究漏洞复现实验的结果,团队可以学习到攻击者可能采取的方法和技巧,提高预防和应对攻击的能力。 4. 攻击模拟与演练:漏洞复现实验可以作为攻击模拟与演练的一种形式,帮助组织评估其安全防护能力和应急响应机制。通过模拟攻击,团队可以发现存在的安全问题,并及时采取措施进行应对,以确保系统的持续运行和数据的保护。 总之,漏洞复现实验在发现漏洞、验证补丁、提高安全意识和应对威胁方面都具有重要意义。它不仅对个体系统的安全有利,也有助于提高整个网络环境的安全性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值