Pular para o conteúdo

O que são Redes Neurais Artificiais (RNA)?

As Redes Neurais Artificiais (RNA) foram criadas há mais de 70 anos (propostas em 1944, por pesquisadores do MIT). Contudo, nas primeiras décadas sua aplicação era limitada devido à capacidade computacional disponível. Graças aos avanços teconológicos, a aplicação das RNA's ganha força dia após dia, e seu uso para negócios têm sido diferencial competitivo nas organizações.

Entenda neste artigo o que são as Redes Neurais Artificiais, seus principais conceitos, exemplos de aplicação na linguagem R e a diferença entre Rede Neural e o termo tão usual “Deep Learning”.

O que é uma Rede Neural Artificial?

As Redes Neurais fazem parte da área de Aprendizado de Máquina, sendo que seu uso é amplo em Aprendizado Supervisionado. Além disso, as RNA's são aplicáveis tanto para problemas de Classificação quanto de Regressão em machine learning.

Uma Rede Neural Artificial executa seu processamento por meio de neurônios distribuídos em camadas, buscando uma estrutura análoga aos neurônios do cérebro humano.

As camadas de uma Rede Neural podem ser de entrada, ocultas ou de saída.

  • Camada de entrada: trata do input dos dados;
  • Camadas ocultas (hidden layers): onde ocorre o processamento;
  • Camada de saída: é o resultado final do processamento de uma rede neural.

Para que haja o processamento, a rede precisa de uma função de ativação, que é a função matemática utilizada para definir os pesos associados a cada rede. Algumas funções que podem ser utilizadas são: linear, logística (sigmoide), rectified linear units, softmax, etc.

A função logística foi a mais usada por muito tempo, mas com o surgimento de cada vez mais aplicações para o uso de redes neurais, algumas funções específicas se tornaram mais assertivas ou mais eficientes dependendo do caso.

Vale ressaltar que não há programação, a priori, nos neurônios. Eles trabalham com tentativa e erro atrelados a um sistema de feedback, que atribui pesos maiores para as redes mais assertivas.

Em termos práticos: (i) os dados entram na camada de entrada como variáveis numéricas e na forma binária para variáveis categóricas (alguns algoritmos já fazem este processo automaticamente, mas em outros é preciso criar colunas binárias para cada classe). (ii) Depois sofrem a aplicação de uma função de ativação. (iii) Por fim, a Rede Neural entrega uma resposta (que pode ser uma probabilidade da ocorrência de uma classe – para problemas de classificação –, ou um número – caso o problema seja de regressão).

Camadas Ocultas (Hidden Layers): Rede Neural e Deep Learning

Possivelmente você já tenha ouvido falar em Deep Learning. Este é um termo “em alta” no contexto de Inteligência Artificial e Machine Learning. Apesar de algumas implementações de Deep Learning serem extremamente complexas, a interpretação é simples.

Deep Learning é uma forma de aplicação de Redes Neurais Artificiais (RNA), em que há mais de uma camada oculta (geralmente são inúmeras) entre a camada de entrada (input) e a camada de saída (output). É também chamada de Deep Neural Network.

Uma rede neural é “mais profunda” (deep, em inglês, significa “profundo” em português) dependendo da quantidade de camadas que possui. Estas camadas são chamadas de hidden layers.

Quanto maior o número de hidden layers mais “black-box” fica o modelo, se tornando praticamente impossível dar uma explicação “real” aos parâmetros que o modelo define ao longo das entradas e saídas das diversas camadas.

Vale ainda ressaltar que a complexidade de uma rede neural não é devida somente à quantidade de camadas de um modelo, mas também está relacionada à quantidade de neurônios que estarão contidos em cada camada.

Sendo assim, trabalhar com deep learning é uma forma de utilizar o elevado potencial computacional que temos atualmente para executar modelos extremamente complexos em busca de predições melhores.

Como Funcionam as Redes Neurais Artificiais?

