Guia do monstro para ajuste de hiperparâmetro

Agora que já se passou mais de um ano desde o surgimento do nosso primeiro projeto de aprendizado profundo , tivemos que seguir em frente e oferecer os melhores modelos possíveis.

Isso envolveu muita pesquisa, experimentando modelos diferentes, desde simples como palavras-chave , LSTM e CNN , até a atenção mais avançada , MDN e aprendizado de múltiplas tarefas .

Até o modelo mais simples que tentamos possui muitos hiperparâmetros, e ajustá-los pode ser ainda mais importante do que a arquitetura real que acabamos usando - em termos de precisão do modelo.

Embora exista muita pesquisa ativa no campo do ajuste de hiperparâmetros (consulte 1, 2, 3, ), a implementação desse processo de ajuste evitou os holofotes.

Se você perguntar por que as pessoas ajustam seus modelos, a resposta mais provável será "apenas escreva um script que faça isso por você". Bem, isso é mais fácil dizer do que fazer ...

Aparentemente, há algumas coisas que você deve ter em mente ao implementar esse script.

Aqui, no Avance Network, implementamos um script de ajuste de hiperparâmetro. Deixe-me compartilhar com você as coisas que aprendemos ao longo do caminho ...

Vamos começar simples

Às vezes, usar o scikit-learn para ajuste de hiperparâmetros pode ser suficiente - pelo menos para projetos pessoais.

Para projetos de longo prazo, quando você precisa acompanhar as experiências realizadas e a variedade de arquiteturas diferentes que você tenta continuar aumentando, isso pode não ser suficiente.

Principium

A primeira versão do script era simples, mas abrangia a maioria das nossas necessidades.

Os requisitos foram:

Fácil de executar

Você vai executar esse script várias vezes. Portanto, deve ser o mais fácil possível especificar quais experimentos você deseja executar.
Acabamos com o seguinte formato JSON:

 

  • Arquitetura : arquitetura que você deseja ajustar, supondo que seu código suporte vários tipos
  • Intervalo de datas : lista de tuplas, cada uma define um intervalo de dados que será usado para treinar um modelo. Cada experimento será executado uma vez por período
  • Parâmetros : valores para tentar para cada hiperparâmetro. Nossa implementação inicial suportou apenas um conjunto finito de valores (pesquisa na grade)

O script gera aleatoriamente experimentos a partir deste JSON.

Criamos um trabalho Jenkins que executa o script em uma de nossas máquinas com GPUs, liberando, assim, a necessidade de usar o SSH.

Enriqueça experiências com métricas

Nosso processo de treinamento gera muitas métricas, como MSE, perda e tempo de treinamento. Você pode escolher o que quiser e eles serão exibidos nos resultados.

Salvar resultados na nuvem

 

Os resultados são salvos como um arquivo CSV no Google Cloud Storage, que permite iniciar o script a partir de qualquer máquina e assistir aos resultados de nossos laptops.

Os resultados são enviados continuamente, portanto, não precisamos esperar que todas as experiências terminem para começar a inspecionar os resultados.

Os próprios modelos também são salvos.

Então, o que aprendemos até agora?

Esta primeira implementação foi a mais importante.

Sendo simples, o script não fez nada de inteligente para você. Ele não sabia quais experimentos executar - você tinha que definir manualmente a entrada JSON para cada execução.

Depois de executar o script várias vezes, você começa a entender quais valores funcionam melhor que outros. É uma das coisas mais importantes que obtivemos do script - uma compreensão mais profunda dos nossos modelos.

O uso desse script pela primeira vez nos trouxe uma grande melhoria - o MSE melhorou em mais de 10%.

Temos certeza de que é real?

Quando você realiza centenas de experimentos, os melhores costumam ter diferenças insignificantes. Como você pode saber que é estatisticamente significativo?

Uma maneira de resolver esse problema, supondo que você tenha dados suficientes, é treinar o mesmo modelo em vários períodos. Se um modelo é melhor que os outros em todos os períodos, você pode ter mais certeza de que é real.

Digamos que hoje seja junho e você execute o script. Aqui estão os períodos que o script escolherá:

 

Observe que o script escolhe um novo conjunto de períodos se você o executar em um mês diferente. Isso é importante, pois, caso contrário, você poderá desajustar acidentalmente seus modelos devido à extensa sintonia de hiperparâmetro.

Não tenho tempo para isso

Quem tem tempo para executar todos os experimentos três vezes? É bom que você obtenha resultados confiáveis, mas isso significa que você acabará executando menos experimentos diferentes.

A próxima versão do script resolveu esse problema, suportando um novo modo de operação:

  • Somente um período é usado
  • O período contém apenas um mês de dados
  • O treinamento é limitado a menos épocas

Mas os resultados estão correlacionados com o que obteríamos se usássemos mais dados e épocas?

Para responder a isso, realizamos algumas experiências, cada uma usando uma quantidade diferente de dados, variando de uma semana a três meses. Descobrimos que um mês teve uma boa troca entre MSE e tempo de treinamento.

(Você notou que usamos o script de ajuste do hiperparâmetro para ajustar o script do hiperparâmetro? Quão legal é isso?)

Para investigar qual seria o número certo de épocas, analisamos o MSE no TensorBoard.

 

Cada gráfico no gráfico representa um modelo diferente treinado em uma quantidade diferente de dados.
Após 20 épocas, todos os modelos quase convergiram, então é seguro parar por aí.

Vamos script, faça o trabalho para mim!

Nesse ponto, decidimos que o script deve escolher os valores de hiperparâmetro para você.
Começamos com os hiperparâmetros relacionados à taxa de aprendizado: taxa de aprendizado inicial, fator de decaimento, número de épocas sem melhora para paradas precoces, etc.

Por que aprender taxa?

  • Isso afeta significativamente o tempo de treinamento. Primeiro, devemos estabelecer uma boa taxa de aprendizado, tanto em termos de precisão quanto de tempo de treinamento, antes de ajustar todo o resto
  • Alguns sugerem que ele controla a capacidade efetiva do modelo de uma maneira mais complicada do que outros hiperparâmetros, portanto, pode ser melhor começar com isso.

O novo modo do script usa intervalos de valores embutidos que são razoáveis ​​para nossos modelos.

Então veio a próxima demanda:

A próxima versão do script fez exatamente isso: fornecido com um nome de arquitetura, ele gera automaticamente experimentos para você. Você não precisa especificar nenhum valor de hiperparâmetro.

Vamos aleatoriamente

Embora seja pior do que a pesquisa aleatória em alguns casos , a pesquisa em grade é mais fácil de analisar: todo valor é usado por várias experiências, por isso é fácil identificar tendências.

Como já tínhamos ganhado intuição sobre quais valores funcionam melhor, era hora de implementar a pesquisa aleatória. Isso ajudou o script a encontrar melhores hiperparâmetros.

Algumas considerações finais

Na fase de pesquisa de qualquer projeto de aprendizado de máquina, o ajuste do hiperparâmetro pode ser feito manualmente. No entanto, quando você deseja levar o projeto para o próximo nível, é altamente eficaz automatizar o processo. Neste post, descrevi alguns dos pequenos detalhes que implementamos no processo de automação. Alguns podem ser úteis para você, outros podem não. Deixe uma linha nos comentários se você encontrar outras coisas interessantes para ajudar.

 

Máxima comunicação com proteção ao extremo? Avance Network: A verdadeira rede social junte-se a nós


Strong

5178 Blog des postes

commentaires