Hiperparâmetros a otimizar um modelo (v2)

APLICA-SE A:Extensão v2 da CLI do Azure (atual)SDK python azure-ai-ml v2 (atual)

Automatize a otimização eficiente de hiperparâmetros com o SDK do Azure Machine Learning v2 e a CLI v2 através do tipo SweepJob.

  1. Definir o espaço de pesquisa de parâmetros para a sua versão de avaliação
  2. Especifique o algoritmo de amostragem para a tarefa de varrimento
  3. Especificar o objetivo a otimizar
  4. Especificar a política de cessação antecipada para trabalhos de baixo desempenho
  5. Definir limites para a tarefa de varrimento
  6. Iniciar uma experimentação com a configuração definida
  7. Visualizar as tarefas de preparação
  8. Selecione a melhor configuração para o seu modelo

O que é a otimização do hiperparâmetros?

Os hiperparâmetros são parâmetros ajustáveis que lhe permitem controlar o processo de preparação do modelo. Por exemplo, com as redes neurais, decide o número de camadas ocultas e o número de nós em cada camada. O desempenho do modelo depende muito dos hiperparâmetros.

A otimização do hiperparâmetros, também denominada otimização de hiperparâmetros, é o processo de localizar a configuração de hiperparâmetros que resulta no melhor desempenho. Normalmente, o processo é computacionalmente dispendioso e manual.

O Azure Machine Learning permite automatizar a otimização de hiperparâmetros e executar experimentações em paralelo para otimizar eficazmente os hiperparâmetros.

Definir o espaço de pesquisa

Ajuste os hiperparâmetros ao explorar o intervalo de valores definido para cada hiperparâmetros.

Os hiperparâmetros podem ser discretos ou contínuos e têm uma distribuição de valores descrita por uma expressão de parâmetro.

Hiperparâmetros discretos

Os hiperparâmetros discretos são especificados como valores Choice discretos. Choice pode ser:

  • um ou mais valores separados por vírgulas
  • um range objeto
  • qualquer objeto arbitrário list
from azure.ai.ml.sweep import Choice

command_job_for_sweep = command_job(
    batch_size=Choice(values=[16, 32, 64, 128]),
    number_of_hidden_layers=Choice(values=range(1,5)),
)

Neste caso, batch_size um dos valores [16, 32, 64, 128] e number_of_hidden_layers utiliza um dos valores [1, 2, 3, 4].

Os seguintes hiperparâmetros discretos avançados também podem ser especificados através de uma distribuição:

  • QUniform(min_value, max_value, q) - Devolve um valor como round(Uniform(min_value, max_value) /q) * q
  • QLogUniform(min_value, max_value, q) - Devolve um valor como round(exp(Uniform(min_value, max_value)) / q) * q
  • QNormal(mu, sigma, q) - Devolve um valor como round(Normal(mu, sigma) /q) * q
  • QLogNormal(mu, sigma, q) - Devolve um valor como round(exp(Normal(mu, sigma)) / q) * q

Hiperparâmetros contínuos

Os hiperparâmetros contínuos são especificados como uma distribuição através de um intervalo contínuo de valores:

  • Uniform(min_value, max_value) - Devolve um valor distribuído uniformemente entre min_value e max_value
  • LogUniform(min_value, max_value) - Devolve um valor desenhado de acordo com exp(Uniform(min_value, max_value)) para que o logaritmo do valor devolvido seja distribuído uniformemente
  • Normal(mu, sigma) - Devolve um valor real que é normalmente distribuído com mu médio e sigma de desvio padrão
  • LogNormal(mu, sigma) - Devolve um valor desenhado de acordo com exp(Normal(mu, sigma)) para que o logaritmo do valor devolvido seja normalmente distribuído

Um exemplo de uma definição de espaço de parâmetros:

from azure.ai.ml.sweep import Normal, Uniform

command_job_for_sweep = command_job(   
    learning_rate=Normal(mu=10, sigma=3),
    keep_probability=Uniform(min_value=0.05, max_value=0.1),
)

