3.6 基于随机搜索的策略


文档摘要

3.6 基于随机搜索的策略 第三章:NAS 的核心要素:搜索策略 - 3.6 基于随机搜索的策略 在神经网络架构搜索 (NAS) 的浩瀚星空中,搜索策略如同指引星舰航向的导航仪,决定了我们如何在广阔的架构空间中高效、精准地寻觅到性能卓越的神经网络。前文我们已经探讨了 NAS 的重要性以及搜索空间和性能评估策略,现在,让我们聚焦于搜索策略的核心—— 3.6 基于随机搜索的策略。 如果将 NAS 比作一场寻宝游戏,那么搜索空间就是藏宝图所描绘的广阔地域,性能评估策略则是我们判断宝藏价值的标尺。而搜索策略,则是我们在这片地域上探索的路线图。在众多搜索策略中,随机搜索 (Random Search, RS) 犹如一位看似漫不经心、实则蕴含哲理的探险家。

3.6 基于随机搜索的策略

第三章:NAS 的核心要素:搜索策略 - 3.6 基于随机搜索的策略

在神经网络架构搜索 (NAS) 的浩瀚星空中,搜索策略如同指引星舰航向的导航仪,决定了我们如何在广阔的架构空间中高效、精准地寻觅到性能卓越的神经网络。前文我们已经探讨了 NAS 的重要性以及搜索空间和性能评估策略,现在,让我们聚焦于搜索策略的核心—— 3.6 基于随机搜索的策略

如果将 NAS 比作一场寻宝游戏,那么搜索空间就是藏宝图所描绘的广阔地域,性能评估策略则是我们判断宝藏价值的标尺。而搜索策略,则是我们在这片地域上探索的路线图。在众多搜索策略中,随机搜索 (Random Search, RS) 犹如一位看似漫不经心、实则蕴含哲理的探险家。它摒弃了复杂的规划和精密的计算,仅仅依靠“随机”这一朴素而强大的力量,在架构空间中自由探索。

3.6.1 随机搜索:大道至简的探索哲学

随机搜索,顾名思义,是一种完全依赖随机性的搜索策略。在 NAS 的语境下,它意味着我们从预定义的搜索空间中,随机地抽取神经网络架构,并对其进行性能评估,然后重复这一过程,直到达到预定的搜索预算或找到满意的架构为止。

这种策略乍看之下似乎过于简单粗暴,甚至显得有些“不负责任”。毕竟,在充斥着梯度下降、强化学习、进化算法等复杂精巧策略的 NAS 领域,随机搜索就像一位手持木棍、信步闲庭的旅者,与那些驾驶着精密仪器、规划着最优路径的探险队形成了鲜明对比。

然而,正是这种“大道至简”的哲学,赋予了随机搜索独特的魅力和价值。它如同自然界的进化过程,看似随机的变异,却在环境的选择压力下,孕育出了无数令人惊叹的生命奇迹。在 NAS 领域,随机搜索同样展现出了令人意想不到的有效性,并在某些情况下,甚至能够与更为复杂的搜索策略相媲美。

3.6.2 随机搜索在 NAS 中的具体流程

为了更清晰地理解随机搜索在 NAS 中的运作方式,我们可以借助流程图来可视化其具体步骤:

