自学内容网 自学内容网

深入理解 DARTS


深入理解 DARTS:基于微分的神经架构搜索算法详解

神经架构搜索(Neural Architecture Search, NAS)一直是深度学习中一个重要而复杂的问题。传统的NAS方法往往需要大量的计算资源,特别是当我们需要反复训练不同的架构时。为了减少NAS的计算成本,研究者提出了DARTS(Differentiable Architecture Search),一种将架构搜索问题连续化并可微分化的高效方法。本文将深入探讨DARTS算法的核心原理,并详细推导其关键的数学公式,帮助读者更直观地理解DARTS是如何高效地进行架构搜索的。


1. DARTS的基本思想

在DARTS中,我们的目标是找到一个能够在验证集上表现最优的网络架构。与传统NAS不同,DARTS通过定义连续的架构参数,使得架构搜索问题可以用梯度下降的方式进行优化。这种方法的核心在于双层优化

  • 外层优化:优化架构参数 α \alpha α,使得验证集上的损失最小化。
  • 内层优化:对于给定的架构参数 α \alpha α,优化网络权重 w w w,使得训练集上的损失最小化。

在DARTS(Differentiable Architecture Search)算法中, α \alpha α w w w 分别代表架构参数模型权重,两者在算法中扮演不同的角色:

  1. α \alpha α(架构参数):

    • 定义:架构参数 α \alpha α 控制网络的结构或拓扑。在DARTS中,网络结构被定义为一个超网络,其中每个连接(例如卷积操作、池化操作等)都不是确定的,而是由一系列可能的候选操作组合而成。架构参数 α \alpha α 为这些候选操作赋予不同的权重。
    • 作用:通过调整 α \alpha α,可以动态调整每个操作的重要性,最终确定网络中每条边所采用的具体操作。
    • 优化目标:DARTS的目标是优化验证集损失 L v a l L_{val} Lval,并通过调整 α \alpha α 来找到在验证集上表现最佳的架构。
  2. w w w(模型权重):

    • 定义:模型权重 w w w 是标准的神经网络参数,比如卷积核权重、全连接层的权重等。这些权重是模型在给定架构(由 α \alpha α 确定)下,通过在训练集上训练得到的。
    • 作用:这些权重决定了模型在给定架构上的具体性能。在DARTS中,权重 w w w 的优化过程类似于普通神经网络训练,即通过最小化训练集上的损失 L t r a i n L_{train} Ltrain 来更新权重。
    • 优化目标:在DARTS的双层优化框架中,权重 w w w 的优化主要是为了更好地拟合训练数据,以便在内层优化过程中得到良好的 w ∗ ( α ) w^*(\alpha) w(α),从而辅助架构参数 α \alpha α 的优化。
  • 架构参数 α \alpha α 决定模型的结构,经过优化后可以确定最优的网络架构。
  • 模型权重 w w w 是模型的标准训练参数,经过优化后可以提升模型的表现,但不会直接改变网络的结构。

在DARTS中,这两个参数的联合优化,使得神经架构搜索变成了一个可微分的问题,通过梯度下降就可以高效搜索最优架构。
这一过程可以用以下两个公式来表示:

min ⁡ α L v a l ( w ∗ ( α ) , α ) \min_{\alpha} L_{val}(w^*(\alpha), \alpha) αminLval(w(α),α)
其中, w ∗ ( α ) = arg ⁡ min ⁡ w L t r a i n ( w , α ) \text{其中,} \quad w^*(\alpha) = \arg \min_w L_{train}(w, \alpha) 其中,w(α)=argwminLtrain(w,α)

外层优化的目标是最小化验证集上的损失 L v a l L_{val} Lval,而内层优化的目标是找到使得训练集损失 L t r a i n L_{train} Ltrain 最小的权重 w w w

2. 近似求解双层优化

直接求解上面的双层优化问题是非常耗时的,因为每次更新架构参数 α \alpha α 时都需要将内层优化的权重 w w w 训练到最优。为了解决这个问题,DARTS采用了一步近似方法,即通过仅一步更新来近似权重随架构参数的变化。

具体来说,我们假设在当前架构参数 α \alpha α 下,权重 w w w 可以通过一次梯度下降来更新:

w ′ = w − ξ ∇ w L t r a i n ( w , α ) w' = w - \xi \nabla_w L_{train}(w, \alpha) w=wξwLtrain(w,α)

这里, ξ \xi ξ 是一个小的学习率,用来模拟权重 w w w 随架构参数 α \alpha α 的变化趋势。我们通过这个更新来近似权重 w w w α \alpha α 改变时的变化,而不需要完全训练到最优。

3. 验证集损失对架构参数的梯度

为了更新架构参数 α \alpha α,我们需要计算验证集损失 L v a l L_{val} Lval α \alpha α 的梯度:

∇ α L v a l ( w ∗ ( α ) , α ) \nabla_{\alpha} L_{val}(w^*(\alpha), \alpha) αLval(w(α),α)

