Se você não vive em completo isolamento numa cabana na floresta, certamente já percebeu que a inteligência artificial conquistou o mundo. Na vanguarda desta revolução estão as redes neurais. Redes neurais são modelos computacionais inspirados no funcionamento do cérebro. Elas têm aplicações em vários campos, como reconhecimento de imagens, processamento de linguagem natural, veículos autônomos e muito mais. Neste post, iremos abordar os fundamentos técnicos das redes neurais e como essas “caixas pretas” funcionam.
Por que as redes neurais se tornaram tão populares?
As redes neurais são uma classe de algoritmos de machine learning. Como mencionado anteriormente, algoritmos de machine learning tem como característica central a capacidade de aprender. Em consequência, eles melhoraram seus desempenhos através de suas exposições a dados. As redes neurais, portanto, são algoritmos que aprendem, ou seja, são treináveis.
Algoritmos de machine learning são tipicamente empregados em tarefas que requerem a identificação de padrões em dados. E é exatamente nessas tarefas que o desempenho das redes neurais supera com frequência o de outras técnicas. As estruturas das redes neurais, explicitamente inspiradas no cérebro, possibilitam que elas identifiquem padrões muito complexos em dados. Isso permite que elas sejam bem-sucedidas em atividades que, até pouco tempo atrás, eram consideradas impossíveis de serem realizadas por algoritmos.
Mas o que são redes neurais?
Redes neurais são algoritmos capazes de aprender a mapear padrões complexos em dados e utilizá-los para fazer previsões. Existem vários tipos de redes neurais e mais de uma forma de ensiná-las a extrair padrões de dados. Neste post, vamos nos ater a sua arquitetura mais tradicional.
As redes neurais são algoritmos inspirados explicitamente em como o cérebro se organiza e processa informações. Consequentemente, o elemento básico de uma rede neural é o neurônio artificial, também conhecido como perceptron. Ele é responsável por receber estímulos de entrada, fazer uma computação sobre eles e produzir uma saída.
Os neurônios artificiais de uma rede são organizados em camadas e suas conexões são ponderadas, ou seja, têm pesos (w). A rede recebe dados, os processa através de suas camadas e produz uma saída.
Uma rede neural pode ser simples e conter apenas uma camada de neurônios ou ser profunda com várias camadas. Nesse caso, elas são chamadas deep learning. Além disso, as formas como as informações são propagadas através das camadas de uma rede variam. Em redes do tipo feedforward (Feedforward Neural Networks, FNN), as informações são propagadas em apenas uma direção, ou seja, da entrada para a saída. Quando uma rede tem conexões que realizam retroalimentações sobre si próprias, elas são chamadas recorrentes (Recurrent Neural Networks, RNN).
O neurônio artificial
Os neurônios de uma rede neural artificial possuem três componentes principais:
1. Pesos (w): Cada estímulo de entrada de um neurônio está associado a um peso que determina sua importância no cálculo. Esses pesos são parâmetros que podem ser aprendidos pelo neurônio.
2. Agregador (Z): os estímulos multiplicados por seus pesos são somados e combinados a um termo adicional chamado bias (b, viés). A soma destes valores é comumente referida pelo símbolo Z. A etapa de agregação pode ser representada matematicamente pela seguinte fórmula:
Onde Z é o agregador, wi são os pesos, xi são as entradas do neurônio e b é seu bias.
3. Função de ativação: O valor agregador Z calculado é então passado por uma função de ativação. Ela também é conhecida como função de transferência. Seu papel é transformar a saída do neurônio em não-linear. Existem várias funções de ativação, as mais comuns são a sigmoide, a tangente hiperbólica (tanh) e a ReLU (Rectified Linear Unit).
Um exemplo de implementação da função sigmoide em Python é mostrado a abaixo.
import numpy as np
def sigmoide(X, W, b):
'''sigmoide: sigma(Z) = 1 / (1 + e^(-Z))'''
Z = np.dot(X, W) + b
sigmoid_activation = 1 / (1 + np.exp(-Z))
return sigmoid_activation
As funções de ativação são essenciais em redes neurais, pois permitem que elas modelem relações complexas e não-lineares dentro dos dados. A escolha da função de ativação depende da natureza do problema e da arquitetura da rede, e pode afetar a velocidade e a estabilidade do treinamento.
Curva obtida mediante a resolução numérica da função de ativação sigmoide.
Combinando neurônios em camadas
Do ponto de vista estrutural, uma rede neural consiste em um monte de neurônios organizados em camadas. A primeira camada é chamada de camada de entrada e consiste nos estímulos que a rede recebe. A última camada é a de saída. Camadas intermediárias são chamadas de ocultas.
A organização das camadas entre si determina a forma de propagação de informação pela rede até que ela gere uma saída. Diferentes estruturas têm desempenhos que variam com as aplicações consideradas. As redes mais clássicas são do tipo feedforward e tem propagação unidirecional de informação, como mencionado acima. Essas redes podem ser usadas em múltiplas aplicações.
A organização feedforward determina que a função de ativação calculada para uma camada da rede é o estímulo de entrada para a camada seguinte imediata a ela. Veja um exemplo genérico de código abaixo. O vetor X representa os estímulos de entrada da rede. Ele é usado para calcular as funções de ativação dos neurônios de uma camada oculta. Nesse exemplo, usamos como função de ativação a sigmoide mostrada acima. O resultado obtido na camada oculta é usado para calcular as ativações dos neurônios na camada de saída da rede. Por sua vez, a camada de saída da rede faz previsões sobre os dados.
def forward(X, W1, b1, W2, b2):
oculta = sigmoide(X, W1, b1)
saida = sigmoide(oculta, W2, b2)
return saida
Note que cada neurônio da rede tem parâmetros w e b específicos. Isso significa que os termos W1, W2, b1 e b2 do exemplo acima não representam valores escalares, mas vetores ou matrizes. Eles são inicializados com valores randômicos que mudam ao longo do treinamento da rede.
O que é treinar uma rede neural?
Treinar uma rede neural envolve encontrar os pesos e bias ideais para cada um de seus neurônios, o que permite que a rede faça previsões precisas. Este processo é realizado mediante um algoritmo de otimização matemática chamado backpropagation (retropropagação).
Basicamente, backpropagation é um método para treinar redes neurais otimizando seus parâmetros internos. Os parâmetros são ajustados em resposta ao desempenho da rede em uma tarefa específica, como reconhecimento de imagem, processamento de linguagem natural ou qualquer outro problema de machine learning.
O termo backpropagation é derivado da forma como os erros são propagados para trás através da rede. Durante o processo de treinamento, a rede faz previsões, calcula seus erros e depois utiliza esses erros para atualizar seus parâmetros. A ideia principal é minimizar a diferença entre as previsões da rede e valores alvo reais. Esse tipo de treinamento é conhecido como aprendizagem supervisionada.
As ideias por trás da backpropagation
No centro da backpropagation está uma função de perda. Ela mede a disparidade entre as previsões da rede e valores alvo reais. A backpropagation atua para minimizar essa disparidade.
Mas como minimizar a função de perda?
Se você voltar um pouco no texto, irá reencontrar a curva de uma sigmoide. Ela tem uma característica muito especial que também é encontrada em outras funções de ativação comumente usadas em redes neurais. A sigmoide é uma curva suave. Por causa disso, a backpropagation se fundamenta na noção de que pequenas mudanças nos parâmetros w e b de um neurônio causam pequenas mudanças em sua saída em função da suavidade de suas curvas de ativação. Essa afirmação é representada, matematicamente, pela seguinte equação:
A equação tem derivadas parciais e parece complicada. Mas seu significado prático é simples. Ela indica que as saídas de um neurônio variam (Δoutput) de forma aproximadamente linear com mudanças em seus pesos (Δwj) e bias (Δbj).
No centro da backpropagation está uma expressão que computa a derivada parcial da perda para qualquer w ou b da rede. A partir dessa expressão, ela calcula como mudanças nos pesos e bias da rede alteram os resultados de sua função de perda.
Para que a rede aprenda, é preciso que esse entendimento se traduza em mudanças concretas em seus parâmetros. O algoritmo de backpropagation faz isso percorrendo a rede a partir de sua saída na direção da camada de entrada, alterando os parâmetros de cada neurônio de forma ponderada.
A atualização dos parâmetros da rede pode ser feita mediante várias técnicas de otimização. Uma das mais comumente empregadas é chamada gradient descent.
As etapas de treinamento de uma rede neural
As etapas envolvidas no treinamento de uma rede são as seguintes:
1. Forward Pass (passo para frente): a rede recebe os dados de entrada e eles são transformados e propagados através de suas camadas até a camada de saída. Nessa camada o resultado da rede é uma previsão sobre o dado. Durante o treinamento, essas previsões são comparadas com os valores alvo reais e uma função de perda mede o erro.
2. Backward Pass (passo para trás): Os gradientes da perda em relação aos pesos e bias são calculados através de suas derivadas. Isso é feito usando a regra da cadeia de cálculo. Esses gradientes indicam a direção e a magnitude dos ajustes necessários para minimizar o erro.
3. Atualizações de parâmetros: os pesos e bias são atualizados na direção que minimiza o erro da rede. Esta atualização é realizada usando um algoritmo de otimização, como stochastic gradient descent, Adam ou RMSprop.
4. Repetição: as etapas de 1 a 3 são repetidas por inúmeras iterações (épocas) até que o modelo convirja para um estado onde seu erro seja minimizado.
Através dessas etapas, o algoritmo de backpropagation permite que as redes neurais aprendam com os dados ajustando seus parâmetros internos.
Conclusões
As redes neurais avançaram significativamente a área de inteligência artificial. Inspiradas no cérebro e nas formas de conexões de seus neurônios, elas são capazes de capturar padrões complexos de dados. Seus algoritmos podem parecer intimidadores à primeira vista, mas, na realidade, suas concepções de base não são tão complicadas assim.