深度学习自动调参之NNI样例分析

作者

  • DeamoV
  • 变身的大恶魔
  • 张博涵
    在之前的博文中介绍了 NNI 与其他自动机器学习工具的比较,NNI 的安装和使用等内容,这篇文章你将看到:
  • 如何修改 NNI 官方的 mnist-annotation 例子的配置文件;
  • 官方例子支持的 Tuner 介绍;
  • 各个 Tuner 的训练结果以及结果分析。

一、配置文件

将 NNI 项目 clone 到本地,进入到目录 ~/nni/examples/trials/mnist-annotation ,NNI 有两种配置方式,分别为 Annotation 和 Assessor,nni 官方给的例子是用 Annotation 的配置方式(Assessor 可参见官方 experiment 配置参考文档),配置文件 config.yml 默认参数配置如下:

authorName: default
# authorName 是创建 Experiment 的作者。(你自己的名字 o(* ̄▽ ̄*) ブ)

experimentName: example_mnist
# experimentName 是 Experiment 的名称。
trialConcurrency: 1

#    **trialConcurrency** 定义了并行运行的 trails 的数量。
#    注意:如果 trialGpuNum 大于空闲的 GPU 数量,Trial 任务会被放入队列,等待分配 GPU 资源。

maxExecDuration: 1h
# maxExecDuration 定义 Experiment 执行的最长时间。时间单位:{**s**, **m**, **h**, **d**},分别代表:{*seconds*, *minutes*, *hours*, *days*}。
#    注意:maxExecDuration 设置的是 Experiment 执行的时间,不是 Trial 的。 如果 Experiment 达到了设置的最大时间,Experiment 不会停止,但不会再启动新的 Trial 作业。

maxTrialNum: 10
# maxTrialNum 定义了你此次 Experiment 总共想要 NNI 跑多少 Trial。
trainingServicePlatform: local
#choice: local, remote, pai
# trainingServicePlatform 定义运行 Experiment 的平台
# local:在本机的 ubuntu 上运行 Experiment。
# remote:将任务提交到远程的 Ubuntu 上,必须用 **machineList** 来指定远程的 SSH 连接信息。
# pai:提交任务到微软开源的 OpenPAI 上。
# kubeflow 提交任务至 Kubeflow NNI 支持基于 Kubeflow 的 Kubenetes,以及 Azure Kubernetes

useAnnotation: true
#choice: true, false
#定义使用标记来分析代码并生成搜索空间。(官方例子使用的是 Annotation,所以 useAnnotation = true)

tuner:
  builtinTunerName: TPE
  #builtinTunerName 指定了系统 Tuner 的名字,NNI SDK 提供了多种 Tuner,如:{TPE, Random, Anneal, Evolution, BatchTuner, GridSearch}。
  #choice: TPE, Random, Anneal, Evolution, BatchTuner
  #SMAC (SMAC should be installed through nnictl)
  classArgs:
   #classArgs** 指定了 Tuner 算法的参数。 如果 builtinTunerName 是{TPE, Random, Anneal, Evolution},用户需要设置 optimize_mode。
    #choice: maximize, minimize
    optimize_mode: maximize

trial:
  command: python3 mnist.py
  codeDir: .
  gpuNum: 0

二、tuner 对比实验

2.1、Random

建议场景

在每个 Trial 运行时间不长(例如,能够非常快的完成,或者很快的被 Assessor 终止),并有充足计算资源的情况下。 或者需要均匀的探索搜索空间。 随机搜索可作为搜索算法的基准线。

参数

  • optimize_mode (maximize 或 minimize,可选,默认值为 maximize) - 如果为 'maximize',Tuner 会给出有可能产生较大值的参数组合。 如果为 'minimize',Tuner 会给出有可能产生较小值的参数组合。

使用样例:

# config.yml
tuner:
  builtinTunerName: Random
  classArgs:
    optimize_mode: maximize

训练结果:

以下为 Tuner 为 Random,TrialNum 为 30 时的训练结果,从下图右下角可以直观的得出,最大正确率为 98.28%,展开后可看到对应的超参值,在 Trails Detail 能够看到所有 Trails 在不同超参选择上的分布,便于分析。

卷积核大小:7×7

隐藏层:512

学习率:0.0018762964666695628

激活函数:ReLU

池化层:最大池化

batch size:32

dropout rate:0.5
Random.png
Random2.png

结果分析:

正确率低于 30% 的 trails 隐藏层多数为 1024,学习率绝大多数低于 0.001,激活函数多数为 sigmoid。于此同时,正确率高于 90% 的 trails 卷积核大小大部分为 7×7,学习率主要分布在 0.001 以下。

根据以上对结果的分析,可以合理猜测,此模型下设置卷积核大小为 7×7,学习率低于 0.001,激活函数选用 relu 或 tanh,就能获得比较理想的正确率。

2.2、TPE

建议场景

