点击上方“视学算法”,选择加"星标"或“置顶

重磅干货,第一时间送达

作者 | Sean Benhur J

编译 | ronghuaiyang

转自 | AI公园

使用SAM(锐度感知最小化),优化到损失的最平坦的最小值的地方,增强泛化能力。

论文:https://arxiv.org/pdf/2010.01412.pdf

代码:https://github.com/moskomule/sam.pytorch

动机来自先前的工作,在此基础上,我们提出了一种新的、有效的方法来同时减小损失值和损失的锐度。具体来说,在我们的处理过程中,进行锐度感知最小化(SAM),在领域内寻找具有均匀的低损失值的参数。这个公式产生了一个最小-最大优化问题,在这个问题上梯度下降可以有效地执行。我们提出的实证结果表明,SAM在各种基准数据集上都改善了的模型泛化。

在深度学习中,我们使用SGD/Adam等优化算法在我们的模型中实现收敛,从而找到全局最小值,即训练数据集中损失较低的点。但等几种研究表明,许多网络可以很容易地记住训练数据并有能力随时overfit,为了防止这个问题,增强泛化能力,谷歌研究人员发表了一篇新论文叫做Sharpness Awareness Minimization,在CIFAR10上以及其他的数据集上达到了最先进的结果。

在本文中,我们将看看为什么SAM可以实现更好的泛化,以及我们如何在Pytorch中实现SAM。

SAM的原理是什么?

在梯度下降或任何其他优化算法中,我们的目标是找到一个具有低损失值的参数。但是,与其他常规的优化方法相比,SAM实现了更好的泛化,它将重点放在领域内寻找具有均匀的低损失值的参数(而不是只有参数本身具有低损失值)上。

由于计算邻域参数而不是计算单个参数,损失超平面比其他优化方法更平坦,这反过来增强了模型的泛化。

(左))用SGD训练的ResNet收敛到的一个尖锐的最小值。(右)用SAM训练的相同的ResNet收敛到的一个平坦的最小值。

注意:SAM不是一个新的优化器,它与其他常见的优化器一起使用,比如SGD/Adam。

在Pytorch中实现SAM

在Pytorch中实现SAM非常简单和直接

import torchclass SAM(torch.optim.Optimizer):def __init__(self, params, base_optimizer, rho=0.05, **kwargs):assert rho >= 0.0, f"Invalid rho, should be non-negative: {rho}"defaults = dict(rho=rho, **kwargs)super(SAM, self).__init__(params, defaults)self.base_optimizer = base_optimizer(self.param_groups, **kwargs)self.param_groups = self.base_optimizer.param_groups@torch.no_grad()def first_step(self, zero_grad=False):grad_norm = self._grad_norm()for group in self.param_groups:scale = group["rho"] / (grad_norm + 1e-12)for p in group["params"]:if p.grad is None: continuee_w = p.grad * scale.to(p)p.add_(e_w)  # climb to the local maximum "w + e(w)"self.state[p]["e_w"] = e_wif zero_grad: self.zero_grad()@torch.no_grad()def second_step(self, zero_grad=False):for group in self.param_groups:for p in group["params"]:if p.grad is None: continuep.sub_(self.state[p]["e_w"])  # get back to "w" from "w + e(w)"self.base_optimizer.step()  # do the actual "sharpness-aware" updateif zero_grad: self.zero_grad()def _grad_norm(self):shared_device = self.param_groups[0]["params"][0].device  # put everything on the same device, in case of model parallelismnorm = torch.norm(torch.stack([p.grad.norm(p=2).to(shared_device)for group in self.param_groups for p in group["params"]if p.grad is not None]),p=2)return norm

代码取自非官方的Pytorch实现。

代码解释:

  • 首先,我们从Pytorch继承优化器类来创建一个优化器,尽管SAM不是一个新的优化器,而是在需要继承该类的每一步更新梯度(在基础优化器的帮助下)。

  • 该类接受模型参数、基本优化器和rho, rho是计算最大损失的邻域大小。

  • 在进行下一步之前,让我们先看看文中提到的伪代码,它将帮助我们在没有数学的情况下理解上述代码。

  • 正如我们在计算第一次反向传递后的伪代码中看到的,我们计算epsilon并将其添加到参数中,这些步骤是在上述python代码的方法first_step中实现的。

  • 现在在计算了第一步之后,我们必须回到之前的权重来计算基础优化器的实际步骤,这些步骤在函数second_step中实现。

  • 函数_grad_norm用于返回矩阵向量的norm,即伪代码的第10行

  • 在构建这个类后,你可以简单地使用它为你的深度学习项目通过以下的训练函数片段。

from sam import SAM
...model = YourModel()
base_optimizer = torch.optim.SGD  # define an optimizer for the "sharpness-aware" update
optimizer = SAM(model.parameters(), base_optimizer, lr=0.1, momentum=0.9)
...for input, output in data:# first forward-backward passloss = loss_function(output, model(input))  # use this loss for any training statisticsloss.backward()optimizer.first_step(zero_grad=True)# second forward-backward passloss_function(output, model(input)).backward()  # make sure to do a full forward passoptimizer.second_step(zero_grad=True)
...

总结

虽然SAM的泛化效果较好,但是这种方法的主要缺点是,由于前后两次计算锐度感知梯度,需要花费两倍的训练时间。除此之外,SAM还在最近发布的NFNETS上证明了它的效果,这是ImageNet目前的最高水平,在未来,我们可以期待越来越多的论文利用这一技术来实现更好的泛化。

