| | | | |

2.2 Algoritmo de Treinamento

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

Na seção anterior, desenvolvemos dois modelos de neurônios para problemas diferentes, um de classificação e outro de regressão. Em cada caso, utilizamos algoritmos de treinamento diferentes. Agora, vamos estudar algoritmos de treinamentos mais gerais44endnote: 4Aqui, vamos explorar apenas algoritmos de treinamento supervisionado., que podem ser aplicados a ambos os problemas.

Ao longo da seção, vamos considerar o modelo de neurônio

y~=𝒩(𝒙;(𝒘,b))=f(𝒘𝒙+b)z, (2.23)

com dada função de ativação f:, sendo os vetores de entrada 𝒙 e dos pesos 𝒘 de tamanho nin. A pré-ativação do neurônio é denotada por

z:=𝒘𝒙+b (2.24)

Fornecido um conjunto de treinamento {(𝒙(s),y(s))}1ns, com ns amostras, o objetivo é calcular os parâmetros (𝒘,b) que minimizam a função erro quadrático médio

ε(𝒘,b) :=1nss=1ns(y~(s)y(s))2 (2.25)
=1nss=1nsε(s) (2.26)

onde y~(s)=𝒩(𝒙(s);(𝒘,b)) é o valor estimado pelo modelo e y(s) é o valor esperado para a s-ésima amostra. A função erro para a s-ésima amostra é

ε(s):=(y~(s)y(s))2. (2.27)

Ou seja, o treinamento consiste em resolver o seguinte problema de otimização

min(𝒘,b)ε(𝒘,b) (2.28)

Para resolver este problema de otimização, vamos empregar o Método do Gradiente Descendente.

2.2.1 Método do Gradiente Descendente

O Método do Gradiente Descendente (GD, em inglês, Gradiente Descent Method) é um método de declive. Aplicado ao nosso modelo de Perceptron consiste no seguinte algoritmo:

  1. 1.

    (𝒘,b) aproximação inicial.

  2. 2.

    Para e1,,ne:

    1. (a)

      (𝒘,b)(𝒘,b)lrε(𝒘,b)

onde, ne é o número de épocas, lr é uma dada taxa de aprendizagem (lr, do inglês, learning rate) e o gradiente é

ε(𝒘,b):=(εw1,,εwnin,εb) (2.29)

O cálculo do gradiente para os pesos 𝒘 pode ser feito como segue55endnote: 5Aqui, há um abuso de linguagem ao não se observar as dimensões dos operandos matriciais.

ε𝒘 =𝒘[1nss=1nsε(s)] (2.30)
=1nss=1nsε(s)y~(s)y~(s)𝒘 (2.31)
ε𝒘 =1nss=1nsε(s)y~(s)y~(s)z(s)z(s)𝒘 (2.32)

Observando que

ε(s)y~(s)=2(y~(s)y(s)) (2.33)
y~(s)z(s)=f(z(s)) (2.34)
z(s)𝒘=𝒙(s) (2.35)

obtemos

ε𝒘=1nss=1ns2(y~(s)y(s))f(z(s))𝒙(s) (2.36)
εb =1nss=1nsε(s)y~(s)y~(s)z(s)z(s)b (2.37)
εb =1nss=1ns2(y~(s)y(s))f(z(s))1 (2.38)

Aplicação: Problema de Classificação

Na Subseção 2.1.1, treinamos um perceptron para o problema de classificação do e-lógico. A função de ativação f(x)=sign(x) não é adequada para a aplicação do Método GD, pois f(x)0 para x0. Aqui, vamos usar