流程解读:

  1. 定义搜索空间 (Define Search Space): 这是 NAS 的第一步,也是随机搜索的基础。我们需要预先定义一个包含所有可能神经网络架构的搜索空间。这个搜索空间可以是离散的(例如,预定义网络层类型和连接方式),也可以是连续的(例如,网络层参数的取值范围)。搜索空间的合理性直接影响到随机搜索的效率和最终结果。
  2. 随机抽样架构 (Randomly Sample Architecture): 这是随机搜索的核心步骤。我们从预定义的搜索空间中,均匀非均匀地随机抽取一个神经网络架构。抽样方式的选择取决于搜索空间的特性和先验知识。例如,如果搜索空间中不同类型的架构数量差异很大,我们可以采用非均匀抽样,以增加抽样到稀有但可能高性能架构的概率。
  3. 评估架构性能 (Evaluate Architecture Performance): 对于抽样得到的架构,我们需要对其进行性能评估。这通常包括在训练数据集上训练该架构,并在验证数据集上评估其性能指标,例如准确率、损失值、延迟等。性能评估策略的选择至关重要,它直接影响到我们对架构优劣的判断。在随机搜索中,我们通常采用与最终目标任务一致的性能评估策略,以确保搜索结果的实用性。
  4. 达到搜索预算? (Reach Search Budget?): 随机搜索通常会预设一个搜索预算,例如搜索次数、计算资源消耗等。每次评估完一个架构的性能后,我们需要判断是否达到了搜索预算。
  5. 选择最佳架构 (Select Best Architecture): 如果达到了搜索预算,我们则从所有已评估的架构中,选择性能最佳的架构作为最终搜索结果。性能最佳的定义取决于具体的任务和需求,可以是验证集准确率最高、延迟最低等。
  6. 结束 (End): 搜索过程结束,输出最佳架构。

如果未达到搜索预算,则返回步骤 2,继续随机抽样和评估新的架构。这个过程不断循环,直到满足搜索预算或找到令人满意的架构。

3.6.3 随机搜索的优势:简单、高效、并行

尽管随机搜索看似简单,但它却拥有许多其他复杂搜索策略难以比拟的优势:

  • 简单易实现 (Simplicity and Ease of Implementation): 随机搜索的算法逻辑极其简单,几乎不需要复杂的数学推导和编程技巧。它只需要一个随机数生成器和一个性能评估模块即可实现。这使得随机搜索成为 NAS 领域中最容易上手和实现的搜索策略之一。对于研究人员和工程师来说,快速搭建和验证 NAS 系统,随机搜索无疑是一个理想的起点。
  • 天然的并行性 (Natural Parallelism): 随机搜索的每次架构评估都是相互独立的,这意味着我们可以轻松地将架构评估过程并行化。我们可以同时在多个计算设备上评估不同的随机抽样架构,从而大幅缩短搜索时间。这对于计算资源有限的研究团队来说,尤其具有吸引力。
  • 避免局部最优 (Avoid Local Optima): 相比于基于梯度或模型的搜索策略,随机搜索在架构空间中进行全局探索,不易陷入局部最优解。由于其完全的随机性,它更有可能跳出性能平 plateau,发现一些意想不到的高性能架构。尤其在复杂、非凸的架构搜索空间中,随机搜索的全局探索能力可能成为其超越其他策略的关键。
  • 强大的基线 (Strong Baseline): 随机搜索作为最简单的搜索策略,成为了 NAS 领域中一个重要的基线方法。任何新的 NAS 策略都需要与随机搜索进行比较,以证明其有效性和优越性。如果一种新的复杂策略的性能提升甚至不如随机搜索,那么就很难证明其价值。因此,随机搜索在 NAS 研究中扮演着“试金石”的角色。
  • 出人意料的有效性 (Surprisingly Effective): 在一些研究中,随机搜索甚至展现出了令人惊讶的有效性。例如,Bergstra 和 Bengio 在 2012 年的经典论文 "Random Search for Hyper-Parameter Optimization" 中指出,在超参数优化任务中,随机搜索在某些情况下甚至优于网格搜索和人工调参。在 NAS 领域,也有研究表明,在某些特定的搜索空间和任务上,随机搜索能够找到与更复杂的搜索策略性能相当甚至更优的架构。

3.6.4 随机搜索的局限性:低效、盲目、浪费