TPE 是一种黑盒优化方法,可以使用在各种场景中,通常情况下都能得到较好的结果。 特别是在计算资源有限,只能运行少量 Trial 的情况。 大量的实验表明,TPE 的性能远远优于随机搜索。

参数

  • optimize_mode (maximize 或 minimize,可选,默认值为 maximize) - 如果为 'maximize',Tuner 会给出有可能产生较大值的参数组合。 如果为 'minimize',Tuner 会给出有可能产生较小值的参数组合。

使用样例:

# config.yml
tuner:
  builtinTunerName: TPE
  classArgs:
    optimize_mode: maximize

训练结果:

以下为 tuner 为 TPE,TrialNum 为 30 时的训练结果,从下图右下角可以直观的得出,最大正确率为 98.13%,展开后可看到对应的超参值:

卷积核大小:7×7

隐藏层:1024

学习率:0.0005779853380708741

激活函数:ReLU

池化层:最大池化

batch size:16

dropout rate:0.5
TPE.png
TPE2.png

结果分析:

正确率前 50% 的 trails 隐藏层多数为 1024,学习率全部低于 0.001,激活函数多数为 relu 和 tanh,卷积核大小大部分为 7×7 和 5×5。

根据以上对结果的分析,可以合理猜测,此模型下设置卷积核大小为 7×7 或 5×5,学习率低于 0.001,激活函数选用 relu 或 tanh,就能获得比较理想的正确率。

2.3、Anneal

建议场景

当每个 Trial 的时间不长,并且有足够的计算资源时使用(与随机搜索基本相同)。 或者搜索空间的变量能从一些先验分布中采样。

参数

  • optimize_mode (maximize 或 minimize,可选,默认值为 maximize) - 如果为 'maximize',Tuner 会给出有可能产生较大值的参数组合。 如果为 'minimize',Tuner 会给出有可能产生较小值的参数组合。

使用样例:

# config.yml
tuner:
  builtinTunerName: Anneal
  classArgs:
    optimize_mode: maximize

训练结果:

以下为 tuner 为 Anneal,TrialNum 为 100 时的训练结果,从下图右下角可以直观的得出,最大正确率为 98.89%,展开后可看到对应的超参值:

卷积核大小:7×7

隐藏层:512

学习率:0.0010559236204399935

激活函数:ReLU

池化层:最大池化

batch size:32

dropout rate:0.5
Anneal.png
Anneal2.png

结果分析:

正确率前 20% 的 trails 隐藏层基本分布于 512 和 1024,学习率分布在 0.001 左右,激活函数为 relu,卷积核大小大部分为 5×5。

根据以上对结果的分析,可以合理猜测,此模型下设置卷积核大小为 5×5,学习率在 0.001 左右,激活函数选用 relu,隐藏层为 1024 或 512,就能获得比较理想的正确率。

2.4、Evolution

建议场景

此算法对计算资源的需求相对较高。 需要非常大的初始种群,以免落入局部最优中。 如果 Trial 时间很短,或者利用了 Assessor,就非常适合此算法。 如果 Trial 代码支持权重迁移,即每次 Trial 会从上一轮继承已经收敛的权重,建议使用此算法。 这会大大提高训练速度。

参数

  • optimize_mode (maximize 或 minimize,可选,默认值为 maximize) - 如果为 'maximize',Tuner 会给出有可能产生较大值的参数组合。 如果为 'minimize',Tuner 会给出有可能产生较小值的参数组合。

使用样例:

# config.yml
tuner:
  builtinTunerName: Evolution
  classArgs:
    optimize_mode: maximize

训练结果:

以下为 Tuner 为 Evolution,TrialNum 为 30 时的训练结果,从下图右下角可以直观的得出,最大正确率为 98.69%,展开后可看到对应的超参值:卷积核大小:5×5

隐藏层:512

学习率:0.0008152180302834592

激活函数:tanh

池化层:最大池化

batch size:32

dropout rate:0.5
Evolution.png
Evolution2.png

结果分析:

正确率前 20% 的 trails 隐藏层多数分布于 512,学习率分布在 0.001 左右较为集中,激活函数为 tanh 较为集中,卷积核大小大部分为 5×5 或 3×3。

根据以上对结果的分析,可以合理猜测,此模型下设置卷积核大小为 5×5,学习率在 0.001 左右,激活函数选用 tanh,隐藏层为 512,就能获得比较理想的正确率。

三、总结

综合对比不同 Tuner 的实验结果,发现不同的 Tuner 算法得出的超参分布存在一定差异性,如在使用 Anneal 时准确率前 20% 的 trails 采用的激活函数都为 relu,而 Evolution 的实验中,这部分 trails 却是 tanh 居多。需要思考一下神经网络模型相同的情况下,是什么导致的这些差异性。同样,我们在对比中也能发现许多一致性,通过这些一致性能够对我们的模型调参工作以及对深度学习的理解给予一些启示。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容