论文笔记:Fast AutoAugment

写在前面

第一次完整地读完一篇英文论文,上来就搞得那么硬核其实我也不想……(毕竟要做Paper Reading汇报)

本文所写仅为自己的理解(只求理解,所以可能会缺乏专业性……),可能有不少错漏之处,此外现在对贝叶斯优化那块还不是太清楚……如有错误请各位大佬指出,感激不尽~

 

背景

数据增强是一种较为常用的可提高模型性能的技术,通过对数据集中的图片进行旋转、对称、颜色变换等操作,提升数据集中图片的数量及多样性,进而在训练后提高模型的泛化能力。传统数据增强方法是学者通过专业知识手动设计增强方案。如今,谷歌推出的AutoAugment使用增强学习算法,对于给定数据集,可让机器学习其特征,自动进行数据增强。

AutoAugment虽然实现了“AutoAugment”且在不少图像识别任务中达到了SOTA性能,但其训练速度实在是太慢。而在此之后出现的Fast AutoAugment(也就是本文的主角)提出了比前者快得多的自动数据增强的算法。

 

算法细节

增强策略

首先提增强策略,Fast AutoAugment与AutoAugment类似,每个增强策略有多个子策略组成,每个子策略又由多个图像增强操作组成(如剪切、旋转等等),每个操作还有两个参数:概率p,幅度λ。概率指有多大的概率执行该操作,幅度指如果执行操作,执行的幅度为多少(例如某操作是旋转,对应的幅度越大,旋转角也就越大,当然不是所有的操作都要有幅度,比如翻转),我们用O表示操作,x表示输入的图像数据,有:

因为对于某个操作是有一定概率不执行的,不执行的话输出图像与输入一致,所以对于单个操作,可用执行后的输出图像和概率p来表示。因此,可用这种递推的形式来表示有Nτ个操作并按一定顺序执行的某个子策略τ:

\large \tilde{x_i}  表示经第i次操作后输出的图像。边界条件:

当然也可以用集合的形式表示子策略τ:

这里再提一点Fast AutoAugment与AutoAugment不一样的地方。一方面是AutoAugment的每个子策略规定由两个操作构成,而Fast对此没有要求;另一方面是AutoAugment的操作中概率p和幅度λ是离散取值,例如p的只能取0.1、0.2、0.3……但Fast为连续取值,相比离散的搜索空间就有更多的取值可能。

这里放一张原论文的图像,展示了一个由两个操作组成的子策略:

这里要提一下图中运用的一个操作“Cutout”:对于输入图像,随机选取其中的一块方形区域进行屏蔽(抹除)。

我们最终的目标,是要找到一个由\large N_\tau个子策略组成的策略\large \tau

D为数据集,x,y分别为图像和对应的标签。

密度匹配(Density Matching)

论文提出使用密度匹配算法来寻找最佳增强策略。假设我们用于算法的分类模型为M,模型中的相关参数统称为θ。对于给定的数据集D及模型M,我们有期望准确度(expected accuracy):\large R(\theta |D)

以及期望损失(expected loss):\large L(\theta |D)

接下来论文提出了如何评估增强策略的好坏,具体做法为:将数据集\large D_{train}分成\large D_M\large D_A,其中\large D_M用于学习模型参数θ,\large D_A用于搜索增强策略\large \tau。对此,我们希望找到的\large \tau应该满足:

理想的\large \tau(即\large \tau ^*),应该是在经过其增强后的\large D_A上,模型\large M(\theta^*)能取得最高准确度,由前文可知,\large \theta^*是在\large D_M上训练出来的,然而在经过\large \tau ^*增强后的\large D_A\large M(\theta^*)还能取得最高的准确度,说明该策略是行之有效的。在保持模型参数不变的情况下,模型在\large D_M和增强后的\large D_A上均取得最好性能,说明该增强策略使得这两个数据集尽可能地”密度匹配“了。

上图源自原论文,可以看出,算法不会仅在一份\large D_A\large D_M上寻找最佳增强策略,类似于K折交叉验证法,在一开始会将训练数据集分成K份,逐份寻找,之后对于找到的B个增强策略(称为”候选策略“),我们选择其中最好的N个加入到我们的最佳策略列表中。最终,我们要实现:

贝叶斯优化(Bayesian Optimization)

密度匹配算法给予了我们对策略的评判标准,现在要通过贝叶斯优化来寻找这B个候选策略。首先简单讲讲贝叶斯优化的思想。

贝叶斯优化常用于超参数搜索中,假设X=x1,x2,...,xn为一组超参数的集合,又假设要优化的损失函数(目标函数)为f(X),则我们的目的是找到这样的X:

