Existe um método padrão e aceito para selecionar o número de camadas e o número de nós em cada camada em uma rede neural feed-forward? Estou interessado em maneiras automatizadas de construir redes neurais.
Existe um método padrão e aceito para selecionar o número de camadas e o número de nós em cada camada em uma rede neural feed-forward? Estou interessado em maneiras automatizadas de construir redes neurais.
Respostas:
Sei que essa pergunta foi respondida, mas não acho que a resposta existente realmente envolva a questão além de apontar para um link geralmente relacionado ao assunto da pergunta. Em particular, o link descreve uma técnica para configuração de rede programática, mas esse não é um " [a] método padrão e aceito " para configuração de rede.
Seguindo um pequeno conjunto de regras claras, é possível definir programaticamente uma arquitetura de rede competente (ou seja, o número e o tipo de camadas neuronais e o número de neurônios que compõem cada camada). Após esse esquema, você fornecerá uma arquitetura competente, mas provavelmente não a ideal.
Mas depois que essa rede é inicializada, você pode ajustar iterativamente a configuração durante o treinamento usando vários algoritmos auxiliares; uma família desses trabalhos poda os nós com base em valores (pequenos) do vetor de peso após um certo número de épocas de treinamento - em outras palavras, eliminando nós desnecessários / redundantes (mais sobre isso abaixo).
Portanto, todo NN tem três tipos de camadas: entrada , oculto e saída .
Portanto, criar a arquitetura NN significa criar valores para o número de camadas de cada tipo e o número de nós em cada uma dessas camadas.
A camada de entrada
Simples - todo NN tem exatamente um deles - sem exceções que eu saiba.
Com relação ao número de neurônios que compõem essa camada, esse parâmetro é determinado de maneira completa e exclusiva quando você conhece o formato dos dados de treinamento. Especificamente, o número de neurônios que compõem essa camada é igual ao número de recursos (colunas) em seus dados . Algumas configurações de NN adicionam um nó adicional para um termo de polarização.
A camada de saída
Como a camada de entrada, todo NN tem exatamente uma camada de saída. Determinar seu tamanho (número de neurônios) é simples; é completamente determinado pela configuração do modelo escolhido.
O seu NN está funcionando no Modo Máquina ou no Modo Regressão (a convenção de ML de usar um termo que também é usado em estatística, mas atribuir um significado diferente a ele é muito confusa). Modo de máquina: retorna um rótulo de classe (por exemplo, "Conta premium" / "Conta básica"). O modo de regressão retorna um valor (por exemplo, preço).
Se o NN for um regressor, a camada de saída terá um único nó.
Se o NN for um classificador, ele também terá um único nó, a menos que o softmax seja usado. Nesse caso, a camada de saída possui um nó por rótulo de classe no seu modelo.
As camadas ocultas
Portanto, essas poucas regras definem o número de camadas e o tamanho (neurônios / camada) para as camadas de entrada e saída. Isso deixa as camadas ocultas.
Quantas camadas ocultas? Bem, se seus dados são linearmente separáveis (que você já sabe quando começa a codificar um NN), não precisa de nenhuma camada oculta. Obviamente, você também não precisa de um NN para resolver seus dados, mas ele ainda funcionará.
Além disso, como você provavelmente sabe, há uma montanha de comentários sobre a questão da configuração da camada oculta nas NNs (consulte as FAQs da NN insanamente completas e perspicazes para obter um excelente resumo desse comentário). Uma questão nesse assunto em que existe um consenso é a diferença de desempenho da adição de camadas ocultas adicionais: as situações em que o desempenho melhora com uma segunda (ou terceira, etc.) camada oculta são muito poucas. Uma camada oculta é suficiente para a grande maioria dos problemas.
E quanto ao tamanho da (s) camada (s) oculta (s) - quantos neurônios? Existem algumas regras práticas derivadas empiricamente, dentre as quais a mais comum é a de que " o tamanho ideal da camada oculta geralmente está entre o tamanho da entrada e o tamanho das camadas de saída ". Jeff Heaton, autor de Introdução às redes neurais em Java, oferece um pouco mais.
Em suma, para a maioria dos problemas, é possível obter um desempenho decente (mesmo sem uma segunda etapa de otimização) definindo a configuração da camada oculta usando apenas duas regras: (i) o número de camadas ocultas é igual a um; e (ii) o número de neurônios nessa camada é a média dos neurônios nas camadas de entrada e saída.
Otimização da configuração de rede
Podadescreve um conjunto de técnicas para aparar o tamanho da rede (por nós e não por camadas) para melhorar o desempenho computacional e, às vezes, o desempenho da resolução. A essência dessas técnicas é remover nós da rede durante o treinamento, identificando aqueles que, se removidos da rede, não afetariam visivelmente o desempenho da rede (ou seja, a resolução dos dados). (Mesmo sem usar uma técnica de poda formal, você pode ter uma idéia aproximada de quais nós não são importantes observando sua matriz de peso após o treinamento; olhe pesos muito próximos de zero - são os nós em cada extremidade dos pesos que são frequentemente removidos durante a remoção.) Obviamente, se você usar um algoritmo de remoção durante o treinamento, comece com uma configuração de rede com maior probabilidade de ter nós em excesso (ou seja, 'removíveis') - em outras palavras,
Em outras palavras, aplicando um algoritmo de remoção à sua rede durante o treinamento, você pode abordar a configuração ideal da rede; se você pode fazer isso em um único "upfront" (como um algoritmo baseado em algoritmos genéticos) não sei, embora saiba que, por enquanto, essa otimização em duas etapas é mais comum.
A resposta de @ doug funcionou para mim. Há uma regra geral adicional que ajuda a problemas de aprendizado supervisionado. Geralmente, você pode evitar o excesso de ajuste se mantiver o número de neurônios abaixo:
Para um procedimento automatizado, você começaria com um alfa de 2 (o dobro de graus de liberdade nos dados de treinamento que o modelo) e aumentaria até 10 se o erro (perda) no conjunto de dados de treinamento for significativamente menor do que no modelo seu conjunto de dados de teste.
N_h
(número médio de neurônios ocultos por camada) solução para isso N_s = (N_i + N_o) * N_h ^ N_hidden_layers
. Mas eu ainda não usaria essa fórmula. É apenas para problemas muito básicos (problemas de brinquedo) quando você não planeja implementar outras abordagens de regularização.
From Introduction to Neural Networks for Java (segunda edição) por Jeff Heaton - pré-visualização disponível gratuitamente no Google Livros e anteriormente no site do autor :
O número de camadas ocultas
Há realmente duas decisões que devem ser tomadas com relação às camadas ocultas: quantas camadas ocultas realmente existem na rede neural e quantos neurônios estarão em cada uma dessas camadas. Primeiro, examinaremos como determinar o número de camadas ocultas a serem usadas com a rede neural.
Problemas que requerem duas camadas ocultas raramente são encontrados. No entanto, redes neurais com duas camadas ocultas podem representar funções com qualquer tipo de forma. Atualmente, não há razão teórica para usar redes neurais com mais de duas camadas ocultas. De fato, para muitos problemas práticos, não há razão para usar mais de uma camada oculta. A Tabela 5.1 resume os recursos das arquiteturas de redes neurais com várias camadas ocultas.
Tabela 5.1: Determinando o número de camadas ocultas
| Número de camadas ocultas | Resultado 0 - Apenas capaz de representar funções ou decisões lineares separáveis. 1 - Pode aproximar qualquer função que contenha um mapeamento contínuo de um espaço finito para outro. 2 - Pode representar um limite de decisão arbitrária para precisão arbitrária com funções racionais de ativação e pode aproximar-se de qualquer mapeamento com qualquer precisão.Decidir o número de camadas ocultas de neurônios é apenas uma pequena parte do problema. Você também deve determinar quantos neurônios estarão em cada uma dessas camadas ocultas. Este processo é abordado na próxima seção.
O número de neurônios nas camadas ocultas
Decidir o número de neurônios nas camadas ocultas é uma parte muito importante para decidir sua arquitetura geral da rede neural. Embora essas camadas não interajam diretamente com o ambiente externo, elas exercem uma tremenda influência sobre o resultado final. Tanto o número de camadas ocultas quanto o número de neurônios em cada uma dessas camadas ocultas devem ser cuidadosamente considerados.
Usar muito poucos neurônios nas camadas ocultas resultará em algo chamado desajustamento. A falta de ajuste ocorre quando há muito poucos neurônios nas camadas ocultas para detectar adequadamente os sinais em um conjunto de dados complicado.
O uso de muitos neurônios nas camadas ocultas pode resultar em vários problemas. Primeiro, muitos neurônios nas camadas ocultas podem resultar em super adaptação. O ajuste excessivo ocorre quando a rede neural tem tanta capacidade de processamento de informações que a quantidade limitada de informações contidas no conjunto de treinamento não é suficiente para treinar todos os neurônios nas camadas ocultas. Um segundo problema pode ocorrer mesmo quando os dados de treinamento são suficientes. Um número excessivamente grande de neurônios nas camadas ocultas pode aumentar o tempo necessário para treinar a rede. A quantidade de tempo de treinamento pode aumentar a ponto de ser impossível treinar adequadamente a rede neural. Obviamente, algum compromisso deve ser alcançado entre muitos e poucos neurônios nas camadas ocultas.
Existem muitos métodos práticos para determinar o número correto de neurônios a serem usados nas camadas ocultas, como os seguintes:
- O número de neurônios ocultos deve estar entre o tamanho da camada de entrada e o tamanho da camada de saída.
- O número de neurônios ocultos deve ser 2/3 do tamanho da camada de entrada, mais o tamanho da camada de saída.
- O número de neurônios ocultos deve ser menor que o dobro do tamanho da camada de entrada.
Essas três regras fornecem um ponto de partida para você considerar. Por fim, a seleção de uma arquitetura para sua rede neural se resume a tentativa e erro. Mas o que exatamente se entende por tentativa e erro? Você não deseja começar a lançar números aleatórios de camadas e neurônios na sua rede. Fazer isso seria muito demorado. O Capítulo 8, “Podando uma rede neural”, explorará várias maneiras de determinar uma estrutura ideal para uma rede neural.
Também gosto do seguinte trecho de uma resposta encontrada em researchgate.net , que transmite muito em apenas algumas palavras:
Steffen B Petersen · Universidade de Aalborg
[...]
Para garantir a capacidade da rede de generalizar, o número de nós deve ser mantido o mais baixo possível. Se você tiver um grande excesso de nós, sua rede se tornará um banco de memória que pode recuperar o conjunto de treinamento com perfeição, mas não apresenta bom desempenho em amostras que não faziam parte do conjunto de treinamento.
No momento, estou trabalhando em um estudo empírico disso (abordando um século de simulações de processadores em nossas instalações de HPC!). Meu conselho seria usar uma rede "grande" e regularização; se você usar a regularização, a arquitetura da rede se tornará menos importante (desde que seja grande o suficiente para representar a função subjacente que queremos capturar), mas você precisará ajustar a regularização. parâmetro corretamente.
Um dos problemas com a seleção da arquitetura é que ele é um controle discreto, e não contínuo, da complexidade do modelo e, portanto, pode ser um instrumento um tanto brusco, especialmente quando a complexidade ideal é baixa.
No entanto, tudo isso está sujeito aos teoremas "sem almoço grátis", enquanto a regularização é eficaz na maioria dos casos, sempre haverá casos em que a seleção da arquitetura funciona melhor e a única maneira de descobrir se isso é verdade para o problema em questão é tentar ambas as abordagens e validar cruzadamente.
Se eu fosse construir um construtor de rede neural automatizado, usaria a abordagem bayesiana baseada em amostragem Hybrid Monte Carlo (HMC) da Radford Neal e usaria uma grande rede e integraria os pesos em vez de otimizar os pesos de uma única rede. No entanto, isso é computacionalmente caro e um pouco de "arte negra", mas os resultados alcançados pelo Prof. Neal sugerem que vale a pena!
Tanto quanto sei, não há como selecionar automaticamente o número de camadas e neurônios em cada camada. Mas existem redes que podem construir automaticamente sua topologia, como a EANN (Redes Neurais Artificiais Evolucionárias, que usam algoritmos genéticos para desenvolver a topologia).
Existem várias abordagens, uma mais ou menos moderna que parecia dar bons resultados foi a NEAT (Neuro Evolution of Augmented Topologies) .
Maneiras automatizadas de construir redes neurais usando a pesquisa global de hiperparâmetros:
As camadas de entrada e saída são de tamanho fixo.
O que pode variar:
Vários métodos podem ser usados para esse problema discreto de otimização , com o erro de falta de amostra na rede como a função de custo.
Desculpe, mas não posso postar um comentário, por isso, tenha paciência comigo. Enfim, esbarrei neste tópico de discussão que me lembrava um artigo que eu tinha visto muito recentemente. Eu acho que pode ser interessante para as pessoas que participam aqui:
AdaNet: Aprendizado estrutural adaptável de redes neurais artificiais
Corinna Cortes, Xavier Gonzalvo, Vitaly Kuznetsov, Mehryar Mohri, Scott Yang; Anais da 34ª Conferência Internacional sobre Aprendizado de Máquina, PMLR 70: 874-883, 2017.
Resumo Apresentamos uma nova estrutura para analisar e aprender redes neurais artificiais. Nossa abordagem aprende simultânea e adaptativamente tanto a estrutura da rede quanto seus pesos. A metodologia é baseada e acompanhada de fortes garantias de aprendizado teórico dependente de dados, para que a arquitetura final da rede se adapte de maneira comprovada à complexidade de qualquer problema.
Listei muitas maneiras de aprender topologia em minha tese de mestrado, capítulo 3 . As grandes categorias são:
Eu gostaria de sugerir um método menos comum, mas super eficaz .
Basicamente, você pode aproveitar um conjunto de algoritmos chamado "algoritmos genéticos" que tentam um pequeno subconjunto das opções em potencial (número aleatório de camadas e nós por camada). Em seguida, trata essa população de opções como "pais" que criam filhos combinando / mutando um ou mais dos pais, da mesma forma que os organismos evoluem. As melhores crianças e algumas crianças aleatórias são mantidas em cada geração e ao longo de gerações, as mais aptas sobrevivem.
Para ~ 100 ou menos parâmetros (como a escolha do número de camadas, tipos de camadas e número de neurônios por camada), esse método é super eficaz. Use-o criando várias arquiteturas de rede em potencial para cada geração e treinando-as parcialmente até que a curva de aprendizado possa ser estimada (mini-lotes de 100 a 10 mil tipicamente, dependendo de muitos parâmetros). Depois de algumas gerações, você pode considerar o ponto em que o trem e a validação começam a ter uma taxa de erro (adaptação excessiva) significativamente diferente como sua função objetiva na escolha de filhos. Pode ser uma boa ideia usar um subconjunto muito pequeno de seus dados (10 a 20%) até você escolher um modelo final para chegar a uma conclusão mais rapidamente. Além disso, use uma única semente para a inicialização da rede para comparar adequadamente os resultados.
10-50 gerações devem produzir ótimos resultados para uma rede de tamanho decente.
Número de camadas ocultas e o que elas podem alcançar:
0 - Apenas capaz de representar funções ou decisões lineares separáveis.
1 - Pode aproximar qualquer função que contenha um mapeamento contínuo de um espaço finito para outro.
2 - Pode representar um limite de decisão arbitrário para precisão arbitrária com funções de ativação racional e pode aproximar qualquer mapeamento suave a qualquer precisão.
Mais de 2 - Camadas adicionais podem aprender representações complexas (tipo de engenharia automática de recursos) para camadas de camada.