Perguntas frequentes

Como as falhas de otimização podem ser depuradas e mitigadas?

Resumo: se o modelo estiver enfrentando dificuldades de otimização, é importante corrigi-las antes de tentar outras coisas. Diagnosticar e corrigir falhas de treinamento é uma área ativa de pesquisa.

Um gráfico comparando o WideResNet padrão com o WideResNet Stride 1x1.
            O eixo y é a taxa de erro de teste; o eixo x é a taxa de aprendizado básica.
            A WideResNet padrão tem uma queda gradual no TestErrorRate
            à medida que a taxa de aprendizado base aumenta. Por outro lado, o Stride WideResNet passa por flutuações selvagens à medida que a taxa de aprendizado básica aumenta.
Figura 4. Mudar os passos em um único bloco residual (2x2 -> 1x1) em um WideResnet resulta em instabilidade no treinamento.

 

Observe o seguinte sobre a Figura 4:

  • Mudar os passos não prejudica o desempenho em taxas de aprendizado baixas.
  • As altas taxas de aprendizado não treinam mais bem devido à instabilidade.
  • Aplicar 1.000 etapas de aquecimento da taxa de aprendizado resolve essa instância específica de instabilidade, permitindo um treinamento estável com taxa de aprendizado máxima de 0,1.

Como identificar cargas de trabalho instáveis

Qualquer carga de trabalho ficará instável se a taxa de aprendizado for muito grande. A instabilidade só é um problema quando força você a usar uma taxa de aprendizado muito pequena. É preciso distinguir pelo menos dois tipos de instabilidade de treinamento:

  • Instabilidade na inicialização ou no início do treinamento.
  • Instabilidade súbita no meio do treinamento.

Você pode adotar uma abordagem sistemática para identificar problemas de estabilidade na carga de trabalho fazendo o seguinte:

  • Fazer uma varredura de taxa de aprendizado e encontrar a melhor taxa de aprendizado lr*.
  • Traçar curvas de perda de treinamento para taxas de aprendizado logo acima de lr*.
  • Se as taxas de aprendizado > lr* mostrarem instabilidade de perda (a perda não diminui durante os períodos de treinamento), corrigir a instabilidade geralmente melhora o treinamento.

Registre a norma L2 do gradiente de perda total durante o treinamento, já que valores atípicos podem causar instabilidade falsa no meio do treinamento. Isso pode informar a agressividade para recortar gradientes ou atualizações de peso.

OBSERVAÇÃO: alguns modelos mostram instabilidade muito precoce, seguida por uma recuperação que resulta em um treinamento lento, mas estável. Programações de avaliação comuns podem acabar perdendo esses problemas se não avaliarem com frequência suficiente!

Para verificar isso, treine para uma sequência abreviada de apenas 500 etapas usando lr = 2 * current best, mas avalie todas as etapas.

Dois gráficos: o eixo x para os dois gráficos é de etapas globais, e o eixo y para os dois gráficos é "Perda de trem". Ambos os gráficos comparam um Stride conv. de (2,2) a um Conv Stride de (1,1). O primeiro gráfico mostra avaliações
            a cada 1.000 etapas. No primeiro gráfico, ambas as Strides de conv. mostram uma descida gradual e estável com mais passos globais. O segundo gráfico mostra avaliações frequentes nas primeiras 25 etapas. Neste segundo gráfico, o "Conv Stride" de (2,2) mostra oscilações exageradas na perda de trens nas primeiras etapas globais antes de ficar mais baixo de maneira consistente em 20 passos globais. O valor da conversão de (1,1) mostra uma
            perda de trem consistentemente baixa mesmo após o primeiro passo global.
Figura 5. O valor das avaliações mais frequentes no início do treinamento. Útil quando você suspeitar que o modelo sofre de instabilidade no treinamento.

 

Possíveis correções para padrões de instabilidade comuns

