Perceptron
Em aprendizado de máquina, o perceptron é um algoritmo para aprendizado supervisionado de classificadores binários. Um classificador binário é uma função que pode decidir se uma entrada, representada por um vetor de números, pertence ou não a uma classe específica.[1] É um tipo de classificador linear, ou seja, um algoritmo de classificação que faz suas previsões com base em uma função preditora linear combinando um conjunto de pesos com o vetor de características.
História
[editar | editar código]
O neurônio artificial e a rede neural artificial foram inventados em 1943 por Warren McCulloch e Walter Pitts em seu artigo seminal "A Logical Calculus of the Ideas Immanent in Nervous Activity".[5]
Em 1957, Frank Rosenblatt estava no Cornell Aeronautical Laboratory. Ele simulou o perceptron em um IBM 704.[6][7] Mais tarde, ele obteve financiamento do Information Systems Branch do Office of Naval Research dos Estados Unidos e do Rome Air Development Center para construir um computador personalizado, o Mark I Perceptron. Foi demonstrado publicamente pela primeira vez em 23 de junho de 1960.[8] A máquina fazia "parte de um esforço secreto de quatro anos do NPIC [o National Photographic Interpretation Center dos EUA] de 1963 a 1966 para desenvolver este algoritmo em uma ferramenta útil para foto-intérpretes".[9]
Rosenblatt descreveu os detalhes do perceptron em um artigo de 1958.[10] Sua organização de um perceptron é construída com três tipos de células ("unidades"): S, A, R, que significam "sensorial", "associação" e "resposta". Ele apresentou no primeiro simpósio internacional sobre IA, Mechanisation of Thought Processes, que ocorreu em novembro de 1958.[11]
O projeto de Rosenblatt foi financiado sob o Contrato Nonr-401(40) "Cognitive Systems Research Program", que durou de 1959 a 1970,[12] e o Contrato Nonr-2381(00) "Project PARA" ("PARA" significa "Perceiving and Recognition Automata"), que durou de 1957[6] a 1963.[13]
Em 1959, o Institute for Defense Analysis concedeu ao seu grupo um contrato de $10.000. Em setembro de 1961, o ONR concedeu mais $153.000 em contratos, com $108.000 comprometidos para 1962.[14]
O gerente de pesquisa do ONR, Marvin Denicoff, afirmou que o ONR, em vez da ARPA, financiou o projeto Perceptron, porque era improvável que o projeto produzisse resultados tecnológicos no curto ou médio prazo. O financiamento da ARPA chega à ordem de milhões de dólares, enquanto o do ONR é da ordem de 10.000 dólares. Enquanto isso, o chefe do IPTO da ARPA, J.C.R. Licklider, estava interessado em métodos 'auto-organizáveis', 'adaptativos' e outros métodos de inspiração biológica na década de 1950; mas em meados da década de 1960, ele era abertamente crítico a estes, incluindo o perceptron. Em vez disso, ele favoreceu fortemente a abordagem de IA lógica de Simon e Newell.[15]
Máquina Mark I Perceptron
[editar | editar código]
O perceptron foi concebido para ser uma máquina, e não um programa, e, embora sua primeira implementação tenha sido em software para o IBM 704, foi posteriormente implementado em hardware personalizado como o Mark I Perceptron com o nome de projeto "Project PARA",[16] projetado para reconhecimento de imagens. A máquina está atualmente no Smithsonian National Museum of American History.[17]
O Mark I Perceptron tinha três camadas. Uma versão foi implementada da seguinte forma:
- Uma matriz de 400 fotocélulas dispostas em uma grade 20x20, chamadas de "unidades sensoriais" (unidades S), ou "retina de entrada". Cada unidade S pode se conectar a até 40 unidades A.
- Uma camada oculta de 512 perceptrons, chamados de "unidades de associação" (unidades A).
- Uma camada de saída de oito perceptrons, chamados de "unidades de resposta" (unidades R).
Rosenblatt chamou essa rede perceptron de três camadas de alpha-perceptron, para distingui-la de outros modelos de perceptron com os quais ele experimentou.[8]
As unidades S estão conectadas às unidades A aleatoriamente (de acordo com uma tabela de números aleatórios) através de um painel de conexões (ver foto), para "eliminar qualquer viés intencional particular no perceptron". Os pesos das conexões são fixos, não aprendidos. Rosenblatt era inflexível sobre as conexões aleatórias, pois acreditava que a retina estava conectada aleatoriamente ao córtex visual e queria que sua máquina perceptron se assemelhasse à percepção visual humana.[18]
As unidades A estão conectadas às unidades R, com pesos ajustáveis codificados em potenciômetros, e as atualizações de peso durante o aprendizado eram realizadas por motores elétricos.[2]:193 Os detalhes do hardware estão em um manual do operador.[16]