根据链式法则,这个梯度可以分解为:

∇ α L v a l ( w ∗ ( α ) , α ) = ∂ L v a l ∂ α + ∂ L v a l ∂ w ⋅ ∂ w ∗ ( α ) ∂ α \nabla_{\alpha} L_{val}(w^*(\alpha), \alpha) = \frac{\partial L_{val}}{\partial \alpha} + \frac{\partial L_{val}}{\partial w} \cdot \frac{\partial w^*(\alpha)}{\partial \alpha} αLval(w(α),α)=αLval+wLvalαw(α)

其中,第二项中的 ∂ w ∗ ( α ) ∂ α \frac{\partial w^*(\alpha)}{\partial \alpha} αw(α) 表示权重 w w w 随架构参数 α \alpha α 的变化梯度。这个梯度的直接计算非常困难,因此我们使用一步近似的方法来简化它。

4. 应用链式法则的进一步近似

在应用一步更新之后,我们将权重的变化 w ′ w' w 带入验证损失的梯度中。利用链式法则可以得到:

∇ α L v a l ( w ′ , α ) ≈ ∇ α L v a l ( w , α ) − ξ ∇ w L v a l ( w ′ , α ) ⋅ ∇ α ∇ w L t r a i n ( w , α ) \nabla_{\alpha} L_{val}(w', \alpha) \approx \nabla_{\alpha} L_{val}(w, \alpha) - \xi \nabla_w L_{val}(w', \alpha) \cdot \nabla_{\alpha} \nabla_w L_{train}(w, \alpha) αLval(w,α)αLval(w,α)ξwLval(w,α)αwLtrain(w,α)

在这里,我们将 w ′ w' w 视为 w ∗ ( α ) w^*(\alpha) w(α) 的近似解,避免了直接计算内层优化的复杂过程。上式中的高阶导数项 ∇ α ∇ w L t r a i n ( w , α ) \nabla_{\alpha} \nabla_w L_{train}(w, \alpha) αwLtrain(w,α) 表示在训练集损失上,架构参数和权重之间的混合二阶导数。

5. 使用有限差分法简化高阶导数计算

为了进一步简化高阶导数的计算,DARTS引入了有限差分法。具体来说,定义一个小标量 ϵ \epsilon ϵ,并构造新的权重向量:

w + = w + ϵ ∇ w L v a l ( w ′ , α ) w^+ = w + \epsilon \nabla_w L_{val}(w', \alpha) w+=w+ϵwLval(w,α)
w − = w − ϵ ∇ w L v a l ( w ′ , α ) w^- = w - \epsilon \nabla_w L_{val}(w', \alpha) w=wϵwLval(w,α)

这样,我们可以用有限差分来近似高阶导数:

∇ α , w 2 L t r a i n ( w , α ) ⋅ ∇ w L v a l ( w ′ , α ) ≈ ∇ α L t r a i n ( w + , α ) − ∇ α L t r a i n ( w − , α ) 2 ϵ \nabla_{\alpha, w}^2 L_{train}(w, \alpha) \cdot \nabla_w L_{val}(w', \alpha) \approx \frac{\nabla_\alpha L_{train}(w^+, \alpha) - \nabla_\alpha L_{train}(w^-, \alpha)}{2\epsilon} α,w2Ltrain(w,α)wLval(w,α)2ϵαLtrain(w+,α)αLtrain(w,α)

这一技巧避免了直接计算复杂的矩阵-向量乘积,仅需两次前向传播和反向传播来获得新的梯度,从而显著降低了计算成本。

6. DARTS算法流程总结

在完成上述推导后,我们可以总结DARTS的算法流程如下:

  1. 初始化:随机初始化架构参数 α \alpha α 和权重 w w w
  2. 循环优化
    • Step 1:在验证集上更新架构参数 α \alpha α,使用一步近似的梯度:
      α = α − η α ∇ α L v a l ( w − ξ ∇ w L t r a i n ( w , α ) , α ) \alpha = \alpha - \eta_\alpha \nabla_\alpha L_{val}(w - \xi \nabla_w L_{train}(w, \alpha), \alpha) α=αηααLval(wξwLtrain(w,α),α)
    • Step 2:在训练集上更新网络权重 w w w
      w = w − η w ∇ w L t r a i n ( w , α ) w = w - \eta_w \nabla_w L_{train}(w, \alpha) w=wηwwLtrain(w,α)
  3. 最终架构选择:在搜索完成后,根据每个操作的权重大小,选择最优的操作,构建最终的神经网络结构。

总结

DARTS 的核心创新在于通过将离散的架构搜索问题连续化,并利用梯度下降进行高效的架构优化。通过一步近似和有限差分法,DARTS 在计算复杂度上进行了显著优化,使得在有限的计算资源下仍然能够进行有效的神经架构搜索。


原文地址:https://blog.csdn.net/handsomeboysk/article/details/143651323

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!