[DAY28] 用 hyperdrive 来微调超参数

DAY28 用 hyperdrive 来微调超参数

AI 工程师一般又被戏称为调参数工程师,我们要不断的调整超参数,以求得最佳解。透过 Azure Machine Learning 中的 Hyperdrive,我们可以很容易的设定一组参数,让它自己去跑,找到这批超参数中的最佳解。举例来说,我们可以设定一组 Learning rate,让 Hyperdrive 找到这组中最好的 Learning rate。

超参数的种类

连续超参数

连续超参数就是给定一个范围内连续的数值。举例来说,如果用 uniform(0.05, 0.1),有最小值 0.05 和最大值 0.1 的均匀分布(uniform distribution)。

常用的连续超参数的函式如下:
uniform(low, high):传回在 low 与 high 之间均匀分布的值
loguniform(low, high):传回根据 exp(uniform(low, high)) 绘制的值,让传回值的对数均匀分布
normal(mu, sigma):传回以平均值 mu 和标准差 sigma 进行常态分布的实数值
lognormal(mu, sigma):传回根据 exp(normal(mu, sigma)) 绘制的值,让传回值的对数常态分布

离散超参数

离散超参数就是超参数彼此不是连续的。最常使用的是 choice。举例来说,choice(16, 32, 64, 128, 5566) 就是会从其中取出一个数值,它并不会去取到 128 和 5566 之间的数值。除了最常用的 choice,还有 quniform、qloguniform、qnormal、qlognormal,有需要用到时再去查即可。

使用超参数的参考程序码如下:

from azureml.train.hyperdrive import choice, normal

param_space = {
                 '--batch_size': choice(16, 32, 64, 128),
                 '--learning_rate': normal(10, 3)
              }

超参数的取样

因为不可能把所有超参数的排列组合都试过,所以我们要用取样的技巧来找到比较好的超参数。定义好超参数的范围之後,再来就要定义取样的方式。在 AML 里提供了三种超参数的取样方法,分述如下:

  1. RandomParameterSampling:
    顾名思义就是随机取样,我们在实务上常常会是先随机取样,缩小超参数的范围空间後再来改善结果。随机取样支援离散和连续超参数,还有 early stop。

程序码参考如下:

from azureml.train.hyperdrive import choice, normal, RandomParameterSampling

param_space = {
                 '--batch_size': choice(16, 32, 64, 128),
                 '--learning_rate': normal(10, 3)
              }

sampling = RandomParameterSampling(param_space)
  1. GridParameterSampling:
    对所有可能的超参数值进行搜寻,所以只支援离散超参数。(连续超参数是无穷无尽的啊!)也支援 early stop。

程序码参考如下,我们可以知道这一段程序码会有八种组合:

from azureml.train.hyperdrive import choice, GridParameterSampling

param_space = {
                 '--batch_size': choice(16, 32, 64, 128),
                 '--learning_rate': choice(0.001, 0.01)
              }

sampling = GridParameterSampling(param_space)
  1. BayesianParameterSampling:
    贝氏取样是用 Bayesian optimization algorithm 来取得最佳解,简单来说是会根据前一次的组合的结果来调整下一次的结果。只支援choice, uniform, quniform,不支援 early stop。

参考程序码如下:

from azureml.train.hyperdrive import  choice, uniform, BayesianParameterSampling

param_space = {
                 '--batch_size': choice(16, 32, 64),
                 '--learning_rate': uniform(0.05, 0.1)
              }

param_sampling = BayesianParameterSampling(param_space)

Early stop

在 AML 的相关文件里,微软都用 early termination 这个词,不过仔细研究了之後,就是 early stop 的概念,即找到一组参数之後几次都不会比现在这组参数更好,就停止。在这里先说明一下,避免大家看原文时也被词所困惑。

在 AML 里提供四种 early stop 方法,分述如下(评估的指标我们都假设为 AUC):

  1. 没有终止原则:对,就是不 early stop,这是预设值。

  2. Bandit policy:
    这个主要的参数是 slack_factor。下面程序码是说,一开始评估超参数,是要在第15次在评估,因为前面有个 delay 5。假设第15次时我们 AUC 是 0.8,然後这时候 slack_factor 为 0.2 时,同时假设针对此次跑出来最佳 AUC 是 Y,那麽就会比较 (Y + Y * 0.2) 到0.8 之间的值,如果之後的跑出来的 AUC 较小,则会取消执行。

slack_factor 可以取代成 slack_amount。如果 slack_amount = 0.2 时,目前最佳的 AUC 为 0.8,那麽如果之後跑出来的 AUC 比 0.8-0.2=0.6 还要小,那麽就会 early stop。

from azureml.train.hyperdrive import BanditPolicy

early_termination_policy = BanditPolicy(slack_factor = 0.2,
                                        evaluation_interval=10, # 套用policy的频率
                                        delay_evaluation=5) # 要延迟多久才第一次评估
  1. Median Stopping Policy:只要比前面平均的中位数还差,就 early stop。
from azureml.train.hyperdrive import MedianStoppingPolicy

early_termination_policy = MedianStoppingPolicy(evaluation_interval=1,
                                                delay_evaluation=5)
  1. Truncation Selection Policy:下面范例,如果评估时低於最低的 AUC 的 20%,那就 early stop。
from azureml.train.hyperdrive import TruncationSelectionPolicy
early_termination_policy = TruncationSelectionPolicy(evaluation_interval=1, 
                                                     truncation_percentage=20,  # 20%的意思
                                                     delay_evaluation=5)

使用 HyperDriveConfig

我们之前讲过了这麽多 SDK 中的 config,没错 HyperDrive 也是用 config 的形式来做设定的。参考程序码如下:

from azureml.core import Experiment
from azureml.train.hyperdrive import HyperDriveConfig, PrimaryMetricGoal


hyperdrive = HyperDriveConfig(run_config=script_config, # 这里是供你参数化的 ScriptRunConfig
                              hyperparameter_sampling=param_sampling,
                              policy=None,
                              primary_metric_name='Accuracy', #这里看你的 script 里所 log 的指标是什麽,如果是AUC就用AUC
                              primary_metric_goal=PrimaryMetricGoal.MAXIMIZE,
                              max_total_runs=6, #最多跑几个 run
                              max_concurrent_runs=4) #最多同时几个跑

experiment = Experiment(workspace = ws, name = 'hyperdrive_training')
hyperdrive_run = experiment.submit(config=hyperdrive)

到此为止,我们就讲完了 AML SDK 最重要的几个部份罗!有没有觉得 SDK 其实也不难上手呢?


<<:  【Day28】企业数位治理议题1:系统因应企业商业模式变动弹性调整

>>:  Day27 - 【概念篇】Keycloak使用基本概念 - 第二部分: User & Claim & Profile

数据中台:实施阶段

当有新的业务需求且与既有系统的资料关联较大时,应该优先安排在中台上实现,这可以让数据中台尽快地产生业...

# Day15--今天,我想来点.......扩展

扩展的主要功能: 扩展(extension)是 Swift 一个重要的特性,它可以为已存在的列举、结...

Day 3 | 游戏故事与世界观

游戏简介 我们制作的「山海异闻录」是一款AR手机游戏,一共有五个关卡,完成每个关卡即可开启新的故事剧...

Day 26 Redis (下)

上一篇我们只简单介绍了 Redis ,这篇就来详细的介绍一下以及如何再 Flask 中使用。 Red...

Day 28 - WooCommerce: 显示虚拟帐号付款资讯

昨天虽然完成了以永丰银行虚拟帐号付款方式进行结帐,但如果没有找个地方显示帐号,顾客也不知道要汇钱到那...