Em uma conferência de imprensa de 1958 organizada pela Marinha dos EUA, Rosenblatt fez declarações sobre o perceptron que causaram uma controvérsia acalorada entre a comunidade de IA incipiente; com base nas declarações de Rosenblatt, o The New York Times relatou que o perceptron era "o embrião de um computador eletrônico que [a Marinha] espera que será capaz de andar, falar, ver, escrever, se reproduzir e estar consciente de sua existência."[19]
A Divisão de Fotografia da Agência Central de Inteligência, de 1960 a 1964, estudou o uso da máquina Mark I Perceptron para reconhecer alvos silhuetados de interesse militar (como aviões e navios) em fotos aéreas.[20][21]
Principles of Neurodynamics (1962)
[editar | editar código]Rosenblatt descreveu seus experimentos com muitas variantes da máquina Perceptron em um livro Principles of Neurodynamics (1962). O livro é uma versão publicada do relatório de 1961.[22]
Entre as variantes estão:
- "acoplamento cruzado" (conexões entre unidades dentro da mesma camada) possivelmente com loops fechados,
- "retroacoplamento" (conexões de unidades em uma camada posterior para unidades em uma camada anterior),
- perceptrons de quatro camadas onde as duas últimas camadas têm pesos ajustáveis (e, portanto, um perceptron multicamadas adequado),
- incorporação de atrasos de tempo às unidades do perceptron, para permitir o processamento de dados sequenciais,
- análise de áudio (em vez de imagens).
A máquina foi enviada da Cornell para o Smithsonian em 1967, sob uma transferência do governo administrada pelo Office of Naval Research.[9]
Perceptrons (1969)
[editar | editar código]Embora o perceptron inicialmente parecesse promissor, rapidamente se provou que perceptrons não podiam ser treinados para reconhecer muitas classes de padrões. Isso fez com que o campo de pesquisa de redes neurais estagnasse por muitos anos, antes que se reconhecesse que uma rede neural feedforward com duas ou mais camadas (também chamada de perceptron multicamadas) tinha um poder de processamento maior do que perceptrons com uma camada (também chamada de perceptron de camada única).
Perceptrons de camada única são capazes apenas de aprender padrões linearmente separáveis.[23] Para uma tarefa de classificação com alguma função de ativação degrau, um único nó terá uma única linha dividindo os pontos de dados que formam os padrões. Mais nós podem criar mais linhas divisórias, mas essas linhas devem ser combinadas de alguma forma para formar classificações mais complexas. Uma segunda camada de perceptrons, ou mesmo nós lineares, é suficiente para resolver muitos problemas de outra forma não separáveis.
Em 1969, um famoso livro intitulado Perceptrons de Marvin Minsky e Seymour Papert mostrou que era impossível para essas classes de rede aprender uma função XOR. Muitas vezes, acredita-se erroneamente que eles também conjecturaram que um resultado semelhante valeria para uma rede perceptron multicamadas. No entanto, isso não é verdade, pois tanto Minsky quanto Papert já sabiam que perceptrons multicamadas eram capazes de produzir uma função XOR. (Veja a página sobre Perceptrons (livro) para mais informações.) No entanto, o texto de Minsky e Papert, frequentemente mal citado, causou um declínio significativo no interesse e financiamento da pesquisa em redes neurais. Levou mais dez anos até que a pesquisa em redes neurais experimentasse um ressurgimento na década de 1980.[23][verificar] Este texto foi reimpresso em 1987 como "Perceptrons - Expanded Edition", onde alguns erros no texto original são mostrados e corrigidos.
Trabalho subsequente
[editar | editar código]Rosenblatt continuou trabalhando em perceptrons apesar da diminuição do financiamento. A última tentativa foi Tobermory, construído entre 1961 e 1967, para reconhecimento de fala.[24] Ocupava uma sala inteira.[25] Tinha 4 camadas com 12.000 pesos implementados por núcleos magnéticos toroidais. Na época de sua conclusão, a simulação em computadores digitais tornou-se mais rápida do que as máquinas perceptron construídas para esse fim.[26] Ele morreu em um acidente de barco em 1971.
Um programa de simulação para redes neurais foi escrito para IBM 7090/7094 e foi usado para estudar várias aplicações de reconhecimento de padrões, como reconhecimento de caracteres, rastros de partículas em fotografias de câmara de bolhas; fonemas, palavras isoladas e reconhecimento de fala contínuo; verificação de locutor; e mecanismos de atenção central para processamento de imagens.[27][28]