显然,对于各种各样的超参数的数值组合,一个个代入模型计算f(X)进而比较超参数优劣的做法并不现实,这种做法在每一次取超参数的值并代入计算时与之前的任一次取值没有任何关系,换句话说,它并没有学习到之前的”失败经验“。

贝叶斯优化会跟踪过去的评估结果,并使用这些结果形成概率模型,将超参数映射到目标函数的得分概率:

这个概率函数又被称为目标函数的“代理”。一般也可写为p(y | x),可以理解为:在使用超参数x的前提下,要达到分数y的概率。

一般代理会比目标函数更容易优化,因此该方法会通过选择在代理函数上表现最佳的超参数来更新迭代。具体步骤为:

1. 建立目标函数的“代理”概率模型
2. 找到在代理上表现最佳的超参数
3. 将这些超参数应用于真正的目标函数
4. 更新包含新结果的代理模型
5. 重复步骤2-4,直到达到设定的迭代次数

这个过程也可简单概括为:我们形成了一个任务的初始视图(称为先验),然后在任务的尝试中根据新经验更新我们的模型(更新的模型称为后验)。在这里,我们的先验是y服从高维正态分布,因此随着实验(迭代)次数的增多,这个正态分布的“轮廓”也就更清楚,也就越能通过其来找到使y更好的x。

有鉴于此,在选择新的超参数进行优化迭代的时候,我们可以借鉴之前的经验,然而,这个所谓的“借鉴”过程又该如何实现?

通过当前所知的正态分布的轮廓,我们可以选择获得一个较好的x,这个选择叫做“Exploitation”,即“利用”。然而这个x可能只是个局部最优值,如果把有限的迭代次数都使用在找这些局部最优值,显得过于“目光短浅”。

此外还可选择一个之前未探索过的x,其对应的y可能并不好,但更多的“失败经验”也就能将这个正态分布的“轮廓”勾勒地更清楚,更有助于寻找到全局最优的x。这叫“Exploration”,即“探索”。

显然,极端偏向“探索”还是“利用”都是不对的,而我们寻找全局最优的x也就是一个“探索—利用”结合的过程,即Exploration-Exploitation。

而选择函数(Acquisition Function)则平衡了“探索”与“利用”,这个函数规定了从代理函数中选择下一组超参数的标准。常用的有预期改进(Expected Improvement,EI)、POI(probability of improvement)等,这里仅介绍EI:

这里y*是目标函数的阈值(一般取目前所得的最小y值),y是使用超参数x所得的目标函数值。我们希望y越小越好,因此y*-y可视为“得分”,因此整个函数可视为y*-y在(-∞, y*]的期望,若选择函数EI的值为正,说明取x得到的y要比y*更好,因此能使EI尽可能大的x即为我们所求。

论文给出的选择函数:

相比起来这个EI函数就更为简洁,其中后面这个长得像\large L^+与上面提到的y*类似。我们的最终目标,是要找到使目标函数\large L尽可能小的\large \tau

通过以上这些根据“先验”来寻找更佳超参数的方式,避免了对于大量超参数组合反复计算f(x)的情况,从而达到极高的算法效率。

Tree-structured Parzen Estimator (TPE)

论文中所用的贝叶斯优化中,还使用了TPE进一步优化。

在上面的EI函数中现身的p(y|x)在TPE中使用贝叶斯公式替换为p(x|y):

对于p(x|y),即在目标函数值为y下取超参数x的概率,为什么p(x|y)会有多个值呢,这是因为在贝叶斯优化中,代理函数是逐步迭代更新的,因此在不同时期代理函数即使输入相同,输出也不一定相同。

然后随着一系列变换,可将EI函数变形为:

以下为原论文给出的伪代码:

注意这里输入的T,我理解为“步数”或“迭代次数”,和前面所提的策略\large \tau不一样……

 

效果展示及一些结论

与AutoAugment对比

为了直观、公平地与AutoAugment对比,Fast AutoAugment将超参数设置地尽可能与AutoAugment一致,对于一些难以与AutoAugment相较的超参数,Fast 则将其设置为与Baseline一致。论文中提到的Fast的超参数设置有:

数据集份数K=5,搜索宽度T=2,搜索深度(候选策略数)B=200,选定的策略N=10。

效果分析

可以看出无论在PBA还是AutoAugment面前,Fast AutoAugment在准确度上还是不遑多让的,然而最重要的一点是,Fast要比前面的那些算法快太多了:

这里值得一提的是,AutoAugment训练所用的为Tesla P100显卡,而Fast用的是Tesla V100。虽然V100的计算性能要比P100强上不少,但这上千倍的速度提升还是足以说明Fast AutoAugment的确在速度上有巨大优势。

