| | | |

Introdução a PINNs

Ajude a manter o site livre, gratuito e sem propagandas. Colabore!

2.1 Unidade de processamento

A unidade básica de processamento111A unidade básica de processamento de uma RNA também é chamada de neurônio artificial ou nodo da rede. do tipo perceptron segue o esquema apresentado na Figura 2.1.

Refer to caption
Figura 2.1: Unidade básica de processamento do tipo perceptron: y=η(𝒙;𝜽).

Consiste na composição de uma função de ativação222Originalmente, o perceptron tem a função sinal como função de ativação. Por referência histórica, vamos adotar este nome mesmo para unidades de processamento com outras funções de ativação φ: com a pré-ativação

z:=𝒘𝒙+b (2.1)
=w0x0+w1x1++wn1xn1+b (2.2)

onde, 𝒙=(x0,x1,,xnin1)nin é o vetor de entrada, 𝜽=(𝒘,b)nin+1 são of parâmetros da unidade, formados pelos pesos 𝒘=(w0,w1,,wnin1)nin e o bias b. Escolhida uma função de ativação, a saída do neurônio é computada por

y=η(𝒙;𝜽):=φ(z) (2.3)
=φ(𝒘𝒙+b) (2.4)

O treinamento (calibração) consiste em determinar os parâmetros 𝜽 de forma que o neurônio forneça as saídas y esperadas com base em um critério predeterminado.

2.1.1 Um problema de classificação

O perceptron é um classificador linear, i.e., é capaz de classificar dados que sejam linearmente separáveis. Como aplicação deste fato que demonstraremos mais adiante, vamos criar um perceptron que emule a operação booleana333George Boole, 1815 - 1864, matemático britânico. Fonte: Wikipédia: George Boole. (e-lógico). Para tanto, precisamos definir o problema, os dados originais de treinamento, o modelo do perceptron, o pré-processamento dos dados, o método de treinamento e, por fim, realizar a implementação do modelo.

Problema e dados de treinamento

Dados dois valores booleanos A1 e A2 (V, verdadeiro ou F, falso), esperamos que nossa unidade de processamento forneça como saída o valor booleano R=A1A2. Para isso, precisamos de um conjunto de dados de treinamento e de um critério de treinamento. Como dados, podemos usar a tabela verdade do e-lógico (consultemos aTabela 2.1). Esta tabela nos fornece um conjunto de dados de entrada e saída esperada. O critério de treinamento vamos definir mais adiante.

Tabela 2.1: Tabela verdade da operação booleana (e-lógico).
A1 A2 R:=A1A2
V V V
V F F
F V F
F F F

Modelo

Nosso modelo será um perceptron

y=η(𝒙;𝜽), (2.5)
=sign(𝒘𝒙+b), (2.6)

com entradas 𝒙=(x0,x1){1,1}2, nin=2, função sinal

