- View
Sabes pelas aulas de biologia que a célula é a unidade básica de estrutura e função de todos os seres vivos. Do ponto de vista da inteligência artificial e da aprendizagem, as mais interessantes são as células cerebrais, chamadas neurónios. Os neurónios são compostos por um corpo com um núcleo e extensões mais curtas e mais longas, chamadas axónios e dendrites. As extensões permitem que os neurónios se liguem a outros neurónios. Estes pontos de ligação são chamados sinapses. As sinapses permitem que os sinais — ou seja, impulsos elétricos gerados por um neurónio — sejam transmitidos a outro neurónio. Curiosamente, um único neurónio pode estar ligado a milhões de outros neurónios. Isto significa que recebe e processa sinais provenientes de muitos outros neurónios e, com base nos seus mecanismos internos, ajusta o sinal que envia para os neurónios seguintes. É comum chamar-se a este estado estado de ativação neuronal. Dura apenas uma fração de segundo, mas permite realizar cálculos subtis e gera um sinal que é transmitido por todo o sistema nervoso.

O neurónio que encontramos na inteligência artificial é uma abstração matemática dos neurónios do cérebro. É descrito como uma função de várias variáveis \(f(x_1,x_2,...,x_n)\), onde cada uma das variáveis \(x_1, x_2, ..., x_n\) corresponde a um único sinal que chega ao neurónio. Como nem todos os sinais são igualmente importantes para a atividade do neurónio, a cada um deles é atribuído um peso \(w_1, w_2, ..., w_n\) que indica a sua importância. Valores mais elevados destes pesos indicam que o sinal é mais importante, e valores mais baixos indicam o contrário. Assim, a estimulação total dos neurónios corresponde à soma ponderada \(w_1x_1 + w_2x_2 +...+ w_nx_n\). Para influenciar comportamentos adicionais do neurónio, é adicionado um termo livre b, a esta soma, de forma que a estimulação total do neurónio seja, na realidade \(w_1x_1 + w_2x_2 +...+ w_nx_n + b\). Este valor é então passado a uma função de ativação φ, cuja função é calcular a saída do neurónio. Dependendo da escolha da função de ativação, os valores de saída obtidos também serão diferentes. Se juntarmos tudo de forma sistemática, obtemos que, para os sinais recebidos \(x_1, x_2, ..., x_n\), a saída do neurónio é: \(y = φ(w_1x_1 + w_2x_2 +...+ w_nx_n + b\). Podes também seguir o procedimento que acabámos de descrever na ilustração abaixo.

Abstração matemática dos neurónios
Vamos analisar mais de perto o significado do parâmetro b. Um neurónio natural é caracterizado pelo chamado limiar de ativação – se o sinal total recebido pelo neurónio for superior ao valor do limiar de ativação, o neurónio é ativado, processa o sinal e encaminha o resultado desse processamento para outros neurónios. Um papel semelhante, no modelo matemático dos neurónios, é desempenhado pelo parâmetro b. Se o sinal total for superior ao limiar de activação b, ou seja, se \(w_1x_1 + w_2x_2 +...+ w_nx_n>b\), o neurónio será ativado. Assim, o parâmetro b permite-nos influenciar comportamentos adicionais dos neurónios. A expressão \(w_1x_1 + w_2x_2 +...+ w_nx_n>b\) também pode ser escrita como \(w_1x_1 + w_2x_2 +...+ w_nx_n-b>0\), e, nesse sentido, o parâmetro b é também uma parte integrante da soma.
Quando os neurónios estão ligados entre si, temos uma rede neuronal. Uma rede neuronal é geralmente composta por camadas, ou seja, grupos de neurónios associados entre si.

Camadas de redes neurais
A camada de entrada é uma camada que está localizada na entrada de uma rede neural. Os sinais de entrada \(x1, x2, ..., xn\) desta camada estão relacionados com os valores dos atributos que temos no conjunto de dados, e assim abordamos a aplicação prática das redes neurais. Por exemplo, se tivermos um conjunto de dados contendo três atributos, temperatura, umidade e pressão atmosférica, a camada de entrada terá três neurônios: o primeiro corresponderá ao primeiro atributo, temperatura, o segundo corresponderá ao segundo atributo, umidade, e o terceiro neurônio ao terceiro atributo, ou seja, a pressão atmosférica. Para um exemplo particular do conjunto de dados com os valores de temperatura, humidade e pressão atmosférica ascendendo, respetivamente, a 19 °C, 77% e 1011,2 mb, teremos os valores do sinal \(x1 = 19, x2 = 77\) e \(x3 = 1011.2\). No espírito da história anterior, o primeiro neurônio da camada de entrada recebe e processa apenas o sinal x1 passando-o sem qualquer modificação (isso é possível para a seleção da função de ativação \(φ(x)= x\) e o valor \(w_1 = 1\) e \(b = 0\)). Os outros dois neurônios e seus sinais \(x_2\) e \(x_3\) também são válidos. Isso significaria que a camada de entrada nos permite entrar na rede.
A camada de saída é uma camada que está localizada na saída de uma rede neural. Como você pode imaginar, ele nos permite ler os resultados que a rede neural calculou para nós. Dependendo da tarefa a ser resolvida, o número de neurônios nesta camada também dependerá.
Em tarefas de regressão, como esperamos um único valor numérico como resultado (quantidade de precipitação ou algo semelhante), um único neurónio é suficiente. O seu resultado deve corresponder à previsão que esperamos. Para a tarefa de classificação, vamos considerar separadamente a classificação binária e a classificação multiclasse. Como a classificação binária espera dois valores, 0 ou 1, poderás pensar inicialmente que são necessários dois neurónios. No entanto, se pensares bem, verás que até um único neurónio é suficiente: se a sua saída ultrapassar um determinado limiar, um valor pré-definido, podemos considerá-la como um resultado de 1, caso contrário, como um resultado de 0. No caso da classificação multiclasse, podemos ter várias classes, pelo que é prático introduzir um neurónio para cada classe.
Numa tarefa de classificação multiclasse, esperamos que todas as saídas dos neurónios da camada de saída sejam 0, exceto uma que tenha um valor de 1 - então saberemos exatamente que classe pertence.
As camadas da rede neural que estão localizadas entre as camadas de entrada e saída são chamadas de camadas ocultas. Redes neurais que têm mais de uma camada oculta são geralmente designadas por Redes Neurais Profundas. É daí que vem o nome deep learning . Deep Learning é a área de machine learning que os estuda, também conhecida como Shallow Learning. A aprendizagem superficial é uma forma de aprendizagem.
Redes Neurais Totalmente Ligadas são redes nas quais cada neurónio da camada anterior está ligado a cada neurónio da camada seguinte. A imagem que mostra as camadas da rede neural representa também uma rede totalmente ligada, pois todos os neurónios da camada de entrada estão ligados a todos os neurónios da primeira camada oculta; depois, todos os neurónios da primeira camada oculta estão ligados a todos os neurónios da segunda camada oculta e, finalmente, todos os neurónios da segunda camada oculta estão ligados a todos os neurónios (apenas um, na nossa imagem) da camada de saída. As formas pelas quais os neurónios das camadas estão ligados entre si determinam a arquitetura das redes neurais e algumas propriedades específicas das mesmas, que por sua vez, determinam ainda mais em quais áreas elas podem ser utilizadas. Na próxima aula, vamos conhecer alguns desses redes.
Agora vamos considerar o que realmente obtivemos com a introdução de neurónios e redes neuronais. Suponhamos que temos três atributos \(x_1, x_2\) e \(x3\). A relação linear entre um atributo e uma variável alvo é matematicamente descrita pela equação \(y = β_0 + β_1x_1 + β_2x_2 + β_3x_3\). Se, em vez dos parâmetros β, escrevermos w e, em vez de β0, escrevermos b e colocarmos no fim, obtemos, na verdade, a soma ponderada \(w_1x_1 + w_2x_2 + w_3x_3 + b\) calculada por um neurónio com base nos sinais que recebe. Isso significa que, se não houvesse função de ativação, \(φ\) e neurónio modelariam apenas, uma relação linear entre os atributos (sinais) e as saídas. Isto pode também ser representado graficamente por uma rede que consiste em apenas uma camada de entrada com três neurónios e uma camada de saída com um neurónio, como na figura abaixo.

Se a função de ativação não existisse, do ponto de vista da modelação de dependências, faria alguma diferença adicionar uma nova camada escondida? Suponhamos que é uma camada de cor amarela na figura seguinte.

Agora, cada neurónio da camada escondida calcula uma combinação linear dos atributos, e o neurónio da camada de saída calcula uma combinação linear dos valores da camada escondida. Isto significa que o neurónio da camada de saída está, mais uma vez, a calcular apenas uma combinação linear dos atributos, e que não avançámos muito na representação de relações mais complexas entre atributos e saídas. Além disso, mesmo que adicionássemos 100 camadas escondidas, não sairíamos deste ponto — estaríamos sempre a modelar uma dependência linear.
É por isso que a inclusão de uma função de ativação nos cálculos dos neurónios muda significativamente o conjunto de possibilidades que temos. Se usarmos uma função de ativação não linear, conseguimos modelar relações não lineares entre os atributos e a variável alvo. Assim, a existência de uma função de ativação não linear na camada escondida do exemplo anterior permite que o neurónio da camada de saída possa agora calcular uma combinação não linear dos atributos. Neste contexto, faz muito mais sentido adicionar novas camadas. Ao combinarmos as não linearidades de várias camadas, conseguimos modelar relações complexas entre atributos e saídas.
Para encaixar todas as peças do puzzle, falta discutir quais são as funções de ativação não lineares mais populares em aprendizagem automática. São elas: a função sigmoide, que conhecemos na história da regressão logística, a tangente hiperbólica, a Rectified Linear Unit (ReLU) e a Leaky Rectified Linear Unit (Leaky ReLU).As fórmulas pelas quais estas funções são calculadas, bem como os seus gráficos, estão apresentados na figura abaixo. Como se pode ver, estas funções não são de facto lineares — os seus gráficos não o são.

As funções de ativação mais comuns
Para completar a explicação sobre a combinação de diferentes funções de ativação, vamos observar as funções \(f(x)= 2x\) e \(g(x)= 1 − x\). Podemos ver que ambas são funções lineares de uma variável. Ao combiná-las, a composição das funções, obtemos a função \(g(f(x))= 1 − 2x\), que também é uma função linear de uma variável. Pode-se ver os gráficos de todas as três funções na imagem abaixo.

Para completar a explicação sobre a combinação de diferentes funções de ativação, vamos observar as funções \(f(x)= ReLU(2x)\) e \(g(x)= ReLU(1 − x)\), que diferem das funções anteriores na medida em que apresentam a função de ativação de uma unidade linear retificada. Portanto, ambas as funções não são lineares. Ao combiná-los, ou seja, ao compô-los, obtemos a função \(g(f(x))= ReLU(1 − ReLU(2x))\), que também é não-linear, e que tem uma nova "forma": nos permite expressar uma relação ligeiramente diferente entre a variável de entrada e a saída.

A escolha da função de ativação adequada depende da natureza da tarefa e de algumas das propriedades que a rede neuronal deve apresentar durante o treino. Como isso é feito, iremos explicar na próxima aula.