Considere estas possíveis correções para padrões de instabilidade comuns:

  • Aplique o aquecimento da taxa de aprendizado. Essa opção é melhor para instabilidade no início do treinamento.
  • Aplique truncamento de gradiente. Isso é bom para a instabilidade inicial e durante o treinamento, além de corrigir algumas inicializações incorretas que o aquecimento não consegue.
  • Experimente um novo otimizador. Às vezes, Adam pode lidar com instabilidades que a Momentum não consegue. Essa é uma área de pesquisa ativa.
  • Verifique se você está usando as práticas recomendadas e as melhores inicializações para a arquitetura do seu modelo (exemplos a seguir). Adicione conexões residuais e normalização caso elas ainda não estejam no modelo.
  • Normalizar como a última operação antes do residual. Por exemplo: x + Norm(f(x)). Observe que Norm(x + f(x)) pode causar problemas.
  • Tente inicializar as ramificações residuais para 0. Consulte ReZero is All You Need: rápida convergência em grande profundidade.
  • Diminua a taxa de aprendizado. Esse é um último recurso.

Aquecimento da taxa de aprendizado

Dois gráficos que demonstram o mesmo experimento. No primeiro gráfico, o eixo x é Degrau global e o eixo Y é Perda de trem. Com os números de aquecimento baixos da taxa de aprendizado, o Train Loss estava muito instável.
            Com números de aquecimento com taxa de aprendizado mais alta, a perda de treinamento ficou muito mais estável.
Figura 6. Um exemplo de instabilidade durante um período de aquecimento. Observe a escala de registro do eixo horizontal. Foram necessárias 40 mil etapas de aquecimento para o treinamento bem-sucedido nesse caso.

Quando aplicar o aquecimento da taxa de aprendizado

Gráfico da perda de entropia cruzada no conjunto de validação (eixo y) x taxa de aprendizado básica (eixo X). O gráfico mostra seis testes viáveis,
            todos com uma taxa de aprendizado base relativamente baixa. A perda
            de validação cai à medida que a taxa de aprendizado base aumenta e, em seguida, atinge um ponto baixo
            antes de começar a aumentar. O gráfico também mostra quatro testes inviáveis, todos com uma taxa de aprendizado base relativamente alta.
Figura 7a. Um exemplo de plotagem de eixo de hiperparâmetro para um modelo que exibe instabilidade de treinamento. A melhor taxa de aprendizado está no limite do que é viável. Um teste "inviável" produz NaNs ou valores excepcionalmente altos de perda.

 

Gráfico da perda de entropia cruzada no conjunto de treinamento (eixo y) vs. passo global (eixo X). A perda cai muito rapidamente nas etapas globais iniciais. Assim, a perda aumenta drasticamente em torno de 10.000 passos. Depois,
            a perda diminui gradualmente em cerca de 15.000 passos.
Figura 7b. Perda de treinamento de um modelo treinado com uma taxa de aprendizado em que há instabilidade.

 

A Figura 7a mostra um gráfico de eixo de hiperparâmetro que indica um modelo com instabilidades de otimização, porque a melhor taxa de aprendizado está no limite da instabilidade.

A Figura 7b mostra como isso pode ser verificado novamente examinando a perda de treinamento de um modelo treinado com uma taxa de aprendizado 5 ou 10 vezes maior do que esse pico. Se esse gráfico mostrar um aumento repentino na perda após uma queda constante (por exemplo, na etapa ~10 mil na figura acima), é provável que o modelo sofra com a instabilidade da otimização.

Como aplicar o aquecimento da taxa de aprendizado

Um gráfico de perda de validação na etapa 76619 (eixo y) x taxa de aprendizado base (eixo X). O gráfico compara os resultados de quatro situações diferentes em um Transformer LayerNorm na WMT14 EN-De. O aquecimento
            da taxa de aprendizado reduziu a perda de validação em taxas de aprendizado mais baixas.
Figura 8. Efeito benéfico do aquecimento da taxa de aprendizado ao lidar com instabilidades de treinamento.

 

Permita que unstable_base_learning_rate seja a taxa de aprendizado em que o modelo fica instável, usando o procedimento anterior.

O aquecimento envolve anexar uma programação de taxa de aprendizado que aumenta a taxa de aprendizado de 0 para um base_learning_rate estável que seja pelo menos uma ordem de magnitude maior que unstable_base_learning_rate. O padrão seria tentar um base_learning_rate que fosse 10x unstable_base_learning_rate. No entanto, é possível executar todo esse procedimento novamente para algo como 100x unstable_base_learning_rate. O cronograma específico é:

  • Aumento de 0 para base_learning_rate em SCHEDULE_steps.
  • Treine a uma taxa constante para post_aquecimento_steps.

