Introdução a Redes Neurais Artificiais – Parte 1

Introdução

Olá, seja bem-vindo!
Vivemos em um mundo sofrendo uma revolução digital profunda. Muito disso graças à aplicação de técnicas de Inteligência Artificial em vários produtos. Estamos nos acostumando a interagir cada vez mais com os computadores e já vemos usos de IA em sistemas de recomendação, marcação de fotos em redes sociais, assistentes pessoais ativados por voz, smartphones com reconhecimento facial e daqui a poucos anos, com carros autônomos.
Existem muitos algoritmos que permitem a implementação de IA mas nesse artigo, vamos falar de um tipo em especial que vem se destacando bastante: as Redes Neurais Artificiais.
Se você ainda não entende muito bem os conceitos de Inteligência Artificial, Deep Learning e Machine Learning, antes de continuar, não deixe de conferir esse outro artigo, onde explico em detalhes cada uma dessas ideias e como elas se relacionam.
No futuro próximo, pretendo mergulhar fundo no mundo do estado da arte no campo da Inteligência Artificial, as técnicas de Deep Learning. Mas antes, precisamos conhecer as bases para o entendimento desse mundo. E isso começa com as Redes Neurais.
Este é um artigo de introdução e abordaremos somente teoria. Na parte 2 vamos conhecer as principais arquiteturas de Redes Neurais bem como construir uma, usando a linguagem Python, que irá reconhecer dígitos manuscritos.

Breve história

Antes de prosseguir, vamos entrar um pouco na história e descobrir como chegamos até aqui. Se você já leu esse meu artigo, onde comento a história por trás das tentativas humanas de dotar uma máquina da capacidade de pensar e aprender por si mesma, sabe que muitas estratégias para realizar esse feito já foram implementadas e testadas. Um dos métodos que se mostrou mais promissor foi quando pesquisadores se inspiraram no cérebro humano.
Essa máquina muito poderosa, em sua estrutura básica, é formada por neurônios e é por meio deles que as informações são transmitidas e processadas. Tarefas muito complexas para um computador, como por exemplo, reconhecer um rosto ou controlar o movimento dos olhos, são facilmente executadas pelo nosso cérebro. Ainda há muito o que descobrir sobre esse fascinante órgão mas já se sabe que o mesmo desenvolve suas “regras” através da experiência adquirida.
Inspirando-se nesse modelo, muitos pesquisadores tentaram reproduzir o funcionamento do cérebro. Em 1943, o neurofisiologista Warren McCulloch e o matemático Walter Pitts escreveram um artigo sobre como um neurônio simples poderia funcionar e usando circuitos elétricos, modelaram uma rede neural simples.
Graças ao sucesso que esses algoritmos estavam obtendo face a certos desafios simples, nas décadas de 1950 e início da de 1960 cada vez mais arquiteturas de redes neurais foram surgindo, como o Perceptron, ADALINE e MADALINE. Mas infelizmente, o avanço foi diminuindo por conta da limitação da eletrônica na época. Esses problemas ocasionaram o chamado inverno da IA, um período de poucos avanços científicos na área.
Somente no início da década de 1980 surgiram novos trabalhos acadêmicos e novas propostas de implementação de redes neurais. Em 1987, aconteceu a primeira conferência internacional sobre o tema, organizada pelo Instituto de Engenheiros Elétricos e Eletrônicos (IEEE). Evento que atraiu mais de 1800 pesquisadores. Foi nessa época que muitas ideias importantes surgiram, como as redes de múltiplas camadas e a técnica de Backpropagation, que embora mais lentas, obtinha um resultado muito mais preciso. Na ilustração abaixo você pode conferir marcos na evolução da IA.


Podemos resumir os principais marcos nesse processo de evolução com os seguintes pontos:

1943: Warren McCulloch e Walter Pitts criam um modelo matemático para redes neurais.

1958: Frank Rosenblatt cria o Perceptron, um algoritmo para o reconhecimento de padrões baseado em uma rede neural de duas camadas.

1980: Kunihiko Fukushima propõe a Neoconitron, uma rede neural de hierarquia, multicamada, que foi utilizada para o reconhecimento de caligrafia e outros problemas de reconhecimento de padrões.

1989: Pesquisadores criam algoritmos que usavam redes neurais profundas, mas o tempo de treinamento para os sistemas foi medido em dias, tornando-os impraticáveis para o uso no mundo real.

Meio da década de 2000: O termo “aprendizagem profunda” começa a ganhar popularidade após um artigo de Geoffrey Hinton e Ruslan Salakhutdinov mostrar como uma rede neural de várias camadas poderia ser pré-treinada uma camada por vez.

