ML Atlas

Machine learning do zero · Aula 7.1 · 32 de 33 aulas prontas · 12 min

Redes neurais: muitas unidades simples juntas

Em resumo

Uma rede neural empilha unidades simples que traçam uma reta e a dobram. Com mais unidades ocultas, as regiões de decisão se curvam em volta das íris.

Aquecimento Duas perguntas de aulas anteriores. Um minuto, e a aula nunca fica bloqueada.
Da aula 5.6: Qual modelo, quando? Verdadeiro ou falso: “um modelo com média 0,3 ponto mais alta é melhor”.

Ver a resposta

Resposta certa: Falso: com essa diferença, as divisões se repartem quase por igual

Nos tumores, a SVM obtém 94,2% e o gradient boosting 93,9%. A SVM acerta mais em 10 divisões, o boosting em 7, e 3 empatam.

Da aula 5.5: Máquinas de vetores de suporte e kernels Quais flores definem a fronteira de uma SVM linear?

Ver a resposta

Resposta certa: Os vetores de suporte: flores na borda, dentro da faixa ou além

As outras flores poderiam ser removidas sem mudar a fronteira. Com C = 100, 4 flores de 70 a seguram.

A regressão logística da lição 5 só consegue traçar uma fronteira reta. Árvores só conseguem traçar caixas. Mas e se as classes se enroscarem umas nas outras? Você poderia tentar inventar à mão a curva certa para cada problema — ou poderia construir um modelo com peças tão simples que cada uma só sabe traçar uma reta, e deixar que a combinação trace qualquer coisa. Essa é a aposta das redes neurais.

Preveja, depois confira Você aumenta o número de unidades ocultas de 2 para 32. O que acontece com a acurácia no conjunto de teste?
Qual é o seu grau de certeza?

Experimento interativo

Este experimento interativo funciona em um navegador com JavaScript ativado. O texto ao redor descreve o que ele mostra.

Ver a resposta

Resposta certa: Não sobe, e pode até cair, embora o treino melhore

Duas unidades dão 81,3% no teste e 32 unidades 70,7%, embora a acurácia de treino suba de 81,3% para 94,7%. A rede maior se ajusta a detalhes casuais das 75 flores de treino. Duas das três espécies se sobrepõem nessas duas medidas, então uma divisão perfeita não existe de qualquer maneira.

Experimente

  • Coloque o controle de unidades ocultas no menor valor e clique em Treinar. Olhe as regiões de decisão: quantas bordas retas você consegue ver?
  • Aumente o número de unidades ocultas e clique em Treinar de novo. Veja as fronteiras se curvarem e compare a acurácia.
  • Coloque o controle de unidades ocultas no maior valor e treine. As regiões começam a se curvar em volta de flores específicas? Pergunte-se se uma flor nova que caísse num desses bolsões seria mesmo daquela espécie.
  • Olhe as flores onde duas espécies se sobrepõem. Alguma fronteira consegue separá-las usando só essas duas medidas?

A ideia em poucas palavras

Vamos ver agora, em palavras simples, o que você acabou de manipular.

Uma rede neural é feita de pequenas unidades chamadas neurônios. Cada neurônio faz algo que já conhecemos: calcula uma soma ponderada das entradas, soma um intercepto e passa o resultado por uma função simples que o dobra, chamada função de ativação. Um neurônio sozinho é quase uma regressão logística; ele consegue separar o plano com uma reta.

Os neurônios são organizados em camadas. As entradas (aqui, duas medidas da flor) alimentam uma camada oculta de neurônios, e cada um deles traça a sua própria reta e informa a que distância, e de que lado, um ponto está. A camada de saída combina esses relatos na decisão final. Como cada neurônio oculto dobra o seu sinal, combiná-los produz fronteiras com cantos e curvas.

Imagine uma equipe de vigias bem simples guardando um campo. Cada vigia só consegue dizer “o intruso está à minha esquerda” ou “à minha direita” de uma única cerca reta. Um vigia sozinho não ajuda muito. Mas uma supervisora que ouve muitos vigias, cada um com a sua cerca num lugar diferente, consegue delimitar regiões de quase qualquer formato.

Por que funciona

Um neurônio calcula

saída = f(w · x + b)

em que x é a lista de entradas, w os pesos, b o intercepto e f a ativação. Sem f, empilhar camadas não serviria para nada: uma soma ponderada de somas ponderadas continua sendo uma única soma ponderada, então a rede inteira traçaria uma única reta. A ativação é a dobra que fica. Com ela, cada neurônio oculto acrescenta uma dobra, e dobras suficientes conseguem aproximar qualquer fronteira razoável. Mais unidades ocultas significam mais dobras possíveis — mais flexibilidade, que, como a lição 7 ensinou, é uma faca de dois gumes.

Os pesos são aprendidos com as ferramentas das lições 4 e 5. A rede faz previsões, a perda logarítmica mede o quanto elas erram e a descida de gradiente empurra cada peso morro abaixo. O único truque novo é como encontrar o gradiente dos pesos que estão lá no fundo da rede: um algoritmo chamado retropropagação (backpropagation) aplica a regra da cadeia do cálculo de trás para frente, a partir da saída, camada por camada, dizendo a cada peso quanto ele contribuiu para o erro.

O exemplo desta lição é o conjunto de dados Iris: 150 flores de três espécies, 50 de cada, que ficou famoso com um artigo de Ronald Fisher de 1936. Usamos duas das quatro medidas, então cada flor é um ponto num plano, e a rede treinada atribui uma espécie prevista a cada lugar desse plano.

