Cérebro e Redes Neurais Artificiais
UFPE
O cérebro é o mais requintado dos instrumentos, capaz de refletir as complexidades e os emaranhamentos do mundo ao nosso redor.
Centro da inteligência, memória, consciência e linguagem, o cérebro controla, em colaboração com outras partes do encéfalo, as sensações e os órgãos efetores, ele é o ponto mais alto da evolução, o único órgão consciente da sua existência.
O córtex cerebral é a fina camada de substância cinzenta que reveste o centro branco medular de todo encéfalo e possui uma espessura que varia de 1 a 4 mm.
Trata-se de uma das partes mais importantes do sistema nervoso e a maior parte é composta por células nervosas (neurônios) que recebem impulsos dos pontos mais distantes do corpo e os retransmitem ao destino certo.
No córtex cerebral chegam impulsos provenientes de todas as vias da sensibilidade que aí se tornam conscientes e são interpretadas.
Do córtex saem os impulsos nervosos que iniciam e comandam os movimentos voluntários e involutários. Com ele estão relacionados os fenômenos psíquicos como a memória, a inteligência, a linguagem e a consciência.
Sabendo que o Córtex Cerebral é formado em sua maior parte por Neurônios, vamos entender um pouco mais sobre eles!
O neurônio é a unidade fundamental do cérebro e tem como função básica receber, processar e enviar informações. Ou seja, transmitir os impulsos nervosos
O número de neurônios é fixo e não se multiplicam.
Durante o desenvolvimento intra-uterino, o cérebro humano produzirá todas as células nervosas que o acompanharão durante a vida.
Estima-se que o cérebro humano possui aproximadamente 86 bilhões de neurônios.
Cada neurônio pode ter de 1.000 até 10.000 conexões sinápticas.
Em geral os neurônios constituem-se dos mesmos compontes básicos:
Corpo celular: contém o núcleo e a maioria dos organelos celulares.
Dendritos: prolongamentos que recebem sinais de outros neurônios e levam o impulso nervoso até o corpo celular, sendo, na maioria das vezes, responsáveis pela comunicação entre os neurônios através das sinapses.
Axônio: prolongamento que transmite sinais para outros neurônios. É responsável pela condução do impulso nervoso para o próximo neurônio
Bainha de Mielina: protege o axônio e acelera a transmissão de sinais.
A região de contato entre o fim do axônio de um neurônio e os dendritos de outro neurônio é chamado de Sinapse;
A sinapse é composta por:
Botão sináptico: extremidade do axônio que libera neurotransmissores;
Fenda sináptica: espaço entre o botão sináptico e os dendritos;
Receptor: proteína localizada na membrana do dendrito que recebe os neurotransmissores.
O axônio leva os impulsos para fora do corpo celular, as extremidades de cada axônio chegam até bem próximo dos dendritos do próximo neurônio, mas não chega a tocá-lo, ou seja, os neurônios não tem uma ligação física entre eles, mas os mediadores químicos são passados de um neurônio a outro.
Redes Neurais Artificiais são estruturas computacionais inspiradas no sistema nervoso de seres vivos, mais especificamente neurônios. Porém aqui devem ser guardadas as proporções: enquanto as redes neurais biológicas estão entre as estruturas mais complexas já conhecidas e seu funcionamento ainda não é totalmente compreendido, as Redes Neurais Artificiais buscam simular o comportamento dos neurônios para executar apenas tarefas bem específicas, como as de classificar um objeto.
As redes neurais são semelhantes ao funcionamento do cérebro humano em dois aspectos fundamentais:
o conhecimento é adquirido pela rede neural por meio de um processo de aprendizado
e os pesos das conexões entre neurônios, conhecidas como sinapses, são utilizados para armazenar o conhecimento.
O procedimento utilizado para representar o processo de aprendizado, normalmente conhecido como algoritmo de aprendizado, é uma função para modificar os pesos das conexões da rede com o objetivo de alcançar um valor previamente estabelecido.
As redes neurais aprendem a identificar os padrões de uma determinada base de dados por meio da análise dos seus respectivos casos, construindo um mapeamento de entrada e saída analogamente aos ,modelos estatísticos não paramétricos.
Dessa forma, os modelos de redes neurais podem identificar padrões que são evidentes ou característicos para um problema em particular e armazenar esse conhecimento com uma base de inferência para classificação ou predição.
O conhecimento é representado em uma rede neural pela sua própria estrutura e pelo estado de ativação e pode se adaptar às menores mudanças nas situações utilizadas como base de aprendizado.
Conceitualmente, uma rede neural artificial consiste de um conjunto de componentes de processamento interconectados entre si, formando uma rede.
Uma unidade da rede é chamada de neurônio, assim como no sistema nervoso humano, e as conexões entre essas unidades são chamadas de sinapses, seguindo a mesma analogia.
O componente central de uma rede neural é o neurônio, ou nó. O neurônio recebe um conjunto de informações de entrada \(x_i\) a partir de outros nós, e multiplica cada entrada por um peso \(w_{ij}\), que está associado a cada uma das conexões.
O produto resultante dessa multiplicação é somado dentro do neurônio para gerar uma ativação \(\nu_j = \sum x_iw_{ij}\).
A ativação é transformada utilizando-se uma função de transferência \(F(\nu_j)\) para produzir a saída do nó.
Usualmente, uma função de transferência sigmoidal do tipo \(F(\nu_j) = 1 / (1 + e^{-\nu_j})\) é utilizada, onde \(\nu_j\) é a ativação.
O desempenho da rede depende da forma como os neurônios estão conectados, o que define a estrutura da rede.
Conforme visto anteriormente, a saída do neurônio é calculada a partir das entradas ponderadas por um peso associado a conexão.
\[\varphi=F(\nu) = F\left(\sum_i x_iw_{i}\right)\]
\(x\) é a entrada do neurônio, ou valor de observação, \(w\) é o peso da conexão, \(\nu\) é o valor da ativação e \(F\) é a função de ativação.
Diversas funções de ativação podem ser utilizadas na implementação de uma rede neural em multicamadas.
As funções de ativação mais básicas são a função linear:
\[\varphi=F(\nu) = \nu = \sum_i x_iw_{i}\]
e a função lógica, ou de ativação por limiar (também conhecida como função degrau):
\[\begin{align} %\begin{eqnarray} \varphi = F(\nu) =\left\{ \begin{array}{c l} 0, & \nu < \beta\\ 1, & \nu > \beta \end{array}\right. %\end{eqnarray} \end{align}\]
\(\beta\) é o ponto de transição do neurônio. Nesse caso, o ponto de transição pode ser incorporado ao neurônio, o que resulta em uma função da seguinte forma:
\[\varphi=F(\nu) = F \left( \sum_i x_iw_{i} + \beta \right)\]
Entretanto, a função de ativação degrau possui algumas limitações como mapeia valores de entrada para 0 ou 1, tem uma derivada zero quase em todos os lugares, exceto no ponto de mudança (o limiar). Isso faz com que o gradiente seja zero para quase todas as entradas, resultando no “vanishing gradient problem” (problema do gradiente desaparecendo), onde os pesos não são ajustados adequadamente durante o treinamento.
Uma função contínua da função de ativação, que permite a implementação de algoritmos mais complexos para o treinamento da rede, é a função sigmoide:
\[\varphi=F(\nu) = \dfrac{1}{1+e^{-\alpha \nu}}\] onde \(\alpha\) é um parâmetro de ajuste da função.
A função de ativação sigmoide limita a saída de um neurônio entre o intervalo 0 e 1, o que implica na necessidade de discretização dos valores da base de entrada da rede, fazendo com que os valores de observação \(x\) fiquem dentro desse intervalo.
Temos também a função a função tangente hiperbólica:
\[\varphi=F(\nu) = tanh(\nu)\]
A função tangente hiperbólica é uma função sigmoide que limita a saída de um neurônio entre -1 e 1.
Existem outras funções de ativação que podem ser utilizadas, dependendo do problema a ser resolvido e da arquitetura da rede.
Uma função que está sendo muito utilizada ultimamente é a função de ativação ReLU (Rectified Linear Unit), dada por:
\[\varphi=F(\nu) = max(0,\nu)\]
essa função é muito utilizada em redes neurais profundas, pois acelera o treinamento da rede, visto que ela não satura para valores muito grandes de \(\nu\).
Outra que vem em crescente uso, é a função de ativação Leaky ReLU, dada por:
\[\varphi=F(\nu) = max(0.01\nu,\nu)\]
Essa função é uma variação da ReLU, que permite que valores negativos de \(\nu\) sejam passados adiante, o que pode ajudar no treinamento da rede.
Em geral quando temos um problema de multiclasse utilizamos a função de ativação Softmax, que é uma generalização da função sigmoide para múltiplas classes, dada por:
\[\varphi=F(\nu) = \dfrac{e^{\nu_i}}{\sum_{j=1}^{n}e^{\nu_j}}\]
onde \(n\) é o número de classes do problema.
Essa função de ativação está presente em redes como a MLP (Multilayer Perceptron) e a CNN (Convolutional Neural Network).
O modelo neuronal matemático também pode incluir uma polarização ou viés de entrada, representado pela letra \(b\).
Esta variável é incluída ao somatório da função de ativação, com o intuito de aumentar o grau de liberdade desta função e, consequentemente, a capacidade de aproximação da rede.
O valor do viés é ajustado da mesma forma que os pesos sinápticos.
O viés possibilita que um neurônio apresente saída não nula ainda que todas as suas entradas sejam nulas.
Por exemplo, caso não houvesse o viés e todas as entradas de um neurônio fossem nulas, então o valor da função de ativação \(\varphi\) seria nulo.
Assim, se estivermos usando, por exemplo, a função de transferência tangente hiperbólica, a saída seria nula.
Desta forma não poderíamos por exemplo, fazer com que o neurônio aprendesse a relação \(x=[0\, \,0]^\top\) e \(y=1\), pertinente ao problema “ou exclusivo” da lógica.
O perceptron, invenção de Rosenblatt, foi um dos primeiros modelos de redes neurais.
Dentre os tipos de redes neurais existentes, o perceptron é a arquitetura mais simples, apresentando apenas um conjunto de neurônios de entrada e um conjunto de neurônios de saída, sem haver nenhuma camada de neurônios intermediária.
Este tipo de rede neural, embora simples, apresenta problemas específicos, não podendo ser utilizada em aplicações mais avançadas, mas apenas em estruturas de decisão simples.
O perceptron modela um neurônio pegando uma soma ponderada de suas entradas e enviando o resultado 1 se a soma for maior que algum valor inicial ajustável ( caso contrário, ele envia o resultado 0).
A próxima Figura mostra o dispositivo.
Note que, em um perceptron as conexões são unidirecionais
As entradas (\(x_1, x_2, \ldots, x_n\)) e os pesos das conexões (\(w_1, w_2, \ldots, w_n\)) na figura são tipicamente valores reais, tanto positivos quanto negativos.
Se a presença de alguma característica \(x_i\) tender a disparar o perceptron, o peso \(w_i\) será positivo; se a característica \(x_i\) inibir o perceptron, o peso \(w_i\) será negativo.
O perceptron em si, consiste nos pesos, no processador de soma (valor de ativação) e no processador de limite ajustável (função de ativação).
E temos que neste caso, a Aprendizagem é o processo de modificar os valores dos pesos e do limite.
Apesar de ter causado grande euforia na comunidade científica da época, o perceptron não teve vida muito longa, já que as duras críticas de Minsky e Papert (1969) à sua capacidade computacional causaram grande impacto sobre as pesquisas em RNAs, levando a um grande desinteresse pela área durante os anos 70 e início dos anos 80.
Essas críticas são relacionadas a um problema denominado de problema da linearidade, que é a incapacidade do perceptron de aprender funções não-lineares. Um exemplo clássico é o problema do XOR, que vamos apresentar a seguir.
Tabela da Verdade
A tabela de verdade para p XOR q de duas entradas é a seguinte:
p | q | p \(\oplus\) q |
---|---|---|
F | F | F |
F | V | V |
V | F | V |
V | V | F |
mudando-se os valores de \(w_1\) e \(w_2\) e \(\theta\), muda-se a inclinação e a posição da reta;
entretanto é impossível achar uma reta que divide o plano de forma a separar os pontos \(A_1\) e \(A_2\) de um lado e \(A_0\) e \(A_3\) do outro.
redes de uma única camada só representam funções linearmente separáveis.
As redes de uma só camada resolvem apenas problemas linearmente separáveis.
A solução de problemas não linearmente separáveis passa pelo uso de redes com uma ou mais camadas intermediárias ou escondidas.
O perceptron de múltiplas camadas ou multilayer perceptron (MLP) é uma rede com uma camada sensorial ou camada de entrada, que possui tantos nós de entrada quantos forem os sinais de entrada, uma ou mais camadas ocultas de neurônios e uma camada de saída com um número igual ao número de sinais de saída.
O sinal de entrada se propaga para frente através das camadas até a camada de saída, ou seja, é uma rede alimentada para frente.
O MLP é uma generalização da rede perceptron e, assim como esta, é treinada de forma supervisionada, através da regra de aprendizagem que minimiza o erro.
O mecanismo utilizado para a aprendizagem no caso do MLP, é conhecido como algoritmo de retropropagação de erro.
De maneira similar ao perceptron, no MLP necessita da definição do sinal de erro e da taxa de aprendizagem.
Entretanto, para o melhor funcionamento e mais correta definição das correções nos pesos das saídas dos neurônios em cada camada, algumas especificidades são atribuídas no sinal de erro.
Isto, de certa forma, garante uma maior convergência no aprendizado da rede.
Todo o procedimento do treinamento do MLP é baseado no sinal do erro, o que é visto a seguir.
No MLP, o sinal do erro do neurônio de saída \(j\), na iteração \(t\), é definido por:
\[e_j(t) = y_j - \hat{y}_j(t),\]
em que \(\hat{y}_j(t)\) é a resposta calculada pelo neurônio \(j\) e \(y_j\) é a resposta real referente ao neurônio \(j\).
O sinal de erro global e instantâneo da rede, para os \(J\) neurônios da camada de saída, na iteração \(t\), é definido por:
\[E(t) =\dfrac{1}{2} \sum\limits_{j=1}^J e_j^2(t).\]
O erro de cada neurônio é elevado ao quadrado para evitar que um erro negativo oriundo de um neurônio compense um erro positivo de outro.
Vale destacar que ao fazermos isso, temos que
\[e_j^2(t) = \left( y_j - \hat{y}_j(t) \right)^2\] é a distância euclidiana entre a resposta desejada e a calculada pela rede.
\[\overline{E} =\dfrac{1}{T} \sum\limits_{t=1}^T E(t).\]
O erro global instantâneo médio, assim como, o erro global instantâneo \(E(t)\) são funções de todos os parâmetros livres (pesos sinápticos e viés) da rede.
Dessa forma, a questão passa a ser em como atribuir uma parcela de culpa, pelo erro global instantâneo, a cada um dos parâmetros, com finalidade de possibilitar o ajuste destes parâmetros em direção a um erro global mínimo.
\[E(t) = \dfrac{1}{2}\sum\limits_{j=1}^{J} \left(y_j - \varphi \left( \sum\limits_k w_{kj}\varphi \left( \ldots \varphi \left( \sum\limits_l w_{lg} \varphi \left(\ldots \varphi \left( \sum\limits_i w_{iu} x_i \right) \right) \right) \right) \right) \right)^2 \]
Esta equação é composta de somatórios de funções sigmoides aninhados, onde \(y_j\) representam os sinais de saída desejados, \(x_i\) representam os sinais de entrada e \(\varphi\) a função sigmoide de transferência. A representação gráfica teria a forma similar a figura apresentada a seguir:
Representação gráfica para o processo de minimização do erro entre \(E \, \times\, w_{kj}(t)\).
\[\dfrac{\partial E(t)}{\partial w_{kj}(t)},\] Essa derivada parcial traz insights sobre o peso \(w_{kj}(t)\):
se o valor da derivada parcial for positivo, significa que, se for aplicada uma correção positiva ao peso sináptico \(w_{kj}(t)\), ter-se-ia um acréscimo no erro global \(E(t)\), devendo, neste caso, deve ser aplicada uma correção negativa e vice-versa.
se o valor da derivada parcial for pequeno, estamos próximos a um \(E(t)\) mínimo para \(w_{kj}\), devendo assim ser aplicada uma correção a \(w_{kj}\) pequena.
se o valor desta derivada fosse grande, o valor de \(w_{kj}\) está distante do valor que resultaria em \(E(t)\) mínimo, portanto seria necessário aplicar uma correção maior para \(w_{kj}(t)\).
Então, nesse caso utilizamos a regra delta para corrigir o peso sináptico \(w_{kj}(t)\), conforme a equação a seguir:
\[\Delta w_{kj}(t) = -\eta\dfrac{\partial E(t)}{\partial w_{kj}(t)},\]
em que \(\eta\) é a taxa de aprendizado.
O processo é repetido até caminhar por todos os pesos e vieses da rede. Em que, após a finalização de uma iteração é dito que foi executado 1 época (epoch).
Entretanto, o cálculo da derivada parcial \(\partial E(t)/\partial w_{ij}(t)\) para cada um dos pesos não é simples, pois, como já foi visto, \(E(t)\) é uma equação composta de somatórios de funções de ativação (\(\varphi\)) aninhados.
\[E(t) = \dfrac{1}{2}\sum\limits_{j=1}^{J} \left(y_j - \varphi \left( \sum\limits_k w_{kj}\varphi \left( \ldots \varphi \left( \sum\limits_l w_{lg} \varphi \left(\ldots \varphi \left( \sum\limits_i w_{iu} x_i \right) \right) \right) \right) \right) \right)^2 \]
Para nosso entendimento, vamos utilizar como base a estrutura abaixo:
Legenda:
como o próprio nome sugere:
O objetivo é determinar a derivada parcial \(\partial E(t)/\partial w_{ij}(t)\), para aplicar a correção \(\Delta w_{ij}(t)\) ao peso sináptico \(w_{ij}(t)\).
De acordo com a regra da cadeia, é possível expressar a derivada parcial como sendo a equação a seguir
\[\begin{equation} \dfrac{\partial E(t)}{\partial w_{ij}(t)} = \dfrac{\partial E(t)}{\partial e_{j}(t)} \dfrac{\partial e_j(t)}{\partial \hat{y}_{j}(t)} \dfrac{\partial \hat{y}_j(t)}{\partial \nu_{j}(t)} \dfrac{\partial \nu_{j}(t)}{\partial w_{ij}(t)}, \label{equacao56} \end{equation}\]
Lembrem-se que \(\hat{y}_j(t) = \varphi_j(\nu_j(t))\).
É importante também definir o gradiente local do neurônio \(j\), que é definido por \(\delta_j(t)\), que é dado pela derivada \(\partial E(t) / \partial \nu_j(t)\), que pode ser escrita como
\[\begin{equation} \delta_j(t) = \dfrac{\partial E(t)}{\partial \nu_{j}(t)} = \dfrac{\partial E(t)}{\partial e_{j}(t)} \dfrac{\partial e_j(t)}{\partial \hat{y}_{j}(t)} \dfrac{\partial \hat{y}_j(t)}{\partial \nu_{j}(t)}, \label{equacao57} \end{equation}\]
ou seja, o gradiente é formado pela multiplicação dos três primeiros fatores da função \(\partial E(t) / \partial w_{ij}(t)\).
Vamos desenvolver cada fator da equação:
\[ \dfrac{\partial E(t)}{\partial w_{ij}(t)} = \color{red}{\dfrac{\partial E(t)}{\partial e_{j}(t)}} \dfrac{\partial e_j(t)}{\partial \hat{y}_{j}(t)} \dfrac{\partial \hat{y}_j(t)}{\partial \nu_{j}(t)} \dfrac{\partial \nu_{j}(t)}{\partial w_{ij}(t)}, \]
Temos
\[E(t)=\dfrac{1}{2}\sum\limits_{j=1}^J e^2_j(t),\]
logo,
\[ \color{red}{\dfrac{\partial E(t)}{\partial e_{j}(t)} = e_j(t) = y_j - \hat{y}_j(t).} \]
Desenvolvendo o segundo fator
\[ \dfrac{\partial E(t)}{\partial w_{ij}(t)} = \dfrac{\partial E(t)}{\partial e_{j}(t)} \color{blue}{\dfrac{\partial e_j(t)}{\partial \hat{y}_{j}(t)}} \dfrac{\partial \hat{y}_j(t)}{\partial \nu_{j}(t)} \dfrac{\partial \nu_{j}(t)}{\partial w_{ij}(t)}, \]
em que \(\color{red}{e_j(t) = y_j - \hat{y}_j(t)}\), tem-se:
\[\color{blue}{\dfrac{\partial e_j(t)}{\partial \hat{y}_j(t)} = -1,}\]
Desenvolvendo o terceiro fator
\[ \dfrac{\partial E(t)}{\partial w_{ij}(t)} = \dfrac{\partial E(t)}{\partial e_{j}(t)} \dfrac{\partial e_j(t)}{\partial \hat{y}_{j}(t)} \color{green}{\dfrac{\partial \hat{y}_j(t)}{\partial \nu_{j}(t)}} \dfrac{\partial \nu_{j}(t)}{\partial w_{ij}(t)}, \]
sendo \(y_j(t) = \varphi_j(\nu_j(t)),\) encontra-se
\[\color{green}{\dfrac{\partial \hat{y}_j(t)}{\partial \nu_j(t)} = \varphi^\prime_j (\nu_j(t)).}\]
Se por exemplo, a função de ativação \(\varphi\) for sigmoide \(\left( \varphi_j(\nu_j(t)) = \dfrac{1}{1+e^{- \nu}} \right)\), a derivada parcial acima teria a seguinte forma:
\[ \varphi^\prime_j (\nu_j(t)) = \dfrac{e^{-\nu_j(t)}}{(1+e^{-\nu_j(t)})^2} \]
Dado os resultados anteriores, podemos escrever a equação do gradiente local do neurônio \(j\), da seguinte forma:
\[\delta_j(t) = \dfrac{\partial E(t)}{\partial \nu_{j}(t)} = \color{red}{\dfrac{\partial E(t)}{\partial e_{j}(t)}} \color{blue}{\dfrac{\partial e_j(t)}{\partial \hat{y}_{j}(t)}} \color{green}{\dfrac{\partial \hat{y}_j(t)}{\partial \nu_{j}(t)}} = \color{blue}{-}\color{red}{e_j(t)}\color{green}{\varphi^\prime_j(\nu_j(t))}.\]
E desenvolvendo o quarto fator
\[ \dfrac{\partial E(t)}{\partial w_{ij}(t)} = \dfrac{\partial E(t)}{\partial e_{j}(t)} \dfrac{\partial e_j(t)}{\partial \hat{y}_{j}(t)} \dfrac{\partial \hat{y}_j(t)}{\partial \nu_{j}(t)} \color{orange}{\dfrac{\partial \nu_{j}(t)}{\partial w_{ij}(t)}}, \]
temos que, para o neurônio \(j\) com
\[\nu_j(t) = \sum\limits_iw_{ij}(t)\hat{y}_i(t) \quad \quad \Longrightarrow \quad \quad \color{orange}{\dfrac{\partial \nu_j(t)}{\partial w_{ij}} = \hat{y}_i(t).} \]
Substituindo os fatores desenvolvidos, temos
\[\dfrac{\partial E(t)}{\partial w_{ij}(t)} = \color{red}{\dfrac{\partial E(t)}{\partial e_{j}(t)}} \color{blue}{\dfrac{\partial e_j(t)}{\partial \hat{y}_{j}(t)}} \color{green}{\dfrac{\partial \hat{y}_j(t)}{\partial \nu_{j}(t)}} \color{orange}{\dfrac{\partial \nu_{j}(t)}{\partial w_{ij}(t)}} = \color{blue}{-}\color{red}{e_j(t)}\color{green}{\varphi^\prime_j(\nu_j(t))}\color{orange}{\hat{y}_i(t)} = \delta_j(t)\color{orange}{\hat{y}_i(t)}.\]
Com os resultados anteriores, é possível aplicar a correção a todos os pesos sinápticos e viés dos neurônios da última camada.
A correção se dará pela aplicação da regra delta dada por
\[ \Delta w_{ij} = -\eta \dfrac{\partial E(t)}{\partial w_{ij}(t)} = -\eta \delta_j(t)\hat{y}_i(t). \]
em que \(\eta\) é um hiperparâmetro que define a taxa de aprendizado e geralmente é previamente definido pelo usuário.
Vamos agora entender como é o processo de ajuste dos pesos sinápticos e viés dos neurônios de uma camada anterior, nesse caso vamos utilizar como auxílio a imagem abaixo e fazer o procedimento para a camada \(i\).
Na Figura aterior, temos um grafo de fluxo de sinal, em que é representado, o neurônio da camada de saída visto anteriormente (camada J), e um neurônio de camada imediatamente anterior (camada I).
Ao observar a equação abaixo para o neurônio \(i\)
\[\dfrac{\partial E(t)}{\partial w_{ki}(t)} = \color{red}{\dfrac{\partial E(t)}{\partial \hat{y}_{i}(t)}} \color{green}{\dfrac{\partial \hat{y}_i(t)}{\partial \nu_{i}(t)}} \color{orange}{\dfrac{\partial \nu_{i}(t)}{\partial w_{ki}(t)}},\]
Entretanto, podemos reescrever \(\partial E(t)\) como
\[\begin{eqnarray} \begin{array}{r l} \partial E(t) =& \sum\limits_{j=1}^J \partial E_j(t) \\ = & \sum\limits_{j=1}^J \delta_j(t) \partial \nu_j(t), \end{array} \end{eqnarray}\]
em que \(J\) é o número de neurônios da camada \(J\).
dado que podemos expressar \(\color{green}{\partial \nu_j(t)}\), como:
\[\color{green}{\partial \nu_j(t) = \varphi_i^{\prime}(\nu_i(t)) \hat{y}_k(t) \partial w_{ki}(t) w_{ij}(t)}\]
então,
\[\begin{eqnarray} \begin{array}{r l} \partial E(t) = & \sum\limits_{j=1}^J \delta_j(t) \color{green}{\partial \nu_j(t)}\\ = & \sum\limits_{j=1}^J \bigg( \delta_j(t) \color{green}{\varphi_i^{\prime}(\nu_i(t)) \hat{y}_k(t) \partial w_{ki}(t) w_{ij}(t)} \bigg), \end{array} \end{eqnarray}\]
e assim, temos:
\[\dfrac{\partial E(t)}{\partial w_{ki}(t)} = \varphi_i^{\prime}(\nu_i(t))\hat{y}_k(t) \sum\limits_{j=1}^J \bigg( \delta_j(t) w_{ij}(t) \bigg).\]
Substituindo a derivada \(\partial E(t) / \partial w_{ki}(t)\) na regra delta, encontra-se:
\[\begin{equation} \Delta w_{ki}(t) = -\eta \dfrac{\partial E(t)}{\partial w_{ki}(t)} = -\eta \varphi_i^{\prime}(\nu_i(t)) \hat{y}_k(t) \sum\limits_{j=1}^J \bigg( \delta_j(t) w_{ij}(t) \bigg). \label{5-30} \end{equation}\]
Assim, é possível ajustar todos os pesos da camada \(I\).
Entretanto, é conveniente determinar o gradiente local \(\delta_i(t)\), para todos os neurônios desta camada, pois estes serão necessários quando se ajustarem os pesos da camada imediatamente anterior, ou seja, a camada \(K\).
Tomando \(\delta_i(t)\) como \[\delta_i(t) = \varphi_i^{\prime}(\nu_i(t)) . \sum\limits_{j=1}^J \bigg( \delta_j(t). w_{ij}(t) \bigg),\]
temos que, a equação \(\Delta w_{ki}(t)\) pode ser reescrita como:
\[\begin{equation} \Delta w_{ki}(t) = -\eta \delta_i(t) \hat{y}_k(t). \label{5-35} \end{equation}\]
Asssim, segue, em que o procedimento para ajuste dos parâmetros das demais camadas ocultas é o mesmo.
A taxa de aprendizagem \(\eta\) é responsável pela velocidade com que se dá a busca no espaço de pesos, em direção aos valores que resultam em um erro global mínimo.
Quanto menor for a taxa de aprendizagem, mais suave e precisa será a trajetória através do espaços de pesos, entretanto o aprendizado será lento.
Em resumo, o algoritmo debackpropagation pode ser descrito em cinco etapas, conforme apresentadas a seguir:
Inicialização: arbitram-se valores aleatórios aos pesos sinápticos e viés, em uma distribuição uniforme, cuja média deverá ser zero.
Apresentação dos exemplos de treinamento: apresenta-se uma época de exemplos à rede. Para cada exemplo, realiza-se a propagação dos sinais e a retropropagação dos erros com a correção dos pesos e viés, conforme descrito nos dois próximos itens.
Propagação dos sinais: aplica-se á camada da rede o vetor de sinais de entrada \(x(i)\) e calcula-se o campo local induzido e o sinal de saída para todos os neurônios, começando da camada de entrada até a camada de saída, onde se obtém o vetor de sonais funcionais da rede \(\hat{y}_j(t)\).
Em seguida, calcula-se o sinal de erro \(e_j(t)\) para cada neurônio da camada de saída, pela comparação de \(\hat{y}_j(t)\) com o vetor de sinais de saída desejados \(y\). Daí, calculam-se o erro instantâneo e com este, o erro médio global, para teste de finalização.
backpropagation dos sinais de erro: calculam-se os gradientes locais para todos os neurônios da camada de saída: \[\delta_j(t) = -e_j(t)\varphi'_j(\nu_j(t))\]
Em seguida, calculam-se os ajustes para os pesos daquela camada, bem como dos viés, os quais devem ser somados aos valores atuais: \[ \Delta w_{ij} = \eta e_j(t)\varphi'_j(\nu_j(t))\hat{y}_i(t) = -\eta \delta_j(t)\hat{y}_i(t)\] \[ \Delta b_{j} = \eta e_j(t)\varphi'_j(\nu_j(t))\hat{y}_i(t) = -\eta \delta_j(t)\hat{y}_i(t)\]
O próximo passo é o cálculo do gradiente local para os neurônios da penúltima camada (camada oculta): \[\delta_i(t) = \varphi'_i(\nu_i(t))\sum\limits_{j=1}^J(\delta_j(t)w_{ij}(t)).\]
Então, calcula-se o ajuste para todos os pesos desta camada, bem como dos viés, os quais devem ser somados aos valores atuais. \[\Delta w_{ki} = -\eta \varphi'_i(\nu_i(t))\hat{y}_k(t) \sum\limits_{j=1}^J(\delta_j(t)w_{ij}(t)) = -\eta_i(t)\hat{y}_k(t)\] \[\Delta b_{i} = -\eta \varphi'_i(\nu_i(t))\hat{y}_k(t) \sum\limits_{j=1}^J(\delta_j(t)w_{ij}(t)) = -\eta_i(t)\hat{y}_k(t)\]
O processo prossegue de forma idêntica para as demais camadas ocultas, assim como para a camada de entrada, em que os valores dos ajustes na primeira camada oculta (após a entrada da rede) deve ter o valor \(\hat{y}_k(t)\) substituído pelo valor de \(x_k\).
Tomando como base estes passos, é possível obter uma rede MLP.
BRAGA, A. P.; CARVALHO, A.; LUDEMIR, T. Redes Neurais Artificiais: Teoria e Aplicações. .: [s.n.], 2000.
HOPFWELD, J. J. Neural networks and physical systems with emergent collective computational abilities. Proc. NatL Acad. Sci., v. 79, p. 2554–2558, 1982.
LUDWIG, O.; MONTGOMERY, E. Redes Neurais - Fundamentos e Aplicações com Programas em C. .: Ciência Moderna, 2007.
MINSKY, M.; PAPERT, S. Perceptrons: an introduction to computationational geometry. [S.l.]: MIT Press, 1969.
PINHEIRO, C. A. R. Inteligência Analítica: Mineração de Dados e Descoberta de Conhecimento. .: [s.n.], 2008.
RICH, E.; KNIGHT, K. Inteligência Artificial. .: [s.n.], 1993.
ROSENBLATT, F. Principles of Neurodynamics: Perceptrons and Theory of Brain Mechanisms. .: Washigton, DC, 1962.
https://acervolima.com/funcoes-de-ativacao/
OBRIGADO!
Slide produzido com quarto
Redes Neurais - Prof. Jodavid Ferreira