Seu objetivo é encontrar o menor número de warmup_steps que permita acessar taxas de aprendizado de pico muito maiores do que unstable_base_learning_rate. Portanto, para cada base_learning_rate, você precisa ajustar warmup_steps e post_warmup_steps. Não há problema em definir post_warmup_steps como 2*warmup_steps.

O aquecimento pode ser ajustado independentemente de uma programação de iminência da conversão existente. warmup_steps precisa ser varredo em algumas ordens de magnitude diferentes. Por exemplo, um exemplo de estudo pode testar [10, 1000, 10,000, 100,000]. O maior ponto viável não pode ser maior que 10% de max_train_steps.

Depois que um warmup_steps que não explode o treinamento em base_learning_rate for estabelecido, ele precisará ser aplicado ao modelo de referência. Basicamente, anexe essa programação à programação atual e use a seleção ideal de ponto de verificação discutida acima para comparar esse experimento com o valor de referência. Por exemplo, se originalmente tivéssemos 10.000 max_train_steps e executamos warmup_steps em 1.000 etapas, o novo procedimento de treinamento será executado em um total de 11.000 etapas.

Se warmup_steps longos forem necessários para um treinamento estável (>5% de max_train_steps), talvez seja necessário aumentar max_train_steps para considerar isso.

Não há um valor "típico" em toda a gama de cargas de trabalho. Alguns modelos só precisam de 100 etapas, enquanto outros (especialmente transformadores) podem precisar de mais de 40.000.

Clipe de gradiente

Gráfico da norma Grad l2 (eixo y) vs. etapa global (eixo X). O treinamento "típico" da norma de gradiente foi muito instável nos primeiros passos globais. Um limite de clipe muito agressivo cortou a
          taxa de aprendizado e desacelerou o treinamento. Um limite de corte melhor
          (logo acima da norma de gradiente típica) estabilizou o treinamento inicial.
Figura 9. Recorte de gradiente corrigindo a instabilidade no treinamento inicial.

 

O recorte de gradiente é mais útil quando ocorrem problemas de gradientes grandes ou atípicos. O recorte de gradiente pode corrigir um dos seguintes problemas:

  • Instabilidade no treinamento inicial (norma de gradiente grande antecipadamente)
  • Instabilidades no meio do treinamento (picos repentinos do gradiente durante o treinamento)

Às vezes, períodos de aquecimento mais longos podem corrigir instabilidades que o recorte não corre. Para detalhes, consulte Aquecimento da taxa de aprendizado.

🤖 E quanto a clippings durante o aquecimento?

Os limites de clipe ideais estão logo acima da norma de gradiente "típica".

Veja um exemplo de como o recorte de gradiente pode ser feito:

  • Se a norma do gradiente $\left | g \right |$ for maior que o limite de recorte do gradiente $\lambda$, faça ${g}'= \lambda \times \frac{g}{\left | g \right |}$, em que ${g}'$ é o novo gradiente.

Registre a norma de gradiente sem corte durante o treinamento. Por padrão, gere:

  • Diagrama da norma do gradiente vs. passo
  • Um histograma de normas de gradiente agregadas em todas as etapas

Escolha um limite de recorte de gradiente com base no 90o percentil das normas de gradiente. O limite depende da carga de trabalho, mas 90% é um bom ponto de partida. Se 90% não funcionar, ajuste esse limite.

🤖 E quanto a algum tipo de estratégia adaptativa?

Se você tentar o truncamento de gradiente e os problemas de instabilidade persistirem, você poderá tentar mais difícil, ou seja, diminuir o limite.

O recorte de gradiente extremamente agressivo (ou seja, mais de 50% das atualizações que são cortadas) é, essencialmente, uma maneira estranha de reduzir a taxa de aprendizado. Se você perceber que está usando um recorte extremamente agressivo, é recomendável cortar a taxa de aprendizado.

Por que a taxa de aprendizado e outros parâmetros de otimização são chamados de hiperparâmetros? Eles não são parâmetros de nenhuma distribuição anterior.