A ideia é antiga — Frank Rosenblatt construiu o perceptron, um único neurônio treinável, em 1958 —, mas as redes só passaram a dominar quando os dados, o poder de computação e os truques de treinamento cresceram o bastante para treinar muitas camadas.

Erro comum

“Neural” sugere um cérebro, e essa sugestão engana. Um neurônio artificial é uma soma ponderada com uma dobra, não um modelo de uma célula biológica, e uma rede não entende de flores; ela ajusta uma função a exemplos. O erro prático é supor que maior é sempre melhor. Uma rede com muitas unidades ocultas num conjunto de dados pequeno consegue decorar exatamente como uma árvore profunda ou um polinômio de grau alto. O tamanho dela precisa ser escolhido com dados de validação, e o treinamento precisa ser acompanhado de olho na mesma distância entre treino e teste que vimos na lição 7.

Empilhe camadas suficientes, alimente-as com texto suficiente, e uma tarefa de previsão vira algo que escreve. Na última lição vemos como uma rede aprende linguagem adivinhando a próxima palavra.

Quer ir mais fundo? O curso de redes neurais começa com um único neurônio (PL).

Quiz

Três perguntas para você se testar. Escolha uma resposta ou abra a resposta embaixo de cada pergunta. No teclado: as setas escolhem, Enter ou Espaço confirma.

1. Por que uma rede neural precisa de uma função de ativação?
Ver a resposta

Resposta certa: Porque sem ela as camadas empilhadas viram uma única soma ponderada

A ativação dobra o sinal; sem dobras, as camadas não acrescentam poder expressivo além de um único modelo linear.

2. O que acontece quando você adiciona unidades ocultas?
Ver a resposta

Resposta certa: A rede ganha flexibilidade: fronteiras mais complexas, mas também risco de decorar

Mais unidades significam mais dobras possíveis, que podem captar estrutura real ou causar overfitting, dependendo dos dados.

3. O que a retropropagação calcula?
Ver a resposta

Resposta certa: A contribuição de cada peso para o erro, usada na descida de gradiente

A retropropagação aplica a regra da cadeia da saída para trás para obter o gradiente de cada peso.

Pontos-chave

  • Um neurônio é uma soma ponderada mais uma função de ativação que dobra o sinal.
  • Uma camada oculta combina muitas retas simples em fronteiras curvas.
  • Os pesos são aprendidos com descida de gradiente; a retropropagação fornece o gradiente de cada camada.
  • Mais unidades ocultas significam mais flexibilidade, que precisa ser controlada com dados de validação.

Mais a fundo: fórmula, código, prática

A matemática

Um neurônio calcula a = f(w·x + b), onde x contém as entradas, w os pesos, b o intercepto e f a ativação. Uma camada oculta com h neurônios é a mesma coisa em forma matricial: a = f(W₁x + b₁). A camada de saída calcula então ŷ = softmax(W₂a + b₂).

  • Sem f, as camadas colapsam: W₂(W₁x + b₁) + b₂ = (W₂W₁)x + (W₂b₁ + b₂), que é uma única aplicação linear. A ativação é o que torna a profundidade útil.
  • O treino minimiza a perda logarítmica L = −(1/n) Σ log ŷᵢ,yᵢ, onde ŷᵢ,yᵢ é a probabilidade que o modelo deu à espécie verdadeira da flor i.
  • A retropropagação é a regra da cadeia aplicada da saída para trás: ∂L/∂W₁ = ∂L/∂ŷ · ∂ŷ/∂a · ∂a/∂W₁.
  • A descida do gradiente atualiza então cada peso: w ← w − η · ∂L/∂w, onde η é a taxa de aprendizado.
No código (Python)

Uma rede pequena nos dados do lab: duas medidas da sépala, metade das flores para treino (75), entradas padronizadas, neurônios tanh, 2 e 32 neurônios ocultos. É o treinador do scikit-learn, não o do lab:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

X, y = load_iris(return_X_y=True)
X = X[:, :2]  # comprimento e largura da sépala, como no lab
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.5, stratify=y, random_state=1)
for h in (2, 32):
    net = make_pipeline(StandardScaler(), MLPClassifier(hidden_layer_sizes=(h,), activation="tanh", solver="lbfgs", max_iter=5000, random_state=0))
    net.fit(X_tr, y_tr)
    print(f"{h:2d} hidden units: train {net.score(X_tr, y_tr):.1%}, test {net.score(X_te, y_te):.1%}")

Saída

 2 hidden units: train 84.0%, test 74.7%
32 hidden units: train 96.0%, test 66.7%

O padrão é o da lição: a rede maior ajusta melhor as flores de treino e vai pior nas flores de teste. O treinador do próprio lab (descida do gradiente com momento) dá 81,3% e 70,7% no conjunto de teste para 2 e 32 neurônios, então os números diferem, mas o padrão não.

Para quem pratica
  • Padronize as entradas antes de treinar (subtraia a média do treino, divida pelo desvio padrão do treino). Variáveis sem escala deixam a descida do gradiente lenta ou instável.
  • Escolha o número de neurônios ocultos com dados de validação, não pela acurácia de treino. Uma rede maior quase sempre ajusta melhor o conjunto de treino (96,0% contra 84,0% acima).
  • Conjuntos de dados pequenos, como 75 flores de treino, são fáceis de memorizar. Tente uma rede menor, weight decay ou parada antecipada antes de acrescentar neurônios.
  • Pesos iniciais aleatórios diferentes dão redes diferentes. Para uma comparação justa, fixe as sementes que usar e compare várias delas.
  • Em dados no formato de tabela, árvores com gradient boosting costumam ser uma baseline mais forte. Experimente antes de recorrer a uma rede.

Vá mais fundo no Atlas

Verbetes da enciclopédia sobre as ideias desta aula: