.. role:: raw-html(raw)
:format: html
搜索空间
============
概述
--------
在 NNI 中,Tuner 会根据搜索空间来取样生成参数和网络架构。搜索空间通过 JSON 文件来定义。
要定义搜索空间,需要定义变量名称、采样策略的类型及其参数。
* 搜索空间示例如下:
.. code-block:: yaml
{
"dropout_rate": {"_type": "uniform", "_value": [0.1, 0.5]},
"conv_size": {"_type": "choice", "_value": [2, 3, 5, 7]},
"hidden_size": {"_type": "choice", "_value": [124, 512, 1024]},
"batch_size": {"_type": "choice", "_value": [50, 250, 500]},
"learning_rate": {"_type": "uniform", "_value": [0.0001, 0.1]}
}
将第一行作为示例。 ``dropout_rate`` 定义了一个变量,先验分布为均匀分布,范围从 ``0.1`` 到 ``0.5``。
注意:搜索空间中可用的取样策略取决于要使用的 Tuner 。 此处列出了内置 Tuner 所支持的类型。 对于自定义的 Tuner,不必遵循这些约定,可使用任何的类型。
类型
-----
所有采样策略和参数如下:
*
``{"_type": "choice", "_value": options}``
* 变量值为 options 中之一。 这里的 ``options`` 应该是字符串或数值的列表。 可将任意对象(如子数组,数字与字符串的混合值或者空值)存入此数组中,但可能会产生不可预料的行为。
* ``options`` 也可以是嵌套的子搜索空间。此子搜索空间仅在相应的元素选中后才起作用。 该子搜索空间中的变量可看作是条件变量。 :githublink:`嵌套搜索空间定义的简单示例 `。 如果选项列表中的元素是 dict,则它是一个子搜索空间,对于内置的 Tuner,必须在此 dict 中添加键 ``_name``,这有助于标识选中的元素。 相应的,这是从 NNI 中获得的嵌套搜索空间定义的 :githublink:`示例 ` 。 参见下表了解支持嵌套搜索空间的 Tuner 。
*
``{"_type": "randint", "_value": [lower, upper]}``
* 从 ``lower`` (包含) 到 ``upper`` (不包含) 中选择一个随机整数。
* 注意:不同 Tuner 可能对 ``randint`` 有不同的实现。 一些 Tuner(例如,TPE,GridSearch)将从低到高无序选择,
而其它一些(例如,SMAC)则有顺序。 如果希望所有 Tuner 都有序,
可使用 ``quniform`` 并设置 ``q=1``。
*
``{"_type": "uniform", "_value": [low, high]}``
* 变量值在 low 和 high 之间均匀采样。
* 当优化时,此变量值会在两侧区间内。
*
``{"_type": "quniform", "_value": [low, high, q]}``
* 变量值为 ``clip(round(uniform(low, high) / q) * q, low, high)``,clip 操作用于约束生成值的边界。 例如,``_value`` 为 [0, 10, 2.5],可取的值为 [0, 2.5, 5.0, 7.5, 10.0]; ``_value`` 为 [2, 10, 5],可取的值为 [2, 5, 10]。
* 适用于离散,同时反映了某种"平滑"的数值,但上下限都有限制。 如果需要从范围 [low, high] 中均匀选择整数,可以如下定义 ``_value``:``[low, high, 1]``。
*
``{"_type": "loguniform", "_value": [low, high]}``
* 变量值在范围 [low, high] 中是 loguniform 分布,如 exp(uniform(log(low), log(high))),因此返回值是对数均匀分布的。
* 当优化时,此变量必须是正数。
*
``{"_type": "qloguniform", "_value": [low, high, q]}``
* 变量值为 ``clip(round(loguniform(low, high) / q) * q, low, high)``,clip 操作用于约束生成值的边界。
* 适用于值是“平滑”的离散变量,但上下限均有限制。
*
``{"_type": "normal", "_value": [mu, sigma]}``
* 变量值为实数,且为正态分布,均值为 mu,标准方差为 sigma。 优化时,此变量不受约束。
*
``{"_type": "qnormal", "_value": [mu, sigma, q]}``
* 变量的值由 ``round(normal(mu, sigma) / q) * q`` 确定。
* 适用于在 mu 周围的离散变量,且没有上下限限制。
*
``{"_type": "lognormal", "_value": [mu, sigma]}``
* 变量值为 ``exp(normal(mu, sigma))`` 分布,范围值是对数的正态分布。 当优化时,此变量必须是正数。
*
``{"_type": "qlognormal", "_value": [mu, sigma, q]}``
* 变量的值由 ``round(exp(normal(mu, sigma)) / q) * q`` 确定。
* 适用于值是“平滑”的离散变量,但某一边有界。
每种 Tuner 支持的搜索空间类型
------------------------------------------
.. list-table::
:header-rows: 1
:widths: auto
* -
- choice
- choice(nested)
- randint
- uniform
- quniform
- loguniform
- qloguniform
- normal
- qnormal
- lognormal
- qlognormal
* - TPE Tuner
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
* - Random Search Tuner
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
* - Anneal Tuner
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
* - Evolution Tuner
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
* - SMAC Tuner
- :raw-html:`✓`
-
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
-
-
-
-
-
* - Batch Tuner
- :raw-html:`✓`
-
-
-
-
-
-
-
-
-
-
* - Grid Search Tuner
- :raw-html:`✓`
-
- :raw-html:`✓`
-
- :raw-html:`✓`
-
-
-
-
-
-
* - Hyperband Advisor
- :raw-html:`✓`
-
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
* - Metis Tuner
- :raw-html:`✓`
-
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
-
-
-
-
-
-
* - GP Tuner
- :raw-html:`✓`
-
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
- :raw-html:`✓`
-
-
-
-
已知的局限:
*
GP Tuner 和 Metis Tuner 的搜索空间只支持 **数值**,(**choice** 类型在其它 Tuner 中可以使用非数值, 如:字符串等)。 GP Tuner 和 Metis Tuner 都使用了高斯过程的回归(Gaussian Process Regressor, GPR)。 GPR 基于计算不同点距离的和函数来进行预测,其无法计算非数值值的距离。
*
请注意,对于嵌套搜索空间:
* 只有 随机搜索/TPE/Anneal/Evolution Tuner/Grid Search 支持嵌套搜索空间