英文原文:https://pub.towardsai.net/we-dont-need-to-worry-about-overfitting-anymore-9fb31a154c81

点个在看 paper不断!

再也不用担心过拟合的问题了相关推荐

  1. gm怎么刷东西 rust_刷了这种黑板漆再也不用担心吃粉笔灰了

    刷了这种黑板漆再也不用担心吃粉笔灰了 黑板漆正在越来越多的被人们使用,黑板墙很酷很实用,可以用在家里的各个地方,不仅仅是墙面.很多人想要,但又担心实际用起来会有各种问题,被提及最多的就是粉笔灰的问题啦 ...

  2. word公式插件_再也不用担心我的公式写不出来了:一款公式输入神器实测

    → → https://mp.weixin.qq.com/s/gNRWdN-W4_Eb2MyyTpWzjw关注微信公众号:人工智能前沿讲习,重磅干货,第一时间送达 本文推荐一个公式输入神器,只要截图就 ...

  3. 充电电流用软件测试准吗,实验:1A与2.1A对手机充电电流一样的,小伙伴再也不用担心咯...

    新福克斯舒适,USB在手套箱(不方便啊,郁闷),插U盘放MP3, 一个行车记录仪,插在点烟器里,平时没事也够用, 要跑一次长途,用iPhone 5C高德导航,靠,问题来,没方充电,郁闷啊! 在 ...

  4. git for windows_手把手教会舍友玩 Git (包教包会,再也不用担心他的学习)

    作 者: BWH_Steven 原文链接:https://www.cnblogs.com/ideal-20/p/13644420.html 舍友长大想当程序员,我和他爷爷奶奶都可高兴了,写他最喜欢的喜 ...

  5. rm: 无法删除swap: 不允许的操作_safe-rm老板再也不用担心我删库跑路啦[视频]

    saferm 老板再不怕我删库跑路https://www.zhihu.com/video/1177717527541731328 在 linux 上,使用 rm 是一件非常危险的事情(最近又有朋友遇到 ...

  6. 不知道工作组名称怎样加入_剩米饭不知道怎样做?试试泡菜炒饭,再也不用担心米饭做多了...

    剩米饭不知道怎样做?试试泡菜炒饭,再也不用担心米饭做多了 东北的朋友这几天连续经历了春天,初夏和冬天,甚至在一天中看到了雪.雨和冰雹.这变化莫测的天气让大家一时间慌了神,不知到底要穿些什么.由于楼上都 ...

  7. python实现抢劵_用Python实现微信自动化抢红包,再也不用担心抢不到红包了

    1. 概述 刚刚收到了两个消息,一个好消息,一个坏消息. 先说好消息,好消息就是微信群里有人要发红包,开心~ 不过转念一想,前几次的红包一个都没抢到,这次???不由自主的叹了一口气 ... 过了一会, ...

  8. 妈妈再也不用担心别人问我是否真正用过redis了

    1. Memcache与Redis的区别 1.1. 存储方式不同 1.2. 数据支持类型 1.3. 使用底层模型不同 2. Redis支持的数据类型 3. Redis的回收策略 4. Redis小命令 ...

  9. 请检查captcha表格_【分享】工程资料这样写,再也不用担心检查组来检查资料了...

    活儿都干完了,碰到检查组来检查资料,啥?您说整齐的资料里有问题,这可如何是好? 不急,协会君为你整理了一份秘籍,请收好! 施工资料最常出错点1.施工资料管理要求不统一 主要体现在资料表格形式的不统一及 ...

最新文章

  1. [Mac] mac linux 多线程下载利器 axel
  2. 一次被僵尸网络病毒攻击的过程
  3. 流网络的最小割问题c语言,「网络流24题」最小路径覆盖问题
  4. java中function_Java 8:java.util.function中的TriFunction(和亲属)在哪里?还是有什么选择?...
  5. 第11章:项目风险管理—章节重点
  6. php 将查询出的数组数据存入redis
  7. 基于Citus和ASP.NET Core开发多租户应用
  8. java 不能同时修改一条记录_【免费毕设】JAVA+SQL离散数学题库管理系统(源代码+论文+外文翻译)...
  9. Java继承知识之基本控制语句(if、switch与穿透现象)
  10. 自定义 Web 服务器控件
  11. Sell yourself 1
  12. nvidia-smi 重置GPU
  13. 支持向量积【SVM】
  14. 别以透明的名义降低人工智能的能力
  15. java中的g1_G1GC 概念与性能调优
  16. linux fstab错误无法启动,Linux 系统 fstab错误导致系统无法启动的修复
  17. vmwareshanch删除快照以及删除快照时卡住的解决办法
  18. 讨论下2018年的北京房市(长文慎入)
  19. android夜间模式监控
  20. 目标网站https://music.163.com/discover/toplist

热门文章

  1. 【怎样写代码】工厂三兄弟之抽象工厂模式(一):问题案例
  2. 【Codeforces】808D Array Division(前后两部分和相等)
  3. 快速上手微软 “群策 MARO” 平台,打造简易的共享单车场景
  4. 邢波出任全球第一所AI大学校长,履历横跨三门学科
  5. 量子计算与AI“双拳”出击,他们锁定38种潜在抗疫药物
  6. 如何用知识图谱挖掘商业数据背后的宝藏?
  7. Python打造最强表白程序
  8. 印度小哥“神剑”:PDF提取表格so easy!
  9. 南开大学提出最新边缘检测与图像分割算法,精度刷新记录(附开源地址)
  10. AI一分钟 | 谷歌或发布Home Hub;特斯拉数周内五名高管离职