Inicializando uma rede MLP (Keras)

Inicializando uma rede MLP (Keras)Importância1. Números aleatórios com distribuição uniformeDescriçãoEquações1. Uniforme Contínua2. Uniforme DiscretaHistograma TípicoImplementação no Keras2. Método de Inicialização de Xavier (Glorot, 2010)DescriçãoEquações1. Função de Densidade de Probabilidade (PDF)2. Média ($\mu$)3. Variância ($\sigma^2$)Histograma TípicoEmbasamento teórico3. Método de Inicialização de He (He et al, 2015)Funções de Ativação $\times$ VariânciaImplementação no TensorFlowImplementação no KerasMétodos Mais Recentes e Promissores?Método de LeCun (1998)Método LeCun com funções Sigmoidal e tanhPor que LeCun Normal ou LeCun Uniform funciona bem com Sigmoid/Tanh?Implementação no KerasQuando usar LeCun vs Xavier (Glorot) vs He?Estudos ComparativosDoc's TensorFlowCódigo Python para gráfico da Distribuição UniformeCódigo Python para gráficos da Distribuição Gaussiana


Importância

Quando você está trabalhando com redes neurais profundas, inicializar a rede com os pesos certos pode ser difícil de lidar porque as Redes Neurais Profundas sofrem de problemas chamados Gradientes de Desaparecer/Explodir. Portanto, precisamos que o sinal flua adequadamente em ambas as direções: na direção para frente ao fazer previsões e na direção inversa ao retropropagar gradientes. Não queremos que o sinal se apareça, nem queremos que ele exploda e sature (He, 2015).

Para inicializar os pesos de uma rede neural no Keras, você pode utilizar diferentes métodos de inicialização. Abaixo, apresento como implementar três abordagens específicas:

  1. Números aleatórios com distribuição uniforme;
  2. Método de Inicialização de Xavier (Glorot & Bengio, 2010);
  3. Método de Inicialização de He (He et al, 2015);
  4. Método de Inicialização de LeCun

1. Números aleatórios com distribuição uniforme

Descrição

A distribuição uniforme é uma distribuição de probabilidade onde todos os valores dentro de um intervalo específico têm a mesma probabilidade de ocorrer. Ela pode ser contínua ou discreta.

Equações

1. Uniforme Contínua

2. Uniforme Discreta

Histograma Típico

O histograma de uma distribuição uniforme contínua é uma reta horizontal, indicando que todos os valores no intervalo têm a mesma frequência. Para a uniforme discreta, o histograma consiste em barras de mesma altura, cada uma representando um valor possível com a mesma probabilidade, por exemplo:

dist_uniforme.png

Código Python usado para gerar figura anterior: ver aqui.

Implementação no Keras

Suponha que se queria inicializar os pesos da rede usando números aleatórios com distribuição uniforme na faixa [-0.1, 0.1].

Pode-se usar a função RandomUniform para definir a faixa desejada:

2. Método de Inicialização de Xavier (Glorot, 2010)

Não sabemos nada sobre os dados, então não temos certeza de como atribuir os pesos que funcionariam num caso específico. Uma boa maneira é atribuir os pesos usando distribuição gaussiana.

Descrição

A distribuição normal, também conhecida como distribuição Gaussiana, é uma das distribuições mais importantes em estatística. Ela é simétrica em torno da média, com a maioria dos valores concentrados próximos ao centro.

Equações

1. Função de Densidade de Probabilidade (PDF)

onde: é a média, é o desvio padrão.

2. Média ()

Para uma distribuição normal padrão (, ), a média é 0.

3. Variância ()

Para uma distribuição normal padrão, a variância é 1.

Histograma Típico

O histograma de uma distribuição normal tem a forma de um sino, simétrico em torno da média. A maioria dos dados está concentrada próximo à média, e a frequência diminui à medida que os valores se afastam da média em ambas as direções.

Embasamento teórico

Essa distribuição teria média zero e alguma variância finita (He, 2015).

Suponha que tenhamos uma contribuiçãoXComNcomponentes e um neurônio linear com pesos aleatórios que gera uma saída . A variância de pode ser desscrita como:

Sabemos que a variância de é:

Aqui, nós assumimos que e são todos distribuídos de forma idêntica e independente (distribuição gaussiana com média zero), então podemos trabalhar a variância de como sendo:

A variância da saída é a variância da entrada, mas é ponderada por . Portanto, se quisermos que a variação de seja igual à variância de , o termo deve ser igual a 1. Portanto, a variância do peso deve ser:

onde: número de neurônios de entrada num certo tensor.

Esta é a equação de inicialização de Xavier. Precisamos escolher os pesos de uma distribuição gaussiana com média zero e uma variância de: [[He, 2015]].