φ(z)=sign(z):={1,z>00,z=01,z<0, (2.7)

como função de ativação, saída y{1,0,1} e parâmetros a determinar 𝜽=(w0,w1,b)3.

Pré-processamento

O pré-processamento dos dados de treinamento consiste em compatibilizá-los com o modelo. No caso em estudo, podemos assumir que o valor booleano F (falso) seja associado a 1 e que valor booleano V (verdadeiro) a 1. Com isso, os dados de treinamento originais podem ser reescritos como na Tabela 2.2. Denotaremos o conjunto de treinamento pré-processado por {𝒙(s),y(s)}s=0ns1, onde ns=4 é o número de amostras, 𝒙(s)=(x0(s),x1(s)) é o vetor de entrada da s-ésima amostra e y(s) é a saída esperada para a s-ésima amostra.

Tabela 2.2: Dados de treinamento pré-processados para o treinamento do modelo do e-lógico.
s x0(s) x1(s) y(s)
0 1 1 1
1 1 1 1
2 1 1 1
3 1 1 1

Treinamento

Agora, nos falta treinar nosso neurônio para fornecer o valor esperado de y para cada dada entrada 𝒙. Isso consiste em determinar método (de treinamento) para escolhermos os parâmetros 𝜽 que sejam adequados para esta tarefa. Vamos explorar mais sobre isso na sequência do texto, sendo que aqui vamos empregar uma análise geométrica para escolhermos os parâmetros.

Lembrando que nosso modelo é

η(𝒙;𝜽)=sign(w0x0+w1x1+b), (2.8)

observamos que

w0x0+w1x1+b=0 (2.9)

corresponde à equação geral de uma reta no plano τ:x0×x1. Esta reta divide o plano em dois semiplanos

τ+={𝒙2:w0x0+w1x1+b>0} (2.10)
τ={𝒙2:w0x0+w1x1+b<0} (2.11)

O primeiro está no sentido do vetor normal à reta 𝒘=(w0,w1) e o segundo no sentido oposto. Com isso, o problema de treinamento se reduz a encontrar os coeficientes da reta

w0x0+w1x1+b=0 (2.12)

de forma a separar o ponto (1,1) no semiplano positivo τ+ e os demais pontos no semiplano negativo τ. Consultemos a Figura 2.2.

Refer to caption
Figura 2.2: Interpretação geométrica do perceptron aplicado ao problema de classificação associado à operação lógica (e-lógico).

Com base nessa interpretação geométrica, podemos escolher os parâmetros 𝜽=(𝒘,b) do nosso modelo. Por exemplo, escolhendo 𝒘=(1,1) e b=1, temos o modelo

η(𝒙)=sign(x0+x11) (2.13)

Verifique que o modelo fornece a saída esperada para cada entrada 𝒙 da Tabela 2.2!

Implementação

O Código 1 é uma implementação do modelo que criamos. Verifique!

Código 1: perceptron.py
1import torch
2
3# modelo
4class Perceptron(torch.nn.Module):
5 def __init__(self):
6 super().__init__()
7 self.linear = torch.nn.Linear(2,1)
8
9 def forward(self, x):
10 z = self.linear(x)
11 y = torch.sign(z)
12 return y
13
14model = Perceptron()
15
16# escolha dos parâmetros
17W = torch.Tensor([[1., 1.]])
18b = torch.Tensor([-1.])
19with torch.no_grad():
20 model.linear.weight = torch.nn.Parameter(W)
21 model.linear.bias = torch.nn.Parameter(b)
22
23# dados de entrada
24X = torch.tensor([[1., 1.],
25 [1., -1.],
26 [-1., 1.],
27 [-1., -1.]])
28
29print(f"\nDados de entrada\n{X}")
30
31
32# aplicação
33y = model(X)
34
35print(f"Valores estimados\n{y}")

2.1.2 Algoritmo de treinamento: perceptron

O algoritmo de treinamento perceptron permite computar os parâmetros do modelo para fazer a classificação de dados linearmente separáveis. Trata-se de um método para o treinamento supervisionado de um modelo, i.e., a calibração dos pesos é feita com base em um conjunto de amostras de treinamento que contém pares de entradas e saídas esperadas.

Seja dado um conjunto de treinamento {𝒙(s),y(s)}s=0ns1, onde ns é o número de amostras, 𝒙(s)n e y(s), s=0,1,,ns. O algoritmo consiste no seguinte:

  1. 1.

    𝒘𝟎, b0.

  2. 2.

    Para e1,,ne:

    1. (a)

      Para s1,,ns:

      1. i.

        Se y(s)η(𝒙(s))0:

        1. A.

          𝒘𝒘+y(s)𝒙(s)

        2. B.

          bb+y(s)

onde, ne é um dado número de épocas. Usualmente, uma época é definida como o número de vezes que todas as amostras serão utilizadas para realizar a correção dos pesos.

Para mostrarmos a convergência do algoritmo de treinamento perceptron, vamos simplificar a notação, assumindo 𝒙~=(x0,x1,,xnin1,1). Com isso, um conjunto D={𝒙~(s),y(s)}s=0ns1 é linearmente separável, se existe 𝜽 tal que

y(s)𝜽𝒙~(s)>0, (2.14)

para todas as amostras s=0,1,,ns1. Com isso, temos o seguinte resultado.

Teorema 2.1.1.(Perceptron)

Seja dado um conjunto de treinamento D={𝒙~(s),y(s)}s=0ns1, onde ns é o número de amostras. Se existe 𝜽 tal que

y(s)𝜽𝒙~(s)𝜽γ>0, (2.15)

e 𝒙~(s)R, para todo s=0,1,,ns1, então o algoritmo de treinamento perceptron converge em no máximo (R/γ)2 épocas.

Demonstração.

Assuma que iniciamos com 𝜽(0)=𝟎 e que na k-ésima iteração de correção vamos computar os parâmetros 𝜽(k). Seja β o ângulo entre os vetores 𝜽(k) e 𝜽, então

cos(β)=𝜽(k)𝜽𝜽(k)𝜽 (2.16)
=𝜽(k)𝜽𝜽1𝜽(k). (2.17)

Sem perda de generalidade, suponhamos que a amostra s seja a amostra que gera a correção na k-ésima iteração, ou seja, y(s)𝜽(k1)𝒙~(s)0. Com isso, temos

𝜽(k)𝜽𝜽=(𝜽(k1)+y(s)𝒙~(s))𝜽𝜽 (2.18)
=𝜽(k1)𝜽𝜽+y(s)𝒙~(s)𝜽𝜽 (2.19)
𝜽(k1)𝜽𝜽+γ (2.20)
kγ, (2.21)

por indução matemática. Por outro lado, temos

𝜽(k)2=𝜽(k1)+y(s)𝒙~(s)2 (2.22)
=𝜽(k1)2+2y(s)𝜽(k1)𝒙~(s)0+𝒙~(s)2 (2.23)
𝜽(k1)2+R2 (2.24)
kR2, (2.25)

novamente por indução matemática. Com isso, temos

1cos(β)kγ1kR=kγR (2.26)

e, portanto, k(R/γ)2. ∎

Aplicação

O Código 2 contém uma implementação do algoritmo de treinamento perceptron para o problema de classificação associado à operação lógica (e-lógico). Verifique!

Código 2: algo_perceptron.py
1import torch
2
3# modelo
4
5class Perceptron(torch.nn.Module):
6 def __init__(self):
7 super().__init__()
8 self.linear = torch.nn.Linear(2,1)
9
10 def forward(self, x):
11 z = self.linear(x)
12 y = torch.sign(z)
13 return y
14
15model = Perceptron()
16with torch.no_grad():
17 W = model.linear.weight
18 W.zero_()
19 b = model.linear.bias
20 b.zero_()
21
22# dados de treinamento
23X_train = torch.tensor([[1., 1.],
24 [1., -1.],
25 [-1., 1.],
26 [-1., -1.]])
27y_train = torch.tensor([1., -1., -1., -1.]).reshape(-1,1)
28
29## número de amostras
30ns = y_train.size(0)
31
32print("\nDados de treinamento")
33print("X_train =")
34print(X_train)
35print("y_train = ")
36print(y_train)
37
38# treinamento
39
40## num max épocas
41nepochs = 100
42
43for epoch in range(nepochs):
44
45 # update
46 not_updated = True
47 for s in range(ns):
48 y_est = model(X_train[s:s+1,:])
49 if (y_est*y_train[s] <= 0.):
50 with torch.no_grad():
51 W += y_train[s]*X_train[s,:]
52 b += y_train[s]
53 not_updated = False
54
55 if (not_updated):
56 print('Training ended.')
57 break
58
59
60# verificação
61print(f'W =\n{W}')
62print(f'b =\n{b}')
63y = model(X_train)
64print(f'y =\n{y}')

2.1.3 Exercícios

E. 2.1.1.

Seja um perceptron com função sinal como função de ativação e parâmetros 𝒘=(1,1) e b=0.5. Esboce a reta de separação associada a este modelo e indique os semiplanos τ+ e τ. Então, classifique os seguintes pontos utilizando este modelo: (1,0), (0,1), (1,1) e (1,1).

E. 2.1.2.

Crie um perceptron que emule a operação booleana do (ou-lógico). Treine o modelo utilizando:

  1. a)

    uma análise geométrica;

  2. b)

    o algoritmo de treinamento perceptron.

E. 2.1.3.

Crie um perceptron que emule a operação booleana do ¬ (negação-lógico). Treine o modelo utilizando:

  1. a)

    uma análise geométrica;

  2. b)

    o algoritmo de treinamento perceptron.

E. 2.1.4.

Crie um perceptron que emule a operação booleana ¬ (negação do e-lógico). Treine o modelo utilizando:

  1. a)

    uma análise geométrica;

  2. b)

    o algoritmo de treinamento perceptron.

E. 2.1.5.

Busque criar um perceptron que emule a operação lógica do xor (ou-exclusivo-lógico). É possível? Justifique sua resposta.

Tabela 2.3: Tabela verdade da operação booleana xor (ou-exclusivo-lógico).
A1 A2 A1 xor A2
V V F
V F V
F V V
F F F

Envie seu comentário

Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!

Opcional. Preencha seu nome para que eu possa lhe contatar.
Opcional. Preencha seu e-mail para que eu possa lhe contatar.
As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a política de uso de dados para mais informações.

Licença Creative Commons
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.

Pedro H A Konzen
| | | |