arquitetura perceptron multicamadas (MLP): critérios para escolher o número de camadas ocultas e o tamanho da camada oculta?

104

Se tivermos 10 autovetores, então podemos ter 10 nós neurais na camada de entrada. Se tivermos 5 classes de saída, então podemos ter 5 nós na camada de saída. Mas qual é o critério para escolher o número de camadas ocultas em um MLP e quantas nós em 1 camada oculta?

Abhishek Kumar
fonte

Respostas:

217

quantas camadas ocultas ?

um modelo com zero camadas ocultas resolverá dados separáveis ​​linearmente . Portanto, a menos que você já saiba que seus dados não são linearmente separáveis, não custa verificar isso - por que usar um modelo mais complexo do que o exigido pela tarefa? Se for linearmente separável, uma técnica mais simples funcionará, mas um Perceptron também fará o trabalho.

Supondo que seus dados exijam separação por uma técnica não linear, sempre comece com uma camada oculta . Quase certamente, isso é tudo de que você precisa. Se seus dados são separáveis ​​usando um MLP, então esse MLP provavelmente só precisa de uma única camada oculta. Há uma justificativa teórica para isso, mas meu motivo é puramente empírico: muitos problemas difíceis de classificação / regressão são resolvidos usando MLPs de camada oculta única, mas não me lembro de ter encontrado nenhuma MLPs de camada oculta múltipla usada para modelar dados com sucesso. -se em quadros de avisos de ML, livros didáticos de ML, trabalhos acadêmicos, etc. Eles existem, certamente, mas as circunstâncias que justificam seu uso são empiricamente muito raras.


Quantos nós na camada oculta?

Da literatura acadêmica do MLP. minha própria experiência, etc., eu reuni e frequentemente confio em várias regras práticas ( RoT ), e que também descobri serem guias confiáveis ​​(ou seja, a orientação era precisa e, mesmo quando não era, era geralmente estava claro o que fazer a seguir):

RoT com base na melhoria da convergência:

Ao começar a construção do modelo, prefira usar mais nós na camada oculta.

Por quê? Primeiro, alguns nós extras na camada oculta provavelmente não farão nenhum dano - seu MLP ainda convergirá. Por outro lado, poucos nós na camada oculta podem impedir a convergência. Pense nisso desta forma, nós adicionais fornecem algum excesso de capacidade - pesos adicionais para armazenar / liberar sinal para a rede durante a iteração (treinamento ou construção de modelo). Em segundo lugar, se você começar com nós adicionais em sua camada oculta, será fácil removê-los posteriormente (durante o andamento da iteração). Isso é comum e existem técnicas de diagnóstico para ajudá-lo (por exemplo, Diagrama de Hinton, que é apenas uma representação visual das matrizes de peso, um 'mapa de calor' dos valores de peso).

RoTs com base no tamanho da camada de entrada e tamanho da camada de saída:

Uma regra geral é que o tamanho desta camada [oculta] esteja entre o tamanho da camada de entrada ... e o tamanho da camada de saída ....

Para calcular o número de nós ocultos, usamos uma regra geral de: (Número de entradas + saídas) x 2/3

RoT baseado em componentes principais:

Normalmente, especificamos tantos nós ocultos quanto as dimensões [componentes principais] necessários para capturar 70-90% da variância do conjunto de dados de entrada .

E ainda o NN FAQ autor do chama essas regras de "absurdas" (literalmente) porque elas: ignoram o número de instâncias de treinamento, o ruído nos alvos (valores das variáveis ​​de resposta) e a complexidade do espaço de recursos.

Na opinião dele (e sempre me pareceu que ele sabe do que está falando), escolha o número de neurônios na camada oculta com base no fato de o seu MLP incluir alguma forma de regularização ou parada precoce .

A única técnica válida para otimizar o número de neurônios na camada oculta:

Durante a construção do modelo, teste obsessivamente; o teste revelará as assinaturas da arquitetura de rede "incorreta". Por exemplo, se você começar com um MLP com uma camada oculta composta por um pequeno número de nós (que você aumentará gradualmente conforme necessário, com base nos resultados do teste), o erro de treinamento e generalização será alto causado por viés e ajuste insuficiente.

Em seguida, aumente o número de nós na camada oculta, um de cada vez, até que o erro de generalização comece a aumentar, desta vez devido ao overfitting e à alta variância.


Na prática, faço desta forma:

camada de entrada : o tamanho do meu vator de dados (o número de recursos em meu modelo) + 1 para o nó de polarização e não incluindo a variável de resposta, é claro

camada de saída : determinado apenas pelo meu modelo: regressão (um nó) versus classificação (número de nós equivalente ao número de classes, assumindo softmax)