Usando o método de Glorot & Bengio (2010), também conhecido como Inicialização Xavier, este método é implementado no Keras como GlorotUniform:

Este método é especialmente eficaz para funções de ativação como a tangente hiperbólica (tanh) e a sigmoide.

Referência:

 

3. Método de Inicialização de He (He et al, 2015)

Glorot e Bengio consideraram a função de ativação sigmóide logística, que era a escolha padrão naquele momento para seu esquema de inicialização de peso. Mais tarde, a ativação sigmóide foi superada pelo ReLu, porque permitiu resolver o problema dos gradientes de desaparecimento/explosão (wanishing gradiet). No entanto, acontece que a inicialização de Xavier (Glorot) não é tão ideal para as funções ReLU. Consequentemente, surgiu uma nova técnica de inicialização, que aplicou a mesma ideia (equilíbrio da variância da ativação) a essa nova função de ativação e agora é frequentemente referida como inicialização. A estratégia de inicialização para a função de ativação ReLU e suas variantes às vezes é chamada de inicialização He. Há apenas um pequeno ajuste que precisamos fazer, que é multiplicar a variância dos pesos por 2! (He, 2015).

Funções de Ativação Variância

Função de AtivaçãoDistribuição Uniforme
Distribuição Normal
Tangente Hiperbólia (tanh)
Sigmóide
ReLU (e variantes)

Ref: He, 2015.

Implementação no TensorFlow

No Tensorflow, a inicialização é implementada na função variance_scaling_initializer() (que é, na verdade, um inicializador mais geral, mas, por padrão, executa a inicialização de He), enquanto o inicializador de Xavier é logicamente xavier_initializer().

Implementação no Keras

Conhecido como Inicialização de He, é adequado para funções de ativação ReLU e suas variantes. No Keras, utilize HeNormal:

Este método ajuda a evitar o problema do desaparecimento do gradiente (wanishing gradiet) em redes profundas.

Referência:

Referências Bibliográficas:

 

Métodos Mais Recentes e Promissores?

Método de LeCun (1998)

Uma abordagem mais recente é a Inicialização de LeCun, que é particularmente eficaz quando usada com a função de ativação selu (Scaled Exponential Linear Unit). No Keras, pode ser implementada como:

Referência

Este trabalho é amplamente citado na literatura de aprendizado de máquina e é considerado uma referência fundamental para técnicas de inicialização de pesos em redes neurais.

Método LeCun com funções Sigmoidal e tanh

O método de inicialização de LeCun é eficaz para redes MLP (Multilayer Perceptron) que utilizam funções de ativação sigmoide ou tangente hiperbólica (tanh). Ele foi projetado para lidar com o problema da variação da escala dos gradientes à medida que a informação se propaga pela rede, especialmente quando se usa essas funções de ativação.

Por que LeCun Normal ou LeCun Uniform funciona bem com Sigmoid/Tanh?

O método de LeCun ajusta a escala dos pesos com base no número de neurônios da camada anterior, usando a seguinte equação:

Onde:

Essas escalas ajudam a manter a variação dos sinais dentro de um intervalo controlado, evitando explosão ou desaparecimento do gradiente, um problema comum ao usar sigmoid ou tanh.

Implementação no Keras

Para aplicar esse método no Keras, utilize os inicializadores LeCunNormal ou LeCunUniform:

Ou usando distribuição uniforme:

Quando usar LeCun vs Xavier (Glorot) vs He?

MétodoObservações
LeCunMelhor para sigmoid e tanh.
Glorot (Xavier)Também funciona bem para sigmoid e tanh,
mas LeCun tende a ser um pouco mais estável.
HeMelhor para ReLU e variantes
(Leaky ReLU, ELU, etc.)

Em resumo, se sua rede MLP utiliza sigmoid ou tanh, a inicialização de LeCun Normal/Uniform é uma excelente escolha! 🚀

Estudos Comparativos

Existem diversos estudos que comparam métodos de inicialização de pesos em redes neurais multicamadas. Esses estudos analisam o impacto de diferentes inicializações no desempenho e na convergência das redes. Para uma análise detalhada, consulte artigos acadêmicos e publicações especializadas que abordam comparações entre essas técnicas.

Ao escolher o método de inicialização, considere a arquitetura da sua rede e as funções de ativação utilizadas, pois a combinação adequada pode melhorar significativamente o desempenho do modelo.

Doc's TensorFlow

Em TensorFlow > API > TensorFlow v2.16.1 > Python > tf.keras.initializers.VarianceScaling pode-se encontrar documentação à respeito de implementações e formas de inicializações usando Keras.


Código Python para gráfico da Distribuição Uniforme

. Código show_dist_uniform.py:

Comentários:

Código Python para gráficos da Distribuição Gaussiana

Código show_dist_gauss.py:

Comentários:


19/03/2025