2009: Acontece o NIPS Workshop sobre Aprendizagem Profunda para Reconhecimento de Voz e descobre-se que com um conjunto de dados suficientemente grande, as redes neurais não precisam de pré-treinamento e as taxas de erro caem significativamente.

2012: Algoritmos de reconhecimento de padrões artificiais alcançam desempenho em nível humano em determinadas tarefas. E o algoritmo de aprendizagem profunda do Google é capaz de identificar gatos.

2015: Facebook coloca a tecnologia de aprendizado profundo – chamada DeepFace – em operação para marcar e identificar automaticamente usuários do Facebook em fotografias. Algoritmos executam tarefas superiores de reconhecimento facial usando redes profundas que levam em conta 120 milhões de parâmetros.

2016: O algoritmo do Google DeepMind, AlphaGo, mapeia a arte do complexo jogo de tabuleiro Go e vence o campeão mundial de Go, Lee Sedol, em um torneio altamente divulgado em Seul.

  • Fonte: Data Science Academy

Neurônio: biológico e matemático

Para entender o funcionamento das redes neurais, é preciso ter em mente alguns conceitos básicos sobre o mecanismo de operação de um neurônio biológico.
Como dito anteriormente, o neurônio é a unidade básica do cérebro humano, e é uma célula especializada na transmissão de sinal, devido a sua natureza de excitabilidade. Sua estrutura é composta por 3 partes principais: a soma ou corpo celular, os dendritos e os axônios. Na extremidade dos axônios estão os nervos terminais, pelos quais é realizada a transmissão de informação entre neurônios. Esse processo é chamado de sinapse. Na imagem abaixo você pode conferir uma ilustração de um neurônio biológico.

O cérebro possui bilhões de neurônios, formando assim, uma extensa rede neural. De forma bastante resumida, podemos definir o processo de transmissão de informação como: através das sinapses, os dendritos recebem sinais elétricos de outros neurônios, essa informação é então processada dentro do corpo celular e então enviada para a saída, pelos axônios. Esse fluxo será muito importante para compreender o funcionamento do neurônio matemático.
A partir dos princípios que regem um neurônio natural, os pesquisadores conseguiram simular seu funcionamento computacionalmente. De forma sucinta, podemos explicar a operação que acontece da seguinte maneira: um neurônio matemático recebe vários sinais de entrada e calcula, de forma ponderada, a soma entre eles; então aplica uma determinada função e passa o resultado adiante.
No modelo matemático, os impulsos recebidos recebidos de outros neurônios são representados pelos sinais de entrada, que nada mais é do que o conjunto de dados para treinar o algoritmo.
Dentre os sinais recebidos, alguns excitarão mais e outros menos o neurônio receptor, por conta da soma ponderada que é realizada. Essa operação é comandada pelos pesos sinápticos. Na imagem abaixo, você pode ver a representação de um único neurônio artificial, onde os pesos são representados por Wn. O corpo celular, por sua vez, é formado por dois elementos. O primeiro é um somatório dos sinais de entrada, cada um multiplicado pelo seu peso. E o segundo, que vamos entrar em detalhes mais adiante, é uma função de ativação, que baseado no resultado do somatório, determinará a saída do neurônio. Assim como ocorre no nosso cérebro, um estímulo (sinal) pode ser de natureza excitatório ou inibitório, uma vez que os pesos podem ser positivos ou negativos.

Nesse modelo, um neurônio recebe um ou mais sinais de entrada e devolve um único sinal de saída, que pode ser passado, inclusive, como sinal de entrada para outros neurônios em uma rede. Uma vez que as entradas x são apresentadas ao modelo, o que ocorre basicamente é uma multiplicação de matrizes, dado que x1 multiplica W1 etc.

Vamos então listar todos os componentes que fazem parte do modelo apresentado:

  • Sinais de entrada { X1, X2, …, Xn }: São os dados que alimentam o modelo.
  • Pesos sinápticos { W1, W2, …, Wn }: São valores para ponderar os sinais de cada entrada na rede.
  • Combinador linear { Σ }: Agrega todos os sinais de entrada que foram ponderados pelos respectivos pesos sinápticos.
  • Limiar de ativação { Θ }: Determina qual será o patamar apropriado para que o resultado produzido pelo combinador linear possa gerar um valor de disparo de ativação.
  • Potencial de ativação { u }: É o resultado obtido pela diferença do valor produzido entre o combinador linear e o limiar de ativação. Se o valor for positivo, ou seja, se u ≥ 0 então o neurônio produz um potencial excitatório; caso contrário, o potencial será inibitório.
  • Função de ativação { g }: Seu objetivo é limitar a saída de um neurônio em um intervalo valores.
  • Sinal de saída { y}: É o valor final de saída podendo ser usado como entrada de outros neurônios.