camada oculta : para começar , uma camada oculta com um número de nós igual ao tamanho da camada de entrada. O tamanho "ideal" é mais provável de ser menor (ou seja, algum número de nós entre o número na camada de entrada e o número na camada de saída) em vez de maior - novamente, esta é apenas uma observação empírica e o volume desta observação é minha própria experiência. Se o projeto justificar o tempo adicional necessário, eu começo com uma única camada oculta composta por um pequeno número de nós, então (como expliquei acima) adiciono nós à Camada Oculta, um de cada vez, enquanto calculo a generalização erro, erro de treinamento, viés e variância. Quando o erro de generalização diminuir e um pouco antes de começar a aumentar novamente, o número de nós nesse ponto é minha escolha. Veja a figura abaixo.

insira a descrição da imagem aqui

doug
fonte
1
Eu gostaria de adicionar alguns resultados relacionados ao RoT # 1: Nos SVMs bem-sucedidos, você realmente mapeia sua entrada para um espaço dimensional mais alto (mais nós ocultos do que nós na camada de entrada, no jargão NN). O trabalho da camada de saída é obter a decisão dessa representação supercompleta. Pode haver uma conexão com as projeções aleatórias também. O brilhante artigo de Adam Coates e Andrew Y. Ng (2011) discute tópicos relacionados.
Vladislavs Dovgalecs
Bela explicação. Alguma ideia de como eu poderia plotar uma figura como a acima ao usar sklearn e MLPClassifier?
seralouk
1
@sera você quer dizer estilo xkcd?
denfromufa
Em princípio, você poderia automatizar o processo de otimização do número de neurônios na camada oculta? Além disso, você poderia otimizar o número de camadas ocultas automaticamente também?
Addison
2

É muito difícil escolher o número de neurônios em uma camada oculta e o número de camadas ocultas em sua rede neural.

Normalmente, para a maioria dos aplicativos, uma camada oculta é o suficiente. Além disso, o número de neurônios nessa camada oculta deve estar entre o número de entradas (10 em seu exemplo) e o número de saídas (5 em seu exemplo).

Mas a melhor maneira de escolher o número de neurônios e camadas ocultas é a experimentação. Treine várias redes neurais com diferentes números de camadas e neurônios ocultos e meça o desempenho dessas redes usando validação cruzada . Você pode ficar com o número que produz a rede de melhor desempenho.

Ove
fonte
2

Para automatizar a seleção do melhor número de camadas e melhor número de neurônios para cada uma das camadas, você pode usar a otimização genética .

As peças-chave seriam:

  1. Cromossomo : Vetor que define quantas unidades em cada camada oculta (por exemplo, [20,5,1,0,0] significando 20 unidades na primeira camada oculta, 5 na segunda, ..., com as camadas 4 e 5 ausentes). Você pode definir um limite para o número máximo de camadas a serem experimentadas e o número máximo de unidades em cada camada. Você também deve colocar restrições de como os cromossomos são gerados. Por exemplo, [10, 0, 3, ...] não deve ser gerado, porque qualquer unidade após uma camada ausente (o '3, ...') seria irrelevante e desperdiçaria ciclos de avaliação.
  2. Função de aptidão : uma função que retorna o recíproco do menor erro de treinamento no conjunto de validação cruzada de uma rede definida por um determinado cromossomo. Você também pode incluir o número de unidades totais ou o tempo de computação se quiser encontrar a "rede menor / mais rápida, porém mais precisa".

Você também pode considerar:

  • Poda : comece com uma grande rede, depois reduza as camadas e unidades ocultas, enquanto acompanha o desempenho do conjunto de validação cruzada.
  • Crescendo : comece com uma rede muito pequena, depois adicione unidades e camadas e, novamente, controle o desempenho do conjunto de CV.
Assim como
fonte
0

Recentemente, há um trabalho teórico sobre este https://arxiv.org/abs/1809.09953 . Supondo que você use um RELU MLP, todas as camadas ocultas têm o mesmo número de nós e sua função de perda e função verdadeira que você está aproximando com uma rede neural obedece a algumas propriedades técnicas (no papel), você pode escolher a profundidade a ser peça $ \ log (n) $ e a largura das camadas ocultas seja da ordem $ n ^ {d / (2 (\ beta + d))} \ log ^ 2 (n) $. Aqui $ n $ é o tamanho da sua amostra, $ d $ é a dimensão do seu vetor de entrada e $ \ beta $ é um parâmetro de suavidade para sua verdadeira função. Como $ \ beta $ é desconhecido, provavelmente você desejará tratá-lo como um hiperparâmetro.

Fazendo isso, você pode garantir que, com probabilidade que converge para $ 1 $ em função do tamanho da amostra, seu erro de aproximação converge para $ 0 $ em função do tamanho da amostra. Eles dão a taxa. Observe que não há garantia de que essa seja a 'melhor' arquitetura, mas pode pelo menos ser um bom lugar para começar. Além disso, minha própria experiência sugere que coisas como o abandono escolar ainda podem ajudar na prática.

mlstudent
fonte