Prévia do material em texto
A derivada g′ da função logística satisfaz g′(z) = g(z) (1 – g (z)), então temos assim, a atualização de peso para minimizar a perda é Repetindo os experimentos da Figura 18.16 com regressão logística em vez de classificador de limiar linear, obtemos os resultados mostrados na Figura 18.18. Em (a), como o caso é separável linearmente, a regressão logística é um pouco mais lenta para convergir, mas tem um comportamento muito mais previsível. Em (b) e (c), onde os dados são ruidosos e não separáveis, a regressão logística converge muito mais rápido e confiavelmente. Essas vantagens tendem a se manter em aplicações do mundo real, e a regressão logística tornou-se uma das técnicas de classificação mais populares para problemas de medicina, marketing e análise de dados, pontuação de crédito, saúde pública e outras aplicações. Figura 18.18 Repetição dos experimentos na Figura 18.16 por regressão logística e erro quadrático. A representação gráfica em (a) abrange 5.000 iterações em vez de 1.000, enquanto (b) e (c) utilizam a mesma escala. 18.7 REDES NEURAIS ARTIFICIAIS Passaremos agora ao que parece ser um tema um tanto independente: o cérebro. Na verdade, como veremos, as ideias técnicas que discutimos até agora neste capítulo serão úteis na construção de modelos matemáticos da atividade do cérebro e, de forma inversa, pensar sobre o cérebro tem ajudado a estender o âmbito das ideias técnicas. O Capítulo 1 passou brevemente pelos resultados básicos da neurociência — em particular, a hipótese de que a atividade mental consiste basicamente na atividade eletroquímica em redes de células cerebrais chamadas neurônios (a Figura 1.2 mostrou um diagrama esquemático de um neurônio típico). Inspirado por essa hipótese, alguns dos trabalhos mais antigos de IA tiveram o objetivo de criar redes neurais artificiais (outros nomes do campo incluem conexionismo, processamento distribuído em paralelo e computação neural). A Figura 18.19 apresenta um modelo matemático simples do neurônio desenvolvido por McCulloch e Pitts (1943). Grosseiramente falando, ele “dispara” quando uma combinação linear de suas entradas excede algum limiar (rígido ou suave), ou seja, ele implementa um classificador linear do tipo descrito na seção anterior. Uma rede neural é apenas uma coleção de unidades conectadas; as propriedades da rede são determinadas pela sua topologia e pelas propriedades dos “neurônios”. Figura 18.19 Modelo matemático simples de um neurônio. A ativação de saída da unidade é , onde ai é a ativação de saída da unidade i e wi,j é o peso sobre a ligação da unidade i com essa unidade. Desde 1943, têm sido desenvolvidos modelos muito mais detalhados e realistas, tanto de neurônios como de sistemas maiores no cérebro, levando ao campo moderno da neurociência computacional. Por outro lado, os pesquisadores de IA e os estatísticos tornaram-se interessados nas propriedades mais abstratas das redes neurais, tais como sua capacidade de realizar computação distribuída, de tolerar entradas ruidosas e aprender. Embora entendamos agora que outros tipos de sistemas — incluindo redes bayesianas — têm essas propriedades, as redes neurais permanecem uma das formas mais populares e eficazes de aprendizagem do sistema e são dignos de estudo. 18.7.1 Estrutura das redes neurais As redes neurais são compostas por nós ou unidades (ver Figura 18.19) conectadas por ligações direcionadas. Uma ligação da unidade i para a unidade j serve para propagar a ativação ai de i para j.8 Cada ligação também tem um peso numérico wi,j associado a ele, que determina a força e o sinal de conexão. Assim como em modelos de regressão linear, cada unidade tem uma entrada fictícia a0 = 1 com peso associado w0,j. Cada unidade j primeiro calcula uma soma ponderada de suas entradas: Em seguida, aplica uma função de ativação g a essa soma para obter a saída: A ativação da função g tipicamente é tanto um limiar rígido (Figura 18.17(a)), caso em que a unidade é chamada de perceptron, como uma função logística (Figura 18.17 (b)), caso em que por vezes é utilizado o termo perceptron sigmoide. Ambas as funções de ativação não linear garantem a propriedade importante de que toda a rede de unidades pode representar uma função não linear (veja o Exercício 18.22). Como mencionado na discussão de regressão logística, a função de ativação logística tem a vantagem adicional de ser diferenciável. Tendo decidido sobre o modelo matemático para “neurônios” individuais, a próxima tarefa é conectá-los para formar uma rede. Existem duas formas fundamentalmente distintas para fazer isso. Uma rede com alimentação para a frente tem conexões somente em uma direção, isto é, forma um grafo acíclico dirigido. Cada nó recebe a entrada de nós “para cima” e libera a saída de nós “para baixo”; não há laços. Uma rede com alimentação para a frente representa uma função de sua entrada atual; portanto, não tem estado interno que não seja os próprios pesos. A rede recorrente, por outro lado, alimenta suas saídas de volta às suas próprias entradas. Isso significa que os níveis de ativação da rede formam um sistema dinâmico que pode atingir um estado estável ou apresentar oscilações ou até mesmo um comportamento caótico. Além disso, a resposta da rede para determinada entrada depende do seu estado inicial, que pode depender de entradas anteriores. Portanto, as redes recorrentes (ao contrário das redes com alimentação para a frente) podem suportar memória de curto prazo. Isso as torna mais interessantes como modelos de cérebro, mas também mais difícil de entender. Esta seção vai se concentrar em redes com alimentação para a frente; algumas dicas para mais informação sobre redes recorrentes são dadas ao final do capítulo. As redes com alimentação para a frente normalmente estão dispostas em camadas, de tal forma que cada unidade recebe a entrada somente a partir de unidades na camada imediatamente anterior. Nas duas próximas subseções, analisaremos as redes de camada única, em que cada unidade se conecta diretamente a partir de entradas da rede para suas saídas, e as redes de camadas múltiplas, que têm uma ou mais camadas de unidades ocultas que não são conectadas às saídas da rede. Até agora, neste capítulo, consideramos apenas problemas de aprendizagem com uma variável única de saída y, mas as redes neurais são frequentemente usadas em casos em que são adequadas saídas múltiplas. Por exemplo, se quisermos formar uma rede para adicionar dois bits de entrada, cada 0 ou 1, precisaremos de uma saída para o bit de soma e uma para o bit de vai-um. Além disso, quando o problema de aprendizagem envolve classificação em mais que duas classes — por exemplo, quando aprendemos a categorizar imagens de dígitos manuscritos —, é comum o uso de uma unidade de saída para cada classe. 18.7.2 Redes neurais de camada única com alimentação para a frente (perceptrons) Uma rede com todas as entradas conectadas diretamente com as saídas é chamada de rede neural de camada única ou rede perceptron. A Figura 18.20 mostra uma rede perceptron simples de duas entradas e duas saídas. Com uma rede desse tipo, podemos ter a esperança de aprender a função adicionador de dois bits, por exemplo. Aqui estão todos os dados de treinamento de que precisaremos: x1 x2 y3 (transporte) y4 (soma) 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 A primeira coisa a notar é que uma rede perceptron com m saídas é realmente m redes separadas, pois cada peso afeta apenas uma das saídas. Assim, haverá m processos de treinamento separados. Além disso, dependendo do tipo de função de ativação utilizada, o processo de treinamento será tanto a regra de aprendizagem perceptron (Equação 18.7) como a regra de descida pelo gradiente por regressão logística (Equação 18.8). Figura 18.20 (a) Rede perceptron com duas unidades de entrada e duas unidades de saída. (b) Rede neural com duas entradas, uma camada oculta de duas unidades e uma unidade de saída. As entradas fictícias e seus pesos associados não são mostrados. Se você tentar qualquer método nos dadossomadores de dois bits, algo interessante acontecerá. A unidade 3 aprende a função vai-um com facilidade, mas a unidade 4 falha completamente em aprender a função soma. Não, a unidade 4 não está com defeito! O problema é com a função de soma em si. Vimos na Seção 18.6 que classificadores lineares (rígidos ou suaves) podem representar limiares de decisão linear no espaço de entrada. Isso funciona bem para a função vai-um, que é uma lógica E (ver Figura 18.21(a)). A função soma, porém, é um XOR (OU exclusivo) das duas entradas. Como a Figura 18.21(c) ilustra, essa função não é linearmente separável de modo que o perceptron não pode aprendê-la. Figura 18.21 Separabilidade linear em limiar de perceptrons. Os pontos pretos indicam um ponto no espaço de entrada onde o valor da função é 1, e pontos brancos indicam um ponto onde o valor é 0. O perceptron retorna 1 na região do lado não sombreado da linha. Em (c), não existe essa linha que classifica corretamente as entradas. As funções linearmente separáveis constituem apenas uma pequena fração de todas as funções booleanas; o Exercício 18.20 pede para quantificar essa fração. A incapacidade dos perceptrons de aprender mesmo tais funções simples como XOR foi um revés significativo para a comunidade nascente de redes neurais na década de 1960. No entanto, os perceptrons estão longe de ser inúteis. A Seção 18.6.4 observou que a regressão logística (ou seja, o treinamento de um perceptron sigmoide) ainda é hoje muito popular e uma ferramenta eficaz. Além disso, um perceptron pode representar uma função booleana bastante “complexa” de forma compacta. Por exemplo, a função da maioria, que gera um 1 apenas se mais da metade de suas entradas n forem 1, pode ser representada por um perceptron com cada wi = 1 e com w0 = −n/2. Uma árvore de decisão precisaria exponencialmente de muitos mais nós para representar essa função. A Figura 18.22 mostra a curva de aprendizagem para um perceptron em dois problemas diferentes. À esquerda, mostramos a curva de aprendizagem da função maioria com 11 entradas booleanas (ou seja, a função de saída 1, se seis ou mais entradas forem 1). Como seria de esperar, o perceptron aprende a função de forma rápida porque a função da maioria é linearmente separável. Por outro lado, o aprendiz de árvore de decisão não faz nenhum progresso porque a função da maioria é muito difícil (embora não seja impossível) para ser representada como árvore de decisão. À direita, temos o exemplo do restaurante. A solução do problema é facilmente representada como uma árvore de decisão, mas não é linearmente separável. O melhor plano utilizando dados classifica corretamente apenas 65%. Figura 18.22 Comparação do desempenho dos perceptrons e das árvores de decisão. (a) Os perceptrons são melhores em aprender a função de maioria de 11 entradas. (b) As árvores de decisão são melhores em aprender o predicado VamosEsperar no exemplo do restaurante. 18.7.3 Redes neurais com alimentação para a frente multicamada McCulloch e Pitts (1943) sabiam que uma única unidade de limiar não resolveria todos os seus problemas. De fato, suas teses provam que tal unidade pode representar funções booleanas básicas E, OU e NÃO, e depois continuam a argumentar que qualquer funcionalidade desejada pode ser obtida ligando grande número de unidades em redes de profundidade arbitrária (possivelmente recorrentes). O problema era que ninguém sabia como treinar tais redes. Isso acaba por ser um problema fácil se pensarmos em uma rede da maneira certa: como uma função hw(x) parametrizada pelos pesos w. Considere a rede simples mostrada na Figura 18.20 (b), que tem duas unidades de entrada, duas unidades ocultas e duas unidades de saída (além disso, cada unidade tem uma entrada fictícia fixada em 1). Dado um vetor de entrada x = (x1, x2), as ativações das unidades de entrada são definidas como (a1, a2) = (x1, x2). A saída da unidade 5 é dada por Assim, temos a saída expressa como uma função das entradas e dos pesos. Uma expressão similar vale para a unidade 6. Enquanto podemos calcular as derivadas de tais expressões com relação aos pesos, podemos usar o método de minimização de perda da descida pelo gradiente para treinar a rede. A Seção 18.7.4 mostra exatamente como fazer isso. E, como a função representada por uma rede pode ser altamente não linear — composta por funções de limiar suave não lineares aninhadas — pode-se ver as redes neurais como ferramenta para fazer regressão não linear. Antes de nos aprofundar em regras de aprendizagem, vamos observar como as redes geram funções complicadas. Primeiro, lembre-se de que cada unidade em uma rede sigmoide representa um limiar suave em seu espaço de entrada, como mostrado na Figura 18.17(c). Com uma camada oculta e uma camada de saída, como na Figura 18.20(b), cada unidade de saída calcula uma combinação linear de limiar suave dessas várias funções. Por exemplo, pela adição de duas funções de limiar suave opostas e limitando o resultado, podemos obter uma função “cume” como mostrado na Figura 18.23(a). A combinação das duas cristas em ângulos corretos entre si (ou seja, combinando as saídas de quatro unidades ocultas), obtém um “sobressalto”, como mostrado na Figura 18.23(b). Figura 18.23 (a) Resultado da combinação de duas funções de limiar suave opostas para produzir um cume. (b) Rresultado da combinação de duas cristas para produzir um sobressalto. Com mais unidades ocultas, podemos produzir outros sobressaltos de tamanhos diferentes em outros lugares. Na verdade, com uma camada oculta única, suficientemente grande, é possível representar qualquer função contínua de entrada com precisão arbitrária; com duas camadas, podem ser representadas até mesmo funções descontínuas.9 Infelizmente, para qualquer estrutura de rede particular, é mais difícil caracterizar exatamente as funções que podem ser representadas e as que não podem. 18.7.4 Aprendizagem em redes multicamadas Primeiro, vamos tratar de uma complicação menor decorrente de redes multicamadas: interações entre os problemas de aprendizagem quando a rede tem várias saídas. Nesses casos, devemos pensar na rede como uma função vetorial hw de implementação, em vez de uma função escalar hw; por exemplo, a rede na Figura 18.20(b) retorna um vetor [a5, a6]. Da mesma forma, a saída de destino será um vetor y. Considerando que uma rede perceptron se decompõe em m problemas de aprendizagem em separado para um problema de m saídas, essa decomposição falha em uma rede de múltiplas camadas. Por exemplo, tanto a5 como a6 na Figura 18.20(b) dependem de todos os pesos da camada de entrada, de modo que as atualizações desses pesos dependerão de erros tanto em a5 como em a6. Felizmente, essa dependência é muito simples, no caso de qualquer função de perda que seja aditiva entre os componentes do vetor de erro y − hw(x). Pela perda L2, temos, para qualquer peso w, onde o índice k varia no intervalo dos nós na camada de saída. Cada termo, no somatório final, é apenas o gradiente de perda para a k-ésima saída, calculado como se outras saídas não existissem. Assim, podemos decompor um problema de aprendizagem com m-saídas em m problemas de aprendizagem, desde que não esqueçamos de somar as contribuições do gradiente de cada um deles ao atualizar os pesos. A principal complicação vem da adição de camadas ocultas da rede. Enquanto que o erro y − hw na camada de saída é claro, o erro nas camadas ocultas parece misterioso porque os dados de treinamento não dizem que valor os nós ocultos devem ter. Felizmente, verifica-se que podemos retropropagar o erro da camada de saída para as camadas ocultas. O processo de retropropagação emerge diretamente de uma derivação do gradiente de erro geral. Primeiro, descreveremos o processo com uma justificação intuitiva; depois, mostraremos a derivação. Na camada de saída, a regra de atualização do peso é idêntica à Equação 18.8. Temos unidades de saída múltiplas; assim, façamos Errk o componente do erro k-ésimo do vetor de erro y − hw. Também é convenientedefinir um erro modificado , para que a regra de atualização de peso torne-se Para atualizar as conexões entre as unidades de entrada e as unidades ocultas, precisamos definir uma quantidade análoga ao termo de erro dos nós de saída. Aqui fazemos a retropropagação do erro. A ideia é que o nó oculto j seja “responsável” por uma fração do erro ∆k em cada um dos nós de saída aos quais ele se conecta. Assim, os valores ∆k são divididos de acordo com a força de ligação entre o nó oculto e o nó de saída e são retropropagados para fornecer os valores ∆j para a camada oculta. A regra para a propagação dos valores ∆ é a seguinte: Agora a regra de atualização de peso para os pesos entre as entradas e a camada oculta é essencialmente idêntica à regra de atualização para a camada de saída: O processo de retropropagação pode ser resumido da seguinte forma: • Calcule valores ∆ para as unidades de saída usando o erro observado. • A partir da camada de saída, repita o seguinte para cada camada da rede até que a primeira camada oculta seja alcançada: – Propague os valores ∆ de volta à camada anterior. – Atualize os pesos entre as duas camadas. O algoritmo detalhado é mostrado na Figura 18.24. Figura 18.24 Algoritmo de retropropagação para o aprendizagem em redes multicamadas. Para quem gosta de matemática, vamos agora derivar as equações de retropropagação dos primeiros princípios. A derivação é bastante semelhante ao cálculo de gradiente de regressão logística (que conduziu à Equação 18.8), exceto que temos de usar a regra de cadeia mais de uma vez. A partir da Equação 18.10, calculamos apenas o gradiente de Perdak = (yk − ak)2 na k-ésima saída. O gradiente dessa perda com relação aos pesos de conexão com a camada oculta até a camada de saída será zero, exceto para os pesos wj,k que se unem à k-ésima unidade de saída. Para aqueles pesos, temos com ∆k definido como antes. Para obter o gradiente com relação aos pesos wi,j em conexão com a camada de entrada até aj camada oculta temos que expandir as ativações aj e reaplicar a regra da cadeia. Vamos mostrar a derivação em pormenores porque é interessante ver como o operador de derivada retropropaga através da rede: onde ∆j foi definido como antes. Assim, obtemos as regras de atualização obtidas anteriormente a partir de considerações intuitivas. Também fica claro que o processo pode ser continuado para redes com mais de uma camada oculta, o que justifica o algoritmo geral dado na Figura 18.24. Passando por toda essa matemática, vamos ver o desempenho de uma rede de camada oculta única no problema do restaurante. Primeiro, precisamos determinar a estrutura da rede. Temos 10 atributos que descrevem cada exemplo, então precisaremos de 10 unidades de entrada. Deveríamos ter uma camada oculta ou duas? Quantos nós em cada camada? Devem estar totalmente conectados? Não há nenhuma boa teoria que nos forneça a resposta (veja a próxima seção). Como sempre, podemos usar a validação cruzada: tentar várias estruturas diferentes e ver qual funciona melhor. Acontece que uma rede com uma camada oculta contendo quatro nós parece razoável para esse problema. Na Figura 18.25, apresentamos duas curvas. A primeira é uma curva de treinamento mostrando o erro quadrático médio, dado um conjunto de treinamento de 100 exemplos de restaurante durante o processo de atualização de peso. Isso demonstra que a rede, de fato, converge para um ajuste perfeito aos dados de treinamento. A segunda curva é a curva de aprendizagem padrão para os dados do restaurante. A rede neural aprende bem, embora não tão rápido quanto a aprendizagem em árvore de decisão, o que não é surpreendente, em primeiro lugar porque os dados foram gerados a partir de uma árvore de decisão simples. Figura 18.25 (a) A curva de treinamento mostra a redução gradual do erro à medida que os pesos são modificados ao longo de diversas épocas, para um conjunto de exemplos determinados do domínio do restaurante. (b) Curvas de aprendizagem comparativas mostrando que a aprendizagem em árvore de decisão é um pouco melhor para o problema do restaurante do que a retropropagação em uma rede de múltiplas camadas. Certamente as redes neurais são capazes de tarefas muito mais complexas de aprendizagem, embora deva ser dito que é necessário certa quantidade de esforço para obter a estrutura da rede correta e alcançar a convergência para algo próximo ao ótimo global no espaço de peso. Há literalmente dezenas de milhares de aplicações publicadas de redes neurais. A Seção 18.11.1 apresentará um aplicativo, com mais profundidade. 18.7.5 Aprendendo as estruturas de redes neurais Até agora, consideramos o problema de pesos de aprendizagem, dada uma estrutura de rede fixa; assim como com redes bayesianas, também precisamos entender como encontrar a melhor estrutura de rede. Se escolhermos uma rede muito grande, ela será capaz de memorizar todos os exemplos, formando uma tabela grande de pesquisa, mas não generalizará bem necessariamente as entradas que nunca foram vistas antes.10 Em outras palavras, como todos os modelos estatísticos, as redes neurais estão sujeitas a superadaptações quando existem muitos parâmetros no modelo. Vimos isso na Figura 18.1, onde os modelos de muitos parâmetros em (b) e (c) ajustam todos os dados, mas podem não generalizar, assim como os modelos de poucos parâmetros em (a) e (d). Se nos ativermos a redes totalmente conectadas, as únicas escolhas a serem feitas dizem respeito ao número de camadas ocultas e seus tamanhos. A abordagem usual é tentar várias mantendo as melhores. Será necessária a técnica de validação cruzada se quisermos evitar espreitar o conjunto de teste. Ou seja, escolhemos a arquitetura de rede que oferece a maior previsão de precisão nos conjuntos de validação. Se quisermos considerar redes que não estejam totalmente conectadas, precisamos encontrar algum método de busca eficaz através do espaço muito grande de topologias possíveis de conexão. O algoritmo de dano cerebral ótimo começa com uma rede totalmente conectada e remove as conexões dela. Depois que a rede é instruída pela primeira vez, uma abordagem teórica de informação identifica uma seleção ideal de conexões que podem ser descartadas. A rede é, então, reciclada, e se seu desempenho não diminuir, o processo será repetido. Além de remover as conexões, também é possível remover as unidades que não estão contribuindo muito para o resultado. Vários algoritmos têm sido propostos para produzir uma rede maior de uma menor. Um deles, o algoritmo de ladrilhamento, assemelha-se à aprendizagem com lista de decisão. A ideia é iniciar com uma unidade única que faz o melhor para produzir a saída correta para tantos exemplos de treinamento quanto possível. As unidades subsequentes são adicionadas para cuidar dos exemplos que a primeira unidade obteve errado. O algoritmo adiciona apenas tantas unidades quantas forem necessárias para abranger todos os exemplos. 18.8 MODELOS NÃO PARAMÉTRICOS A regressão linear e as redes neurais utilizam dados de treinamento para estimar um conjunto fixo de parâmetros w. Isso define a nossa hipótese hw(x), e nesse ponto podemos jogar fora os dados de treinamento porque todos eles estão resumidos por w. Um modelo de aprendizagem que resume os dados com um conjunto de parâmetros de tamanho fixo (independentemente do número de exemplos de treinamento) é chamado de modelo paramétrico. Não importa a quantidade de dados que você jogue em um modelo paramétrico, não muda a ideia sobre quantos parâmetros são necessários. Quando os conjuntos de dados são pequenos, faz sentido ter uma restrição forte nas hipóteses permitidas, para evitar a superadaptação. Mas, quando há milhares ou milhões ou bilhões de exemplos para aprender, parece que uma ideia melhor é permitir que os dados falem por si em vez de forçá-los a falar através de um vetor de parâmetros minúsculos. Se os dados informam que a resposta correta é uma função muito sinuosa, não devemos nos restringir às funções lineares ou às ligeiramente sinuosas.Um modelo paramétrico é aquele que não pode ser caracterizado por um conjunto limitado de parâmetros. Por exemplo, suponha que cada hipótese que geramos simplesmente mantenha dentro de si todos os exemplos de treinamento e os use para prever o próximo exemplo. Tal grupo de hipótese será não paramétrico, pois o número efetivo de parâmetros é ilimitado — cresce com o número de exemplos. Essa abordagem é chamada de aprendizagem baseada em exemplos ou aprendizagem baseada em memória. O método mais simples de aprendizagem baseada em exemplo é a pesquisa em tabelas: tome todos os exemplos de treinamento, coloque-os em uma tabela e, depois, quando h(x) for solicitado, veja se x está na tabela; se estiver, devolva o y correspondente. O problema com esse método é que ele não generaliza bem: quando x não está na tabela, tudo o que faz é retornar