μNAS:面向微控制器的约束神经架构搜索
Liberis E, Dudziak Ł, Lane N D. μnas: Constrained neural architecture search for microcontrollers[C]//Proceedings of the 1st Workshop on Machine Learning and Systems. 2021: 70-79.
1. 引言与研究背景
1.1 微控制器的资源约束挑战
物联网(IoT)设备的智能化正在改变我们与周围世界的交互方式。这些设备的核心是微控制器单元(MCU),它们是包含低频处理器、持久程序存储器(Flash)和易失性静态RAM的超小型计算机,全部集成在单一芯片上。2019年,全球MCU出货量估计超过300亿个单元,其广泛应用得益于极低的成本和功耗优势。
然而,这些优势是以计算能力的大幅降低为代价的。本研究聚焦于"中等规格"的物联网级MCU,其SRAM和持久存储空间最多64KB,可用于神经网络推理。这种严苛的资源约束给运行资源密集型计算带来了前所未有的挑战。相比之下,即使是移动设备也拥有比MCU多几个数量级的计算资源。
1.2 现有方法的局限性
传统的模型压缩方法,如剪枝、蒸馏、量化和使用更轻量级的层,虽然能够在保持精度的同时减少模型大小,但大多数方法并不适合生成MCU级别的神经网络。许多技术针对的是移动设备或类似平台,这些平台的计算资源比MCU多出几个数量级。即使是专门设计的资源高效模型,如MobileNet和SqueezeNet,也会超出假定的资源预算10倍以上。
2. 神经网络在MCU上的执行机制
2.1 执行策略详解
μNAS遵循TensorFlow Lite Micro解释器和CMSIS-NN库使用的执行策略,这种策略具有以下特点:
顺序执行原则 :算子按预定义顺序逐个执行,完全没有并行性。这与GPU或现代CPU的并行执行形成鲜明对比。
内存管理机制 :执行一个算子时遵循三步流程:
在SRAM中为输出缓冲区分配/预留内存
完全执行算子主体
释放不再需要的输入缓冲区
这意味着神经网络的激活矩阵仅存储在SRAM中,而所有静态数据(如网络权重)则从Flash中的可执行二进制文件读取。
量化策略 :网络权重和所有计算都量化为8位定点数据类型(int8)。这种量化方法的选择基于四个关键优势:字节对齐(值可以直接加载而无需解码)、不需要芯片上存在浮点运算单元、广泛的行业采用、以及在量化过程中不会造成显著的精度损失。
2.2 分支网络的内存管理挑战
图1:计算图的不同执行路径对峰值内存使用的影响
图1展示了一个具有分支结构的卷积神经网络计算图。网络包含多个Conv2D层,具有不同的配置(1×1卷积、3×3深度可分离卷积等)和一个Concat层。图中显示了两种不同的执行顺序:
默认执行路径 (左侧):按照1→2→3→4→5→6→7的顺序执行,产生5216字节的峰值内存使用
优化执行路径 (右侧):按照1→2→5→3→4→6→7的顺序执行,峰值内存使用降至4960字节
这256字节的差异虽然看似不大,但在只有64KB总内存的MCU上却至关重要。图中每个节点旁边的尺寸标注(如7×7×32、4×4×16)表示该层输出张量的维度,这直接影响内存占用。
3. 多目标优化的数学框架
3.1 问题形式化
神经架构搜索的核心是一个约束零阶优化问题。给定搜索空间A,我们寻找最优架构α*,使其最大化某个目标函数L,同时满足资源使用约束。验证集精度对于特定架构α由通过梯度下降获得的最优权重θ*决定。
将资源约束视为软约束并重新表述为额外目标,NAS成为多目标优化问题:
α ∗ = arg min α ∈ A L ( α ) = arg min α ∈ A { 1.0 − ValAccuracy ( α ) ModelSize ( α ) PeakMemUsage ( α ) Latency ( α ) \alpha^* = \arg\min_{\alpha \in A} L(\alpha) = \arg\min_{\alpha \in A} \begin{cases}
1.0 - \text{ValAccuracy}(\alpha) \\
\text{ModelSize}(\alpha) \\
\text{PeakMemUsage}(\alpha) \\
\text{Latency}(\alpha)
\end{cases} α ∗ = arg α ∈ A min L ( α ) = arg α ∈ A min ⎩ ⎪ ⎪ ⎪ ⎪ ⎨ ⎪ ⎪ ⎪ ⎪ ⎧ 1 . 0 − ValAccuracy ( α ) ModelSize ( α ) PeakMemUsage ( α ) Latency ( α )
3.2 Pareto前沿与标量化
多目标问题的解不是单一值,而是Pareto前沿——一组点的集合,在这些点上,改进一个目标函数必然导致另一个目标函数变差。为了有效探索Pareto前沿,μNAS采用随机标量化方法:
L t ( α ) = max i ∈ { 1 , 2 , 3 , 4 } { λ i t ⋅ f i ( α ) } L_t(\alpha) = \max_{i \in \{1,2,3,4\}} \left\{ \lambda_i^t \cdot f_i(\alpha) \right\}
L t ( α ) = i ∈ { 1 , 2 , 3 , 4 } max { λ i t ⋅ f i ( α ) }
其中:
f 1 ( α ) = 1.0 − ValAccuracy ( α ) f_1(\alpha) = 1.0 - \text{ValAccuracy}(\alpha) f 1 ( α ) = 1 . 0 − ValAccuracy ( α )
f 2 ( α ) = PeakMemUsage ( α ) f_2(\alpha) = \text{PeakMemUsage}(\alpha) f 2 ( α ) = PeakMemUsage ( α )
f 3 ( α ) = ModelSize ( α ) f_3(\alpha) = \text{ModelSize}(\alpha) f 3 ( α ) = ModelSize ( α )
f 4 ( α ) = MACs ( α ) f_4(\alpha) = \text{MACs}(\alpha) f 4 ( α ) = MACs ( α )
标量系数λ i t \lambda_i^t λ i t 的采样策略为:1 / λ i ∼ Uniform [ 0 ; b i ] 1/\lambda_i \sim \text{Uniform}[0; b_i] 1 / λ i ∼ Uniform [ 0 ; b i ] ,其中b i b_i b i 是用户为第i个目标指定的软上界。
4. 搜索空间的层次化设计
4.1 架构模板
μNAS的搜索空间基于高度参数化的架构模板。一个架构由N个"卷积块"组成(N∈[1,10]),每个块的详细配置如下:
连接模式 :每个块可以与前一个块串联或并联连接,提供了灵活的信息流路径。
卷积层配置 :每个块包含M个卷积层(M∈[1,3]),每层具有以下可配置参数:
可选的2×2最大池化前置操作
全卷积或深度可分离卷积的选择
核大小K∈{1,3,5,7}
输出通道数C∈[1,128]
步长S∈{1,2}
可选的批归一化和ReLU激活
池化和全连接层 :每个卷积块后跟P×P的平均或最大池化(P∈{2,4,6}),然后是F个全连接层(F∈[1,3]),每层有U个单元(U∈[10,256])。
4.2 搜索空间规模分析
这种细粒度的设计产生了包含1.15 × 1 0 152 1.15 \times 10^{152} 1 . 1 5 × 1 0 1 5 2 个可能架构的搜索空间。这个天文数字级的规模既是挑战也是机遇——它提供了找到最优架构的可能性,但也使搜索变得极其困难。
5. 资源约束的精确建模
5.1 峰值内存使用的算法计算
峰值内存使用的准确计算是μNAS的核心创新之一。算法基于以下原理:
工作集定义 :在任意时刻t,工作集W t W_t W t 包含所有必须保存在内存中的张量。这包括:
当前执行算子的输入张量
当前执行算子的输出张量
后续算子需要但尚未处理的张量
拓扑排序枚举 :对于具有分支的网络,不同的执行顺序产生不同的工作集序列。μNAS枚举所有有效的拓扑排序,计算每种排序的峰值内存使用:
PeakMemUsage ( α ) = min π ∈ Π ( α ) max t ∑ t e n s o r ∈ W t π size ( t e n s o r ) \text{PeakMemUsage}(\alpha) = \min_{\pi \in \Pi(\alpha)} \max_{t} \sum_{tensor \in W_t^\pi} \text{size}(tensor)
PeakMemUsage ( α ) = π ∈ Π ( α ) min t max t e n s o r ∈ W t π ∑ size ( t e n s o r )
其中Π ( α ) \Pi(\alpha) Π ( α ) 是架构α的所有有效拓扑排序的集合。
5.2 模型大小的量化计算
采用8位整数量化后,模型大小计算简化为:
ModelSize ( α ) = ∑ l ∈ layers ( α ) params ( l ) × 1 byte \text{ModelSize}(\alpha) = \sum_{l \in \text{layers}(\alpha)} \text{params}(l) \times 1 \text{ byte}
ModelSize ( α ) = l ∈ layers ( α ) ∑ params ( l ) × 1 byte
5.3 延迟预测模型
图2:MACs作为MCU延迟预测器的有效性验证
图2分为两部分,形成鲜明对比:
上图(GPU延迟) :展示了桌面GPU上FLOPs与实测延迟的关系,数据点分散且呈现非线性模式,延迟范围在0-10毫秒,FLOPs范围在0-400M。这种分散反映了GPU的复杂执行特性,包括并行处理、缓存效应和调度优化。
下图(MCU延迟) :展示了1000个随机采样模型在NUCLEO-H743ZI2 MCU板上的实测延迟与MACs的关系。数据点紧密围绕一条直线分布,R²=0.975的高拟合度证明了线性关系。延迟范围在0-800毫秒,MACs范围在0-80M。
这种线性关系使得延迟预测模型简化为:
Latency ( α ) ≈ k ⋅ MACs ( α ) + c \text{Latency}(\alpha) \approx k \cdot \text{MACs}(\alpha) + c
Latency ( α ) ≈ k ⋅ MACs ( α ) + c
其中k和c是通过实验确定的常数。
6. 搜索算法的设计与实现
6.1 老化进化算法
老化进化(AE)算法维护一个大小为P的种群,通过以下步骤演化:
选择 :从种群中随机采样S个架构
评估 :计算每个架构的L t ( α ) L_t(\alpha) L t ( α ) 值
变异 :对最优架构应用随机变形操作
更新 :将新架构加入种群,移除最老的架构
变形操作包括改变层数、修改通道数、调整核大小等,详见表1中的完整列表。
6.2 贝叶斯优化方法
贝叶斯优化使用高斯过程(GP)作为代理模型来近似目标函数。核函数基于最优传输定义两个神经网络之间的距离:
k ( α 1 , α 2 ) = exp ( − d O T ( α 1 , α 2 ) 2 σ 2 ) k(\alpha_1, \alpha_2) = \exp\left(-\frac{d_{OT}(\alpha_1, \alpha_2)}{2\sigma^2}\right)
k ( α 1 , α 2 ) = exp ( − 2 σ 2 d O T ( α 1 , α 2 ) )
其中d O T d_{OT} d O T 是基于最优传输的距离度量。
7. 模型压缩:结构化剪枝
7.1 DPF剪枝算法
μNAS采用DPF(Dynamic Pruning with Feedback)剪枝,基于L2范数识别和移除不重要的通道/单元:
Importance ( c i ) = ∥ w i ∥ 2 = ∑ j w i j 2 \text{Importance}(c_i) = \|\mathbf{w}_i\|_2 = \sqrt{\sum_j w_{ij}^2}
Importance ( c i ) = ∥ w i ∥ 2 = j ∑ w i j 2
其中w i \mathbf{w}_i w i 是第i个通道或单元的权重向量。
7.2 渐进式剪枝策略
剪枝在训练过程中逐步进行,目标稀疏度s t a r g e t s_{target} s t a r g e t 通过以下公式在训练周期内线性增加:
s t = s i n i t i a l + ( s t a r g e t − s i n i t i a l ) ⋅ t − t s t a r t t e n d − t s t a r t s_t = s_{initial} + (s_{target} - s_{initial}) \cdot \frac{t - t_{start}}{t_{end} - t_{start}}
s t = s i n i t i a l + ( s t a r g e t − s i n i t i a l ) ⋅ t e n d − t s t a r t t − t s t a r t
8. 实验结果的深入分析
8.1 配置比较实验
图3:不同μNAS配置的Pareto前沿比较
图3展示了在Chars74K(左)和MNIST(右)数据集上三种配置的性能:
Chars74K结果 :
错误率范围:0.10-0.50
模型大小范围:0-30000字节
AE+剪枝配置(绿色点)明显占据了最左下角的位置,表示在相同模型大小下实现了最低的错误率
纯AE(蓝色点)次之,而贝叶斯优化(橙色点)的Pareto前沿最差
MNIST结果 :
错误率范围:0.00-0.10
模型大小范围:0-8000字节
AE+剪枝在极小模型(<500字节)区域展现出卓越性能,达到了<1%的错误率
8.2 资源目标消融研究
图4:资源约束对搜索行为的影响
图4通过三个子图展示了不同约束配置下MNIST模型的分布:
左图(无模型大小约束) :
峰值内存使用集中在100-1000字节的低范围
模型大小分散在10²-10⁶字节的广泛范围
搜索被峰值内存约束主导,产生深而窄的网络
中图(无内存使用约束) :
模型大小集中在较低范围
峰值内存使用分散广泛
搜索倾向于浅而宽的架构
右图(所有约束存在) :
两个维度都展现出良好的分布
发现了多样化的权衡点
实现了资源使用和精度之间的平衡
9. 与现有方法的综合比较
表2详细比较了μNAS与现有方法在多个数据集上的表现。特别值得注意的结果包括:
MNIST :μNAS找到了仅480字节、精度99.19%的模型,相比SpArSe在相似精度下模型大小减少5.7倍。
Speech Commands :在保持95.58%精度的同时,模型大小仅37KB,峰值内存使用21.1KB,MACs仅1.1M——比RENA减少636倍的计算量。
Fashion MNIST :达到93.22%的精度,同时保持63.6KB的模型大小和12.6KB的峰值内存使用。
附录:数学推导
A. 多目标优化的Pareto最优性条件
A.1 Pareto支配关系
对于两个解α 1 , α 2 ∈ A \alpha_1, \alpha_2 \in A α 1 , α 2 ∈ A ,我们定义Pareto支配关系≺ \prec ≺ 如下:
α 1 ≺ α 2 ⇔ ∀ i : f i ( α 1 ) ≤ f i ( α 2 ) ∧ ∃ j : f j ( α 1 ) < f j ( α 2 ) \alpha_1 \prec \alpha_2 \Leftrightarrow \forall i: f_i(\alpha_1) \leq f_i(\alpha_2) \land \exists j: f_j(\alpha_1) < f_j(\alpha_2)
α 1 ≺ α 2 ⇔ ∀ i : f i ( α 1 ) ≤ f i ( α 2 ) ∧ ∃ j : f j ( α 1 ) < f j ( α 2 )
A.2 Pareto前沿的数学定义
Pareto前沿P \mathcal{P} P 定义为所有非支配解的集合:
P = { α ∈ A ∣ ∄ α ′ ∈ A : α ′ ≺ α } \mathcal{P} = \{\alpha \in A | \nexists \alpha' \in A: \alpha' \prec \alpha\}
P = { α ∈ A ∣ ∄ α ′ ∈ A : α ′ ≺ α }
A.3 随机标量化的收敛性分析
定理:在适当的条件下,随机标量化方法以概率1收敛到完整的Pareto前沿。
证明概要 :
令Λ \Lambda Λ 为所有可能的权重向量λ \lambda λ 的集合。对于Pareto前沿上的任意点α ∗ ∈ P \alpha^* \in \mathcal{P} α ∗ ∈ P ,存在权重向量λ ∗ \lambda^* λ ∗ 使得:
α ∗ = arg min α ∈ A max i { λ i ∗ f i ( α ) } \alpha^* = \arg\min_{\alpha \in A} \max_i \{\lambda_i^* f_i(\alpha)\}
α ∗ = arg α ∈ A min i max { λ i ∗ f i ( α ) }
由于我们从连续分布中采样λ \lambda λ ,随着采样次数T → ∞ T \rightarrow \infty T → ∞ :
P ( ∃ t ≤ T : ∥ λ t − λ ∗ ∥ < ϵ ) → 1 P(\exists t \leq T: \|\lambda^t - \lambda^*\| < \epsilon) \rightarrow 1
P ( ∃ t ≤ T : ∥ λ t − λ ∗ ∥ < ϵ ) → 1
因此,随机标量化方法能够以任意精度逼近Pareto前沿上的任意点。
B. 峰值内存使用的图算法
B.1 动态规划形式化
令G = ( V , E ) G = (V, E) G = ( V , E ) 为神经网络的计算图,其中V V V 是算子集合,E E E 是数据依赖关系。定义状态s = ( v , M ) s = (v, M) s = ( v , M ) ,其中v v v 是当前算子,M M M 是内存中的张量集合。
峰值内存使用的递归关系:
P M U ( s ) = max { mem ( M ∪ output ( v ) ) , max v ′ ∈ succ ( v ) P M U ( ( v ′ , M ′ ) ) } PMU(s) = \max\left\{\text{mem}(M \cup \text{output}(v)), \max_{v' \in \text{succ}(v)} PMU((v', M'))\right\}
P M U ( s ) = max { mem ( M ∪ output ( v ) ) , v ′ ∈ succ ( v ) max P M U ( ( v ′ , M ′ ) ) }
其中M ′ M' M ′ 是执行v v v 后的更新内存状态:
M ′ = ( M ∖ inputs ( v ) ) ∪ output ( v ) ∪ future_deps ( v ) M' = (M \setminus \text{inputs}(v)) \cup \text{output}(v) \cup \text{future\_deps}(v)
M ′ = ( M ∖ inputs ( v ) ) ∪ output ( v ) ∪ future_deps ( v )
B.2 分支网络的内存调度优化
对于具有分支的网络,最优执行顺序可通过以下整数线性规划(ILP)求解:
决策变量 :
x i j ∈ { 0 , 1 } x_{ij} \in \{0,1\} x i j ∈ { 0 , 1 } :算子i i i 是否在时间步j j j 执行
m j m_j m j :时间步j j j 的内存使用量
目标函数 :
min max j m j \min \max_j m_j
min j max m j
约束条件 :
每个算子恰好执行一次:∑ j x i j = 1 , ∀ i \sum_j x_{ij} = 1, \forall i ∑ j x i j = 1 , ∀ i
依赖关系:∑ k < j x i k ≥ x p j , ∀ ( p , i ) ∈ E \sum_{k<j} x_{ik} \geq x_{pj}, \forall (p,i) \in E ∑ k < j x i k ≥ x p j , ∀ ( p , i ) ∈ E
内存计算:m j = ∑ i size ( i ) ⋅ y i j m_j = \sum_i \text{size}(i) \cdot y_{ij} m j = ∑ i size ( i ) ⋅ y i j
其中y i j y_{ij} y i j 表示张量i i i 在时间j j j 是否在内存中。
C. 量化误差分析
C.1 仿射量化的数学形式
8位整数量化将浮点值r r r 映射到整数q q q :
q = round ( r s ) + z q = \text{round}\left(\frac{r}{s}\right) + z
q = round ( s r ) + z
其中s s s 是缩放因子,z z z 是零点。反量化操作:
r ^ = s ( q − z ) \hat{r} = s(q - z)
r ^ = s ( q − z )
C.2 量化误差界
量化误差ϵ = r − r ^ \epsilon = r - \hat{r} ϵ = r − r ^ 的界限:
∣ ϵ ∣ ≤ s 2 |\epsilon| \leq \frac{s}{2}
∣ ϵ ∣ ≤ 2 s
对于神经网络层f ( x ) = W x + b f(x) = Wx + b f ( x ) = W x + b ,量化后的输出误差:
∥ f ( x ) − f ^ ( x ^ ) ∥ ≤ ∥ W ∥ ⋅ ∥ ϵ x ∥ + ∥ ϵ W ∥ ⋅ ∥ x ∥ + ∥ ϵ b ∥ \|f(x) - \hat{f}(\hat{x})\| \leq \|W\| \cdot \|\epsilon_x\| + \|\epsilon_W\| \cdot \|x\| + \|\epsilon_b\|
∥ f ( x ) − f ^ ( x ^ ) ∥ ≤ ∥ W ∥ ⋅ ∥ ϵ x ∥ + ∥ ϵ W ∥ ⋅ ∥ x ∥ + ∥ ϵ b ∥
C.3 累积误差分析
对于L层网络,总误差界:
∥ output − output ^ ∥ ≤ ∑ l = 1 L ∏ k = l + 1 L ∥ W k ∥ ⋅ ϵ l \|\text{output} - \widehat{\text{output}}\| \leq \sum_{l=1}^L \prod_{k=l+1}^L \|W_k\| \cdot \epsilon_l
∥ output − output ∥ ≤ l = 1 ∑ L k = l + 1 ∏ L ∥ W k ∥ ⋅ ϵ l
这解释了为什么深度网络需要仔细的量化策略。
D. 搜索算法的理论分析
D.1 老化进化的收敛速度
假设目标函数L L L 是Lipschitz连续的,常数为L f L_f L f 。老化进化算法的期望改进率:
E [ Δ L t ] ≥ 1 P ∑ i = 1 S P ( select i ) ⋅ E [ Δ L ∣ mutate ( i ) ] \mathbb{E}[\Delta L_t] \geq \frac{1}{P} \sum_{i=1}^S P(\text{select } i) \cdot \mathbb{E}[\Delta L | \text{mutate}(i)]
E [ Δ L t ] ≥ P 1 i = 1 ∑ S P ( select i ) ⋅ E [ Δ L ∣ mutate ( i ) ]
在适当的变异率μ \mu μ 下,算法以速率O ( 1 / t ) O(1/\sqrt{t}) O ( 1 / t ) 收敛到局部最优。
D.2 贝叶斯优化的遗憾界
使用高斯过程的贝叶斯优化,其累积遗憾R T R_T R T 满足:
R T = ∑ t = 1 T ( L ( α ∗ ) − L ( α t ) ) ≤ O ( T γ T log T ) R_T = \sum_{t=1}^T (L(\alpha^*) - L(\alpha_t)) \leq O(\sqrt{T \gamma_T \log T})
R T = t = 1 ∑ T ( L ( α ∗ ) − L ( α t ) ) ≤ O ( T γ T log T )
其中γ T \gamma_T γ T 是最大信息增益,对于我们的核函数:
γ T ≤ O ( ( log T ) d + 1 ) \gamma_T \leq O((\log T)^{d+1})
γ T ≤ O ( ( log T ) d + 1 )
其中d d d 是搜索空间的有效维度。
E. 剪枝算法的理论保证
E.1 结构化剪枝的最优性
给定目标稀疏度s s s ,最优剪枝策略是保留重要性得分最高的( 1 − s ) (1-s) ( 1 − s ) 比例的通道:
C ∗ = arg max C : ∣ C ∣ = ( 1 − s ) C ∑ c ∈ C ∥ w c ∥ 2 2 \mathcal{C}^* = \arg\max_{\mathcal{C}: |\mathcal{C}|=(1-s)C} \sum_{c \in \mathcal{C}} \|\mathbf{w}_c\|_2^2
C ∗ = arg C : ∣ C ∣ = ( 1 − s ) C max c ∈ C ∑ ∥ w c ∥ 2 2
E.2 剪枝后的性能界
在适当的假设下,剪枝后的网络性能损失界:
∣ L ( α p r u n e d ) − L ( α o r i g i n a l ) ∣ ≤ O ( s ⋅ max c ∥ ∇ w c L ∥ ) |L(\alpha_{pruned}) - L(\alpha_{original})| \leq O(s \cdot \max_c \|\nabla_{\mathbf{w}_c} L\|)
∣ L ( α p r u n e d ) − L ( α o r i g i n a l ) ∣ ≤ O ( s ⋅ c max ∥ ∇ w c L ∥ )
这表明渐进式剪枝(逐步增加s s s )能够更好地保持性能。
F. 搜索空间大小的精确计算
搜索空间的总大小通过乘法原理计算:
∣ A ∣ = ∏ n = 1 10 [ 2 ⋅ ∏ m = 1 3 ( 2 ⋅ 2 ⋅ 4 ⋅ 128 ⋅ 2 ⋅ 2 ⋅ 2 ) ⋅ 2 ⋅ 3 ⋅ ∏ f = 1 3 247 ] |\mathcal{A}| = \prod_{n=1}^{10} \left[2 \cdot \prod_{m=1}^3 \left(2 \cdot 2 \cdot 4 \cdot 128 \cdot 2 \cdot 2 \cdot 2\right) \cdot 2 \cdot 3 \cdot \prod_{f=1}^3 247\right]
∣ A ∣ = n = 1 ∏ 1 0 ⎣ ⎢ ⎡ 2 ⋅ m = 1 ∏ 3 ( 2 ⋅ 2 ⋅ 4 ⋅ 1 2 8 ⋅ 2 ⋅ 2 ⋅ 2 ) ⋅ 2 ⋅ 3 ⋅ f = 1 ∏ 3 2 4 7 ⎦ ⎥ ⎤
考虑所有可能的组合,得到∣ A ∣ = 1.15 × 1 0 152 |\mathcal{A}| = 1.15 \times 10^{152} ∣ A ∣ = 1 . 1 5 × 1 0 1 5 2 。
这个庞大的搜索空间使得穷举搜索完全不可行,即使以每秒评估1 0 9 10^9 1 0 9 个架构的速度,也需要1 0 143 10^{143} 1 0 1 4 3 秒(远超宇宙年龄)才能遍历整个空间。这突出了高效搜索算法的必要性。
评论(0)