作者 | 丛末
编辑 | 唐里
过去数年间,研究者和企业都试图通过提供可获得的预训练计算机视觉或机器翻译模型,来让更多非专业人士用上深度学习方法。将预训练模型用到另一项任务上的方法,就是我们所说的迁移学习,但是这种方法依旧要求使用者具备一定的专业度,能够对在另一个数据集上运行的模型进行微调。因而如果有方法能够将这一步骤完全自动化,可以让更多的使用者从迄今为止机器学习领域所取得的重大突破受益。
该方法就是自动机器学习(AutoML),它能够涵盖预测建模的多个部分,例如架构搜索、超参数优化等等。
近期,能够为某个给定的数据集搜索到「最佳」架构的架构搜索方法取得了突破性进展,因而在本文中,我将聚焦架构搜索部分展开讨论。其中,文中展示的结果,是基于与 Jonathan Lorraine 合作进行的工作得来的。
神经架构搜索的重要性
首先大家需要了解的是,仅有单个隐藏层和非线性激活函数的神经网络,在该层有足够多神经元的情况下(即万能近似定理,UAT),是能够表示任意函数的。
然而,这种简单的架构,虽然理论上能够学习任意函数,但是并不能表示出现在人类视觉皮层的分层过程。
神经网络架构假定一个归纳偏置、浅层、宽广并且不使用卷积的网络,在图像法分类任务上的表现要比深度卷积网络差得多。因此,为了让神经网络实现泛化,同时不会过度拟合训练数据集,找到归纳偏置正确的架构是至关重要的(不管架构是否由大脑所驱动)。
神经架构搜索(NAS)全览
NAS 是谷歌推出的一项有启发性的工作,后续推动了 ENAS、PNAS、DARTS 等工作的出现。它涉及到使用强化学习(RL)来训练循环神经网络(RNN)控制器,从而自动生成架构。之后,这些架构对其权重进行训练并在验证集上进行评估。它们在验证集上的性能就是控制器的奖励信号,后续可以增加生成表现良好的架构的概率,以及降低生成表现不佳的架构的概率。
对于没有技术基础的读者而言,NAS 基本上还需要他们完成这一步骤:手动调节神经网络并学习哪种方法的表现更好,最终将表现最好的方法自动化。自动创建神经网络架构的思想一开始并非由 NAS 提出,因为很久之前就有其他方法用上了诸如遗传算法等方法,但是 NAS 有效地使用了 RL 来高效地搜索到能够实现详尽搜索的空间。
下面,我将更深入地分析 NAS 的各个部分,然后再探讨该方法存在的局限性以及由该方法衍生但更加高效的 ENAS(高效神经网络架构搜索),不过 ENAS 同样也是一个非常有趣的失效模式。
当对文本和下面展示如何对架构采用和训练的图进行比较时,下面的两个小节是最好理解的。
NAS 工作原理图解
短期记忆网络(LSTM)控制器
控制器通过对大量预定义的时间步长做出一系列选择,来生成架构。例如,在生成卷积架构时,控制器一开始仅创建其中 6 层的架构。对于每一层,控制器都只做 4 项决策:滤波器高、滤波器宽、滤波器个数和步长。假设第一层的编号为 0,则特定层 𝒍 的决策 𝑪 被采样为:
滤波器高为 𝑪_{𝒍,h} ~ p_{𝒍 x 4)
滤波器宽为 𝑪_{𝒍,w} ~ p_{𝒍 x 4+1)
滤波器个数为 𝑪_{𝒍,f} ~ p_{𝒍 x 4+2)
步长为 𝑪_{𝒍,s} ~ p_{𝒍 x 4+3)
注意,时间步长 𝒕 的概率分布 p_𝒕=f_𝒕(h_𝒕),只是该时间步长的隐藏状态下的线性函数,softmax 函数紧随其后。
由于控制器是一个 LSTM,因此在初始时间步长 h_0 = [0,0,...,0] 的隐藏状态被设置为全 0 的向量。每个采样的决策都有一组预设值,例如针对滤波器个数的 [24,36,48,64](看起来像是概率网格搜索)。最终层数会增加,因此需要 LSTM 提供动态计算,并期望 LSTM 的隐藏状态能够记住过去的选择并有偏向地决定未来时间步长的概率分布,从而将这些选择考虑在内。
训练采样的架构
在创建完给定的架构之后,就要对其进行 epoch 个数有限(本文中为 50)的训练,并且观察验证准确度 Acc_v。有趣的是,由于在过去 5 个 epoch 中观察到的最大验证准确度随后被立方化并且被用作使用策略梯度来更新控制器参数的奖励,因此涉及一些并不明显的奖励重塑(Reward Shaping):
NAS 使用的奖励重塑
当我稍后讨论 ENAS 时,大家需要注意的一个重点是,经过训练的架构,它的权重后续会被舍弃,并且在每次对架构进行采样时,这些权重都会被随机初始化。由于架构选择非常简单,因此所有经采样的架构的记录及其验证准确性,都会得到保留。
选择最佳架构
在控制器训练期间,最佳性能的架构会被采用,并且会在一些基本超参数例如学习速率和权重衰减上执行网格搜索,以实现与 STOTA 相当的性能。
高效神经网络架构搜索(ENAS)全览
从深度学习专家到非专业人士,并非每个人都能使用 NAS 的原因是它的计算复杂性所带来的昂贵的计算成本。实际上,它的计算大约需要消耗 32,000 GPU 个小时。如此说来,为什么不直接聘专家来设计架构而投入如此多资源来自动搜索一个架构呢?
ENAS 的诞生,便是用来解决这个问题的。
权重共享
ENAS 通过使用不断更新的共享参数池,而无需舍弃在训练过程中从所有经采样的架构学到的权重。
这意味着,架构 100 在被采样时,已经提供了尤其是与随机权重相比更加合理的准确度的权重对将其初始化。这样的话,搜索到一个性能良好的架构所需要的 GPU 耗时就从 32000 个小时降到了 50 个小时!
通过下图,大家可以非常好地理解该采样过程。回顾一下,在 NAS 示例中,我展示了如何创建整个 CNN 架构。在这里,我将聚焦单个循环单元。而在 ENAS 环境中的单元基本上仅为一个有向无环图(DAG),如果预先设定 DAG 中的节点数,则它只需要学习连接。DAG 可以被视作一个计算图,其边缘表示将信息从一个节点传送到另一个节点的矩阵乘法,以及表示不同「隐藏状态」的节点。
DAG 的构建,可以通过为每个节点选定:
在该节点使用的激活函数,即 [tanh,sigmoid,ReLU];
ENAS 如何对 DAG 采样
由于存在与 DAG 中每个边都相关联的矩阵,因此共享参数池仅是所有这些矩阵的集合。
为什么这些方法都能做得这么好?
尽管 NAS 或 ENAS 提供的架构(以及它们学到的权重)在图像分类和语言建模任务上都表现出色,但目前尚不清楚这样的结果是否是由于搜索方法导致的。
架构搜索真值
首先,针对一个给定的数据集,如果不将每个可能的架构都训练一遍,并且为每一个架构都执行一次大范围的超参数搜索,就不可能知道哪个才是该数据集的最佳架构。这就使得我们很难说明白控制器事实上是否正在有效地搜索可能存在的架构空间,或者是否仅仅只是重新创建此前已经提供了高验证准确率的架构。
这里存在一个熵参数,使得控制器在每个时间步长输出的概率分布都更加均匀,从而增强了搜索,但是这种搜索基本上是随机的,不过有利于对已被视为最好的架构进行微调。如果我们所关心的只是让架构达到某种程度的准确性,这可能并不是什么大问题,不过对于架构的良好性能,可能还存在另外一种解释。
由谁决定搜索空间?
控制器在每个时间步长所做出的决定都非常有限。这些决定相当于是从一组过去被认为是在循环或卷积架构上表现很好的选项中选择出来的。例如,针对滤波器宽的选项是 [1,3,5,7],它们是已在 ResNets 或 DenseNets 等模型中应用的标准值。因而,搜索空间本身存在此类偏差,以至于很难去对表现糟糕的架构采样。
显而易见,拥有更多细粒度的选择会增加搜索算法的采样复杂度,但是如果我们真的相信搜索算法的有效性,我们就不会限制它去采用我们人类认为有效的值,因为这可能会阻止它发现更有效的架构。
架构搜索 VS 随机搜索
在我们的实验,以及 Sciuto 等人和 Li、Talwakar 在近期所做的相关工作中,使用基于 RL 的控制器来搜索架构空间,似乎并没有比使用随机搜索更好。我们的实验聚焦的是面向 Penn Treebank 语言建模任务的 ENAS,该任务的目标是生成循环单元。
如下图所示,当从经过训练的控制器中采样的 1000 个架构与从未经训练的控制器中采样的 1000 个架构相比时,经过训练的控制器的确表现更好,但这可以通过权重共享方案而不是控制器在搜索空间上的探索能力来加以解释。
经过训练的控制器采样得到的一组架构具备更少多样性,因为它在定义上无可避免地存在偏见。这就意味着,当在训练期间更新共享参数时,它们一定会对较少的架构有效。而另一方面,随机控制器采样得到的架构会更加多变,因此其更新共享参数的目的在于试图变得对非常多的架构有效,然而最终的结果是,它对于任何给定的架构都不会特别有效。
经过训练的控制器的性能 vs 未经训练的控制器的性能
控制器在学习什么?
如果使用基于 RL 的控制器获得的架构最终并没有比随机搜索更好,那么控制器到底在学习什么呢?众所周知,深度学习导致了黑盒模型无法解释的结果,但对于图像分类、目标检测甚至目标分割等任务而言,我们能够借助一些技术可视化 NN 关注的输入图像所具备的特征,尽管结果大打折扣,正如 Adebyo 等人所说的那样,在最低限度上,我们可以预期控制器的循环属性能够基于过去的决策来做出未来倾向的决策,然而这在 ENAS 中,是不会发生的。
这种对架构决策的无条件采样是令人不安的,因为可能存在高效单元要求节点之间有特定的连接模式,并且如果无法将过去的决策条件化,控制器是无法发现这种模式的。
下图显示了 100 个采样架构的 RNN 控制器的隐藏状态(每行对应于单个架构的控制器隐藏状态)。请注意,在(a)中,即使采样架构不同,所有行也都是相同的,这表明控制器在隐藏状态下,不会对架构选择进行编码。
控制器隐藏状态可视化图
是否有可能强制让控制器记忆过去的决策呢?我们通过在用于训练控制器的原始损失中添加正则化项来研究该想法:一个自我监督的目标,要求控制器能够再现它曾看到过的过去的架构。特别地:
经过 5 个 epoch 的训练,每个 epoch 都采样和存储 1000 个架构(最多可达 10,000 个)。一旦此缓冲区满了,每个时期 epoch 就会随机替换 100 个架构;
在第 10 个 epoch 处,添加一个监督惩罚,用于从架构的内存缓冲区重建 100 个架构的随机样本。在控制器训练的每一步中,此损失都会被添加到策略梯度损失中:L = L_ {PG} + L_ {Sup}。
这种正则化的方法与以自动回归方法中使用 RNN 进行语言建模的方式类似:每个时间步长的目标,都是预测下一个步长的架构选择。这个问题跟「鸡和蛋」的问题有点像。
如果我们要求控制器重建的架构,它的每个时间步长的选择一开始都不会首先考虑过去的时间步长,那么我们的这种方法是不是更加强化了它的这一行为呢?事实上,这并不重要,因为我们在尝试让控制器能够记忆和重现序列,这至少能够促使控制器的隐藏状态能够涵盖控制器过去的选择。
上图(b)中显示了这种正则化的影响,很明显地是,控制器的隐藏状态现在至少在采样架构之间是不同的。
为了确认这种正则化是否真地让控制器嵌入提供架构之间有意义的相似性,我们将架构嵌入之间的 L2 距离与架构相似性的各种直观概念相关联,这些直观概念包括激活函数的个数,或者采样的 DAG 之间的公共连接等。
如下表所示,正则化给出了最佳的 Spearman 相关性,但这种相关性仍然很低。以一种不那么特定的方式去强制控制器记忆架构,似乎更有助于进一步增加这种相关性。
架构间的距离和其他概念之间的 Spearman 相关性
未来的研究方向
目前,神经网络搜索通过比较各种架构从而选出最佳架构的方式还过于简单。仅考虑这些架构在验证集上的性能,会遗漏许多我们可能希望模型能够具有的有用属性。例如,我们可能偏向使用架构搜索来生成对于对抗性扰动更鲁棒的架构,或者更适合修剪的架构。
为了赋予架构搜索方法这一能力,以某种方式量化特定架构可以学到的函数空间,将是有用的。这种方法有助于使用「更好」的更有趣的概念,因为许多架构提供了类似的验证准确性,然而即使 A_ {1} 的性能略差于 A_ {2},它也可能有我们看重但 A_ {2} 不具备的其他属性。
随着近来机器学习社区开始对提高隐私、降低偏见等领域产生兴趣,我们越来越需要更加智能的架构搜索技术,来搜索到能够满足所有此类需求的架构。
via https://towardsdatascience.com/neural-architecture-search-limitations-and-extensions-8141bec7681f
1. Facebook 自然语言处理新突破:新模型能力赶超人类 & 超难 NLP 新基准
点击阅读原文,查看
GitHub 开源神经架构项目推荐