Algoritmos de Aprendizado no KerasComo indicar o algoritmo de aprendizado no Keras?Quais algoritmos de aprendizado estão disponíveis?Como modificar a taxa de aprendizado e o termo momentum?Existe suporte para Simulated Annealing?Como Simulated Annealing poderia ser aplicado em redes neurais?Implementando Simulated Annealing no KerasOutra abordagem: Adicionar ruído aos gradientesConclusãoExiste algum algoritmo que reduza a taxa de aprendizado e aumente o momentum automaticamente?Implementando taxa de aprendizado exponencialmente decrescenteImplementação no KerasExemplo de Evolução da Taxa de AprendizadoAlgoritmos similares com $\eta$ descrescente1. RMSprop e Adam (Momentum Suavizado)ExemplosCódigo Keras usando RMSpropCódigo Keras usando AdamExplicações sobre os códigosExemplo de Decaimento da Taxa de Aprendizado2. Exponential Learning Rate Decay3. AdaDelta e "No Learning Rate Decay"Observações finaisResumo


Algoritmos de Aprendizado no Keras

No Keras, o algoritmo de aprendizado é especificado na fase de compilação do modelo, utilizando o método .compile(). O parâmetro optimizer define qual algoritmo será usado para atualizar os pesos da rede.

Como indicar o algoritmo de aprendizado no Keras?

Ao criar um modelo MLP, por exemplo, você pode definir o otimizador assim:

No exemplo acima, o otimizador escolhido é o SGD (Stochastic Gradient Descent).

Quais algoritmos de aprendizado estão disponíveis?

O Keras oferece os seguintes otimizadores:

  1. SGD (Stochastic Gradient Descent)

    • Suporta momentum e nesterov momentum.
    • Pode ser combinado com um scheduler para reduzir a taxa de aprendizado ao longo do tempo.
  2. Adam (Adaptive Moment Estimation)

    • Híbrido entre RMSprop e momentum.
    • Adapta a taxa de aprendizado para cada parâmetro.
  3. RMSprop (Root Mean Square Propagation)

    • Usa a média quadrática dos gradientes para ajustar a taxa de aprendizado.
    • Muito eficiente para problemas de séries temporais e RNNs.
  4. Adagrad (Adaptive Gradient Algorithm)

    • Adapta a taxa de aprendizado para cada parâmetro individualmente.
  5. Adadelta

    • Variante do Adagrad que evita que a taxa de aprendizado diminua demais.
  6. Adamax

    • Variante do Adam, recomendada para redes muito grandes.
  7. Nadam (Nesterov-accelerated Adaptive Moment Estimation)

    • Combina Adam e Nesterov momentum.

Como modificar a taxa de aprendizado e o termo momentum?

Cada otimizador aceita hiperparâmetros. No caso do SGD, por exemplo, você pode definir:

Neste exemplo:


Existe suporte para Simulated Annealing?

O verdadeiro conceito de Simulated Annealing (SA) envolve a adição de ruído controlado para escapar de mínimos locais, o que não é uma estratégia nativa dos otimizadores do Keras. Nenhum dos otimizadores padrão do Keras implementa essa abordagem explicitamente, mas existem algumas formas de simular esse efeito.

Como Simulated Annealing poderia ser aplicado em redes neurais?

Em redes neurais, SA pode ser implementado de algumas formas, incluindo:

  1. Adicionando ruído gaussiano aos pesos durante o treinamento.
  2. Modificando a função de ativação para incluir um termo estocástico.
  3. Usando um otimizador especializado que introduza perturbações nos gradientes.

Nenhum otimizador padrão do Keras implementa a ideia diretamente, mas algumas abordagens próximas incluem:

Implementando Simulated Annealing no Keras

A abordagem mais direta seria adicionar ruído na ativação dos neurônios das camadas ocultas. Podemos fazer isso adicionando uma camada Lambda que injeta ruído gaussiano:

O que esse código faz?**

Outra abordagem: Adicionar ruído aos gradientes

Se quiser adicionar ruído diretamente ao processo de otimização, uma alternativa é criar um otimizador customizado que "perturba" os gradientes:

O que esse código faz?**

Conclusão

Embora o Keras não tenha um otimizador nativo que implemente Simulated Annealing, podemos alcançar um efeito semelhante de duas formas:

  1. Adicionando ruído na ativação das camadas ocultas (Lambda com random_normal).
  2. Criando um otimizador customizado que injeta ruído nos gradientes.

Isso pode melhorar a capacidade da rede de escapar de mínimos locais.

Existe algum algoritmo que reduza a taxa de aprendizado e aumente o momentum automaticamente?

O Keras não tem um otimizador que faça isso por padrão, mas isso pode ser implementado usando callbacks como LearningRateScheduler e ReduceLROnPlateau.

Exemplo de uma estratégia que reduz a taxa de aprendizado e aumenta o momentum:

Esse callback:

Implementando taxa de aprendizado exponencialmente decrescente

Lembrado da eq. de diferenças de um filtro passa-baixas de primeira ordem e sua resposta a um impulso (exponencial decrescente), podemos tentar implementar uma rotina, que a cada vez que é chamada, reduz exponencialmente a taxa de aprendizado até um valor mínimo minimum_lr.