然而,随机搜索并非完美无缺,其固有的随机性也带来了一些难以克服的局限性:

  • 效率低下 (Inefficiency): 随机搜索是一种典型的“蛮力”搜索方法。它没有利用任何关于架构空间和性能的先验知识,仅仅依靠大量的随机抽样和评估来寻找最优架构。在庞大的架构空间中,随机搜索的效率往往非常低下。为了找到一个高性能的架构,可能需要评估大量的低性能架构,造成计算资源的浪费。
  • 缺乏指导性 (Lack of Guidance): 随机搜索是一种完全盲目的搜索策略。它在搜索过程中没有任何指导信息,无法利用已评估架构的性能反馈来指导后续的搜索方向。这使得随机搜索的探索过程缺乏目的性,如同大海捞针,效率低下。
  • 难以找到最优解 (Difficulty in Finding Optimal Solution): 在复杂的架构空间中,最优架构往往只是沧海一粟。随机搜索依靠纯粹的概率来命中最优解,其概率随着搜索空间维度的增加和最优解密度的降低而迅速减小。因此,随机搜索很难保证找到真正的全局最优解,甚至可能连局部最优解都难以稳定找到。
  • 计算成本高昂 (High Computational Cost): 为了弥补效率低下的缺陷,随机搜索通常需要进行大量的架构评估。而每次架构评估都需要进行神经网络的训练和验证,这本身就是一个计算密集型的过程。因此,随机搜索的总计算成本往往非常高昂,尤其是在需要进行长时间训练和大规模搜索的情况下。
  • 可能重复评估低性能架构 (Potential Redundant Evaluations): 由于随机抽样的特性,随机搜索可能会重复抽样和评估相同的或非常相似的低性能架构,造成不必要的计算资源浪费。尤其是在搜索空间存在冗余的情况下,这个问题会更加突出。

3.6.5 何时选择随机搜索?随机搜索的适用场景

尽管存在诸多局限性,随机搜索在某些特定场景下仍然具有其独特的价值和适用性:

  • 小规模搜索空间 (Small Search Space): 当搜索空间规模较小时,随机搜索的效率相对较高。例如,在一些简单的网络结构或超参数优化问题中,随机搜索可能能够在合理的计算资源预算内找到满意的解。
  • 探索性研究的早期阶段 (Early Stage of Exploratory Research): 在 NAS 研究的早期阶段,当我们对搜索空间和架构性能的先验知识匮乏时,随机搜索可以作为一种快速探索和初步了解搜索空间特性的工具。通过随机搜索,我们可以快速获得一些初步的性能数据,为后续更精细的搜索策略提供参考。
  • 作为基线方法进行对比 (Baseline Comparison): 如前所述,随机搜索是 NAS 领域重要的基线方法。在评估新的 NAS 策略时,我们需要将其与随机搜索进行比较,以验证其有效性和优越性。
  • 计算资源极其有限的场景 (Extremely Limited Computational Resources): 当计算资源极其有限,无法支持复杂的搜索策略时,随机搜索凭借其简单性和并行性,仍然可以作为一种可行的选择。虽然可能无法找到最优解,但至少可以快速找到一些性能尚可的架构。
  • 对搜索结果的随机性要求不高的场景 (Scenarios with Low Demands on Search Result Randomness): 在某些应用场景下,我们对搜索结果的随机性要求不高,只要能够找到一个性能满足要求的架构即可。此时,随机搜索的随机性反而成为一种优势,可以避免陷入局部最优,发现一些意想不到的架构。

3.6.6 随机搜索的改进与变体:在随机中寻求效率

为了克服随机搜索的局限性,研究人员也提出了一些改进和变体方法,旨在在保持随机搜索简单性的同时,提升其效率和性能:

  • 引导式随机搜索 (Guided Random Search): 这种方法在随机搜索的基础上,引入了一些启发式信息或先验知识,来引导随机抽样的方向。例如,可以根据已评估架构的性能,调整抽样分布,增加抽样到高性能架构附近的概率。或者,可以利用一些领域知识,例如网络深度、宽度等对性能的影响,来设计更有效的抽样策略。
  • 自适应随机搜索 (Adaptive Random Search): 这种方法在搜索过程中,根据已评估架构的性能反馈,动态调整搜索策略。例如,可以根据性能反馈,动态调整搜索空间的范围或抽样分布,以更有效地探索有希望的区域。
  • 多保真度随机搜索 (Multi-Fidelity Random Search): 为了降低架构评估的计算成本,多保真度随机搜索采用不同保真度的性能评估方法。例如,可以先使用低保真度的评估方法(例如,在少量数据上训练或训练较少 epoch)快速筛选掉一些低性能架构,然后再对剩余架构进行高保真度的评估。这种方法可以在保证搜索效率的同时,尽可能保留高性能架构。
  • 重启随机搜索 (Restarted Random Search): 为了克服随机搜索容易陷入局部最优的缺点,重启随机搜索采用多次独立的随机搜索过程。每次搜索过程都从头开始,并在不同的随机种子下进行。最终,从所有搜索结果中选择最佳架构。这种方法通过增加搜索的多样性,提高找到全局最优解的概率。