Este código define um espaço de pesquisa com dois parâmetros - learning_rate e keep_probability. learning_rate tem uma distribuição normal com o valor médio 10 e um desvio-padrão de 3. keep_probability tem uma distribuição uniforme com um valor mínimo de 0,05 e um valor máximo de 0,1.

Para a CLI, pode utilizar o esquema YAML da tarefa de varrimento para definir o espaço de pesquisa no seu YAML:

    search_space:
        conv_size:
            type: choice
            values: [2, 5, 7]
        dropout_rate:
            type: uniform
            min_value: 0.1
            max_value: 0.2

Amostragem do espaço do hiperparâmetros

Especifique o método de amostragem de parâmetros a utilizar através do espaço de hiperparâmetros. O Azure Machine Learning suporta os seguintes métodos:

  • Amostragem aleatória
  • Amostragem de grelha
  • Amostragem bayesiana

Amostragem aleatória

A amostragem aleatória suporta hiperparâmetros discretos e contínuos. Suporta a cessação antecipada de trabalhos de baixo desempenho. Alguns utilizadores fazem uma pesquisa inicial com amostragem aleatória e, em seguida, refinam o espaço de pesquisa para melhorar os resultados.

Na amostragem aleatória, os valores de hiperparâmetros são selecionados aleatoriamente no espaço de pesquisa definido. Depois de criar a tarefa de comando, pode utilizar o parâmetro varrer para definir o algoritmo de amostragem.

from azure.ai.ml.sweep import Normal, Uniform, RandomParameterSampling

command_job_for_sweep = command_job(   
    learning_rate=Normal(mu=10, sigma=3),
    keep_probability=Uniform(min_value=0.05, max_value=0.1),
    batch_size=Choice(values=[16, 32, 64, 128]),
)

sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm = "random",
    ...
)

Sobol

Sobol é um tipo de amostragem aleatória suportada por tipos de tarefas de varrimento. Pode utilizar sobol para reproduzir os seus resultados com a semente e cobrir a distribuição do espaço de pesquisa de forma mais uniforme.

Para utilizar sobol, utilize a classe RandomParameterSampling para adicionar a semente e a regra, conforme mostrado no exemplo abaixo.

from azure.ai.ml.sweep import RandomParameterSampling

sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm = RandomParameterSampling(seed=123, rule="sobol"),
    ...
)

Amostragem de grelha

A amostragem de grelha suporta hiperparâmetros discretos. Utilize a amostragem de grelha se conseguir orçamentar para procurar exaustivamente o espaço de pesquisa. Suporta a cessação antecipada de trabalhos de baixo desempenho.

A amostragem de grelha faz uma pesquisa de grelha simples sobre todos os valores possíveis. A amostragem de grelha só pode ser utilizada com choice hiperparâmetros. Por exemplo, o espaço seguinte tem seis amostras:

from azure.ai.ml.sweep import Choice

command_job_for_sweep = command_job(
    batch_size=Choice(values=[16, 32]),
    number_of_hidden_layers=Choice(values=[1,2,3]),
)

sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm = "grid",
    ...
)

Amostragem bayesiana

A amostragem bayesiana baseia-se no algoritmo de otimização bayesiano. Escolhe exemplos com base na forma como os exemplos anteriores o fizeram, para que os novos exemplos melhorem a métrica primária.

A amostragem bayesiana é recomendada se tiver orçamento suficiente para explorar o espaço do hiperparâmetros. Para obter os melhores resultados, recomendamos um número máximo de trabalhos maior ou igual a 20 vezes o número de hiperparâmetros a ser ajustado.

O número de tarefas simultâneas tem impacto na eficácia do processo de otimização. Um número menor de postos de trabalho simultâneos pode conduzir a uma melhor convergência da amostragem, uma vez que o menor grau de paralelismo aumenta o número de postos de trabalho que beneficiam de postos de trabalho concluídos anteriormente.

A amostragem bayesiana só suporta choice, uniforme quniform distribuições através do espaço de pesquisa.