Podemos modelar a taxa de aprendizado com um decaimento exponencial semelhante à resposta ao impulso de um filtro recursivo (IIR) passa-baixas de 1ª ordem, que segue a forma:

No contexto da taxa de aprendizado, ficaria:

onde:

Note que:  
Se taxa não muda
(não há decaimento)
Se taxa mínima
(não há decaimento)

Implementação no Keras

Podemos implementar essa atualização dentro de um Callback no Keras:

Explicação do Código

  1. Callback IIRLearningRateScheduler

    • Atualiza a taxa de aprendizado a cada época seguindo a equação:
    • Garante que a taxa de aprendizado nunca desça abaixo de minimum_lr.
    • O parâmetro alpha controla a suavidade da redução.
  2. Uso no Keras

    • Associamos o callback ao model.fit(), e a taxa de aprendizado vai diminuindo exponencialmente a cada época.

Exemplo de Evolução da Taxa de Aprendizado

Se initial_lr=0.01, minimum_lr=1e-5, alpha=0.9, então:

ÉpocaTaxa de Aprendizado
10.009009
20.008118
30.007306
100.004263
200.002043
500.000100

Isso simula a resposta ao impulso de um filtro passa-baixas de 1ª ordem, suavizando o decaimento.

Se quiser alterar a velocidade do decaimento, basta ajustar alpha! 🚀

O gráfico á seguir mostra a evolução da taxa de aprendizado se: minimum_lr=0,0001$:

evolucao_exp_lr.png

O gráfico anterior foi criado com o script:

Algoritmos similares com descrescente

A ideia de usar um decaimento exponencial da taxa de aprendizado semelhante a um filtro passa-baixas de 1ª ordem aparece em alguns algoritmos de otimização. Aqui estão algumas abordagens que já incorporam essa técnica (ou algo bem próximo):

1. RMSprop e Adam (Momentum Suavizado)

RMSprop

O RMSprop foi introduzido por Geoffrey Hinton em suas notas de aula no Coursera, sem uma publicação formal revisada por pares. Não há um artigo oficial publicado. A referência mais próxima é:

Adam

Tanto o RMSprop quanto o Adam utilizam um fator de amortecimento () que age como um filtro passa-baixas sobre os gradientes:

onde:

Isso faz com que a atualização dos pesos reaja lentamente às mudanças abruptas nos gradientes, funcionando como um filtro passa-baixas de 1ª ordem.

📌 Diferença:

Exemplos

Aqui está como ativar o aprendizado de uma MLP (Multilayer Perceptron) usando RMSprop ou Adam no Keras, com:

Código Keras usando RMSprop
Código Keras usando Adam

Caso queira usar Adam ao invés de RMSprop, basta trocar o otimizador:

Explicações sobre os códigos
  1. Otimizadores RMSprop e Adam

    • learning_rate=0.3 → taxa de aprendizado inicial.
    • rho=0.9 (no RMSprop) e beta_1=0.9 (no Adam) → fator de amortecimento da média móvel dos gradientes.
  2. Decaimento Exponencial da Taxa de Aprendizado

    • Implementado via callback IIRLearningRateScheduler(), que reduz lr de forma suave e adaptativa.
    • Evita quedas bruscas e melhora a convergência.
Exemplo de Decaimento da Taxa de Aprendizado

Se initial_lr=0.3, minimum_lr=1e-4, alpha=0.9, o ajuste ocorre assim:

ÉpocaTaxa de Aprendizado
10.27009
50.19779
100.14411
200.07836
500.01000

Isso ajuda a estabilizar o aprendizado e evitar mínimos locais ruins! 🚀

2. Exponential Learning Rate Decay

A técnica SGD com Decaimento Exponencial da Taxa de Aprendizado não possui um único artigo associado que introduza o SGD com decaimento exponencial da taxa de aprendizado, pois é uma técnica comum utilizada em diversos estudos. Geralmente, é mencionada em livros e tutoriais sobre aprendizado de máquina.

Alguns algoritmos aplicam decaimento exponencial diretamente na taxa de aprendizado:

Essa equação aparece em variantes como SGD com decaimento exponencial, porém ela não usa um filtro recursivo (IIR), e sim um decaimento direto. Nossa abordagem com filtro passa-baixas é mais suavizada e adaptativa.

3. AdaDelta e "No Learning Rate Decay"

O AdaDelta evita definir manualmente uma taxa de aprendizado inicial e ajusta automaticamente a escala de atualização dos pesos:

Aqui, a suavização é aplicada ao histórico de atualizações. Isso lembra a suavização exponencial que fizemos, mas é aplicada à magnitude dos gradientes em vez da taxa de aprendizado.

Referência:

Zeiler, M.D. (2012) 'ADADELTA: An Adaptive Learning Rate Method', arXiv preprint arXiv:1212.5701.


Observações finais

📌 Nenhum otimizador padrão implementa exatamente a estratégia que sugerimos (filtro IIR sobre lr[n]).
📌 Porém, algoritmos como Adam, RMSprop e AdaDelta usam suavização exponencial sobre gradientes, que tem um efeito parecido.

Se você quiser experimentar isso em um otimizador real, podemos tentar modificar um otimizador existente no TensorFlow e implementar nossa versão customizada! 🚀

 


Resumo


19/03/2025