f(x)=tanh(x). (2.39)
Código 4: perceptron_gd.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.tanh(z)
13        return y
14
15model = Perceptron()
16
17# treinamento
18
19## optimizador
20optim = torch.optim.SGD(model.parameters(), lr=5e-1)
21
22## função erro
23loss_fun = torch.nn.MSELoss()
24
25## dados de treinamento
26X_train = torch.tensor([[1., 1.],
27                  [1., -1.],
28                  [-1., 1.],
29                  [-1., -1.]])
30y_train = torch.tensor([1., -1., -1., -1.]).reshape(-1,1)
31
32print("\nDados de treinamento")
33print("X_train =")
34print(X_train)
35print("y_train = ")
36print(y_train)
37
38## num max épocas
39nepochs = 1000
40tol = 1e-3
41
42for epoch in range(nepochs):
43
44    # forward
45    y_est = model(X_train)
46
47    # erro
48    loss = loss_fun(y_est, y_train)
49
50    print(f'{epoch}: {loss.item():.4e}')
51
52    # critério de parada
53    if (loss.item() < tol):
54        break
55
56    # backward
57    optim.zero_grad()
58    loss.backward()
59    optim.step()
60
61
62# verificação
63y = model(X_train)
64print(f'y_est = {y}')

2.2.2 Método do Gradiente Estocástico

O Método do Gradiente Estocástico (SGD, do inglês, Stochastic Gradient Descent Method) é um variação do Método GD. A ideia é atualizar os parâmetros do modelo com base no gradiente do erro de cada amostra (ou um subconjunto de amostras66endnote: 6Nest caso, é conhecido como Batch SGD.). A estocasticidade é obtida da randomização com que as amostras são escolhidas a cada época. O algoritmos consiste no seguinte:

  1. 1.

    w, b aproximações inicial.

  2. 2.

    Para e1,,ne:

    1. 1.1.

      Para s𝚛𝚊𝚗𝚍𝚘𝚖(1,,ns):

      (𝒘,b)(𝒘,b)lrε(s)(𝒘,b) (2.40)

Aplicação: Problema de Classificação

Código 5: perceptron_sgd.py
1import torch
2import numpy as np
3
4# modelo
5
6class Perceptron(torch.nn.Module):
7    def __init__(self):
8        super().__init__()
9        self.linear = torch.nn.Linear(2,1)
10
11    def forward(self, x):
12        z =  self.linear(x)
13        y = torch.tanh(z)
14        return y
15
16model = Perceptron()
17
18# treinamento
19
20## optimizador
21optim = torch.optim.SGD(model.parameters(), lr=5e-1)
22
23## função erro
24loss_fun = torch.nn.MSELoss()
25
26## dados de treinamento
27X_train = torch.tensor([[1., 1.],
28                  [1., -1.],
29                  [-1., 1.],
30                  [-1., -1.]])
31y_train = torch.tensor([1., -1., -1., -1.]).reshape(-1,1)
32
33## num de amostras
34ns = y_train.size(0)
35
36print("\nDados de treinamento")
37print("X_train =")
38print(X_train)
39print("y_train = ")
40print(y_train)
41
42## num max épocas
43nepochs = 5000
44tol = 1e-3
45
46for epoch in range(nepochs):
47
48    # forward
49    y_est = model(X_train)
50
51    # erro
52    loss = loss_fun(y_est, y_train)
53
54    print(f'{epoch}: {loss.item():.4e}')
55
56    # critério de parada
57    if (loss.item() < tol):
58        break
59
60    # backward
61    for s in torch.randperm(ns):
62        loss_s = (y_est[s,:] - y_train[s,:])**2
63        optim.zero_grad()
64        loss_s.backward()
65        optim.step()
66        y_est = model(X_train)
67
68
69# verificação
70y = model(X_train)
71print(f'y_est = {y}')

2.2.3 Exercícios

E. 2.2.1.

Calcule a derivada da função de ativação

f(x)=tanh(x). (2.41)
Resposta.

(tanhx)=1tanh2x

E. 2.2.2.

Crie um perceptron para emular a operação lógica (e-lógico). No treinamento, use como otimizador:

  1. a)

    Método GD.

  2. b)

    Método SGD.

E. 2.2.3.

Crie um perceptron para emular a operação lógica (ou-lógico). No treinamento, use como otimizador:

  1. a)

    Método GD.

  2. b)

    Método SGD.

E. 2.2.4.

Crie um perceptron que se ajuste ao seguinte conjunto de dados:

s x(s) y(s)
1 0.5 1.2
2 1.0 2.1
3 1.5 2.6
4 2.0 3.6

No treinamento, use como otimizador:

  1. a)

    Método GD.

  2. b)

    Método SGD.


Envie seu comentário

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. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!