from azure.ai.ml.sweep import Uniform, Choice

command_job_for_sweep = command_job(   
    learning_rate=Uniform(min_value=0.05, max_value=0.1),
    batch_size=Choice(values=[16, 32, 64, 128]),
)

sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm = "bayesian",
    ...
)

Especifique o objetivo do varrimento

Defina o objetivo da tarefa de varrimento ao especificar a métrica primária e o objetivo que pretende otimizar a otimização do hiperparâmetros. Cada tarefa de preparação é avaliada para a métrica primária. A política de cessação antecipada utiliza a métrica primária para identificar tarefas de baixo desempenho.

  • primary_metric: O nome da métrica primária tem de corresponder exatamente ao nome da métrica registada pelo script de preparação
  • goal: pode ser Maximize ou Minimize e determina se a métrica primária será maximizada ou minimizada ao avaliar as tarefas.
from azure.ai.ml.sweep import Uniform, Choice

command_job_for_sweep = command_job(   
    learning_rate=Uniform(min_value=0.05, max_value=0.1),
    batch_size=Choice(values=[16, 32, 64, 128]),
)

sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm = "bayesian",
    primary_metric="accuracy",
    goal="Maximize",
)

Este exemplo maximiza a "precisão".

Registar métricas para otimização de hiperparâmetros

O script de preparação do modelo tem de registar a métrica primária durante a preparação do modelo com o mesmo nome de métrica correspondente para que o SweepJob possa aceder à mesma para otimização de hiperparâmetros.

Registe a métrica primária no script de preparação com o seguinte fragmento de exemplo:

import mlflow
mlflow.log_metric("accuracy", float(val_accuracy))

O script de preparação calcula o e regista-o val_accuracy como a "precisão" da métrica primária. Sempre que a métrica é registada, é recebida pelo serviço de otimização de hiperparâmetros. Cabe-lhe a si determinar a frequência dos relatórios.

Para obter mais informações sobre os valores de registo para tarefas de preparação, veja Ativar o registo nas tarefas de preparação do Azure Machine Learning.

Especificar a política de cessação antecipada

Termine automaticamente o mau desempenho dos trabalhos com uma política de cessação antecipada. A terminação antecipada melhora a eficiência computacional.

Pode configurar os seguintes parâmetros que controlam quando uma política é aplicada:

  • evaluation_interval: a frequência de aplicação da política. Cada vez que o script de preparação regista as métricas primárias conta como um intervalo. Um evaluation_interval de 1 aplicará a política sempre que o script de preparação comunicar a métrica primária. Um evaluation_interval de 2 aplicará a política de vez em quando. Se não for especificado, evaluation_interval está definido como 0 por predefinição.
  • delay_evaluation: atrasa a primeira avaliação de política para um número especificado de intervalos. Este é um parâmetro opcional que evita a terminação prematura das tarefas de preparação ao permitir que todas as configurações sejam executadas durante um número mínimo de intervalos. Se especificado, a política aplica todos os múltiplos de evaluation_interval maiores ou iguais a delay_evaluation. Se não for especificado, delay_evaluation está definido como 0 por predefinição.

O Azure Machine Learning suporta as seguintes políticas de terminação antecipada:

Política de bandit

A política de bandit baseia-se no intervalo de avaliação e fator de margem/fator de margem. A política de bandit termina uma tarefa quando a métrica primária não está dentro da quantidade de margem/margem especificada da tarefa com mais êxito.

Especifique os seguintes parâmetros de configuração:

  • slack_factor ou slack_amount: a margem permitida no que diz respeito ao trabalho de preparação com melhor desempenho. slack_factor especifica a margem permitido como uma proporção. slack_amount especifica a margem permitido como um montante absoluto, em vez de uma proporção.

    Por exemplo, considere uma política bandit aplicada no intervalo 10. Suponha que a tarefa com melhor desempenho no intervalo 10 reportou que uma métrica primária é 0,8 com o objetivo de maximizar a métrica primária. Se a política especificar um slack_factor de 0,2, todas as tarefas de preparação cuja melhor métrica no intervalo 10 seja inferior a 0,66 (0,8/(1+slack_factor)) serão terminadas.

  • evaluation_interval: (opcional) a frequência de aplicação da política

  • delay_evaluation: (opcional) atrasa a primeira avaliação de política para um número especificado de intervalos