Fique tranquilo, ainda vamos entrar em detalhes sobre os principais componentes que formam o neurônio.

Função de ativação

Nesta seção vamos falar sobre um dos componentes mais importantes de uma rede neural, a função de ativação.
Para começar a explicação, imagine que você está treinando uma rede que deve reconhecer dígitos, analisando os pixels de uma imagem. Para que nosso algoritmo seja capaz de aprender a reconhecer cada um dos dígitos corretamente, precisamos ajustar os pesos da nossa rede.
Agora, imagine que nossa rede está, erroneamente, classificando um 8 como 9. Precisamos ajustar os pesos para corrigir esse problema. Com isso, esbarramos em um ponto importante. Uma pequena alteração e nossa rede é capaz de ter um resultado completamente diferente. O 9 pode até ser classificado corretamente após a mudança, mas talvez isso comprometa o resto das classificações. É nesse ponto que a função de ativação entra.
Ela se trata, basicamente, de um componente matemático que adicionamos ao nosso neurônio artificial. A função de ativação permite que pequenas mudanças nos pesos provoquem apenas uma pequena alteração no output do modelo. Podemos definir sua fórmula como:

Onde o bias é uma variável incluída no somatório da função de ativação, com objetivo de aumentar a capacidade de aproximação da rede ao valor de saída desejado. O bias é ajustado da mesma forma que os pesos.
A função de ativação é a transformação não linear que se faz ao sinal de entrada. Quando não há esse componente matemático, ocorre que os pesos e o bias realizam uma transformação linear. Ou seja, uma rede neural sem função de ativação é, essencialmente, um modelo de regressão linear.
Existem diversos tipos de função de ativação e essa é uma área de pesquisa bastante ativa. Abaixo você confere quais as principais categorias atuais:

  • Função de etapa binária:

É o tipo de função mais simples. É regida por um limiar de ativação (threshold), ou seja, se um neurônio deve ou não ser ativado. É definida como:

Esse tipo de função é basicamente usada em classificadores binários. Quando se é necessário apenas dizer sim ou não para uma classe.

  • Função Sigmóide:

Uma das funções mais usadas. Matematicamente é definida como:

É uma função de derivadas contínuas e o fato dela não ser linear, é uma grande vantagem. A função varia entre 0 e 1, seguindo o formato de um S. Essa função tende a aproximar os valores da saída para extremos. Característica muito útil quando se deseja classificar valores em classes específicas.

  • Função ReLu:

Essa função é a unidade linear retificada. É definida como:

A função ReLu é amplamente utilizada atualmente e também tem características não lineares, fator esse, que ajuda na adição de múltiplas camadas de neurônios.
A principal vantagem de usar a função ReLU sobre outras funções de ativação é que ela não ativa todos os neurônios ao mesmo tempo. Isso significa que, ao se olhar para a função ReLU e a entrada for negativa, ela será convertida em zero e o neurônio não será ativado, fazendo com que apenas alguns neurônios sejam ativados, de modo a tornar a rede esparsa e eficiente para a computação.
Nos próximos artigos vamos adicionar outras funções de ativação ao nosso repertório e comentar, em maiores detalhes, como cada tipo influencia no processo de aprendizagem, bem como em qual aplicação cada um se encaixa melhor

Conclusão

As aplicações baseadas em redes neurais foram as que obtiveram maior sucesso e por isso estão liderando esse mar de inovações que estamos vendo nos últimos anos. A partir do modelo do neurônio matemático, várias arquiteturas e diferentes combinações entre neurônios permitiram criar as redes neurais profundas (Deep Learning).
Agora você já tem uma noção geral do que se trata uma rede neural. Nos próximos artigos vamos explorar novos conceitos e as principais redes em uso. Vamos descobrir como Redes Convolucionais, Redes Recorrentes, Redes de Hopfield, Máquinas de Boltzmann entre outras, funcionam. Vamos entender como a matemática por trás do Gradiente Descendente é um elemento chave no processo de aprendizagem e também criar uma rede neural para reconhecer dígitos manuscritos. Tudo isso usando a linguagem Python.
Obrigado pela atenção!
Um grande abraço

Referências

Pessoal, para esse artigo usei como base as seguintes fontes:

Article By :