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 其實也不難上手呢?