如何快速高效的训练ResNet,各种奇技淫巧(六):权值衰减

2024-06-21 09:18

本文主要是介绍如何快速高效的训练ResNet,各种奇技淫巧(六):权值衰减,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:David Page

编译:ronghuaiyang

导读

这个系列介绍了如何在CIFAR10上高效的训练ResNet,这是第六篇,给大家讲解权值衰减的相关内容以及训练中的各种动态。

我们了解到更多的关于权值衰减对训练的影响,并发现了一个与LARS之间意想不到的关系。

其中我们更深入地研究了学习率的动态

读者可能在这一点上感到有点不安。上次我们给出了神经网络训练超参数空间中三个关于平坦方向的实验结果和理论解释,但这三个解释并不完全一致……

第一个解释了当λN固定时,训练轨迹与学习率λ和batch size N的选择有弱依赖。类似的观点应用于动量ρ当λ/(1−ρ)是固定的。两者都依赖于SGD + momentum权值更新方程中的一阶项的简单匹配。

第三个参数,对于权值衰减α,是相当不同的,权值衰减明显不是一阶的。我们认为,对于具有尺度对称性的权重,相对于权重范数的梯度消失,二阶效应,在动态中处于主导。更糟糕的是,我们认为,虽然权重范数与网络的正向计算无关,但它们决定了其他参数的有效学习率。

那么一阶参数呢?当我们适当地考虑权值范数的动态时,它们站得住脚吗?实验结果表明,该结论至少是正确的。

我们今天的主要任务是通过对权值范数的动态的更仔细的研究来支持这两个一阶论点。在这个过程中,我们会发现与最近在ImageNet上的大batch训练中引入的分层自适应速率缩放技术有着密切的关系。我们研究了这种关系的含义,并提出它可能是在不同架构的最优学习率显著稳定的背后的原因。

今天的帖子将比之前的帖子更理论化。它包含方程,没有多少实用的建议。尽管如此,我还是希望它能引起一些兴趣。数学都是高中的内容。从积极的方面来说,它使我们在讨论中比以往更加精确,而且就这一点而言,也比文献中各种各样的讨论更为精确。

与LARS的联系主要是出于好奇,但如果付出更多的努力,它“应该”会导致实际训练的改进。与其等待这些结果,我决定按原样发布这篇文章。这份工作早该完成了,因为今年夏天在Myrtle进行的Thomas Read实习非常富有成效。

让我们从更详细地研究权值衰减时的权值范数的动态开始。在开始讨论方程之前,这里是对上节课的要点的总结。

对于具有尺度对称性的权值——由于后续的batch norm,包括我们网络的所有卷积层——梯度与权值正交。因此,梯度更新导致权值范数增加,而权值衰减导致权值减小。

对于小的权重,增长项占主导地位,反之亦然。这导致了一种稳定的控制机制,即权值范数趋近于一个固定点(对于固定学习率和其他超参数),使得权值衰减的一阶收缩效应平衡了正交梯度更新的二阶增长。

也许一些图片会使这一点更加具体。首先,我们绘制每个卷积层的平方权值范数|w|2在训练的每一步中在权值衰减下收缩的量:

640?wx_fmt=png

接下来我们画出|w|2由于梯度更新而增长的量。这看起来更像是第一个图的嘈杂版本——如果它们处于平衡状态,就应该是这样:

640?wx_fmt=png

下面是两个图的叠加:

640?wx_fmt=png

我们也画出|w|2的演化过程。大多数层的权值范数最初会增长,而梯度更新占主导地位,一旦达到平衡,则会逐渐变平或衰减:

640?wx_fmt=png

画出的图进行了归一化,这样每一层的初始化|w|2=1。

我们把它代入方程,从没有momentum的SGD开始。在上次SGD更新的表示法中,SGD更新分为两部分,一个权值衰减项:

640?wx_fmt=png

然后是梯度更新:

640?wx_fmt=png

对于权值的范数,我们有:

640?wx_fmt=png

并且

640?wx_fmt=png

我们使用权值比例对称这一事实,w⋅g = 0。

我们预计训练将达到一种平衡,第一次更新的收缩效果将与第二次更新的增长相平衡,从而:

640?wx_fmt=png

上次,我们回顾了虽然在w缩放的时候,前向计算是不变的,但是SGD更新不是不变的。实际上,如果我们将w缩放一个因子r,那么梯度g的尺度将会是r-1,而不是不变所需的r。因此,权值归一化很重要,并决定了剩余权值的有效步长。

解决这个问题的一种方法是使用不同的优化器,比如LARS。在缺乏动量的情况下,LARS更新为:

640?wx_fmt=png

通过依赖于batch的因子|w|/|g|对梯度进行缩放,实现尺度的不变性。现在方程(3)告诉我们(对于具有尺度不变性的权值)普通的带权值衰减的SGD会驱动这个依赖于batch的因子变为一个固定的值。

640?wx_fmt=png

如果这个比例真的是由每个batch的平衡值给出的,那么SGD和LARS的动态将等于:

640?wx_fmt=png

在下面的图中,我们比较了在没有动量的SGD条件下进行训练时方程右边的两个量。圆点表示λ|g|/|w|的值,黑线表示√2λα:

640?wx_fmt=png

我们看到,在训练的最后,等式不成立的时候,会有一点噪声和小的偏差,对于SGD和LARS,使用一个非常高效的学习率√(2λα)来进行更新是非常相似的。这有点出乎意料,并回避了LARS在这种情况下正在做什么——也许只是提供一个尺度不变的方法来裁剪有噪声的梯度?

这个线性扩展法则,也就是保持λN固定不变,但是学习率和batch size变化的法则到哪去了?高效的学习率参数在LARS中的动态是√(2λα)。

如果我们以因子n缩放batch size,同时λ以因子√n缩放。这看起来不再是线性的了!

事实上,当batch中的梯度由噪声主导时,这正是我们所需要的——因此,不同时间步长的梯度平均彼此正交。在这种情况下,|g|缩放1/√n(来自n个正交贡献的平均)。将两个√n因子组合起来,这样的话,一次大的batch的更新就和n个小batch的更新是一样的。

注意,上面参数中的两个√n因子来自非常不同的来源。首先,由于模型的“精确”对称,可以追溯到梯度和权重之间的正交性。第二种是后续的batch的梯度是由于SGD噪声而相互正交的结果,需要进行实证验证。

这里有个图,是梯度gt和先前的指数移动平均梯度vt−1之间的图。大多数训练的相关系数都接近于零,证实了附近的梯度之间的平均正交性是一个合理的近似。

640?wx_fmt=png

到目前为止,我们只处理了SGD不带momentum的情况。让我们尽可能简短地总结一下,而不是用另一个冗长的论述来拖延读者。同样,我们需要假设不同batch的梯度的平均是正交的。

SGD + momentum对单个梯度gt在多个时间步上应用更新(使用ρ的指数进行加权)。如果我们能够恢复这些更新然后立即应用它们,然后求和几何级数的效果就等于是简单的把学习率λ替换为λ /(1−ρ)。然后我们可以用这个替换重复上面的平衡论证(记住权值衰减项是用同样的方法求和的),并发现:

640?wx_fmt=png

这个论点的难点如下。考虑普通SGD+momentum的动态。在计算梯度g并应用梯度的延时,后续从其他batch来的梯度添加到w上,可能打破g和w之间的正交性,方程(2′)不再成立。梯度的互正交性发挥了作用,LARS在动量存在时的更新为:

640?wx_fmt=png

我们刚刚看到,在batch之间的梯度尺度不变性和正交性假设下,SGD+momentum的动态驱动|w|/|g|达到(7)给出的平衡值。我们可以将一般SGD+momentum的动态与LARS联系起来:

640?wx_fmt=png

这是右边两个量在训练中的情况,ρ= 0.9:

640?wx_fmt=png

因为我们需要对batch之间的正交梯度进行近似,所以这里的差异比以前稍微大一些。这个假设在纯SGD中还没有使用。尽管如此,SGD+momentum的step和使用学习率√2(λα(1−ρ))是非常相似的,主要区别是后一种情况下的一些梯度剪裁。