3.6.7 案例分析:随机搜索在 NAS 领域的应用

尽管随机尽管随机搜索看起来简单,但它在 NAS 领域已经有了许多成功的应用案例,以下列举几个例子:

  • NASNet 的早期探索: 在 NASNet 的早期研究中,研究人员使用了随机搜索作为初步探索搜索空间的手段。通过随机搜索,他们对不同的卷积单元结构进行了评估,并从中发现了具有潜力的架构模块。这些模块随后被用于构建更大规模的 NASNet 模型。虽然最终 NASNet 使用了更复杂的强化学习方法进行搜索,但随机搜索为其奠定了基础。
  • 超参数优化: 随机搜索在神经网络的超参数优化方面应用广泛。在 NAS 的上下文中,一些研究将网络架构的某些部分(例如,层数、滤波器大小等)视为超参数,并使用随机搜索来优化这些参数。例如,可以随机搜索卷积神经网络的层数、卷积核大小、学习率等超参数,以找到最佳的网络配置。
  • 轻量级 NAS: 在一些对计算资源和模型大小有严格限制的场景下,随机搜索被用于搜索轻量级的神经网络架构。由于随机搜索的简单性和并行性,它可以快速生成大量的候选架构,并在有限的计算资源下进行评估,从而找到满足性能和资源约束的轻量级模型。
  • 作为对比基准: 几乎所有的 NAS 研究都会将随机搜索作为对比基准。新的 NAS 算法必须能够显著优于随机搜索才能被认为是成功的。例如,DARTS、ENAS 等先进的 NAS 算法,都在论文中与随机搜索进行了对比,以证明其优越性。

3.6.8 代码示例:用 Python 实现简单的随机搜索

为了更好地理解随机搜索的实现方式,我们提供一个简单的 Python 代码示例,演示如何在 NAS 中使用随机搜索。

import random # 定义搜索空间 search_space = { 'num_layers': [2, 3, 4, 5], # 网络层数 'filters': [32, 64, 128, 256], # 滤波器数量 'kernel_size': [3, 5, 7], # 卷积核大小 'learning_rate': [0.001, 0.01, 0.1] # 学习率 } # 定义评估函数 (这里用一个简单的模拟函数) def evaluate_architecture(architecture): # 模拟训练和验证过程 # 根据架构参数计算一个简单的性能指标 (例如,准确率) accuracy = random.random() # 随机生成一个准确率 return accuracy # 随机搜索 def random_search(search_space, num_trials): best_architecture = None best_accuracy = 0.0 for i in range(num_trials): # 随机抽样一个架构 architecture = { 'num_layers': random.choice(search_space['num_layers']), 'filters': random.choice(search_space['filters']), 'kernel_size': random.choice(search_space['kernel_size']), 'learning_rate': random.choice(search_space['learning_rate']) } # 评估架构性能 accuracy = evaluate_architecture(architecture) print(f"Trial {i+1}: Architecture = {architecture}, Accuracy = {accuracy}") # 更新最佳架构 if accuracy > best_accuracy: best_accuracy = accuracy best_architecture = architecture print("\nBest Architecture:", best_architecture) print("Best Accuracy:", best_accuracy) # 设置搜索参数 num_trials = 10 # 搜索次数 # 运行随机搜索 random_search(search_space, num_trials)