O algoritmo do perceptron kernel já foi introduzido em 1964 por Aizerman et al.[29] Garantias de limites de margem foram dadas para o algoritmo Perceptron no caso geral não separável primeiro por Freund e Schapire (1998),[1] e mais recentemente por Mohri e Rostamizadeh (2013) que estendem resultados anteriores e fornecem novos limites L1 mais favoráveis.[30][31]
O perceptron é um modelo simplificado de um neurônio biológico. Embora a complexidade dos modelos de neurônio biológico seja frequentemente necessária para entender completamente o comportamento neural, a pesquisa sugere que um modelo linear semelhante ao perceptron pode produzir alguns comportamentos observados em neurônios reais.[32]
Os espaços de solução das fronteiras de decisão para todas as funções binárias e comportamentos de aprendizado são estudados em.[33]
Definição
[editar | editar código]
No sentido moderno, o perceptron é um algoritmo para aprender um classificador binário chamado função limiar: uma função que mapeia sua entrada (um vetor de valores reais) para um valor de saída (um único valor binário):
onde é a função degrau de Heaviside (onde uma entrada de produz saída 1; caso contrário, a saída é 0), é um vetor de pesos de valores reais, é o produto escalar , onde m é o número de entradas para o perceptron, e b é o viés. O viés desloca a fronteira de decisão para longe da origem e não depende de nenhum valor de entrada.
Equivalentemente, como , podemos adicionar o termo de viés como outro peso e adicionar uma coordenada a cada entrada , e então escrevê-lo como um classificador linear que passa pela origem:
O valor binário de (0 ou 1) é usado para realizar a classificação binária em como uma instância positiva ou negativa. Espacialmente, o viés desloca a posição (embora não a orientação) da fronteira de decisão planar.
No contexto das redes neurais, um perceptron é um neurônio artificial que usa a função degrau de Heaviside como função de ativação. O algoritmo do perceptron também é denominado perceptron de camada única, para distingui-lo de um perceptron multicamadas, que é um nome impróprio para uma rede neural mais complicada. Como um classificador linear, o perceptron de camada única é a rede neural feedforward mais simples.
Poder de representação
[editar | editar código]Teoria da informação
[editar | editar código]Do ponto de vista da teoria da informação, um único perceptron com K entradas tem uma capacidade de 2K bits de informação.[34] Este resultado é devido a Thomas M. Cover.[35]
Especificamente, seja o número de maneiras de separar linearmente N pontos em K dimensões, entãoQuando K é grande, está muito próximo de um quando , mas muito próximo de zero quando . Em palavras, uma unidade perceptron pode quase certamente memorizar uma atribuição aleatória de rótulos binários em N pontos quando , mas quase certamente não quando .
Função booleana
[editar | editar código]Quando opera apenas em entradas binárias, um perceptron é chamado de função booleana linearmente separável, ou função booleana limiar. A sequência de números de funções booleanas limiares em n entradas é OEIS A000609. O valor é conhecido exatamente apenas até o caso , mas a ordem de magnitude é conhecida com bastante precisão: tem limite superior e limite inferior .[36]
Qualquer função limiar linear booleana pode ser implementada apenas com pesos inteiros. Além disso, o número de bits necessários e suficientes para representar um único parâmetro de peso inteiro é .[36]
Teorema da aproximação universal
[editar | editar código]Um único perceptron pode aprender a classificar qualquer semi-espaço. Ele não pode resolver nenhum vetor linearmente não separável, como o problema exclusive-or booleano (o famoso "problema XOR").
Uma rede perceptron com uma camada oculta pode aprender a classificar qualquer subconjunto compacto arbitrariamente próximo. Da mesma forma, também pode aproximar qualquer função contínua de suporte compacto arbitrariamente próxima. Este é essencialmente um caso especial do teorema de George Cybenko e Kurt Hornik.
Perceptron conjuntivamente local
[editar | editar código]Perceptrons (Minsky e Papert, 1969) estudou o tipo de redes perceptron necessárias para aprender várias funções booleanas.
Considere uma rede perceptron com unidades de entrada, uma camada oculta e uma saída, semelhante à máquina Mark I Perceptron. Ela calcula uma função booleana do tipo . Eles chamam uma função de conjuntivamente local de ordem , se existe uma rede perceptron tal que cada unidade na camada oculta se conecta a no máximo unidades de entrada.
Teorema. (Teorema 3.1.1): A função paridade é conjuntivamente local de ordem .
Teorema. (Seção 5.5): A função conectividade é conjuntivamente local de ordem .
Algoritmo de aprendizado para um perceptron de camada única
[editar | editar código]
Abaixo está um exemplo de um algoritmo de aprendizado para um perceptron de camada única com uma única unidade de saída. Para um perceptron de camada única com múltiplas unidades de saída, como os pesos de uma unidade de saída são completamente separados dos das outras, o mesmo algoritmo pode ser executado para cada unidade de saída.
Para perceptrons multicamadas, onde existe uma camada oculta, algoritmos mais sofisticados, como retropropagação, devem ser usados. Se a função de ativação ou o processo subjacente sendo modelado pelo perceptron for não linear, algoritmos de aprendizado alternativos, como a regra delta, podem ser usados, desde que a função de ativação seja diferenciável. No entanto, o algoritmo de aprendizado descrito nas etapas abaixo geralmente funciona, mesmo para perceptrons multicamadas com funções de ativação não lineares.
Quando múltiplos perceptrons são combinados em uma rede neural artificial, cada neurônio de saída opera independentemente de todos os outros; assim, aprender cada saída pode ser considerado isoladamente.
Definições
[editar | editar código]Primeiro, definimos algumas variáveis:
- é a taxa de aprendizado do perceptron. A taxa de aprendizado é um número positivo geralmente escolhido como menor que 1. Quanto maior o valor, maior a chance de volatilidade nas mudanças de peso.
- é o conjunto de treinamento de amostras, onde:
- é o -ésimo vetor de entrada do espaço euclidiano -dimensional .
- é o valor de saída desejado do perceptron para essa entrada.
Mostramos os valores das características da seguinte forma:
- é o valor da -ésima característica do -ésimo vetor de entrada de treinamento.
- .
Para representar os pesos:
- é o -ésimo valor no vetor de pesos, a ser multiplicado pelo valor da -ésima característica de entrada.
- Como , o é efetivamente um viés que usamos em vez da constante de viés .
Para mostrar a dependência temporal de , usamos:
- é o peso no tempo .
Passos
[editar | editar código]- Inicialize os pesos. Os pesos podem ser inicializados com 0 ou com um pequeno valor aleatório. No exemplo abaixo, usamos 0. Defina o contador de tempo como 0.
- Para cada exemplo j em nosso conjunto de treinamento D, execute as seguintes etapas sobre a entrada e a saída desejada :
- Calcule a saída com o vetor de pesos atual :
- Atualize os pesos:
- , para todas as características , onde é a taxa de aprendizado.
- Incremente o contador de tempo:
- Calcule a saída com o vetor de pesos atual :
Para aprendizado offline, a segunda etapa pode ser repetida até que o erro de iteração seja menor que um limite de erro especificado pelo usuário, ou até que um número predeterminado de iterações tenha sido concluído, onde s é novamente o tamanho do conjunto de amostras.
O algoritmo atualiza os pesos após cada amostra de treinamento na etapa 2b, embora se possa notar que os pesos permanecem inalterados sempre que .
Convergência de um perceptron em um conjunto de dados linearmente separável
[editar | editar código]
Um único perceptron é um classificador linear. Ele só pode atingir um estado estável se todos os vetores de entrada forem classificados corretamente. Caso o conjunto de treinamento D não seja linearmente separável, ou seja, se os exemplos positivos não podem ser separados dos exemplos negativos por um hiperplano, então o algoritmo não convergiria, pois não há solução. Portanto, se a separabilidade linear do conjunto de treinamento não for conhecida a priori, uma das variantes de treinamento abaixo deve ser usada. A análise detalhada e as extensões do teorema de convergência estão no Capítulo 11 de Perceptrons (1969).
Linear separability is testable in time , where is the number of data points, and is the dimension of each point.[37]
Se o conjunto de treinamento for linearmente separável, então o perceptron é garantido para convergir após cometer um número finito de erros.[38] O teorema é provado por Rosenblatt et al.
Teorema da convergência do perceptron
Dado um conjunto de dados , tal que , e ele é linearmente separável por algum vetor unitário , com margem .
Então, o algoritmo de aprendizado 0-1 do perceptron converge após cometer no máximo erros, para qualquer taxa de aprendizado e qualquer método de amostragem do conjunto de dados.
A prova simples a seguir é devida a Novikoff (1962). A ideia da prova é que o vetor de peso é sempre ajustado por uma quantidade limitada em uma direção com a qual ele tem um produto escalar negativo e, portanto, pode ser limitado acima por O(√t), onde t é o número de alterações no vetor de peso. No entanto, também pode ser limitado abaixo por O(t) porque, se existe um vetor de peso satisfatório (desconhecido), então cada mudança faz progresso nessa direção (desconhecida) por uma quantidade positiva que depende apenas do vetor de entrada.
Prova
Suponha que na etapa , o perceptron com peso cometa um erro no ponto de dados , então ele atualiza para .
Se , o argumento é simétrico, então o omitimos.
Sem perda de generalidade, , então , , e .
Por hipótese, temos separação com margens:
Assim,
Também
e como o perceptron cometeu um erro, , e então
Como começamos com , após cometer erros,
mas também
Combinando os dois, temos .

