Como inicializar os elementos da matriz do filtro?

24

Estou tentando entender melhor as redes neurais convolucionais melhor escrevendo código Python que não depende de bibliotecas (como Convnet ou TensorFlow), e estou ficando preso na literatura sobre como escolher valores para a matriz do kernel, quando realizando uma convolução em uma imagem.

Estou tentando entender os detalhes da implementação na etapa entre os mapas de recursos na imagem abaixo, mostrando as camadas de uma CNN.

Camadas de redes neurais convolucionais

De acordo com este diagrama:

Como envolver uma imagem

O kernel da matriz do kernel "pisa" sobre a imagem, criando um mapa de recursos, em que cada pixel é a soma de todos os produtos entre elementos entre cada peso do kernel (ou matriz de filtro) e o valor de pixel correspondente da imagem de entrada.

Minha pergunta é: como inicializamos os pesos da matriz do kernel (ou filtro)?

Na demonstração acima, eles são simplesmente 1s e 0s, mas presumo que isso seja simplificado por causa do diagrama.

Esses pesos são treinados em alguma etapa de pré-processamento? Ou escolhido explicitamente pelo usuário?

Kai Kuspa
fonte

Respostas:

19

Normalmente, uma rede é inicializada a partir de uma distribuição aleatória, normalmente significa zero e alguns cuidados são tomados com relação à escolha de sua variação. Atualmente, com os avanços nas técnicas de otimização (SGD + Momentum, entre outros métodos) e as não linearidades de ativação (ativações ReLUs e ReLU, permitem melhor reprodução em retrocesso de sinais de gradiente, mesmo em redes mais profundas), é possível treinar de forma convolucional o estado da arte redes neurais de uma inicialização aleatória.

As principais propriedades são as seguintes:

  • Por que aleatório? Por que não inicializar todos eles para 0? Um conceito importante aqui é chamado de quebra de simetria . Se todos os neurônios tiverem os mesmos pesos, produzirão os mesmos resultados e não aprenderemos recursos diferentes. Não aprenderemos recursos diferentes porque, durante a etapa de retropropagação, todas as atualizações de peso serão exatamente iguais. Assim, começar com uma distribuição aleatória nos permite inicializar os neurônios para serem diferentes (com probabilidade muito alta) e nos permite aprender uma hierarquia de recursos rica e diversificada.

  • Por que dizer zero? Uma prática comum no aprendizado de máquina é centralizar o zero ou normalizar os dados de entrada, de modo que os recursos de entrada brutos (para dados de imagem, seriam pixels) na média de zero.

    Centramos o zero em nossos dados e inicializamos aleatoriamente os pesos da nossa rede (matrizes conforme você os referiu). Que tipo de distribuição devemos escolher? A distribuição dos dados de entrada para a nossa rede significa zero, uma vez que estamos centrados no zero. Digamos que também inicializamos nossos termos de viés como zero. Quando inicializamos o treinamento de nossa rede, não temos motivos para favorecer um neurônio em detrimento do outro, pois todos são aleatórios. Uma prática é inicializar aleatoriamente nossos pesos de uma maneira em que todos eles tenham zero saída de ativação em expectativa. Dessa maneira, nenhum neurônio é favorecido para "ativar" (tem valor de saída positivo) do que qualquer outro neurônio enquanto quebra simultaneamente a simetria devido à inicialização aleatória. Bem, uma maneira simples de conseguir isso é escolher uma distribuição zero média.

  • Como escolhemos as variações? Você não deseja escolher que a variação seja muito grande, mesmo que seja zero zero. Valores extremos nos pesos das redes profundas podem resultar em saídas de ativação que aumentam exponencialmente em magnitude, e esse problema pode se agravar com a profundidade da rede. Isso pode causar estragos no treinamento de nossa rede. Você também não deseja escolher que seja muito pequeno, pois isso pode atrasar o aprendizado, pois estamos computando valores de gradiente muito pequenos. Portanto, há um equilíbrio aqui, especialmente quando se trata de redes mais profundas, pois não queremos que nossas propagações para frente ou para trás aumentem exponencialmente ou diminuam em profundidade.

    Existem dois esquemas de inicialização de peso muito populares: Glorot Uniform ( Entendendo a dificuldade de treinar redes neurais profundas de feedforward ) e o inicializador He Normal ( Explorando profundamente os retificadores: superando o desempenho em nível humano na classificação ImageNet ).

    Ambos são construídos com a intenção de treinar redes profundas com o seguinte princípio central em mente (a citação é do artigo Delving Deeper into Rectifiers):

    "Um método de inicialização adequado deve evitar a redução ou ampliação das magnitudes dos sinais de entrada exponencialmente."

    Grosso modo, esses dois esquemas de inicialização inicializam a variação de cada camada para que a distribuição de saída de cada neurônio seja a mesma. A Seção 2.2 da Pesquisa aprofundada em retificadores fornece uma análise aprofundada.

Uma observação final: às vezes você também verá pessoas usando gaussiano com desvio padrão igual a 0,005 ou 0,01, ou algum outro desvio padrão "pequeno", em todas as camadas. Outras vezes, você verá pessoas mexendo com as variações manualmente, basicamente executando a validação cruzada para encontrar uma configuração com melhor desempenho.

Indie AI
fonte
1
Mas e a forma "X" (feita por 1s) do filtro amarelo no GIF acima? Entendo que é isso que eu gostaria de usar para detectar formas "X" em qualquer lugar da imagem, mas como sei que "X" é a forma que eu quero? Tenho a impressão de que a forma do filtro é aprendida automaticamente, mas não sei como. Talvez essa também fosse a pergunta do OP?
Felipe Almeida
2

Não posso comentar por causa da baixa reputação e, portanto, estou escrevendo isso em resposta à pergunta de Felipe Almeida. Após a resposta perfeita da IA ​​independente, não há muito a acrescentar. Se você deseja detectar formas específicas (como um X), pode predefinir um filtro específico, como é o caso da detecção de arestas. Mas essa é a beleza do aprendizado profundo, há tantas camadas, tantos filtros e tantas iterações que os filtros aprendem quase todas as formas de objetos necessárias por si próprias. Então, teoricamente, se houver um X a ser detectado, um dos filtros aprenderá a detectar um X (como o filtro amarelo)

código morto
fonte