我们将所有与单个梯度对应的权重更新组合在一起,并依赖于batch之间梯度的正交性来证明这并不影响权值的范数的动态。上次我们应用类似的论点,是依靠低曲率的损失,说的是训练动态主要取决于λ/(1−ρ)而不是单独的参数。如果我们把这两个参数结合在起来,我们会发现单个梯度g在尺度不变形式下的有效贡献近似为:

640?wx_fmt=png

通过对权值动态的适当处理,验证了上次的结果。

那么,经过这么多的努力,我们学到了什么呢?其中一个教训是,人们应该警惕听起来可信的理论!如果我们有一个对称性的模型和一个不具有不变性的优化器,那么任何忽略动态的的群体行为都应该非常谨慎地对待。

也许更有趣的是,与LARS的联系打开了许多研究问题和学习有用东西的可能性!LARS最近成功的将ImageNet训练扩展到非常大的batch size。考虑到LARS与普通SGD之间存在着密切的权值衰减的关系,了解是什么导致LARS性能优越将是非常有趣的。

只是大的梯度被裁剪掉了吗?或者在训练初期的关键阶段,SGD的权值范数还没有达到平衡?无论哪种方法,方法本身都建议将这两种技术更紧密地结合在一起,并隔离重要的差异。如果早期训练在SGD中存在问题,可以调整权值初始化量表,以消除最初的不平衡阶段。如果梯度噪声是问题的所在,那么对选定的层使用较低的学习率和/或较高的动量可能会有所改善,或者只是平滑批次之间的梯度范数。

从这些方面的初步调查中,一个尚未解决的问题是找到一个设置,在这个设置中LARS的训练可以明显地改进当前的网络和CIFAR10数据集。来自ImageNet的结果表明,这里应该有一些东西可以找到。

另一个有趣的可能性来自于LARS的连接,它可以解释架构之间最佳学习率的显著稳定性。虽然我们当时没有对此进行评论,但是在较早的文章中,我们在架构搜索中依赖于此属性。在这里,我们比较了不同架构在固定学习速率计划下的训练精度。有人可能会问,这样的方法是否会选择最好的体系结构,或者更确切地说,选择最优学习率与实验中使用的值最接近的体系结构。

事实上,如果我们把在一系列不同架构上的学习率和测试精度画出来,我们可以看到,根据性能选择λ= 0.4是完全合理的,所有不同的体系结构有着相似的最佳学习率。

640?wx_fmt=png

注意,上面图中的结果平均为三次运行,并经过平滑处理以突出趋势。原始结果如下所示,并说明了为什么我们如此热衷于避免超参数调优!

640?wx_fmt=png

考虑到我们使用的是普通的SGD,而且所有层的学习速度相同,所以架构间最优学习速度的稳定性有点令人惊讶。有人可能会认为,具有不同大小、初始化和网络位置的层可能需要不同的学习率,而由于不同的层组成,架构之间的最佳学习率可能会有显著差异。

一种可能的解释是,具有权值衰减的类LARS动态为不同的层提供了一种有用的自适应缩放类型,以便每个层在尺度不变的单位中接收相同的步长,这使得手动调整每层的学习速率变得不必要。人们可以通过人为地为每一层分别优化学习率,并观察最优值在多大程度上重合,来进行实验探索。

第7部分中,我们研究了batch norm在防止训练过程中的协变量漂移方面的另一个作用。

640?wx_fmt=png

—END—

英文原文:https://myrtle.ai/how-to-train-your-resnet-6-weight-decay/

640?wx_fmt=jpeg

请长按或扫描二维码关注本公众号

喜欢的话,请给我个好看吧640?wx_fmt=gif

这篇关于如何快速高效的训练ResNet,各种奇技淫巧(六):权值衰减的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080814

相关文章

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Java高效实现Word转PDF的完整指南

《Java高效实现Word转PDF的完整指南》这篇文章主要为大家详细介绍了如何用Spire.DocforJava库实现Word到PDF文档的快速转换,并解析其转换选项的灵活配置技巧,希望对大家有所帮助... 目录方法一:三步实现核心功能方法二:高级选项配置性能优化建议方法补充ASPose 实现方案Libre

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页