Embora o algoritmo do perceptron seja garantido para convergir para alguma solução no caso de um conjunto de treinamento linearmente separável, ele ainda pode escolher qualquer solução e os problemas podem admitir muitas soluções de qualidade variada.[39] O perceptron de estabilidade ótima, hoje mais conhecido como máquina de vetores de suporte linear, foi projetado para resolver esse problema (Krauth and Mezard, 1987).[40]
Teorema da ciclagem do perceptron
[editar | editar código]Quando o conjunto de dados não é linearmente separável, não há como um único perceptron convergir. No entanto, ainda temos[41]
Teorema da ciclagem do perceptron
Se o conjunto de dados tem apenas um número finito de pontos, então existe um número limite superior , tal que para qualquer vetor de peso inicial todo vetor de peso tem norma limitada por
Isso foi provado primeiro por Bradley Efron.[42]
Aprendendo uma função booleana
[editar | editar código]Considere um conjunto de dados onde os são de , ou seja, os vértices de um hipercubo n-dimensional centrado na origem, e . Ou seja, todos os pontos de dados com positivo têm e vice-versa. Pelo teorema da convergência do perceptron, um perceptron convergiria após cometer no máximo erros.
Se fôssemos escrever um programa lógico para executar a mesma tarefa, cada exemplo positivo mostra que uma das coordenadas é a correta, e cada exemplo negativo mostra que seu complemento é um exemplo positivo. Ao coletar todos os exemplos positivos conhecidos, acabamos eliminando todas as coordenadas, exceto uma, momento em que o conjunto de dados é aprendido.[43]
Esse limite é assintoticamente restrito em termos do pior caso. No pior caso, o primeiro exemplo apresentado é totalmente novo e fornece bits de informação, mas cada exemplo subsequente diferiria minimamente dos exemplos anteriores e forneceria 1 bit cada. Após exemplos, há bits de informação, o que é suficiente para o perceptron (com bits de informação).[34]
No entanto, não é restrito em termos de expectativa se os exemplos forem apresentados uniformemente ao acaso, uma vez que o primeiro forneceria bits, o segundo bits e assim por diante, totalizando exemplos.[43]
Variantes
[editar | editar código]O algoritmo pocket com catraca (Gallant, 1990) resolve o problema de estabilidade do aprendizado do perceptron, mantendo a melhor solução vista até agora "em seu bolso". O algoritmo pocket retorna então a solução no bolso, em vez da última solução. Ele também pode ser usado para conjuntos de dados não separáveis, onde o objetivo é encontrar um perceptron com um pequeno número de classificações incorretas. No entanto, essas soluções aparecem puramente estocasticamente e, portanto, o algoritmo pocket não se aproxima delas gradualmente no decorrer do aprendizado, nem há garantia de que apareçam dentro de um determinado número de etapas de aprendizado.
O algoritmo Maxover (Wendemuth, 1995) é "robusto" no sentido de que convergirá independentemente do conhecimento (prévio) da separabilidade linear do conjunto de dados.[44] No caso linearmente separável, ele resolverá o problema de treinamento – se desejado, até mesmo com estabilidade ótima (margem máxima entre as classes). Para conjuntos de dados não separáveis, ele retornará uma solução com um pequeno número computável de classificações incorretas.[45] Em todos os casos, o algoritmo se aproxima gradualmente da solução no decorrer do aprendizado, sem memorizar estados anteriores e sem saltos estocásticos. A convergência é para a otimalidade global para conjuntos de dados separáveis e para a otimalidade local para conjuntos de dados não separáveis.
O Perceptron Votado (Freund and Schapire, 1999), é uma variante que usa vários perceptrons ponderados. O algoritmo inicia um novo perceptron toda vez que um exemplo é classificado incorretamente, inicializando o vetor de pesos com os pesos finais do último perceptron. Cada perceptron também receberá um peso adicional correspondente a quantos exemplos eles classificam corretamente antes de classificar incorretamente um, e no final a saída será um voto ponderado em todos os perceptrons.
Em problemas separáveis, o treinamento do perceptron também pode visar encontrar a maior margem de separação entre as classes. O chamado perceptron de estabilidade ótima pode ser determinado por meio de esquemas iterativos de treinamento e otimização, como o algoritmo Min-Over (Krauth and Mezard, 1987)[40] ou o AdaTron (Anlauf and Biehl, 1989)).[46] AdaTron usa o fato de que o problema de otimização quadrática correspondente é convexo. O perceptron de estabilidade ótima, juntamente com o kernel trick, são os fundamentos conceituais da máquina de vetores de suporte.
O -perceptron usava ainda uma camada de pré-processamento de pesos aleatórios fixos, com unidades de saída limitadas. Isso permitiu que o perceptron classificasse padrões analógicos, projetando-os em um espaço binário. De fato, para um espaço de projeção de dimensão suficientemente alta, os padrões podem se tornar linearmente separáveis.
Outra maneira de resolver problemas não lineares sem usar múltiplas camadas é usar redes de ordem superior (unidade sigma-pi). Nesse tipo de rede, cada elemento no vetor de entrada é estendido com cada combinação de pares de entradas multiplicadas (segunda ordem). Isso pode ser estendido para uma rede de ordem n.
Uma generalização do modelo perceptron é o Receptron que incorpora interações não lineares entre as entradas. Um único receptron é capaz de classificar funções booleanas não lineares.
No entanto, deve-se ter em mente que o melhor classificador não é necessariamente aquele que classifica perfeitamente todos os dados de treinamento. De fato, se tivéssemos a restrição prévia de que os dados vêm de distribuições gaussianas equi-variantes, a separação linear no espaço de entrada é ótima, e a solução não linear é superajustada.
Outros algoritmos de classificação linear incluem Winnow, máquina de vetores de suporte e regressão logística.
Perceptron multiclasse
[editar | editar código]Como a maioria das outras técnicas para treinar classificadores lineares, o perceptron se generaliza naturalmente para a classificação multiclasse. Aqui, a entrada e a saída são extraídas de conjuntos arbitrários. Uma função de representação de características mapeia cada par possível de entrada/saída para um vetor de características real de dimensão finita. Como antes, o vetor de características é multiplicado por um vetor de peso , mas agora a pontuação resultante é usada para escolher entre muitas saídas possíveis:
O aprendizado novamente itera sobre os exemplos, prevendo uma saída para cada um, deixando os pesos inalterados quando a saída prevista corresponde ao alvo e alterando-os quando não corresponde. A atualização se torna:
Essa formulação de feedback multiclasse se reduz ao perceptron original quando é um vetor de valor real, é escolhido de e .
Para certos problemas, as representações de entrada/saída e as características podem ser escolhidas de modo que possa ser encontrado de forma eficiente, mesmo que seja escolhido de um conjunto muito grande ou mesmo infinito.
Desde 2002, o treinamento do perceptron se tornou popular no campo do processamento de linguagem natural para tarefas como etiquetagem de classes gramaticais e análise sintática (Collins, 2002). Também foi aplicado a problemas de aprendizado de máquina em larga escala em um ambiente de computação distribuída.[47]
Implementação em Python
[editar | editar código]'''
Este projeto esta disponivel no GiHub de Marcos castro de Sousa
Implementação da rede neural Perceptron
w = w + N * (d(k) - y) * x(k)
'''
import random, copy
class Perceptron:
def __init__(self, amostras, saidas, taxa_aprendizado=0.1, epocas=1000, limiar=-1):
self.amostras = amostras # todas as amostras
self.saidas = saidas # saídas respectivas de cada amostra
self.taxa_aprendizado = taxa_aprendizado # taxa de aprendizado (entre 0 e 1)
self.epocas = epocas # número de épocas
self.limiar = limiar # limiar
self.num_amostras = len(amostras) # quantidade de amostras
self.num_amostra = len(amostras[0]) # quantidade de elementos por amostra
self.pesos = [] # vetor de pesos
# função para treinar a rede
def treinar(self):
# adiciona -1 para cada uma das amostras
for amostra in self.amostras:
amostra.insert(0, -1)
# inicia o vetor de pesos com valores aleatórios
for i in range(self.num_amostra):
self.pesos.append(random.random())
# insere o limiar no vetor de pesos
self.pesos.insert(0, self.limiar)
# inicia o contador de epocas
num_epocas = 0
while True:
erro = False # o erro inicialmente inexiste
# para todas as amostras de treinamento
for i in range(self.num_amostras):
u = 0
'''
realiza o somatório, o limite (self.amostra + 1)
é porque foi inserido o -1 para cada amostra
'''
for j in range(self.num_amostra + 1):
u += self.pesos[j] * self.amostras[i][j]
# obtém a saída da rede utilizando a função de ativação
y = self.sinal(u)
# verifica se a saída da rede é diferente da saída desejada
if y != self.saidas[i]:
# calcula o erro: subtração entre a saída desejada e a saída da rede
erro_aux = self.saidas[i] - y
# faz o ajuste dos pesos para cada elemento da amostra
for j in range(self.num_amostra + 1):
self.pesos[j] = self.pesos[j] + self.taxa_aprendizado * erro_aux * self.amostras[i][j]
erro = True # ainda existe erro
# incrementa o número de épocas
num_epocas += 1
# critério de parada é pelo número de épocas ou se não existir erro
if num_epocas > self.epocas or not erro:
break
# função utilizada para testar a rede
# recebe uma amostra a ser classificada e os nomes das classes
# utiliza a função sinal, se é -1 então é classe1, senão é classe2
def testar(self, amostra, classe1, classe2):
# insere o -1
amostra.insert(0, -1)
# utiliza o vetor de pesos que foi ajustado na fase de treinamento
u = 0
for i in range(self.num_amostra + 1):
u += self.pesos[i] * amostra[i]
# calcula a saída da rede
y = self.sinal(u)
# verifica a qual classe pertence
if y == -1:
print('A amostra pertence a classe %s' % classe1)
else:
print('A amostra pertence a classe %s' % classe2)
# função de ativação: degrau bipolar (sinal)
def sinal(self, u):
return 1 if u >= 0 else -1
print('\nA ou B?\n')
# amostras: um total de 4 amostras
amostras = [[0.1, 0.4, 0.7], [0.3, 0.7, 0.2],
[0.6, 0.9, 0.8], [0.5, 0.7, 0.1]]
# saídas desejadas de cada amostra
saidas = [1, -1, -1, 1]
# conjunto de amostras de testes
testes = copy.deepcopy(amostras)
# cria uma rede Perceptron
rede = Perceptron(amostras=amostras, saidas=saidas,
taxa_aprendizado=0.1, epocas=1000)
# treina a rede
rede.treinar()
# testando a rede
for teste in testes:
rede.testar(teste, 'A', 'B')
Implementação em C#
[editar | editar código]
using System;
using System.Linq;
namespace perceptron
{
public class Perceptron
{
static readonly double[] w = new double[3];
private readonly int[,] _matrizAprendizado = new int[4, 3];
private double _net;
Perceptron()
{
//tabela AND
_matrizAprendizado[0, 0] = 0;
_matrizAprendizado[0, 1] = 0;
_matrizAprendizado[0, 2] = 0;
_matrizAprendizado[1, 0] = 0;
_matrizAprendizado[1, 1] = 1;
_matrizAprendizado[1, 2] = 0;
_matrizAprendizado[2, 0] = 1;
_matrizAprendizado[2, 1] = 0;
_matrizAprendizado[2, 2] = 0;
_matrizAprendizado[3, 0] = 1;
_matrizAprendizado[3, 1] = 1;
_matrizAprendizado[3, 2] = 1;
w[0] = 0;
w[1] = 0;
w[2] = 0;
}
public static void Main(string[] args)
{
//pesos antes do treinamento
w.ToList().ForEach(x => Console.WriteLine(x + ","));
Console.WriteLine("\n");
//efetua-se o treinamento da rede
new Perceptron().Treinar();
Console.WriteLine("\n");
//pesos ajustados após treinamento
w.ToList().ForEach(x => Console.WriteLine(x + ","));
//dados de entrada para rede treinada, 0 e 0 resulta em 0 (tabela and) -1 corresponde ao BIAS
int[] amostra1 = { 0, 1, -1 }; // 0 e 1 -> 0 Classe B
int[] amostra2 = { 1, 0, -1 }; // 1 e 0 -> 0 Classe B
int[] amostra3 = { 0, 0, -1 }; // 0 e 0 -> 0 Classe B
int[] amostra4 = { 1, 1, -1 }; // 1 e 1 -> 1 Classe A
ClassificarAmostra(amostra1);
ClassificarAmostra(amostra2);
ClassificarAmostra(amostra3);
ClassificarAmostra(amostra4);
Console.ReadKey();
}
public static void ClassificarAmostra(int[] amostra)
{
//pesos encontrados após o treinamento
int[] pesos = { 2, 1, 3 };
//aplicação da separação dos dados linearmente após aprendizado
var u = amostra.Select((t, k) => pesos[k] * t).Sum();
var y = LimiarAtivacao(u);
Console.WriteLine(y > 0 ? "Amostra da classe A >= 0" : "HelloWorld < 0");
}
private static int LimiarAtivacao(double u)
{
return (u >= 0) ? 1 : 0;
}
int Executar(int x1, int x2)
{
_net = (x1 * w[0]) + (x2 * w[1]) + ((-1) * w[2]);
return (_net >= 0) ? 1 : 0;
}
public void Treinar()
{
var treinou = true;
for (var i = 0; i < _matrizAprendizado.GetLength(0); i++)
{
var saida = Executar(_matrizAprendizado[i, 0], _matrizAprendizado[i, 1]);
if (saida != _matrizAprendizado[i, 2])
{
CorrigirPeso(i, saida);
treinou = false;
}
}
if (!treinou)
Treinar();
}
void CorrigirPeso(int i, int saida)
{
w[0] = w[0] + (1 * (_matrizAprendizado[i, 2] - saida) * _matrizAprendizado[i, 0]);
w[1] = w[1] + (1 * (_matrizAprendizado[i, 2] - saida) * _matrizAprendizado[i, 1]);
w[2] = w[2] + (1 * (_matrizAprendizado[i, 2] - saida) * (-1));
}
}
}
Implementação em Ruby
[editar | editar código] #
# Classe PERCEPTRON responsável para aprendizado e resolução da tabela AND
#
class Perceptron
def initialize
# pesos sinápticos [0] entrada 1, [1] entrada 2, [3]BIAS
@w = []
# variável responsável pelo somatório(rede).
@net = 0
# variavél responsável pelo número máximo de épocas
@epocasMax = 30
# variável responsável pela contagem das épocas durante o treinamento
@count = 0
# declara o vetor da matriz de aprendizado
@matriz_aprendizado = []
self.inicia_matriz
end
def inicia_matriz
# Primeiro valor
@matriz_aprendizado[0] = []
@matriz_aprendizado[0][0] = 0; # entrada 1
@matriz_aprendizado[0][1] = 0; # entrada 2
@matriz_aprendizado[0][2] = 0; # valor esperado
# Segundo Valor
@matriz_aprendizado[1] = []
@matriz_aprendizado[1][0] = 0; # entrada 1
@matriz_aprendizado[1][1] = 1; # entrada 2
@matriz_aprendizado[1][2] = 0; # valor esperado
# terceiro valor
@matriz_aprendizado[2] = []
@matriz_aprendizado[2][0] = 1; # entrada 1
@matriz_aprendizado[2][1] = 0; # entrada 2
@matriz_aprendizado[2][2] = 0; # valor esperado
# quarto valor
@matriz_aprendizado[3] = []
@matriz_aprendizado[3][0] = 1; # entrada 1
@matriz_aprendizado[3][1] = 1; # entrada 2
@matriz_aprendizado[3][2] = 1; # valor esperado
# inicialização dos pesos sinápticos
# Peso sináptico para primeira entrada.
@w[0] = 0;
# Peso sináptico para segunda entrada.
@w[1] = 0;
# Peso sináptico para o BIAS
@w[2] = 0;
end
# Método responsávelpelo somatório e a função de ativação.
def executar(x1, x2)
# Somatório (NET)
@net = (x1 * @w[0]) + (x2 * @w[1]) + ((-1) * @w[2]);
# Função de Ativação
return 1 if (@net >= 0)
return 0;
end
# Método para treinamento da rede
def treinar()
# variavel utilizada responsável pelo controlede treinamento recebefalso
treinou = true;
# varável responsável para receber o valor da saída (y)
saida = nil;
# laço usado para fazer todas as entradas
@matriz_aprendizado.length.times do |i|
# A saída recebe o resultado da rede que no caso é 1 ou 0
saida = self.executar(@matriz_aprendizado[i][0], @matriz_aprendizado[i][1]);
if (saida != @matriz_aprendizado[i][2])
# Caso a saída seja diferente do valor esperado
# os pesos sinápticos serão corrigidos
self.corrigirPeso(i, saida);
# a variavél responsável pelo controlede treinamento recebe falso
treinou = false;
end
end
# acrescenta uma época
@count+=1;
# teste se houve algum erro duranteo treinamento e o número de epocas
#é menor qe o definido
if(not treinou and (@count < @epocasMax))
# chamada recursiva do método
self.treinar();
end
end # fim do método para treinamento
# Método para a correção de pesos
def corrigirPeso(i, saida)
@w[0] = @w[0] + (1 * (@matriz_aprendizado[i][2] - saida) * @matriz_aprendizado[i][0]);
@w[1] = @w[1] + (1 * (@matriz_aprendizado[i][2] - saida) * @matriz_aprendizado[i][1]);
@w[2] = @w[2] + (1 * (@matriz_aprendizado[i][2] - saida) * (-1));
end
end
Implementação em Java
[editar | editar código]
/*
* Classe PERCEPTRON responsável para aprendizado e resolução da tabela AND
*/
public class Perceptron {
// pesos sinápticos [0] entrada 1, [1] entrada 2, [3]BIAS
private double[] w = new double[3];
// variável responsável pelo somatório(rede).
private double NET = 0;
// variavél responsável pelo número máximo de épocas
private final int epocasMax = 30;
// variável responsável pela contagem das épocas durante o treinamento
private int count = 0;
// declara o vetor da matriz de aprendizado
private int[][] matrizAprendizado = new int[4][3];
// MÉTODO DE RETORNO DO CONTADOR
public int getCount(){
return this.count;
}
// metodo de inicialização inicia o vetor da matriz de aprendizado
Perceptron() {
// Primeiro valor
this.matrizAprendizado[0][0] = 0; // entrada 1
this.matrizAprendizado[0][1] = 0; // entrada 2
this.matrizAprendizado[0][2] = 0; // valor esperado
// Segundo Valor
this.matrizAprendizado[1][0] = 0; // entrada 1
this.matrizAprendizado[1][1] = 1; // entrada 2
this.matrizAprendizado[1][2] = 0; // valor esperado
// terceiro valor
this.matrizAprendizado[2][0] = 1; // entrada 1
this.matrizAprendizado[2][1] = 0; // entrada 2
this.matrizAprendizado[2][2] = 0; // valor esperado
// quarto valor
this.matrizAprendizado[3][0] = 1; // entrada 1
this.matrizAprendizado[3][1] = 1; // entrada 2
this.matrizAprendizado[3][2] = 1; // valor esperado
// inicialização dos pesos sinápticos
// Peso sináptico para primeira entrada.
w[0] = 0;
// Peso sináptico para segunda entrada.
w[1] = 0;
// Peso sináptico para o BIAS
w[2]= 0;
}
// Método responsávelpelo somatório e a função de ativação.
int executar(int x1, int x2) {
// Somatório (NET)
NET = (x1 * w[0]) + (x2 * w[1]) + ((-1) * w[2]);
// Função de Ativação
if (NET >= 0) {
return 1;
}
return 0;
}
// Método para treinamento da rede
public void treinar() {
// variavel utilizada responsável pelo controlede treinamento recebefalso
boolean treinou= true;
// varável responsável para receber o valor da saída (y)
int saida;
// laço usado para fazer todas as entradas
for (int i = 0; i < matrizAprendizado.length; i++) {
// A saída recebe o resultado da rede que no caso é 1 ou 0
saida = executar(matrizAprendizado[i][0], matrizAprendizado[i][1]);
if (saida != matrizAprendizado[i][2]) {
// Caso a saída seja diferente do valor esperado
// os pesos sinápticos serão corrigidos
corrigirPeso(i, saida);
// a variavél responsável pelo controlede treinamento recebe falso
treinou = false;
}
}
// acrescenta uma época
this.count++;
// teste se houve algum erro duranteo treinamento e o número de epocas
//é menor qe o definido
if((treinou == false) && (this.count < this.epocasMax)) {
// chamada recursiva do método
treinar();
}
} // fim do método para treinamento
// Método para a correção de pesos
void corrigirPeso(int i, int saida) {
w[0] = w[0] + (1 * (matrizAprendizado[i][2] - saida) * matrizAprendizado[i][0]);
w[1] = w[1] + (1 * (matrizAprendizado[i][2] - saida) * matrizAprendizado[i][1]);
w[2] = w[2] + (1 * (matrizAprendizado[i][2] - saida) * (-1));
}}
Ver também
[editar | editar código]Referências
[editar | editar código]- 1 2 Freund, Y.; Schapire, R. E. (1999). «Large margin classification using the perceptron algorithm» (PDF). Machine Learning. 37 (3): 277–296. doi:10.1023/A:1007662407062
. Cópia arquivada (PDF) em 19 de maio de 2026 - 1 2 Bishop, Christopher M. (2006). Pattern Recognition and Machine Learning. [S.l.]: Springer. ISBN 0-387-31073-8
- ↑ Hecht-Nielsen, Robert (1991). Neurocomputing Reprint. with corrections ed. Reading (Mass.) Menlo Park (Calif.) New York [etc.]: Addison-Wesley. p. 6, Figure 1.3 caption. ISBN 978-0-201-09355-1
- ↑ Block, H. D. (1 de janeiro de 1962). «The Perceptron: A Model for Brain Functioning. I»
. Reviews of Modern Physics (em inglês). 34 (1): 123–135. Bibcode:1962RvMP...34..123B. ISSN 0034-6861. doi:10.1103/RevModPhys.34.123 - ↑ McCulloch, W; Pitts, W (1943). «A Logical Calculus of Ideas Immanent in Nervous Activity»
. Bulletin of Mathematical Biophysics. 5 (4): 115–133. doi:10.1007/BF02478259. Cópia arquivada em 10 de dezembro de 2024 - 1 2 Rosenblatt, Frank (1957). «The Perceptron—a perceiving and recognizing automaton» (PDF). Cornell Aeronautical Laboratory. Report 85-460-1. Cópia arquivada (PDF) em 9 de junho de 2026
- ↑ Rosenblatt, Frank (Março 1960). «Perceptron Simulation Experiments». Proceedings of the IRE. 48 (3): 301–309. ISSN 0096-8390. doi:10.1109/JRPROC.1960.287598
- 1 2 Nilsson, Nils J. (2009). «4.2.1. Perceptrons». The Quest for Artificial Intelligence. Cambridge: Cambridge University Press. ISBN 978-0-521-11639-8. Cópia arquivada em 2 de junho de 2026
- 1 2 O’Connor, Jack (21 de junho de 2022). «Undercover Algorithm: A Secret Chapter in the Early History of Artificial Intelligence and Satellite Imagery»
. International Journal of Intelligence and CounterIntelligence (em inglês): 1–15. ISSN 0885-0607. doi:10.1080/08850607.2022.2073542. Cópia arquivada em 19 de abril de 2023 - ↑ Rosenblatt, F. (1958). «The perceptron: A probabilistic model for information storage and organization in the brain.»
. Psychological Review. 65 (6): 386–408. ISSN 1939-1471. PMID 13602029. doi:10.1037/h0042519 - ↑ Frank Rosenblatt, ‘Two Theorems of Statistical Separability in the Perceptron’, Symposium on the Mechanization of Thought, National Physical Laboratory, Teddington, UK, November 1958, vol. 1, H. M. Stationery Office, London, 1959.
- ↑ Rosenblatt, Frank, and CORNELL UNIV ITHACA NY. Cognitive Systems Research Program. Technical report, Cornell University, 72, 1971.
- ↑ Muerle, John Ludwig, and CORNELL AERONAUTICAL LAB INC BUFFALO NY. Project Para, Perceiving and Recognition Automata. Cornell Aeronautical Laboratory, Incorporated, 1963.
- ↑ Penn, Jonathan (11 de janeiro de 2021). Inventing Intelligence: On the History of Complex Information Processing and Artificial Intelligence in the United States in the Mid-Twentieth Century (Tese) (em inglês). [object Object]. doi:10.17863/cam.63087. Cópia arquivada em 6 de junho de 2023
- ↑ Guice, Jon (1998). «Controversy and the State: Lord ARPA and Intelligent Computing»
. Social Studies of Science. 28 (1): 103–138. ISSN 0306-3127. JSTOR 285752. PMID 11619937. doi:10.1177/030631298028001004. Cópia arquivada em 7 de junho de 2026 - 1 2 3 Hay, John Cameron (1960). Mark I perceptron operators' manual (Project PARA) / (PDF). Buffalo: Cornell Aeronautical Laboratory. Cópia arquivada (PDF) em 27 de outubro de 2023
- ↑ «Perceptron, Mark I». National Museum of American History (em inglês). Consultado em 30 de outubro de 2023. Cópia arquivada em 30 de outubro de 2023
- ↑ Anderson, James A.; Rosenfeld, Edward, eds. (2000). Talking Nets: An Oral History of Neural Networks (em inglês). [S.l.]: The MIT Press. ISBN 978-0-262-26715-1. doi:10.7551/mitpress/6626.003.0004. Cópia arquivada em 2 de junho de 2026
- ↑ Olazaran, Mikel (1996). «A Sociological Study of the Official History of the Perceptrons Controversy». Social Studies of Science. 26 (3): 611–659. JSTOR 285702. doi:10.1177/030631296026003005
- ↑ «Perception Concepts to Photo-Interpretation». www.cia.gov. Consultado em 14 de novembro de 2024
- ↑ Irwin, Julia A. (11 de setembro de 2024). «Artificial Worlds and Perceptronic Objects: The CIA's Mid-century Automatic Target Recognition»
. Grey Room (em inglês) (97): 6–35. ISSN 1526-3819. doi:10.1162/grey_a_00415. Cópia arquivada em 2 de junho de 2026 - ↑ Principles of neurodynamics: Perceptrons and the theory of brain mechanisms, by Frank Rosenblatt, Report Number VG-1196-G-8, Cornell Aeronautical Laboratory, published on 15 March 1961. The work reported in this volume has been carried out under Contract Nonr-2381 (00) (Project PARA) at C.A.L. and Contract Nonr-401(40), at Cornell Univensity.
- 1 2 Sejnowski, Terrence J. (2018). The Deep Learning Revolution (em inglês). [S.l.]: MIT Press. p. 47. ISBN 978-0-262-03803-4. Cópia arquivada em 19 de julho de 2025
- ↑ Rosenblatt, Frank (1962). “A Description of the Tobermory Perceptron.” Cognitive Research Program. Report No. 4. Collected Technical Papers, Vol. 2. Edited by Frank Rosenblatt. Ithaca, NY: Cornell University.
- 1 2 Nagy, George. 1963. System and circuit designs for the Tobermory perceptron. Technical report number 5, Cognitive Systems Research Program, Cornell University, Ithaca New York.
- ↑ Nagy, George. "Neural networks-then and now." IEEE Transactions on Neural Networks 2.2 (1991): 316-318.
- ↑ Barker, Trevor H. (14 de julho de 1966). A Computer Program for Simulation of Perceptrons and Similar Neural Networks: Users' Manual (Technical Report). NONR 401 (40) and NSF GK-250. Ithaca, NY: Cornell University (publicado em 1966). Cópia arquivada em 21 de agosto de 2025
- ↑ Nagy, George (Março 1991). «Neural networks—then and now» (PDF). IEEE Transactions on Neural Networks. 2 (2): 316–318. ISSN 1941-0093. PMID 18276386. doi:10.1109/72.80343. Cópia arquivada (PDF) em 2 de junho de 2026
- ↑ Aizerman, M. A.; Braverman, E. M.; Rozonoer, L. I. (1964). «Theoretical foundations of the potential function method in pattern recognition learning». Automation and Remote Control. 25: 821–837
- ↑ Mohri, Mehryar; Rostamizadeh, Afshin (2013). «Perceptron Mistake Bounds». arXiv:1305.0208
[cs.LG] - ↑ Foundations of Machine Learning, MIT Press (Chapter 8).
- ↑ Cash, Sydney; Yuste, Rafael (1999). «Linear Summation of Excitatory Inputs by CA1 Pyramidal Neurons». Neuron. 22 (2): 383–394. PMID 10069343. doi:10.1016/S0896-6273(00)81098-3