Após entender a lógica de uma neural network, vamos entender agora como funcionam as redes neurais, partindo desde o caso mais simples, sem nenhuma hidden layer, até casos complexos, em que há inúmeras camadas ocultas, que podemos chamar de “Deep Learning”.

A rede neural mais simples é chamada de perceptron, e contém:

  • 1 ou mais inputs;
  • 1 processador;
  • 1 única saída.

Um perceptron segue 4 passos principais:

i. Recebe os inputs;
ii. Dá peso aos inputs;
iii. Soma os inputs;
iv. Gera um output.

A seguir é apresentado um exemplo de uma tabela de dados muito simples para aplicarmos uma rede neural. O objetivo com este exemplo é demostrar como funcionam as redes neurais e também como é possível construir modelos extremamente complexos mesmo com uma tabela de dados com poucas linhas e colunas.

A tabela possui a seguinte estrutura:

  • Duas variáveis explicativas: Calor (1 = sim, 0 = não) e Umidade (1 = alta, 0 = baixa).
  • Uma variável dependente: Chuva (1 = irá chover, 0 = não irá chover).

Neste exemplo, que foca na simplicidade para demonstrar o funcionamento das redes neurais, a tabela foi construída usando o operador lógico “E” e temos duas variáveis (Calor e Umidade) para explicar se ocorrerá ou não Chuva. A lógica da tabela é: com calor e alta umidade teremos chuva, caso contrário não.

Obs.: O exemplo que segue está na linguagem R de programação, utilizando os pacotes tidyverse (transformação de dados), knitr (criar tabelas) e neuralnet (para as redes neurais em si). Os códigos são replicáveis, mas caso não tenha interesse apenas siga a leitura com o foco nos resultados apresentados.

Vamos então criar o dataset de exemplo:

# Criando Y, a variável dependente
Chuva <- c(rep(0, 3), 1)

# Criando o conjunto de dados fictício
binary.data <- 
  data.frame(expand.grid("Calor" = c(0, 1), "Umidade" = c(0, 1)), Chuva) %>% as_tibble()

binary.data %>% knitr::kable()
Calor Umidade Chuva
0 0 0
1 0 0
0 1 0
1 1 1

Com estes dados podemos construir um exemplo de perceptron, conforme segue:

# Seed para manter o mesmo modelo quando replicar
set.seed(123)

# Criando o modelo
net0hidden <- neuralnet(
  Chuva ~ Calor + Umidade,
  binary.data,
  hidden = 0,
  err.fct = "ce",
  linear.output = FALSE
)

# Criando gráfico
plot(net0hidden, rep = "best", information = FALSE)

plot of chunk redeneural0hidden

O gráfico acima mostra:

  • Uma input layer (círculos da esquerda);
  • Uma output layer (círculo da direita).

Além disso:

  • Os números nas linhas apontam os melhores pesos.
  • O anexo em azul representa um bias node, que nada mais é que uma constante aplicada.

Neste exemplo foi utilizada uma função de ativação logística, conforme segue:

    \[z = -11.86 + 7.7538 ~ Calor + 7.7552 ~ Umidade~ \]

sendo que z é chamado de “ativador”.

O ativador passa por uma função sigmoide (neste caso, mas poderia ser outro tipo de função de ativação), assim como ocorre em uma regressão logística, gerando:

    \[ Chuva = \frac{1}{1 + e^{−(-11.86 + 7.7538 ~ Calor + 7.7552 ~ Umidade)}} \]

Para ter os resultados da predição do perceptron exemplificado basta substituir os valores das variáveis Calor e Umidade por 0 ou 1 e resolver a equação apresentada acima para todas combinações possíveis. Veja como fica o resultado:

# Criando a função logística
Y = function(Var1,Var2){
  1/(1+exp(-(-11.86048+7.75382*Var1+7.75519*Var2)))
}

# Obtendo as probabilidades para as situações possíveis
binary.data %>%
  dplyr::mutate(`Predição` = round(c(Y(0, 0),
                                     Y(1, 0),
                                     Y(0, 1),
                                     Y(1, 1)), 3)) %>%
  knitr::kable()
