Articles

O problema XOR em Redes Neurais.

Introdução
Este é o primeiro de uma série de posts explorando implementações de redes neurais artificiais (ANN). O objetivo do artigo é ajudar o leitor a obter uma intuição dos conceitos básicos antes de passar para as implementações algorítmicas que se seguirão.

Nenhum conhecimento prévio é assumido, embora, no interesse da brevidade, nem toda a terminologia seja explicada no artigo. Em vez disso, são fornecidos hiperlinks para a Wikipédia e outras fontes onde leitura adicional pode ser necessária.

Este é um grande tópico. As ANNs têm uma grande variedade de aplicações e podem ser usadas para aprendizagem supervisionada, não supervisionada, semi-supervisionada e de reforço. Isso é antes de você entrar em arquiteturas de problemas específicos dentro dessas categorias. Mas nós temos que começar em algum lugar, então para restringir o escopo, vamos começar com a aplicação de ANNs a um problema simples.

O problema XOr
O problema XOr, ou “exclusivo ou”, é um problema clássico na pesquisa de ANNs. É o problema de usar uma rede neural para prever as saídas dos portões lógicos XOr, dadas duas entradas binárias. Uma função XOr deve retornar um valor verdadeiro se as duas entradas não forem iguais e um valor falso se elas forem iguais. Todas as possíveis entradas e saídas previstas são mostradas na figura 1.

XOr é um problema de classificação e pelo qual as saídas esperadas são conhecidas antecipadamente. É, portanto, apropriado usar uma abordagem de aprendizagem supervisionada.

>Na superfície, XOr parece ser um problema muito simples, entretanto, Minksy e Papert (1969) mostraram que este era um grande problema para arquiteturas de redes neurais dos anos 60, conhecidas como perceptrons.

Perceptrons
Como todas as ANNs, o perceptron é composto de uma rede de unidades, que são analógicas aos neurônios biológicos. Uma unidade pode receber um input de outras unidades. Ao fazer isso, ela toma a soma de todos os valores recebidos e decide se vai encaminhar um sinal para outras unidades às quais está conectada. Isto é chamado de ativação. A função de ativação utiliza algum meio ou outro para reduzir a soma dos valores de entrada a 1 ou 0 (ou um valor muito próximo de 1 ou 0), a fim de representar a ativação ou a falta dela. Outra forma de unidade, conhecida como unidade de polarização, é sempre ativada, normalmente enviando um 1 codificado para todas as unidades às quais está conectada.

Perceptrons incluem uma única camada de unidades de entrada – incluindo uma unidade de polarização – e uma única unidade de saída (ver figura 2). Aqui uma unidade de polarização é representada por um círculo tracejado, enquanto outras unidades são mostradas como círculos azuis. Há duas unidades de entrada não polarizadas que representam os dois valores de entrada binários para XOr. Qualquer número de unidades de entrada pode ser incluído.

O perceptron é um tipo de rede feed-forward, o que significa que o processo de geração de uma saída – conhecido como propagação para frente – flui em uma direção da camada de entrada para a camada de saída. Não há conexões entre as unidades na camada de entrada. Em vez disso, todas as unidades na camada de entrada são conectadas diretamente à unidade de saída.

Uma explicação simplificada do processo de propagação para frente é que os valores de entrada X1 e X2, juntamente com o valor de polarização 1, são multiplicados pelos respectivos pesos W0…W2, e analisados para a unidade de saída. A unidade de saída pega a soma desses valores e emprega uma função de ativação – tipicamente a função de passos Heavside – para converter o valor resultante em 0 ou 1, classificando assim os valores de entrada como 0 ou 1,

É a definição das variáveis de peso que dá ao autor da rede o controle sobre o processo de conversão dos valores de entrada para um valor de saída. São os pesos que determinam onde a linha de classificação, a linha que separa os pontos de dados em grupos de classificação, é desenhada. Se a todos os pontos de dados de um lado de uma linha de classificação for atribuída a classe 0, todos os outros são classificados como 1,

A limitação desta arquitetura é que ela só é capaz de separar pontos de dados com uma única linha. Isto é lamentável porque as entradas XOr não são separáveis linearmente. Isto é particularmente visível se você traçar os valores de entrada XOr em um gráfico. Como mostrado na figura 3, não há como separar as previsões 1 e 0 com uma única linha de classificação.