from azure.ai.ml.sweep import BanditPolicy
sweep_job.early_termination = BanditPolicy(slack_factor = 0.1, delay_evaluation = 5, evaluation_interval = 1)

Neste exemplo, a política de terminação antecipada é aplicada a cada intervalo quando as métricas são reportadas, começando no intervalo de avaliação 5. Todas as tarefas cuja melhor métrica seja inferior a (1/(1+0,1) ou 91% das tarefas com melhor desempenho serão terminadas.

Política de paragem mediana

A paragem mediana é uma política de terminação antecipada com base nas médias de execução das métricas primárias comunicadas pelas tarefas. Esta política calcula as médias de execução em todas as tarefas de preparação e para os trabalhos cujo valor de métrica principal é pior do que a mediana das médias.

Esta política utiliza os seguintes parâmetros de configuração:

  • evaluation_interval: a frequência de aplicação da política (parâmetro opcional).
  • delay_evaluation: atrasa a primeira avaliação de política para um número especificado de intervalos (parâmetro opcional).
from azure.ai.ml.sweep import MedianStoppingPolicy
sweep_job.early_termination = MedianStoppingPolicy(delay_evaluation = 5, evaluation_interval = 1)

Neste exemplo, a política de terminação antecipada é aplicada a cada intervalo a partir do intervalo de avaliação 5. Uma tarefa é parada no intervalo 5 se a sua melhor métrica primária for pior do que a mediana das médias de execução ao longo dos intervalos 1:5 em todas as tarefas de preparação.

Política de seleção de truncagem

A seleção de truncamento cancela uma percentagem das tarefas com menor desempenho em cada intervalo de avaliação. As tarefas são comparadas com a métrica primária.

Esta política utiliza os seguintes parâmetros de configuração:

  • truncation_percentage: a percentagem de tarefas com menor desempenho a terminar em cada intervalo de avaliação. Um valor inteiro entre 1 e 99.
  • evaluation_interval: (opcional) a frequência de aplicação da política
  • delay_evaluation: (opcional) atrasa a primeira avaliação de política para um número especificado de intervalos
  • exclude_finished_jobs: especifica se pretende excluir tarefas concluídas ao aplicar a política
from azure.ai.ml.sweep import TruncationSelectionPolicy
sweep_job.early_termination = TruncationSelectionPolicy(evaluation_interval=1, truncation_percentage=20, delay_evaluation=5, exclude_finished_jobs=true)

Neste exemplo, a política de terminação antecipada é aplicada a cada intervalo a partir do intervalo de avaliação 5. Uma tarefa termina no intervalo 5 se o seu desempenho no intervalo 5 estiver nos 20% mais baixos de desempenho de todas as tarefas no intervalo 5 e excluirá as tarefas concluídas ao aplicar a política.

Nenhuma política de cessação (predefinição)

Se não for especificada nenhuma política, o serviço de otimização de hiperparâmetros permitirá que todas as tarefas de preparação sejam executadas até à conclusão.

sweep_job.early_termination = None

Escolher uma política de cessação antecipada

  • Para uma política conservadora que proporcione poupanças sem cessar empregos promissores, considere uma Política de Paragem Mediana com evaluation_interval 1 e delay_evaluation 5. Estas são definições conservadoras que podem proporcionar uma poupança de aproximadamente 25%-35% sem perdas na métrica primária (com base nos nossos dados de avaliação).
  • Para poupanças mais agressivas, utilize a Política de Bandit com uma margem mais pequena permitido ou Política de Seleção de Truncagem com uma percentagem de truncamento maior.

Definir limites para a tarefa de varrer

Controle o orçamento de recursos ao definir limites para a tarefa de varrimento.

  • max_total_trials: número máximo de tarefas de avaliação. Tem de ser um número inteiro entre 1 e 1000.
  • max_concurrent_trials: (opcional) Número máximo de tarefas de avaliação que podem ser executadas em simultâneo. Se não for especificado, max_total_trials número de tarefas iniciadas em paralelo. Se especificado, tem de ser um número inteiro entre 1 e 1000.
  • timeout: tempo máximo em segundos em que toda a tarefa de varrimento tem permissão para ser executada. Assim que este limite for atingido, o sistema cancelará a tarefa de varrimento, incluindo todas as suas versões de avaliação.
  • trial_timeout: o tempo máximo em segundos que cada tarefa de avaliação tem permissão para ser executada. Assim que este limite for atingido, o sistema cancelará a versão de avaliação.

Nota

Se forem especificados max_total_trials e tempo limite, a experimentação de otimização de hiperparâmetros termina quando o primeiro destes dois limiares é atingido.

Nota

O número de tarefas de avaliação simultâneas é controlado nos recursos disponíveis no destino de computação especificado. Certifique-se de que o destino de computação tem os recursos disponíveis para a simultaneidade pretendida.

sweep_job.set_limits(max_total_trials=20, max_concurrent_trials=4, timeout=1200)

Este código configura a experimentação de otimização de hiperparâmetros para utilizar um máximo de 20 tarefas de avaliação totais, executando quatro tarefas de avaliação de cada vez com um tempo limite de 1200 segundos para toda a tarefa de varrimento.

Configurar a experimentação de otimização de hiperparâmetros

Para configurar a experimentação de otimização de hiperparâmetros, forneça o seguinte:

  • O espaço de pesquisa de hiperparâmetros definido
  • O algoritmo de amostragem
  • A sua política de cessação antecipada
  • O seu objetivo
  • Limites de recursos
  • CommandJob ou CommandComponent
  • SweepJob

O SweepJob pode executar uma varredura de hiperparâmetros no Componente de Comando ou Comando.

Nota

O destino de computação utilizado no sweep_job tem de ter recursos suficientes para satisfazer o seu nível de simultaneidade. Para obter mais informações sobre destinos de computação, veja Destinos de computação.

Configure a experimentação de otimização de hiperparâmetros:

from azure.ai.ml import MLClient
from azure.ai.ml import command, Input
from azure.ai.ml.sweep import Choice, Uniform, MedianStoppingPolicy
from azure.identity import DefaultAzureCredential

# Create your base command job
command_job = command(
    code="./src",
    command="python main.py --iris-csv ${{inputs.iris_csv}} --learning-rate ${{inputs.learning_rate}} --boosting ${{inputs.boosting}}",
    environment="AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu@latest",
    inputs={
        "iris_csv": Input(
            type="uri_file",
            path="https://azuremlexamples.blob.core.windows.net/datasets/iris.csv",
        ),
        "learning_rate": 0.9,
        "boosting": "gbdt",
    },
    compute="cpu-cluster",
)

# Override your inputs with parameter expressions
command_job_for_sweep = command_job(
    learning_rate=Uniform(min_value=0.01, max_value=0.9),
    boosting=Choice(values=["gbdt", "dart"]),
)

# Call sweep() on your command job to sweep over your parameter expressions
sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm="random",
    primary_metric="test-multi_logloss",
    goal="Minimize",
)