代码解释:

  1. search_space: 定义了搜索空间,包含了网络层数、滤波器数量、卷积核大小和学习率等超参数的取值范围。

  2. evaluate_architecture(architecture): 定义了评估函数,用于评估一个给定架构的性能。在这个示例中,我们使用一个简单的模拟函数,随机生成一个准确率作为性能指标。在实际应用中,需要替换成真实的训练和验证过程。

  3. random_search(search_space, num_trials): 定义了随机搜索函数,用于执行随机搜索过程。它首先初始化最佳架构和最佳准确率,然后循环执行以下步骤 num_trials 次:

    • 随机抽样一个架构:从搜索空间中随机选择每个超参数的取值。
    • 评估架构性能:调用 evaluate_architecture 函数评估该架构的性能。
    • 更新最佳架构:如果当前架构的性能优于最佳架构,则更新最佳架构和最佳准确率。
  4. 设置搜索参数: 设置搜索次数 num_trials

  5. 运行随机搜索: 调用 random_search 函数运行随机搜索过程。

运行结果示例:

Trial 1: Architecture = {'num_layers': 4, 'filters': 64, 'kernel_size': 5, 'learning_rate': 0.01}, Accuracy = 0.8765 Trial 2: Architecture = {'num_layers': 3, 'filters': 128, 'kernel_size': 3, 'learning_rate': 0.1}, Accuracy = 0.2345 Trial 3: Architecture = {'num_layers': 5, 'filters': 32, 'kernel_size': 7, 'learning_rate': 0.001}, Accuracy = 0.9876 Trial 4: Architecture = {'num_layers': 2, 'filters': 256, 'kernel_size': 5, 'learning_rate': 0.01}, Accuracy = 0.5678 Trial 5: Architecture = {'num_layers': 4, 'filters': 128, 'kernel_size': 3, 'learning_rate': 0.1}, Accuracy = 0.1234 Trial 6: Architecture = {'num_layers': 3, 'filters': 64, 'kernel_size': 7, 'learning_rate': 0.001}, Accuracy = 0.7890 Trial 7: Architecture = {'num_layers': 5, 'filters': 256, 'kernel_size': 5, 'learning_rate': 0.01}, Accuracy = 0.3456 Trial 8: Architecture = {'num_layers': 2, 'filters': 32, 'kernel_size': 3, 'learning_rate': 0.1}, Accuracy = 0.6789 Trial 9: Architecture = {'num_layers': 4, 'filters': 128, 'kernel_size': 7, 'learning_rate': 0.001}, Accuracy = 0.4567 Trial 10: Architecture = {'num_layers': 3, 'filters': 64, 'kernel_size': 5, 'learning_rate': 0.01}, Accuracy = 0.8901 Best Architecture: {'num_layers': 5, 'filters': 32, 'kernel_size': 7, 'learning_rate': 0.001} Best Accuracy: 0.9876

这个代码示例展示了随机搜索的基本流程。在实际应用中,需要根据具体的任务和搜索空间,修改搜索空间、评估函数和搜索参数。

3.6.9 总结:随机搜索的价值与局限

随机搜索作为一种简单而强大的搜索策略,在 NAS 领域扮演着重要的角色。它具有简单易实现、天然的并行性、避免局部最优等优点,但也存在效率低下、缺乏指导性、计算成本高昂等局限性。

随机搜索的价值在于:

  • 提供了一个简单有效的基线方法,用于评估其他 NAS 策略的性能。
  • 在小规模搜索空间或探索性研究的早期阶段,可以快速找到一些性能尚可的架构。
  • 凭借其并行性,可以在计算资源有限的场景下进行搜索。

随机搜索的局限性在于:

  • 在庞大的架构空间中,效率非常低下,难以找到全局最优解。
  • 缺乏指导性,无法利用已评估架构的性能反馈来指导后续的搜索方向。
  • 计算成本高昂,需要大量的计算资源才能获得较好的搜索结果。

因此,在选择搜索策略时,需要根据具体的任务、搜索空间和计算资源等因素,综合考虑随机搜索的优缺点,并选择最合适的策略。对于复杂的 NAS 问题,通常需要采用更高级的搜索策略,例如基于梯度、基于进化算法或基于强化学习的方法。然而,随机搜索仍然是理解 NAS 搜索策略的重要一步,也是评估新策略的基准。

总而言之,随机搜索是 NAS 领域中一个不可或缺的组成部分,它既是简单的起点,也是评估复杂策略的标尺。理解随机搜索的原理和应用,对于深入理解 NAS 的本质和发展趋势至关重要。


发布者: 作者: 转发
评论区 (0)
U