NAS 第一弹: DARTS: DIFFERENTIABLE ARCHITECTURE SEARCH

Neural Architecture Search

神经结构搜索(Neural Architecture Search,简称NAS)是一种自动设计神经网络的技术,可以通过算法根据样本集自动设计出高性能的网络结构,在某些任务上甚至可以媲美人类专家的水准,甚至发现某些人类之前未曾提出的网络结构,这可以有效的降低神经网络的使用和实现成本。(自动化,最优)
在这里插入图片描述
搜索空间定义了NAS算法可以搜索的神经网络的类型,同时也定义了如何描述神经网络结构。

搜索策略定义了如何找到最优的网络结构,通常是一个迭代优化过程,本质上是超参数优化问题。目前已知的搜索方法有随机搜索,贝叶斯优化,遗传算法,强化学习,基于梯度的算法。

搜索策略的目标是找到一个神经网络结构,最大化某种性能度量指标,如在之前未见的数据集上的精度。为了指导搜索过程,NAS算法需要估计一个给定神经网络结构的性能,这称为性能评估策略。

darts

motivation

很多现存的NAS的搜索空间是离散的,因此本文将搜索空间弱化为一个连续的空间结构,以此可以使用梯度夏下降进行性能优化,DARTS能够在丰富的搜索空间中搜索到一种具有复杂图形拓扑结构的高性能框架。

定义搜索空间

搜索 cell 然后用重复的cell 堆成model。

其实是预定义好所有的node 只是operation不同。darts做的事情就是挑选的是operation。
在这里插入图片描述

使搜索空间连续

为了使搜索空间连续,我们为每个操作都赋予一个权重α,然后做softmax。这样搜索任务就简化为学习权重α
在这里插入图片描述
搜索完成后,我们通过argmax选权重最大的操作。

这个问题可以定义为一个bilevel的优化问题。很多方向都一样 比如说auto-augment。

在这里插入图片描述
darts的算法流程。
在这里插入图片描述
算法:

  • 在验证集损失上梯度下降更新操作权重
  • 在训练集损失上梯度下降更新架构参数

对应代码:

  • 第一步对应architect.step(input, target, input_search, target_search, lr, optimizer, unrolled=args.unrolled)
    我们可以看到input_search和target search都是从valid_queue中拿出来的一个batch,也就对应了论文中说的用验证集对α进行更新
  • 第二步对应logits = model(input)、loss = criterion(logits, target)、loss.backward()
    这里的input是训练集,因为w都是网络中定义的,loss.backward()就已经设计好了对网络的w进行更新

类似的方法在元学习(MAMAL)、基于梯度的超参数调整与避免GAN崩溃(unrolled GAN)中都能看到。

approximate architecture gradient

在这里插入图片描述
在这里插入图片描述
此时梯度将退化为一阶近似。

Reference:
1.darts代码和论文结合阅读

2.DARTS公式推导

猜你喜欢

转载自blog.csdn.net/kingiscoming/article/details/114108420