深入理解 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 分别代表架构参数和模型权重,两者在算法中扮演不同的角色:
-
α \alpha α(架构参数):
- 定义:架构参数 α \alpha α 控制网络的结构或拓扑。在DARTS中,网络结构被定义为一个超网络,其中每个连接(例如卷积操作、池化操作等)都不是确定的,而是由一系列可能的候选操作组合而成。架构参数 α \alpha α 为这些候选操作赋予不同的权重。
- 作用:通过调整 α \alpha α,可以动态调整每个操作的重要性,最终确定网络中每条边所采用的具体操作。
- 优化目标:DARTS的目标是优化验证集损失 L v a l L_{val} Lval,并通过调整 α \alpha α 来找到在验证集上表现最佳的架构。
-
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+∂w∂Lval⋅∂α∂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的算法流程如下:
- 初始化:随机初始化架构参数 α \alpha α 和权重 w w w。
- 循环优化:
- 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−ηw∇wLtrain(w,α)
- Step 1:在验证集上更新架构参数
α
\alpha
α,使用一步近似的梯度:
- 最终架构选择:在搜索完成后,根据每个操作的权重大小,选择最优的操作,构建最终的神经网络结构。
总结
DARTS 的核心创新在于通过将离散的架构搜索问题连续化,并利用梯度下降进行高效的架构优化。通过一步近似和有限差分法,DARTS 在计算复杂度上进行了显著优化,使得在有限的计算资源下仍然能够进行有效的神经架构搜索。
原文地址:https://blog.csdn.net/handsomeboysk/article/details/143651323
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!