O termo "hiperparâmetro" tem um significado preciso no machine learning bayesiano. Portanto, se referir à taxa de aprendizado e à maioria dos outros parâmetros de aprendizado profundo ajustáveis como "hiperparâmetros" é um abuso da terminologia. Preferimos usar o termo "metaparâmetro" para taxas de aprendizado, parâmetros de arquitetura e todas as outras coisas ajustáveis de aprendizado profundo. Isso porque o metaparâmetro evita o potencial de confusão que ocorre do uso indevido da palavra "hiperparâmetro". Essa confusão é especialmente provável ao discutir a otimização bayesiana, em que os modelos de superfície de resposta probabilística têm os próprios hiperparâmetros verdadeiros.

Infelizmente, embora seja potencialmente confuso, o termo "hiperparâmetro" se tornou extremamente comum na comunidade de aprendizado profundo. Portanto, para este documento, destinado a um amplo público que inclui muitas pessoas que provavelmente não estão cientes desse aspecto técnico, decidimos contribuir para uma fonte de confusão no campo na esperança de evitar outra. Dito isso, podemos fazer uma escolha diferente ao publicar um artigo de pesquisa e incentivar outras pessoas a usar "metaparameter" na maioria dos contextos.

Por que o tamanho do lote não pode ser ajustado para melhorar diretamente o desempenho do conjunto de validação?

Em geral, alterar o tamanho do lote sem alterar outros detalhes do pipeline de treinamento afeta o desempenho do conjunto de validação. No entanto, a diferença no desempenho do conjunto de validação entre dois tamanhos de lote normalmente diminui se o pipeline de treinamento é otimizado de maneira independente para cada tamanho de lote.

Os hiperparâmetros que interagem mais fortemente com o tamanho do lote e, portanto, são mais importantes para serem ajustados separadamente para cada tamanho de lote são os hiperparâmetros do otimizador (por exemplo, taxa de aprendizado, momentum) e os hiperparâmetros de regularização. Tamanhos de lote menores introduzem mais ruído no algoritmo de treinamento devido à variância da amostra. Esse ruído pode ter um efeito de regularização. Assim, tamanhos de lote maiores podem ser mais propensos a overfitting e exigir regularização mais forte e/ou outras técnicas de regularização. Além disso, talvez seja necessário ajustar o número de etapas de treinamento ao alterar o tamanho do lote.

Depois que todos esses efeitos são considerados, não há evidências convincentes de que o tamanho do lote afeta o desempenho máximo de validação alcançável. Para mais detalhes, consulte Shallue et al., 2018.

Quais são as regras de atualização para todos os algoritmos de otimização mais conhecidos?

Nesta seção, fornecemos regras de atualização para vários algoritmos de otimização conhecidos.

Gradiente descendente estocástico (GDE)

\[\theta_{t+1} = \theta_{t} - \eta_t \nabla \mathcal{l}(\theta_t)\]

Onde $\eta_t$ é a taxa de aprendizado na etapa $t$.

Momentum

\[v_0 = 0\]

\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]

\[\theta_{t+1} = \theta_{t} - \eta_t v_{t+1}\]

Onde $\eta_t$ é a taxa de aprendizado na etapa $t$ e $\gamma$ é o coeficiente do momentum.

Nesterov

\[v_0 = 0\]

\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]

\[\theta_{t+1} = \theta_{t} - \eta_t ( \gamma v_{t+1} + \nabla \mathcal{l}(\theta_{t}) )\]

Onde $\eta_t$ é a taxa de aprendizado na etapa $t$ e $\gamma$ é o coeficiente do momentum.

RMSProp

\[v_0 = 1 \text{, } m_0 = 0\]

\[v_{t+1} = \rho v_{t} + (1 - \rho) \nabla \mathcal{l}(\theta_t)^2\]

\[m_{t+1} = \gamma m_{t} + \frac{\eta_t}{\sqrt{v_{t+1} + \epsilon}}\nabla \mathcal{l}(\theta_t)\]

\[\theta_{t+1} = \theta_{t} - m_{t+1}\]

ADAM

\[m_0 = 0 \text{, } v_0 = 0\]

\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]

\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l}(\theta_t)^2\]

\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]

\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{m_{t+1}}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]

NADAM

\[m_0 = 0 \text{, } v_0 = 0\]

\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]

\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l} (\theta_t)^2\]

\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]

\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{\beta_1 m_{t+1} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]