| | | |

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+⋯+wn−1xn−1+b, (2.2)

onde 𝒙=(x0,x1,…,xnin−1)∈ℝnin é o vetor de entrada, 𝜽=(𝒘,b)∈ℝnin+1 são os parâmetros da unidade, formados pelos pesos 𝒘=(w0,w1,…,wnin−1)∈ℝnin e pelo 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=A1∧A2. 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 de saídas esperadas. O critério de treinamento será definido mais adiante.

Tabela 2.1: Tabela verdade da operação booleana ∧ (e-lógico).
A1 A2 R:=A1∧A2
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=0−1,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=0ns−1, 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 entrada dada 𝒙. Isso consiste em determinar o método (de treinamento) para escolher os parâmetros 𝜽 adequados para esta tarefa. Vamos explorar mais sobre isso na sequência do texto; aqui, vamos empregar uma análise geométrica para escolher os parâmetros.

Lembrando que nosso modelo é

η⁢(𝒙;𝜽)=sign⁡(w0⁢x0+w1⁢x1+b), (2.8)

observamos que

w0⁢x0+w1⁢x1+b=0 (2.9)

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

τ+={𝒙∈ℝ2:w0⁢x0+w1⁢x1+b>0} (2.10)
τ−={𝒙∈ℝ2:w0⁢x0+w1⁢x1+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

w0⁢x0+w1⁢x1+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+x1−1) (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=0ns−1, onde ns é o número de amostras, 𝒙(s)∈ℝn e y(s)∈ℝ, s=0,1,…,ns. O algoritmo consiste no seguinte:

  1. 1.

    𝒘←𝟎, b←0.

  2. 2.

    Para e←1,…,ne:

    1. (a)

      Para s←0,…,ns−1:

      1. i.

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

        1. A.

          𝒘←𝒘+y(s)⁢𝒙(s)

        2. B.

          b←b+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,…,xnin−1⁢,1). Com isso, um conjunto D={𝒙~(s),y(s)}s=0ns−1 é linearmente separável, se existe 𝜽 tal que

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

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

Teorema 2.1.1.(Perceptron)

Seja dado um conjunto de treinamento D={𝒙~(s),y(s)}s=0ns−1, 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,…,ns−1, então o algoritmo de treinamento perceptron converge em no máximo (R/γ)2 correções.

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)⁢𝜽(k−1)⋅𝒙~(s)≤0. Com isso, temos

𝜽(k)⋅𝜽∗‖𝜽∗‖=(𝜽(k−1)+y(s)⁢𝒙~(s))⋅𝜽∗‖𝜽∗‖ (2.18)
=𝜽(k−1)⋅𝜽∗‖𝜽∗‖+y(s)𝒙~(s)⋅𝜽∗‖𝜽∗‖ (2.19)
≥𝜽(k−1)⋅𝜽∗‖𝜽∗‖+γ (2.20)
≥kγ, (2.21)

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

‖𝜽(k)‖2=‖𝜽(k−1)+y(s)⁢𝒙~(s)‖2 (2.22)
=∥𝜽(k−1)∥2+2⁢y(s)⁢𝜽(k−1)⋅𝒙~(s)⏟≤0+∥𝒙~(s)∥2 (2.23)
≤∥𝜽(k−1)∥2+R2 (2.24)
≤kR2, (2.25)

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

1≥cos⁡(β)≥k⁢γ⁢1k⁢R=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
| | | |