>

Perceptrões de múltiplas camadas
A solução para este problema é expandir além da arquitetura de camada única adicionando uma camada adicional de unidades sem qualquer acesso direto ao mundo exterior, conhecida como camada oculta. Este tipo de arquitetura – mostrado na Figura 4 – é outro tipo de rede feed-forward conhecida como um perceptron multicamadas (MLP).

>

É importante notar que um MLP pode ter qualquer número de unidades em suas camadas de entrada, oculta e de saída. Também pode ter qualquer número de camadas ocultas. A arquitetura usada aqui é projetada especificamente para o problema XOr.

Simplesmente ao clássico perceptron, a propagação para frente começa com os valores de entrada e unidade de polarização da camada de entrada sendo multiplicados por seus respectivos pesos, entretanto, neste caso há um peso para cada combinação de entrada (incluindo a unidade de polarização da camada de entrada) e unidade oculta (excluindo a unidade de polarização da camada oculta). Os produtos dos valores da camada de entrada e seus respectivos pesos são analisados como entrada para as unidades sem polarização da camada oculta. Cada unidade oculta não polarizada invoca uma função de ativação – geralmente a função sigmóide clássica no caso do problema XOr – para comprimir a soma de seus valores de entrada até um valor que cai entre 0 e 1 (geralmente um valor muito próximo de 0 ou 1). As saídas de cada unidade de camada oculta, incluindo a unidade de polarização, são então multiplicadas por outro conjunto de pesos respectivos e comparadas a uma unidade de saída. A unidade de saída também analisa a soma de seus valores de entrada através de uma função de ativação – novamente, a função sigmóide é apropriada aqui – para retornar um valor de saída que cai entre 0 e 1. Esta é a saída prevista.

Esta arquitetura, embora mais complexa que a da rede clássica de perceptron, é capaz de alcançar uma separação não-linear. Assim, com o conjunto certo de valores de peso, ela pode fornecer a separação necessária para classificar com precisão as entradas XOr.

>

Backpropagation
O elefante na sala, é claro, é como se pode chegar a um conjunto de valores de peso que garanta que a rede produza a saída esperada. Na prática, tentar encontrar manualmente um conjunto aceitável de pesos para uma rede MLP seria uma tarefa incrivelmente trabalhosa. Na verdade, é NP-complete (Blum and Rivest, 1992). Entretanto, felizmente é possível aprender automaticamente um bom conjunto de valores de peso através de um processo conhecido como retropropagação. Isto foi primeiramente demonstrado a funcionar bem para o problema XOr por Rumelhart et al. (1985).

O algoritmo de retropropagação começa comparando o valor real de saída pelo processo de propagação para a frente com o valor esperado e depois se move para trás através da rede, ajustando ligeiramente cada um dos pesos em uma direção que reduz o tamanho do erro em um pequeno grau. Tanto a propagação para frente como para trás são executadas novamente milhares de vezes em cada combinação de entrada até que a rede possa prever com precisão a saída esperada das possíveis entradas usando a propagação para frente.

Para o problema xOr, 100% dos exemplos de dados possíveis estão disponíveis para uso no processo de treinamento. Portanto, podemos esperar que a rede treinada seja 100% precisa em suas previsões e não há necessidade de se preocupar com questões como viés e variância no modelo resultante.

Conclusão
Neste post, o problema clássico do ANN XOr foi explorado. O problema em si foi descrito em detalhes, juntamente com o fato de que os inputs para XOr não são linearmente separáveis em suas categorias de classificação corretas. Uma solução não linear – envolvendo uma arquitetura MLP – foi explorada em alto nível, juntamente com o algoritmo de propagação para frente usado para gerar um valor de saída da rede e o algoritmo de retropropagação, que é usado para treinar a rede.

O próximo post desta série apresentará uma implementação Java da arquitetura MLP descrita aqui, incluindo todos os componentes necessários para treinar a rede a agir como um gate lógico XOr.

Blum, A. Rivest, R. L. (1992). O treinamento de uma rede neural de 3 nós é NP-complete. Redes Neurais, 5(1), 117-127.