最近,想要了解一下,在 NAS 中如何进行多目标的搜索,读了一些论文,以及网上的一些论文笔记,想要做一个总结。
其中一些知识,参考了:
(1)https://blog.csdn.net/kiding_k/article/details/70147299?locationNum=13&fps=1
(2)https://zhuanlan.zhihu.com/p/119461898
(3)https://blog.csdn.net/royce_feng/article/details/80310530
如果在所有的解空间中找不到其他能占优的解,那么我们称解是一个efficient solution,其在空间中对应的点,称为 non-dominated point。efficient solution其实就是一个Pareto最优解,即,不可能在使得至少一个人收益变得更好情况下而保证其他人的收益不变差。
一般而言,在多目标优化的问题里, efficient solution往往不是唯一的,那么所有efficient solutions的集合,我们称为efficient set。相对应地,所有non-dominated points组成的点集,称为Pareto front(帕累托前沿)。
一般多目标规划问题,许多都可以建模为找Pareto 最优解的问题。
论文:https://arxiv.org/pdf/1807.11626v1.pdf
代码:https://github.com/tensorflow/tpu/tree/master/models/official/mnasnet
这篇论文中,对于多目标优化,采用的是自定义加权法,来近似帕累托最优问题。
这篇论文主要针对的是移动平台,想要在低延迟的情况下,获得最大的精度,提出了一个自动移动神经网络架构搜索方法(MNAS),它明确地将模型延迟考虑进主要目标中,以致于可以得到一个在精度和延迟之间达到平衡的模型。在这篇论文中,我们直接通过在移动设备上运行模型来衡量真实的延迟。
给定一个模型m,我们让ACC(m) 表示在目标任务上的精度,LAT (m)表示在目标移动平台上的推理延迟,T TT是目标延迟,即我们允许的最大的延迟时间。我们可以将T作为一个约束条件,在这个约束条件下最大化模型精度:
我们是想同时优化精度和延迟时间两个目标,这种问题一般是不存在绝对最优解的,可以通过帕累托改进达到帕累托最优——“从此之后,非损人不能利己”的状态。一种可行的方法是利用“评价函数”将多目标规划问题转化为单目标规划问题,设计合适的评价函数,使得单目标优化问题的最优解,是多目标优化问题的有效解/弱有效解。我们使用的是自定义加权法,来近似帕累托最优问题,优化目标可以定义为:
这里的α , β都是特定的常量。挑选α ,β的经验规则就是确保在不同的 accurancy-latency 权衡下帕累托优化应该有近似的reward。
为了降低计算开销,提高搜索速度,将待优化目标按搜索成本分为廉价和昂贵两类。例如FLOPS数、model size等被认为是廉价的,而validation error被认为是昂贵的。LEMONADE在每次迭代中,首先根据基于廉价目标的概率分布对父网络进行第一次采样,然后通过应用operation生成子网络。在第二个采样阶段,再次基于廉价目标的概率分布对一个子集进行采样,并且仅对此子集根据昂贵目标进行评估。以上概率分布均为KDE的倒数,目的是尽可能采样稀疏位置的架构。LEMONADE以不同的方式处理其各种目标,选择架构的一个子集,为架构分配较高的概率,以填补“便宜”目标在Pareto前沿的空白;然后,它只评估该子集,进一步降低架构搜索过程中的计算资源需求。
这篇文章里面的多目标分别是准确度和参数数量,采用的是矩阵相乘,然后最优化的方式。
其中f1(·)和f2(·)是两个源自评估标准的适应度函数。直观上,最大化CNN的分类精度是为了增强其泛化能力,而最小化参数是为了降低其计算成本。
原作者的代码主页:http://www.iitk.ac.in/kangal/resources.shtml
论文链接:https://ieeexplore.ieee.org/document/996017
参考博客:https://blog.csdn.net/royce_feng/article/details/80310530
代码链接:https://github.com/haris989/NSGA-II/blob/master/NSGA%20II.py