- ↑ Liou, D.-R.; Liou, J.-W.; Liou, C.-Y. (2013). Learning Behaviors of Perceptron. [S.l.]: iConcept Press. ISBN 978-1-477554-73-9
- 1 2 MacKay, David (25 de setembro de 2003). Information Theory, Inference and Learning Algorithms. [S.l.]: Cambridge University Press. p. 483. ISBN 9780521642989. Cópia arquivada em 1 de novembro de 2023
- ↑ Cover, Thomas M. (Junho 1965). «Geometrical and Statistical Properties of Systems of Linear Inequalities with Applications in Pattern Recognition». IEEE Transactions on Electronic Computers. EC-14 (3): 326–334. ISSN 0367-7508. doi:10.1109/PGEC.1965.264137
- 1 2 Šíma, Jiří; Orponen, Pekka (1 de dezembro de 2003). «General-Purpose Computation with Neural Networks: A Survey of Complexity Theoretic Results»
. Neural Computation (em inglês). 15 (12): 2727–2778. ISSN 0899-7667. PMID 14629867. doi:10.1162/089976603322518731. Cópia arquivada em 31 de outubro de 2023 - ↑ «Introduction to Machine Learning, Chapter 3: Perceptron». openlearninglibrary.mit.edu (em inglês). Consultado em 27 de outubro de 2023. Cópia arquivada em 4 de maio de 2026
- ↑ Novikoff, Albert J. (1963). «On convergence proofs for perceptrons». Office of Naval Research
- ↑ Bishop, Christopher M (17 de agosto de 2006). «Chapter 4. Linear Models for Classification». Pattern Recognition and Machine Learning. [S.l.]: Springer Science+Business Media, LLC. 194 páginas. ISBN 978-0387-31073-2
- 1 2 Krauth, W.; Mezard, M. (1987). «Learning algorithms with optimal stability in neural networks». Journal of Physics A: Mathematical and General. 20 (11): L745–L752. Bibcode:1987JPhA...20L.745K. doi:10.1088/0305-4470/20/11/013
- ↑ Block, H. D.; Levin, S. A. (1970). «On the boundedness of an iterative procedure for solving a system of linear inequalities». Proceedings of the American Mathematical Society (em inglês). 26 (2): 229–235. ISSN 0002-9939. doi:10.1090/S0002-9939-1970-0265383-5

