| | | |

Deep Learning para Equações Diferenciais Parciais

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

2.1 Unidade de processamento

A unidade básica de processamento (neurônio artificial) do tipo perceptron segue o esquema dado na Figura 2.1. Consiste na composição de uma função de ativação111Originalmente, 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,,xn1)n é o vetor de entrada, 𝜽=(𝒘,b)n+1 são of parâmetros da unidade, formados pelos pesos 𝒘=(w0,w1,,wn1)n e o bias b. Escolhida uma função de ativação, a saída do neurônio é computada por

y=𝒩(𝒙;𝜽) (2.3)
:=φ(z)=φ(𝒘𝒙+b) (2.4)
Figura 2.1: Esquema de um perceptron (unidade básica de processamento).

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. O perceptron é um classificador linear, i.e. é capaz de classificar dados que sejam linearmente separáveis.

2.1.1 Um problema de classificação

Vamos desenvolver um perceptron que emule a operação booleana222George Boole, 1815 - 1864, matemático britânico. Fonte: Wikipédia: George Boole. (e-lógico). Mais especificamente, dados dois valores booleanos A1 e A2 (V, verdadeiro ou F, falso), esperamos que nosso neurônio forneça como saída o valor booleano R=A1A2. Lembremos a tabela verdade da operação :

A1 A2 R
V V V
V F F
F V F
F F F

Modelo

Nosso modelo será um perceptron com duas entradas 𝒙{1,1}2 e a função sinal

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

como função de ativação. Com isso, nosso modelo fornece a seguinte saída

y=𝒩(𝒙;𝜽), (2.7)
=sign(𝒘𝒙+b), (2.8)

onde 𝜽=(w0,w1,b)3 são parâmetros a determinar. A ideia, aqui, é que o valor 1 esteja associado ao valor lógico F (falso) e o valor 1 ao valor lógico V (verdadeiro).

Pré-processamento

Precisamos pré-processar os dados do problema de forma a compatibilizá-los com o modelo. Assumindo que valor booleano F (falso) seja associado a 1 e que valor booleano V (verdadeiro) a 1, temos os seguintes dados de treinamento para o nosso modelo de neurônio

x1 x2 y
1 1 1
1 -1 -1
-1 1 -1
-1 -1 -1

Treinamento

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

Lembrando que nosso modelo é dado por

𝒩(𝒙;(𝒘,b))=sign(w0x0+w1x1+b), (2.9)

observamos que

w0x0+w1x1+b=0 (2.10)

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.11)
τ={𝒙2:w0x0+w1x1+b<0} (2.12)

O primeiro está na direção do vetor normal à reta 𝒘=(w0,w1) e o segundo no sentido oposto. Com isso, o problema de treinar nosso neurônio para o problema de classificação consiste em encontrar a reta

w0x0+w1x1+b=0 (2.13)

de forma que o ponto (1,1) esteja 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 de neurônio. Por exemplo, podemos escolher

𝒘=(1,1), (2.14)
b=1. (2.15)

Com isso, nosso perceptron é

𝒩(𝒙)=sign(x0+x11) (2.16)

Verifique que o modelo fornece a saída esperada para cada dada entrada 𝒙.

Implementação

O Código 1 é uma implementação deste modelo de neurônio. 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 de um neurônio para fazer a classificação de dados linearmente separáveis. Trata-se de um algoritmo para o treinamento supervisionado de um modelo, i.e.. a calibração dos pesos é feita com base em um dado conjunto de amostras de treinamento.

Seja dado um conjunto de treinamento {𝒙(s),y(s)}s=0ns1, onde ns é o número de amostras. 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 consiste no 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,,xn1,1). Com isso, um conjunto D={𝒙~(s),y(s)}s=0ns1 é linearmente separável, se existe 𝜽 tal que

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

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.18)

e 𝒙~sR, para 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.19)
=𝜽(k)𝜽𝜽1𝜽(k). (2.20)

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.21)
=𝜽(k1)𝜽𝜽+y(s)𝒙~(s)𝜽𝜽 (2.22)
𝜽(k1)𝜽𝜽+γ (2.23)
kγ, (2.24)

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

𝜽(k)2=𝜽(k1)+y(s)𝒙~(s)2 (2.25)
=𝜽(k1)2+2y(s)𝜽(k1)𝒙~(s)0+𝒙~(s)2 (2.26)
𝜽(k1)2+R2 (2.27)
kR2, (2.28)

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

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

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.

Dado um perceptron com 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).

A1 A2 A1A2
V V V
V F V
F V V
F F F

Primeiramente, treine-o utilizando uma análise geométrica. Depois, implemente o algoritmo de treinamento perceptron para treinar os parâmetros do modelo.

E. 2.1.3.

Crie um perceptron que emule a operação booleana do ¬ (não-lógico).

A ¬A
V F
F V

Primeiramente, treine-o utilizando uma análise geométrica. Depois, implemente o algoritmo de treinamento perceptron para treinar os parâmetros do modelo.

E. 2.1.4.

Crie um perceptron que emule a operação booleana ¬ (nand-lógico).

A1 A2 ¬(A1A2)
V V F
V F V
F V V
F F V

Primeiramente, treine-o utilizando uma análise geométrica. Depois, implemente o algoritmo de treinamento perceptron para treinar os parâmetros do modelo.

E. 2.1.5.

Crie um perceptron que emule a operação booleana ¬ (nor-lógico).

A1 A2 ¬(A1A2)
V V F
V F F
F V F
F F V

Primeiramente, treine-o utilizando uma análise geométrica. Depois, implemente o algoritmo de treinamento perceptron para treinar os parâmetros do modelo.

E. 2.1.6.

Busque criar um perceptron que emule a operação lógica do xor.

A1 A2 A1 xor A2
V V F
V F V
F V V
F F F

É possível? Justifique sua resposta.

E. 2.1.7.

Crie um perceptron para classificar os seguintes dados

x0 x1 x2 y
1.0 1.0 0.0 1
1.0 0.5 0.5 1
0.8 0.2 0.0 1
0.0 0.0 0.0 -1
0.2 0.1 0.0 -1
-0.5 0.4 0.2 -1

Treine-o utilizando o algoritmo de treinamento perceptron. Então, faça a interpretação geométrica do modelo encontrado.

E. 2.1.8.

No E.2.1.6, vimos que não é possível criar um perceptron para emular a operação lógica do xor. Assumindo que 1 esteja associado ao valor V e 1 ao valor 1, podemos contornar esta limitação adicionando uma nova entrada x3 ao modelo, que seja dada por x3=x0x1. Verifique e explique como isso é possível. Implemente o modelo e treine-o utilizando o algoritmo de treinamento perceptron.

E. 2.1.9.

Dado um perceptron y~=𝒩(𝒙;𝜽). Mostre que o valor absoluto de

y𝜽𝒙~𝜽 (2.31)

é a distância do ponto 𝒙~ à reta dada por 𝜽𝒙~=0. Ainda, mostre que o sinal de (2.31) está associado ao semiplano onde o ponto 𝒙~ está localizado.

E. 2.1.10.

Considerando um conjunto de dados linearmente separáveis, verifique que o algoritmo de treinamento perceptron é convergente para uma escolha arbitrária de parâmetros iniciais.Faça a devida modificação no código do Código 2 e verifique a convergência do algoritmo para diferentes escolhas de parâmetros iniciais.


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
| | | |