| | | | |

3.1 Modelo MLP

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

Uma perceptron multicamadas (MLP, do inglês, multilayer perceptron) é um tipo de rede neural artificial formada por composições de camadas de perceptrons. Consultamos a Figura 3.1.

Figura 3.1: Arquitetura de uma rede do tipo perceptron multicamadas (MLP).

Denotamos uma MLP de nl camadas por

𝒚=𝒩(𝒙;(W(l),𝒃(l),f(l))l=1nh+1), (3.1)

onde (W(l),𝒃(l),f(l)) é a tripa de pesos, biases e função de ativação da l-ésima camada da rede, l=1,2,,nh+1. Uma rede com essa arquitetura é dita ter uma camada de entrada, nh camadas escondidas e uma camada de saída.

A saída da rede é calculada por iteradas composições das camadas, i.e.

𝒂(l)=f(l)(W(l)𝒂(l1)+𝒃(l))𝒛(l), (3.2)

para l=1,2,,nh+1, denotando a entrada por 𝒙=:𝒂(0) e a saída por 𝒚=:𝒂(nh+1).

3.1.1 Treinamento

Em um treinamento supervisionado, tem-se um dado conjunto de treinamento {𝒙(s),𝒚(s)}s=1ns, com ns amostras. O treinamento da rede consiste em resolver o problema de minimização

min(W,𝒃){ε:=1nss=1nsε(s)(𝒚~(s),𝒚(s))} (3.3)

onde ε é uma dada função erro (em inglês, loss function) e ε(s) é uma medida do erro da saída estimada 𝒚~(s) da saída esperada 𝒚(s).

O problema de minimização pode ser resolvido por um método de declive e, de forma geral, consiste em:

  1. 1.

    W,𝒃 aproximações iniciais.

  2. 2.

    Para e1,,ne:

    1. (a)

      (W,𝒃)(W,𝒃)lr𝒅(W,𝒃ε)

onde, ne é o número de épocas, lr é uma dada taxa de aprendizagem (em inglês, learning rate)) e 𝒅=𝒅(W,𝒃ε) é o vetor direção, onde

W,𝒃ε :=(εW,ε𝒃) (3.4)
=1nss=1ns(ε(s)W,ε(s)𝒃) (3.5)

O cálculo dos gradientes pode ser feito por retropropagação (em inglês, backward). Para os pesos da última camada, temos77endnote: 7Com um cero abuso de linguagem devido à álgebra matricial envolvida.

ε(s)W(nh+1) =ε(s)𝒚𝒚𝒛(nh+1)𝒛(nh+1)W(nh+1) (3.6)
=ε(s)𝒚f(W(nh+1)𝒂(nh)+𝒃(nh+1))𝒂(nh). (3.7)

Para os pesos da penúltima camada, temos

ε(s)W(nh) =ε𝒚𝒚𝒛(nh+1)𝒛(nh+1)W(nh), (3.8)
=ε(s)𝒚f(𝒛(nh+1))×𝒛(nh+1)𝒂(nh)𝒂(nh)𝒛(nh)𝒛(nh)W(nh) (3.9)
=ε(s)𝒚f(𝒛(nh+1))W(nh+1)×f(𝒛(nh))𝒂(nh1) (3.10)

e assim, sucessivamente para as demais camadas da rede. Os gradientes em relação aos biases podem ser calculados de forma análoga.

3.1.2 Aplicação: Problema de Classificação XOR

Vamos desenvolver uma MLP que faça a operação xor (ou exclusivo). A rede recebe como entrada dois valores lógicos A1 e A2 (V, verdadeiro ou F, falso) e fornece como saída o valor lógico R=A1𝚡𝚘𝚛A2. Consultamos a tabela verdade:

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

Assumindo V=1 e F=1, podemos modelar o problema tendo entradas 𝒙=(x1,x2) e saída y como na seguinte tabela:

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

Modelo

Vamos usar uma MLP de estrutura 221 e com funções de ativação f(1)(𝒙)=tanh(𝒙) e f(2)(𝒙)=id(𝒙). Ou seja, nossa rede tem duas entradas, uma camada escondida com 2 unidades (função de ativação tangente hiperbólica) e uma camada de saída com uma unidade (função de ativação identidade).

Treinamento

Para o treinamento, vamos usar a função erro quadrático médio (em inglês, mean squared error)

ε:=1nss=1ns|y~(s)y(s)|2, (3.11)

onde y~(s)=𝒩(𝒙(s)) são os valores estimados e {𝒙(s),y(s)}s=1ns, ns=4, o conjunto de treinamento conforme na tabela acima.

Implementação

O seguinte código implementa a MLP com Método do Gradiente Descendente (DG) como otimizador do algoritmo de treinamento.

Código 6: mlp_xor.py
1import torch
2
3# modelo
4
5model = torch.nn.Sequential()
6model.add_module('layer_1', torch.nn.Linear(2,2))
7model.add_module('fun_1', torch.nn.Tanh())
8model.add_module('layer_2', torch.nn.Linear(2,1))
9
10
11# treinamento
12
13## optimizador
14optim = torch.optim.SGD(model.parameters(),
15                        lr=5e-1)
16
17## dados de treinamento
18X_train = torch.tensor([[1., 1.],
19                        [1., -1.],
20                        [-1., 1.],
21                        [-1., -1.]])
22y_train = torch.tensor([-1., 1., 1., -1.]).reshape(-1,1)
23
24print("\nDados de treinamento")
25print("X_train =")
26print(X_train)
27print("y_train = ")
28print(y_train)
29
30## num max épocas
31nepochs = 5000
32tol = 1e-3
33
34for epoch in range(nepochs):
35
36    # forward
37    y_est = model(X_train)
38
39    # função erro
40    loss = torch.mean((y_est - y_train)**2)
41
42    print(f'{epoch}: {loss.item():.4e}')
43
44    # critério de parada
45    if (loss.item() < tol):
46        break
47
48    # backward
49    optim.zero_grad()
50    loss.backward()
51    optim.step()
52
53
54# verificação
55y = model(X_train)
56print(f'y_est = {y}')

3.1.3 Exercícios

E. 3.1.1.

Faça uma nova versão do Código , de forma que a MLP tenha tangente hiperbólica como função de ativação na sua saída.

E. 3.1.2.

Faça uma nova versão do Código  usando o método do gradiente estocástico (SGD) como otimizador no algoritmo de treinamento.

E. 3.1.3.

Crie uma MLP 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. 3.1.4.

Crie uma MLP 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. 3.1.5.

Considere uma MLP com nl=3 camadas escondidas. Sendo ε uma dada função erro, calcule:

  1. 1.

    εWnl2.

  2. 2.

    ε𝒃nl2.


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!