# Specify your experiment details
sweep_job.display_name = "lightgbm-iris-sweep-example"
sweep_job.experiment_name = "lightgbm-iris-sweep-example"
sweep_job.description = "Run a hyperparameter sweep job for LightGBM on Iris dataset."

# Define the limits for this sweep
sweep_job.set_limits(max_total_trials=20, max_concurrent_trials=10, timeout=7200)

# Set early stopping on this one
sweep_job.early_termination = MedianStoppingPolicy(
    delay_evaluation=5, evaluation_interval=2
)

O command_job é chamado como uma função para que possamos aplicar as expressões de parâmetro às entradas de varrimento. Em sweep seguida, a função é configurada com trial, sampling-algorithm, objective, limitse compute. O fragmento de código acima é retirado do bloco de notas de exemplo Executar varrimento de hiperparâmetros num Comando ou CommandComponent. Neste exemplo, os learning_rate parâmetros e boosting serão otimizados. A paragem antecipada de trabalhos será determinada por um MedianStoppingPolicy, que interrompe um trabalho cujo valor de métrica principal é pior do que a mediana das médias em todos os trabalhos de preparação.( veja MedianStoppingPolicy class reference (Referência da classe MedianStoppingPolicy).

Para ver como os valores dos parâmetros são recebidos, analisados e transmitidos para o script de preparação a otimizar, veja este exemplo de código

Importante

Cada tarefa de varrimento de hiperparâmetros reinicia a preparação do zero, incluindo a reconstrução do modelo e todos os carregadores de dados. Pode minimizar este custo com um pipeline do Azure Machine Learning ou um processo manual para fazer o máximo de preparação de dados possível antes das suas tarefas de preparação.

Submeter experimentação de otimização de hiperparâmetros

Depois de definir a configuração de otimização de hiperparâmetros, submeta a tarefa:

# submit the sweep
returned_sweep_job = ml_client.create_or_update(sweep_job)
# get a URL for the status of the job
returned_sweep_job.services["Studio"].endpoint

Visualizar tarefas de otimização de hiperparâmetros

Pode visualizar todas as tarefas de otimização de hiperparâmetros no estúdio do Azure Machine Learning. Para obter mais informações sobre como ver uma experimentação no portal, veja Ver registos de tarefas no estúdio.

  • Gráfico de métricas: esta visualização controla as métricas registadas para cada tarefa subordinada do hyperdrive durante a otimização de hiperparâmetros. Cada linha representa uma tarefa subordinada e cada ponto mede o valor de métrica principal nessa iteração do runtime.

    Gráfico de métricas de otimização de hiperparâmetros

  • Gráfico de Coordenadas Paralelas: esta visualização mostra a correlação entre o desempenho das métricas primárias e os valores de hiperparâmetros individuais. O gráfico é interativo através do movimento de eixos (clique e arraste pela etiqueta do eixo) e ao realçar valores num único eixo (clique e arraste verticalmente ao longo de um único eixo para realçar um intervalo de valores pretendidos). O gráfico de coordenadas paralelas inclui um eixo na parte mais à direita do gráfico que desenha o melhor valor de métrica correspondente aos hiperparâmetros definidos para essa instância de trabalho. Este eixo é fornecido para projetar a legenda de gradação de gráfico nos dados de uma forma mais legível.

    Gráfico de coordenadas paralelas de otimização de hiperparâmetros

  • Gráfico de Dispersão Bidimensional: esta visualização mostra a correlação entre dois hiperparâmetros individuais, juntamente com o respetivo valor de métrica primária associado.

    Gráfico de dispersão bidimensional de otimização de hípares

  • Gráfico de Dispersão Tridimensional: esta visualização é igual a 2D, mas permite três dimensões de hiperparâmetros de correlação com o valor da métrica primária. Também pode clicar e arrastar para reorientar o gráfico para ver diferentes correlações no espaço 3D.

    Gráfico de dispersão tridimensional de otimização de hípares

Encontrar a melhor tarefa de avaliação

Assim que todas as tarefas de otimização do hiperparâmetros tiverem sido concluídas, obtenha as suas melhores saídas de avaliação:

# Download best trial model output
ml_client.jobs.download(returned_sweep_job.name, output_name="model")

Pode utilizar a CLI para transferir todas as saídas predefinidas e nomeadas da melhor tarefa de avaliação e registos da tarefa de varrimento.

az ml job download --name <sweep-job> --all

Opcionalmente, para transferir apenas a melhor saída de avaliação

az ml job download --name <sweep-job> --output-name model

Referências

Passos seguintes