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 里提供了三种超参数的取样方法,分述如下:
程序码参考如下:
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)
程序码参考如下,我们可以知道这一段程序码会有八种组合:
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)
参考程序码如下:
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)
在 AML 的相关文件里,微软都用 early termination 这个词,不过仔细研究了之後,就是 early stop 的概念,即找到一组参数之後几次都不会比现在这组参数更好,就停止。在这里先说明一下,避免大家看原文时也被词所困惑。
在 AML 里提供四种 early stop 方法,分述如下(评估的指标我们都假设为 AUC):
没有终止原则:对,就是不 early stop,这是预设值。
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) # 要延迟多久才第一次评估
from azureml.train.hyperdrive import MedianStoppingPolicy
early_termination_policy = MedianStoppingPolicy(evaluation_interval=1,
delay_evaluation=5)
from azureml.train.hyperdrive import TruncationSelectionPolicy
early_termination_policy = TruncationSelectionPolicy(evaluation_interval=1,
truncation_percentage=20, # 20%的意思
delay_evaluation=5)
我们之前讲过了这麽多 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
当有新的业务需求且与既有系统的资料关联较大时,应该优先安排在中台上实现,这可以让数据中台尽快地产生业...
扩展的主要功能: 扩展(extension)是 Swift 一个重要的特性,它可以为已存在的列举、结...
游戏简介 我们制作的「山海异闻录」是一款AR手机游戏,一共有五个关卡,完成每个关卡即可开启新的故事剧...
上一篇我们只简单介绍了 Redis ,这篇就来详细的介绍一下以及如何再 Flask 中使用。 Red...
昨天虽然完成了以永丰银行虚拟帐号付款方式进行结帐,但如果没有找个地方显示帐号,顾客也不知道要汇钱到那...