0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么SAM可以实现更好的泛化?如何在Pytorch中实现SAM?

深度学习自然语言处理 来源:AI公园 作者:Sean Benhur J 2021-04-03 14:48 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

动机来自先前的工作,在此基础上,我们提出了一种新的、有效的方法来同时减小损失值和损失的锐度。具体来说,在我们的处理过程中,进行锐度感知最小化(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 torch

class 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: continue

e_w = p.grad * scale.to(p)

p.add_(e_w) # climb to the local maximum “w + e(w)”

self.state[p][“e_w”] = e_w

if 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: continue

p.sub_(self.state[p][“e_w”]) # get back to “w” from “w + e(w)”

self.base_optimizer.step() # do the actual “sharpness-aware” update

if 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 parallelism

norm = 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是计算最大损失的邻域大小。

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

bf4472f8-92a2-11eb-8b86-12bb97331649.jpg

正如我们在计算第一次反向传递后的伪代码中看到的,我们计算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 pass

loss = loss_function(output, model(input)) # use this loss for any training statistics

loss.backward()

optimizer.first_step(zero_grad=True)

# second forward-backward pass

loss_function(output, model(input)).backward() # make sure to do a full forward pass

optimizer.second_step(zero_grad=True)

。。.

总结

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SAM
    SAM
    +关注

    关注

    0

    文章

    116

    浏览量

    34321
  • 深度学习
    +关注

    关注

    73

    文章

    5591

    浏览量

    123923
  • pytorch
    +关注

    关注

    2

    文章

    813

    浏览量

    14712

原文标题:【过拟合】再也不用担心过拟合的问题了

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    水浸超声扫描显微镜(C-SAM)与其他无损检测技术对比分析

    (C-SAM)以其高分辨率与成像清晰度著称,尤其适合对微小缺陷的精确检测。水浸超声扫描显微镜(C-SAM)水浸超声扫描显微镜基于高频超声波在介质的传播特性进行检测。其
    的头像 发表于 12-04 14:08 58次阅读
    水浸超声扫描显微镜(C-<b class='flag-5'>SAM</b>)与其他无损检测技术对比分析

    电缆标签解决方案:标准布线以实现更好的维护

    将详细介绍电缆标签解决方案在标准布线的应用,以及如何通过这些措施实现更好的维护。 电缆标签的重要性 避免连接错误 在复杂的布线环境,电
    的头像 发表于 11-21 10:28 75次阅读

    SAM G55音频开发板技术解析与应用指南

    Microchip Technology SAM G55音频Curiosity开发板(EV78Y10A)是一款用于基于SAM G55微控制器的音频应用的演示和开发平台。SAM G55 MCU是高性能
    的头像 发表于 10-13 15:11 372次阅读
    ‌<b class='flag-5'>SAM</b> G55音频开发板技术解析与应用指南

    SAM9X60-Curiosity评估板:高性能嵌入式开发的理想起点

    优化的MCP16501电源管理IC。它设计用于评估所有SAM9X60 MPU,包括系统级封装 (SIP) 型号和模块系统 (SOM)。
    的头像 发表于 10-13 14:04 437次阅读
    <b class='flag-5'>SAM</b>9X60-Curiosity评估板:高性能嵌入式开发的理想起点

    Microchip SAM9X7 系列:面向高性能嵌入式系统的超低功耗 Arm® MPU

    加速器(SHA、AES和TDES)、防篡改引脚和PUF。MIcrochip提供不同的供应配置,并经过全面测试的电源管理解决方案,遵守产品规范引用的SAM9X70电源排序规范。
    的头像 发表于 10-11 10:44 398次阅读
    Microchip <b class='flag-5'>SAM</b>9X7 系列:面向高性能嵌入式系统的超低功耗 Arm® MPU

    ‌Microchip SAM-IoT Wx v2开发板技术解析与应用指南

    Microchip Technology EV62V87A SAM-IoT WX v2开发板是一款易于扩展的小型硬件平台,用于评估和开发物联网解决方案。该开发板设有基于ATSAMD21G18 Arm
    的头像 发表于 10-10 10:25 285次阅读
    ‌Microchip <b class='flag-5'>SAM</b>-IoT Wx v2开发板技术解析与应用指南

    Microchip SAM9X75:面向高性能嵌入式应用的 Arm926EJ-S MPU

    Microchip Technology SAM9X75 800MHz ARM926 MPU是一款基于CPU的高性能嵌入式处理器。 Microchip Technology SAM9X75 MPU
    的头像 发表于 09-30 15:42 760次阅读
    Microchip <b class='flag-5'>SAM</b>9X75:面向高性能嵌入式应用的 Arm926EJ-S MPU

    Zettabyte任命Sam Lawn为全球首席财务官

    专注于GPU基础设施、AIDC优化软件与Neo-Cloud计算的全栈AI解决方案提供商Zettabyte已任命Sam Lawn为全球首席财务官,该任命即刻生效。
    的头像 发表于 08-30 15:12 1012次阅读

    椭偏仪与DIC系统联用测量半导体超薄图案SAM薄膜厚度与折射率

    高对比度图像指导测量位置,结合改进的椭偏分析模型,实现对图案SAM薄膜厚度与折射率的高精度无损表征。费曼仪器薄膜厚度测量技术贯穿于材料研发、生产监控到终端应用的全流程
    的头像 发表于 08-11 18:02 641次阅读
    椭偏仪与DIC系统联用测量半导体超薄图案<b class='flag-5'>化</b><b class='flag-5'>SAM</b>薄膜厚度与折射率

    超声波T-SAM与C-SAM模式的区别

    本文介绍了超声波的T-SAM与C-SAM两种模式的区别。
    的头像 发表于 05-21 15:26 1207次阅读
    超声波T-<b class='flag-5'>SAM</b>与C-<b class='flag-5'>SAM</b>模式的区别

    何在热敏打印机实现图片的灰阶打印效果吗?

    谁知道如何在热敏打印机实现图片的灰阶打印效果。 现在基本上文字打印,图片打印功能都已开发结束,图片打印现在用的是点阵打印的方法。想增加灰阶打印的效果。 有哪个大神做过相关方面开发,知道如何
    发表于 04-03 08:40

    R&amp;S®SAM100 系统放大器

    RS®SAM100 系统放大器是一种超宽带固态微波放大器,频率范围为 2 GHz 至 20 GHz。RS®SAM100 还适用于替代电子管放大器和由窄带单级放大器组成的多频段组件。 主要特点 超宽
    的头像 发表于 02-06 14:50 518次阅读
    R&amp;S®<b class='flag-5'>SAM</b>100 系统放大器

    SAM IoT Wx v2硬件用户指南

    电子发烧友网站提供《SAM IoT Wx v2硬件用户指南.pdf》资料免费下载
    发表于 01-21 14:02 0次下载
    <b class='flag-5'>SAM</b> IoT Wx v2硬件用户指南

    OpenAI 2025年新品预览:Sam Altman揭晓多项技术创新

    在近期的一次公开活动,OpenAI的首席执行官Sam Altman向全球科技爱好者透露了公司即将在2025年发布的一系列令人期待的技术产品。 据悉,OpenAI将在明年重点推出AGI(通用
    的头像 发表于 12-31 15:22 1063次阅读

    利用Arm Kleidi技术实现PyTorch优化

    Neoverse 平台上的 PyTorch 推理表现。Kleidi 技术可以通过 Arm Compute Library (ACL) 和 KleidiAI 库获取。
    的头像 发表于 12-23 09:19 1635次阅读
    利用Arm Kleidi技术<b class='flag-5'>实现</b><b class='flag-5'>PyTorch</b>优化