- ↑ Efron, Bradley. "The perceptron correction procedure in nonseparable situations." Rome Air Dev. Center Tech. Doc. Rept (1964).
- 1 2 Simon, Herbert A.; Laird, John E. (13 de agosto de 2019). «Limits on Speed of Concept Attainment». The Sciences of the Artificial, reissue of the third edition with a new introduction by John Laird (em inglês) Reissue ed. Cambridge, Massachusetts London, England: The MIT Press. ISBN 978-0-262-53753-7
- ↑ Wendemuth, A. (1995). «Learning the Unlearnable». Journal of Physics A: Mathematical and General. 28 (18): 5423–5436. Bibcode:1995JPhA...28.5423W. doi:10.1088/0305-4470/28/18/030
- ↑ Wendemuth, A. (1995). «Performance of robust training algorithms for neural networks». Journal of Physics A: Mathematical and General. 28 (19): 5485–5493. Bibcode:1995JPhA...28.5485W. doi:10.1088/0305-4470/28/19/006
- ↑ Anlauf, J. K.; Biehl, M. (1989). «The AdaTron: an Adaptive Perceptron algorithm». Europhysics Letters. 10 (7): 687–692. Bibcode:1989EL.....10..687A. doi:10.1209/0295-5075/10/7/014
- ↑ McDonald, R.; Hall, K.; Mann, G. (2010). «Distributed Training Strategies for the Structured Perceptron». Human Language Technologies: The 2010 Annual Conference of the North American Chapter of the ACL. [S.l.]: Association for Computational Linguistics. pp. 456–464
Leitura adicional
[editar | editar código]- Aizerman, M. A. and Braverman, E. M. and Lev I. Rozonoer. Theoretical foundations of the potential function method in pattern recognition learning. Automation and Remote Control, 25:821–837, 1964.
- Rosenblatt, Frank (1958), The Perceptron: A Probabilistic Model for Information Storage and Organization in the Brain, Cornell Aeronautical Laboratory, Psychological Review, v65, No. 6, pp. 386–408. doi:10.1037/h0042519.
- Rosenblatt, Frank (1962), Principles of Neurodynamics. Washington, DC: Spartan Books.
- Minsky, M. L. and Papert, S. A. 1969. Perceptrons. Cambridge, MA: MIT Press.
- Gallant, S. I. (1990). Perceptron-based learning algorithms. IEEE Transactions on Neural Networks, vol. 1, no. 2, pp. 179–191.
- Olazaran Rodriguez, Jose Miguel. A historical sociology of neural network research. PhD Dissertation. University of Edinburgh, 1991.
- Mohri, Mehryar and Rostamizadeh, Afshin (2013). Perceptron Mistake Bounds arXiv:1305.0208, 2013.
- Novikoff, A. B. (1962). On convergence proofs on perceptrons. Symposium on the Mathematical Theory of Automata, 12, 615–622. Polytechnic Institute of Brooklyn.
- Widrow, B., Lehr, M.A., "30 years of Adaptive Neural Networks: Perceptron, Madaline, and Backpropagation," Proc. IEEE, vol 78, no 9, pp. 1415–1442, (1990).
- Collins, M. 2002. Discriminative training methods for hidden Markov models: Theory and experiments with the perceptron algorithm in Proceedings of the Conference on Empirical Methods in Natural Language Processing (EMNLP '02).
- Yin, Hongfeng (1996), Perceptron-Based Algorithms and Analysis, Spectrum Library, Concordia University, Canada
Ligações externas
[editar | editar código]- Um Perceptron implementado em MATLAB para aprender a função NAND binária Arquivado em 2012-11-06 no Wayback Machine
- Capítulo 3 Redes ponderadas - o perceptron e capítulo 4 Aprendizado do perceptron de Neural Networks - A Systematic Introduction de Raúl Rojas (ISBN 978-3-540-60505-8)
- História dos perceptrons
- Matemática dos perceptrons multicamadas
- Aplicando um modelo perceptron usando scikit-learn - https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Perceptron.html