Calor Umidade Chuva Predição
0 0 0 0.000
1 0 0 0.016
0 1 0 0.016
1 1 1 0.975

A generalização de perceptrons é chamada de neurônios. São então criadas camadas (hidden layers), em que o output de um neurônio serve de input para um neurônio da próxima camada, formando assim a rede neural.

Exemplo 1. RNA com 1 Hidden Layer e 1 Neurônio

Exemplo de rede neural com uma hidden layer de 1 neurônio:

# Seed para replicação
set.seed(123)

# Criando modelo com 1 neurônio em uma hidden layer
net1neur <- 
  neuralnet(
    Chuva ~ Calor + Umidade,
    binary.data,
    hidden = 1,
    err.fct = "ce",
    linear.output = FALSE
  )

# Gerando gráfico da rede
plot(
  net1neur,
  rep = "best",
  information = FALSE
)

plot of chunk redeneural1neuronio

Exemplo 2. RNA com 1 Hidden Layer e 4 Neurônios

Como exemplo, veja como ficaria se aumentássemos o número de neurônios para 4, mas ainda com apenas uma *hidden layer*:

# Seed para replicação
set.seed(123)

# Criando modelo com 4 neurônios em uma hidden layer
net4neur <-
  neuralnet(
    Chuva ~ Calor + Umidade,
    binary.data,
    hidden = 4, # Número de neurônios na hidden layer
    err.fct = "ce",
    linear.output = FALSE
  )

# Gerando gráfico da rede
plot(
  net4neur,
  rep = "best",
  information = FALSE
)

plot of chunk redeneural4neuronios

Exemplo 3. Deep Neural Network com 2 Hidden Layer, com 5 em 3 Neurônios

Por fim, veja um exemplo gráfico de Deep Learning, ou seja, uma Deep Neural Network com 2 hidden layers, sendo que a primeira possui 5 neurônios e a segunda 3.

# Seed para replicação
set.seed(123)

# Criando modelo com 2 hidden layers (5 e 3 neurônios)
net2hidden <- 
  neuralnet(
    Chuva ~ Calor + Umidade,
    binary.data,
    hidden = c(5, 3),
    err.fct = "ce",
    linear.output = FALSE
  ) 

# Gerando gráfico da rede
plot(
  net2hidden,
  rep = "best",
  information = FALSE
)

plot of chunk redeneural2hiddenlayers

O gráfico acima demonstra como é possível construir uma rede neural bastante complexa e de difícil interpretação, mesmo sobre um conjunto de dados simples. Vale ressaltar que o ponto mais relevante ao aplicar redes neurais não é obter redes complexas, mas sim um melhor o resultado das predições.

A definição da quantidade de hidden layers ou os seus tamanhos não possuem regras gerais de configuração. Basicamente, a melhor configuração será encontrada por experimentação, utilizando diversas configurações e comparando para as métricas de cada modelo. Por isso que o processo de grid search é muito importante para a utilização de redes neurais. Uma vez que as possibilidades de configurações são infinitas (quantidade de camadas e número de neurônios para cada uma), normalmente é feito um levantamento aleatório de inúmeras possibilidades de configurações.

Conclusões sobre Redes Neurais

As Redes Neurais tem ganhado muita força nas aplicações práticas, pois é de fato uma família de modelos de Machine Learning capaz de trazer excelentes resultados.

Os exemplos aqui trazidos são introdutórios e bastante básicos. Porém, a implementação de Redes Neurais já é típica de algumas áreas, possuindo aplicações específicas e bastante complexas.

As Redes Neurais Artificiais estão entre os métodos mais utilizados para:

  • Reconhecimento de imagens e OCR (Optical Character Recognition, reconhecimento de caracteres em imagens);
  • Dirigir carros autônomos;
  • Aplicações em Processamento de Linguagem Natural, entre outros casos.

Veja mais artigos na área de Machine Learning e análise de dados: