iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
AI & Data

一起學習 Azure Machine Learning 系列 第 28

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


上一篇
[DAY27] 用 Azure Machine Learning SDK 來做 AutoML
下一篇
[DAY29] 用 Application Insights 來監視部署的模型
系列文
一起學習 Azure Machine Learning 30

尚未有邦友留言

立即登入留言