训练中提高子策略对准确度的影响

当子策略在100~125以内时,随着子策略数量的提高,模型的准确度也随之提高。

直接训练与策略迁移间准确度不同的原因

搜索增强策略所用的模型和拿增强数据集再训练的模型可能不一致,这些差距一定程度上可以表面Fast AutoAugment算法得出的增强策略是否具有迁移性。通过上面的表格可以看出,随着模型越大,直接训练和策略迁移所得的准确度之差也会越大,因为在小模型上搜索出的增强策略对提高大模型的泛化能力还是有局限性的。

更改贝叶斯优化中的参数

论文中说可以这样做,但按他们的经验来说,可能对提高模型表现没什么用……

 

参考资料

https://arxiv.org/pdf/1905.00397v2.pdf

https://github.com/kakaobrain/fast-autoaugment

http://imgtec.eetrend.com/blog/2019/100018057.html

https://www.cnblogs.com/marsggbo/p/9866764.html

  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark SQL是Apache Spark中的一个模块,它提供了一种基于结构化数据的编程接口。Spark SQL可以让用户使用SQL语句来查询数据,也可以让用户使用DataFrame API来进行数据处理和分析。Spark SQL支持多种数据源,包括Hive、JSON、Parquet等。Spark SQL还提供了一些高级功能,如支持用户自定义函数、支持分布式机器学习算法等。Spark SQL的目标是让用户能够方便地使用Spark进行数据处理和分析,同时提供高性能和可扩展性。 ### 回答2: Spark SQL是一个基于Spark平台的关系型数据处理引擎,它支持使用SQL语句和数据框架操作数据,可以轻松处理结构化和半结构化的数据。它可以从多个数据源中读取数据,包括Hive、JSON、Parquet、ORC等。通过Spark SQL,用户可以方便地使用SQL查询语言来分析和处理数据,大大降低了开发和组织数据流的难度。 Spark SQL主要有两种执行模式:SQL查询和DataFrame操作。其中SQL查询基于Hive的SQL语法解析器,支持HiveQL中的大多数语言特性(如UDF、窗口函数等)。在执行计划生成时,Spark SQL采用了Spark的计算引擎,支持各种Spark算子的优化,以便最大程度地提高查询性能。 另一种操作模式是使用DataFrame API,它可以灵活地进行数据转换和处理,并提供了类似于SQL的语法。与SQL查询不同,DataFrame API通过静态检查和编译器优化来避免由SQL查询引起的语法错误和潜在性能问题。 除了这两种基本的操作模式外,Spark SQL还提供了一些高级特性,如嵌套查询、表和视图、共享变量等。这些特性扩展了Spark SQL的功能,使得它可以更加灵活地进行数据处理和查询。 Spark SQL是Spark的重要组成部分,它在数据存储和处理方面提供了很多便利。通过最大程度地利用Spark引擎的优势,Spark SQL能够处理海量数据,并将其转换为有用的信息。这使得Spark SQL成为实现数据分析、机器学习和人工智能的重要工具之一。 ### 回答3: Spark SQL是一种基于Spark平台的数据处理引擎,它提供了高度优化的查询引擎和优秀的支持SQL语句的API。它允许用户使用SQL语句查询来处理大规模数据集,同时仍然支持复杂数据类型和计算。Spark SQL支持数据源,包括Parquet,Avro,JSON等一系列结构化的和半结构化的数据源。 Spark SQL在历史上是一个单独的模块,在Spark 2.0之后,它已经成为Spark的核心组件之一,可以直接在Spark核心API中使用,包括作为一个RDD库或DataFrame/DataSet的API。 Spark SQL的优点如下: 1. 它可以向受过传统SQL培训的用户展示更高级别,更强大的API。 2. 它提供数据集和RDD的良好互操作性。Spark SQL可以通过未被优化的RDD/DataSet API访问同一数据。 3. 它支持Spark的执行引擎以加速查询处理。 使用Spark SQL的时候,可以根据需要选择编程语言,如Scala,Java,Python,SQL等。在Spark核心API中,Spark SQL提供了两种API来处理结构化数据: 1. DataFrame API:DataFrame是具有许多操纵数据的功能的分布式数据集,类似于数据库中的表。 2. Dataset API:Dataset是Scala和Java API,它是类型安全的,并且提供与RDD API相同的API,但比RDD具有更好的性能和可读性。 Spark SQL是Spark生态系统中重要的组成部分之一。在处理大规模数据时,使用Spark SQL可以方便地利用Spark的强大功能,提高处理效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值