Baixe o app para aproveitar ainda mais
Prévia do material em texto
INTELIGÊNCIA ARTIFICIAL Pedro Henrique Chagas Freitas Redes neurais artificiais I Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Identificar os elementos e as notações das redes neurais artificiais. � Caracterizar as diferentes estruturas de rede. � Exemplificar os algoritmos das redes neurais e suas características. Introdução Neste capítulo, você estudará os elementos e as notações principais das redes neurais artificiais, bem como suas estruturas e um algoritmo utilizado nessas redes e suas características. Redes neurais artificiais Para tratar do funcionamento das redes neurais artificiais, é importante contex- tualizar alguns fundamentos de inteligência artificial e modelagem cognitiva. Por exemplo, a espécie Homo sapiens recebeu esse nome devido à inteligência dos seres humanos. Durante milhares de anos, procura-se entender como eles pensam, percebem, compreendem, prevêm e manipulam um mundo muito maior e mais complexo do que eles. Desse pensamento, por volta de 1956, após o final da Segunda Guerra Mundial, surgiu o campo da inteligência artificial. Em suma, a inteligência artificial é o estudo das faculdades mentais pelo uso de modelos computacionais (CHARNIAK; MCDEMOTT, 1985). Em 1950, Alan Turing desenvolveu o teste de Turing, projetado para fornecer uma definição operacional sobre inteligência que, de forma simples, funciona com um computador que passará por testes e será aprovado caso o interrogador humano, depois de propor algumas perguntas por escrito, não conseguir descobrir se as respostas escritas vêm de uma pessoa ou de um computador. Nesse contexto, surgiram quatro premissas que deram origem aos estudos das redes neurais artificias: � Processamento de linguagem natural para permitir que haja comunicação. � Representação de conhecimento para armazenamento. � Raciocínio automatizado para usar informações armazenadas. � Aprendizado de máquina para realizar adaptação diante de novas cir- cunstâncias e criação de padrões. A partir dessas quatro premissas, começou-se a pensar na criação de um subgrupo dentro da inteligência artificial para disciplinar sobre ciência cognitiva ou modelagem cognitiva, que é a representação de modelos computacionais de inteligência artificial e de técnicas experimentais de psicologia, visando construir teorias verificáveis a respeito dos processos de funcionamento da mente humana. Com os estudos de modelagem cognitiva a partir da mente humana, co- meçou-se a fomentar o estudo das redes neurais artificiais, que é um campo de inteligência artificial responsável por simular e referenciar as atividades cerebrais dos neurônios por meio de modelos matemáticos, dando origem a essas redes neurais. Na Figura 1, você pode ver o esquema de uma representação de um neurônio natural e um artificial. Figura 1. Representação de um neurônio natural e um artificial. Fonte: Adaptado de Rocha (2017). Dendritos (terminal de recepção) Terminal do axônio (terminal de transmissão) Sentido de propagação Nodo de Ranvier Bainha de mielina Axônio Corpo x1 x2 xn – θ u y Redes neurais artificiais I2 As redes neurais artificiais realizam a construção de modelos matemáticos que simulam as atividades do cérebro, descrevendo as atividades mentais por meio da eletroquímica das células cerebrais (os neurônios). Inspiradas na eletroquímica das células cerebrais, algumas aplicações de inteligência artificial buscam criar a computação neural a partir de sistemas de proces- samento distribuído paralelo, com modelos matemáticos que demonstram o funcionamento dos neurônios. Segundo McCulloch (1943), as redes neurais artificiais começariam a demonstrar a interconexão de um neurônio a partir de ligações de entrada e saída, em que a ativação de entrada pode ser qualquer estímulo que desencadeie funções de entrada e de ativação, conforme você pode observar na Figura 2. Figura 2. Interconexão de um neurônio artificial a partir de ligações de entrada e saída. Peso em diagonal Ligações de entrada Função de entrada Função de ativação Saída Ligações de saída aj = g(inj) inj ajai a 0 = 1 w 0j wij g Σ Portanto, as redes neurais são compostas de nós ou unidades, que se co- nectam por ligações direcionadas. Uma ligação da unidade i para a unidade j serve para propagar uma ativação ai de i para j, sendo que cada ligação tem um peso numérico wij associado a ele, que, por sua vez, determina o sinal de conexão entre as unidades ou os nós de uma rede neural. Assim, essas redes implementam o seguinte somatório: in w aj i j i i n = = ∑ , 0 3Redes neurais artificiais I O somatório anterior representa a função fundamental das redes neurais, chamada de função de ativação, que é uma representação do somatório das ligações de entrada em uma rede neural artificial. A seguir, você pode ver o somatório para se obter a saída: a g in g w aj j i j i i n = ( ) = = ∑ , 0 Observe que, a partir da representação dos somatórios de entrada e saída, pode-se verificar que a função de ativação g é usada para derivar a saída. Portanto, essas funções de entrada e saída garantem a propriedade de conexão das redes neurais artificiais para cada unidade ou nó delas. Outra propriedade é a estrutura da conexão em rede das redes neurais, que ocorre fundamentalmente por duas estruturas principais: as redes neurais artificiais de camada única e as de multicamada. Nas redes de camada única, há conexões em uma direção, formando uma matriz dirigida, na qual cada nó recebe a entrada de nós “para cima” e libera a saída destes “para baixo”, não havendo laços entre eles. Já a rede com camada múltipla tem uma ou mais camadas que atuarão com diversas unidades (os nós), representadas por funções booleanas básicas nas entradas e saídas. Estruturas de redes neurais artificiais Portanto, como foi visto anteriormente, há duas estruturas principais de redes neurais artificiais: � Redes neurais de camada única. � Redes neurais de multicamada. As redes neurais de camada única são uma estrutura fundamental com todas as suas entradas conectadas diretamente com somente uma saída, por exemplo, na Figura 3, você pode ver uma rede de camada única simples de duas entradas com duas interligações. Redes neurais artificiais I4 Figura 3. Rede de camada única simples de duas entradas com duas interligações. 1 w 1,3 w 1,4 w 2,3 w 2,4 3 42 A estrutura de rede de camada única foi proposta em 1958, por Rosenblatt, e é a forma mais simples de estruturação de rede neural artificial, considerando que se constitui de uma camada neural e de um neurônio. Essas redes podem ter n entradas, porém, apenas uma saída com valores de 0 e 1 ou de –1 e 1. Portanto, ela funciona como um classificador binário simples, que mapeia as entradas x em função de um valor de saída f(x), criando uma matriz, por exemplo, f(x) = 1 se w · x + b > = 0, se não 0, conforme você pode conferir no Quadro 1. x1 x2 f(x)1 f(x)2 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 Quadro 1. Exemplo de uma rede neural artificial de camada única que funciona como um classificador binário simples A partir da função, determina-se que w é um vetor que multiplica os valores, sejam estes de x1 ou de x2, sendo b um valor constante, dependendo do tipo de entrada. Por isso, pode-se criar valores de interligação de 0 e 1 ou –1 e 1 para diversos tipos de interconexão entre os neurônios, tendo uma camada com n entradas, mas somente uma saída. Na Figura 4, você pode observar como ocorre essa conexão. 5Redes neurais artificiais I Figura 4. Interconexão entre os neurônios artificiais e seus valores de entrada e saída. Entradas Saída (y) Função de ativação (f) Pesos das conexões Σ u w 1 w 2 wn x1 x2 xn Já as estruturas de redes neurais de multicamada ou perceptrons de multi- camadas (MLP) são semelhantes aos perceptrons que servem como modelos de neurônios artificiais, presentes em somente uma camada ou em multicama-das, mas, nesse último caso, há mais de uma camada de neurônio. Portanto, trata-se de uma rede composta de camadas de neurônios ligadas entre si por sinapses com pesos, similares à representação de um neurônio (perceptron) em uma camada, porém, com mais de uma camada deles, conforme você pode ver na Figura 5. Figura 5. Exemplo de rede neural artificial de multicamada. 1 w 1,3 w 1,4 w 2,3 w 2,4 3 42 w 3,5 w 3,6 w 4,5 w 4,6 5 6 Uma das principais vantagens na construção da multicamada é que, nela, há a entrada de estímulos e uma camada intermediária de construção da resposta para encaminhar a saída, formando os grafos que simulam neurônios em multicamadas, como apresentado na Figura 6. Redes neurais artificiais I6 Fi gu ra 6 . C on st ru çã o da e st ru tu ra d e m ul tic am ad a. … … … S in al d e en tr ad a o u E st ím u lo in ic ia l C am ad a d e en tr ad a P ri m ei ra ca m ad a o cu lt a S eg u n d a ca m ad a o cu lt a C am ad a d e sa íd a R es p o st a d o s in al d e sa íd a 7Redes neurais artificiais I Na Figura 7, você pode ver outras estruturas das redes artificiais de maior complexidade, que derivam das redes de camada única e de multicamadas. Figura 7. Redes artificiais de maior complexidade, derivadas das redes de camada única e de multicamada. Fonte: Van Veen e Leijnen (2016, documento on-line). Redes neurais artificiais I8 Algoritmos de redes neurais artificiais A seguir, você pode ver como ocorre a implementação de um algoritmo de rede neural artificial de camada única com a linguagem Python apresentada por Caraciolo (2018 apud ROCHA, 2017, documento on-line). Nesse caso, utiliza- -se a classe perceptron oriunda das bibliotecas do Python para implementar a rede de camada única, inserindo os métodos, atributos, classes e comentários nas linhas do código a fim de representar as entradas, saídas e sua respectiva conversão em sinapses de -1 e 1. #!/usr/bin/python # -*- coding: utf-8 -*- # Implementação Perceptron import sys import random class Perceptron: ## Primeira função de uma classe (método construtor de objetos) ## self é um parâmetro obrigatório que receberá a instância criada def _ _ init _ _ (self, amostras, saidas, taxa _ aprendizado=0.1, épocas = 1000, limiar = 1) self.amostras = amostras self.saidas = saidas self.taxa _ aprendizado = taxa _ aprendizado self.epocas = epocas self.limiar = limiar self.n _ amostras = len(amostras) # número de linhas (amostras) self.n _ atributos = len(amostras[0]) # número de atributos self.pesos = [] ## Atribuição de treinamento para amostras e construção da matriz def treinar(self): # Inserir o valor do limiar na posição "0" para cada amostra da lista “amostra” Ex.: [[0.72, 0.82], ...] vira [[1, 0.72, 0.82] for amostra in self.amostras: amostra.insert(0, self.limiar) 9Redes neurais artificiais I # Gerar valores randômicos entre 0 e 1 (pesos) conforme o número de atributos for i in range(self.n _ atributos): self.pesos.append(random.random()) # Inserir o valor do limiar na posição "0" do vetor de pesos self.pesos.insert(0, self.limiar) # Inicializar contador de épocas n _ epocas = 0 while True: # Inicializar variável erro # (quando terminar loop e erro continuar False, é porque não tem mais diferença entre valor calculado e desejado erro = False # Para cada amostra... for i in range(self.n _ amostras): # Inicializar potencial de ativação u = 0 # Para cada atributo... for j in range(self.n _ atributos + 1): # Multiplicar amostra e seu peso e também somar com o potencial u += self.pesos[j] * self.amostras[i][j] # Obter a saída da rede considerando g a função sinal y = self.sinal(u) # Verificar se a saída da rede é diferente da saída desejada if y != self.saidas[i]: # Calcular o erro erro _ aux = self.saidas[i] - y # Fazer o ajuste dos pesos para cada elemento da amostra for j in range(self.n _ atributos + 1): self.pesos[j] = self.pesos[j] + self.taxa _ aprendizado * e # Atualizar variável erro, já que erro é diferente de zero (e erro = True # Atualizar contador de épocas n _ epocas += 1 Redes neurais artificiais I10 # Critérios de parada do loop: erro inexistente ou o número de épocas if not erro or n _ epocas > self.epocas: break ## Testes para "novas" amostras def teste(self, amostra): # Inserir o valor do limiar na posição "0" para cada amostra da lista “amostra” amostra.insert(0, self.limiar) # Inicializar potencial de ativação u = 0 # Para cada atributo... for i in range(self.n _ atributos + 1): # Multiplicar amostra e seu peso e também somar com o poten- cial que já tinha u += self.pesos[i] * amostra[i] # Obter a saída da rede considerando g a função sinal y = self.sinal(u) print('Classe: %d' % y) ## Função sinal def sinal(self, u): if u >= 0: return 1 return -1 # Amostras (entrada e saída) para treinamento amostras = [[0.72, 0.82], [0.91, -0.69], [0.46, 0.80], [0.03, 0.93], [0.12, 0.25], [0.96, 0.47], [0.8, -0.75], [0.46, 0.98], [0.66, 0.24], [0.72, -0.15], [0.35, 0.01], [-0.16, 0.84], [-0.04, 0.68], [-0.11, 0.1], [0.31, -0.96], [0.0, -0.26], 11Redes neurais artificiais I [-0.43, -0.65], [0.57, -0.97], [-0.47, -0.03], [-0.72, -0.64], [-0.57, 0.15], [-0.25, -0.43], [0.47, -0.88], [-0.12, -0.9], [-0.58, 0.62], [-0.48, 0.05], [-0.79, -0.92], [-0.42, -0.09], [-0.76, 0.65], [-0.77, -0.76]] saidas = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1] # Chamar classe e fazer treinamento das amostras rede = Perceptron(amostras, saidas) rede.treinar() # Entrando com amostra para teste rede.teste([0.46, 0.80]) # Fim do perceptron CHARNIAK, E.; McDERMOTT, D. Introduction to artificial intelligence. Reading: Addison Wesley, 1985. 701 p. ROCHA, V. R. Perceptron – Redes Neurais. Monolito Nimbus, [S. l.], 1 jun. 2017. Disponível em: https://www.monolitonimbus.com.br/perceptron-redes-neurais/. Acesso em: 28 maio 2019. VAN VEEN, F.; LEIJNEN, S. A mostly complete chart of Neural Networks. In: VAN VEEN, F. The Neural Network Zoo. The Asimov Institute for Artificial Creativity and Constraint, Utrecht, 14 Sep. 2016. Disponível em: http://www.asimovinstitute.org/neural-network- -zoo/. Acesso em: 28 maio 2019. Leituras recomendadas COPPIN, B. Inteligência artificial. Rio de Janeiro: LTC, 2010. 664 p. DROZDEK, A. Estrutura de dados e algoritmos em C++. 4. ed. São Paulo: Cengage Lear- ning, 2017. 708 p. PERKOVIC, L. Introdução à computação usando Python: um foco no desenvolvimento de aplicações. Rio de Janeiro: LTC, 2016. 516 p. Redes neurais artificiais I12
Compartilhar