From 138fe14d41b25d1102018b0ca1f4695e9ef3cfa0 Mon Sep 17 00:00:00 2001 From: ceci3 Date: Tue, 21 Jan 2020 19:34:20 +0800 Subject: [PATCH] update init temperature and reduce rate docs for sa (#34) * update * update readme * update * update --- docs/docs/api/nas_api.md | 37 +++++++++++++++++++-------------- docs/docs/tutorials/nas_demo.md | 9 ++++---- docs/mkdocs.yml | 2 +- paddleslim/nas/sa_nas.py | 2 +- 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/docs/docs/api/nas_api.md b/docs/docs/api/nas_api.md index 573afd7e211f5..257e19b5ff9c5 100644 --- a/docs/docs/api/nas_api.md +++ b/docs/docs/api/nas_api.md @@ -3,27 +3,23 @@ **参数:** -- **input_size(int|None)**:- `input_size`表示输入feature map的大小。 -- **output_size(int|None)**:- `output_size`表示输出feature map的大小。 +- **input_size(int|None)**:- `input_size`表示输入feature map的大小。`input_size`和`output_size`用来计算整个模型结构中下采样次数。 +- **output_size(int|None)**:- `output_size`表示输出feature map的大小。`input_size`和`output_size`用来计算整个模型结构中下采样次数。 - **block_num(int|None)**:- `block_num`表示搜索空间中block的数量。 -- **block_mask(list|None)**:- `block_mask`是一组由0、1组成的列表,0表示当前block是normal block,1表示当前block是reduction block。如果设置了`block_mask`,则主要以`block_mask`为主要配置,`input_size`,`output_size`和`block_num`三种配置是无效的。 - - -Note:
-1. reduction block表示经过这个block之后的feature map大小下降为之前的一半,normal block表示经过这个block之后feature map大小不变。
-2. `input_size`和`output_size`用来计算整个模型结构中reduction block数量。 +- **block_mask(list|None)**:- `block_mask`是一组由0、1组成的列表,0表示当前block是normal block,1表示当前block是reduction block。reduction block表示经过这个block之后的feature map大小下降为之前的一半,normal block表示经过这个block之后feature map大小不变。如果设置了`block_mask`,则主要以`block_mask`为主要配置,`input_size`,`output_size`和`block_num`三种配置是无效的。 ## SANAS -paddleslim.nas.SANAS(configs, server_addr=("", 8881), init_temperature=100, reduce_rate=0.85, search_steps=300, save_checkpoint='./nas_checkpoint', load_checkpoint=None, is_server=True)[源代码](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/paddleslim/nas/sa_nas.py#L36) +paddleslim.nas.SANAS(configs, server_addr=("", 8881), init_temperature=None, reduce_rate=0.85, init_tokens=None, search_steps=300, save_checkpoint='./nas_checkpoint', load_checkpoint=None, is_server=True)[源代码](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/paddleslim/nas/sa_nas.py#L36) : SANAS(Simulated Annealing Neural Architecture Search)是基于模拟退火算法进行模型结构搜索的算法,一般用于离散搜索任务。 **参数:** -- **configs(list)** - 搜索空间配置列表,格式是`[(key, {input_size, output_size, block_num, block_mask})]`或者`[(key)]`(MobileNetV2、MobilenetV1和ResNet的搜索空间使用和原本网络结构相同的搜索空间,所以仅需指定`key`即可), `input_size` 和`output_size`表示输入和输出的特征图的大小,`block_num`是指搜索网络中的block数量,`block_mask`是一组由0和1组成的列表,0代表不进行下采样的block,1代表下采样的block。 更多paddleslim提供的搜索空间配置可以参考。 +- **configs(list)** - 搜索空间配置列表,格式是`[(key, {input_size, output_size, block_num, block_mask})]`或者`[(key)]`(MobileNetV2、MobilenetV1和ResNet的搜索空间使用和原本网络结构相同的搜索空间,所以仅需指定`key`即可), `input_size` 和`output_size`表示输入和输出的特征图的大小,`block_num`是指搜索网络中的block数量,`block_mask`是一组由0和1组成的列表,0代表不进行下采样的block,1代表下采样的block。 更多paddleslim提供的搜索空间配置可以参考[Search Space](../search_space.md)。 - **server_addr(tuple)** - SANAS的地址,包括server的ip地址和端口号,如果ip地址为None或者为""的话则默认使用本机ip。默认:("", 8881)。 -- **init_temperature(float)** - 基于模拟退火进行搜索的初始温度。默认:100。 -- **reduce_rate(float)** - 基于模拟退火进行搜索的衰减率。默认:0.85。 +- **init_temperature(float)** - 基于模拟退火进行搜索的初始温度。如果init_template为None而且init_tokens为None,则默认初始温度为10.0,如果init_template为None且init_tokens不为None,则默认初始温度为1.0。详细的温度设置可以参考下面的Note。默认:None。 +- **reduce_rate(float)** - 基于模拟退火进行搜索的衰减率。详细的退火率设置可以参考下面的Note。默认:0.85。 +- **init_tokens(list|None)** - 初始化token,若init_tokens为空,则SA算法随机生成初始化tokens。默认:None。 - **search_steps(int)** - 搜索过程迭代的次数。默认:300。 - **save_checkpoint(str|None)** - 保存checkpoint的文件目录,如果设置为None的话则不保存checkpoint。默认:`./nas_checkpoint`。 - **load_checkpoint(str|None)** - 加载checkpoint的文件目录,如果设置为None的话则不加载checkpoint。默认:None。 @@ -39,12 +35,21 @@ config = [('MobileNetV2Space')] sanas = SANAS(config=config) ``` +!!! note "Note" + - 初始化温度和退火率的意义:
+ - SA算法内部会保存一个基础token(初始化token可以自己传入也可以随机生成)和基础score(初始化score为-1),下一个token会在当前SA算法保存的token的基础上产生。在SA的搜索过程中,如果本轮的token训练得到的score大于SA算法中保存的score,则本轮的token一定会被SA算法接收保存为下一轮token产生的基础token。
+ - 初始温度越高表示SA算法当前处的阶段越不稳定,本轮的token训练得到的score小于SA算法中保存的score的话,本轮的token和score被SA算法接收的可能性越大。
+ - 初始温度越低表示SA算法当前处的阶段越稳定,本轮的token训练得到的score小于SA算法中保存的score的话,本轮的token和score被SA算法接收的可能性越小。
+ - 退火率越大,表示SA算法收敛的越慢,即SA算法越慢到稳定阶段。
+ - 退火率越低,表示SA算法收敛的越快,即SA算法越快到稳定阶段。
-paddlesim.nas.SANAS.tokens2arch(tokens) -: 通过一组token得到实际的模型结构,一般用来把搜索到最优的token转换为模型结构用来做最后的训练。 + - 初始化温度和退火率的设置:
+ - 如果原本就有一个较好的初始化token,想要基于这个较好的token来进行搜索的话,SA算法可以处于一个较为稳定的状态进行搜索r这种情况下初始温度可以设置的低一些,例如设置为1.0,退火率设置的大一些,例如设置为0.85。如果想要基于这个较好的token利用贪心算法进行搜索,即只有当本轮token训练得到的score大于SA算法中保存的score,SA算法才接收本轮token,则退火率可设置为一个极小的数字,例如设置为0.85 ** 10。
+ - 初始化token如果是随机生成的话,代表初始化token是一个比较差的token,SA算法可以处于一种不稳定的阶段进行搜索,尽可能的随机探索所有可能得token,从而找到一个较好的token。初始温度可以设置的高一些,例如设置为1000,退火率相对设置的小一些。 -Note:
-tokens是一个列表,token映射到搜索空间转换成相应的网络结构,一组token对应唯一的一个网络结构。 + +paddlesim.nas.SANAS.tokens2arch(tokens) +: 通过一组token得到实际的模型结构,一般用来把搜索到最优的token转换为模型结构用来做最后的训练。tokens的形式是一个列表,tokens映射到搜索空间转换成相应的网络结构,一组token对应唯一的一个网络结构。 **参数:** diff --git a/docs/docs/tutorials/nas_demo.md b/docs/docs/tutorials/nas_demo.md index e6ae97bc1a86f..0116618e25361 100644 --- a/docs/docs/tutorials/nas_demo.md +++ b/docs/docs/tutorials/nas_demo.md @@ -3,11 +3,12 @@ 本示例介绍如何使用网络结构搜索接口,搜索到一个更小或者精度更高的模型,该文档仅介绍paddleslim中SANAS的使用及如何利用SANAS得到模型结构,完整示例代码请参考sa_nas_mobilenetv2.py或者block_sa_nas_mobilenetv2.py。 ## 接口介绍 -请参考。 +请参考神经网络搜索API介绍。 ### 1. 配置搜索空间 -详细的搜索空间配置可以参考神经网络搜索API文档。 -```python + +详细的搜索空间配置可以参考搜索空间。 +``` config = [('MobileNetV2Space')] ``` @@ -53,7 +54,7 @@ with fluid.program_guard(train_program, startup_program): test_program = train_program.clone(for_test=True) sgd = fluid.optimizer.SGD(learning_rate=1e-3) sgd.minimize(avg_cost) - + ``` ### 5. 根据构造的训练program添加限制条件 diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 6013bd378cba2..247f2e7050cfa 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -8,6 +8,7 @@ nav: - 量化训练: tutorials/quant_aware_demo.md - Embedding量化: tutorials/quant_embedding_demo.md - SA搜索: tutorials/nas_demo.md + - 搜索空间: search_space.md - 知识蒸馏: tutorials/distillation_demo.md - API: - 量化: api/quantization_api.md @@ -15,7 +16,6 @@ nav: - 模型分析: api/analysis_api.md - 知识蒸馏: api/single_distiller_api.md - SA搜索: api/nas_api.md - - 搜索空间: search_space.md - 硬件延时评估表: table_latency.md - 算法原理: algo/algo.md diff --git a/paddleslim/nas/sa_nas.py b/paddleslim/nas/sa_nas.py index 754bace99f8e0..85299df3ffa96 100644 --- a/paddleslim/nas/sa_nas.py +++ b/paddleslim/nas/sa_nas.py @@ -114,7 +114,7 @@ def __init__(self, range_table, self._reduce_rate, self._init_temperature, - max_try_times=500, + max_try_times=50000, init_tokens=preinit_tokens, reward=prereward, max_reward=premax_reward,