| | | | |

4.4 Integração de Funções

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

Em construção

O objetivo, aqui, é de treinarmos uma RNA para a computação da integral de uma função f: em um dado intervalo [a, b]. Mais precisamente, vamos treinar uma MLP 𝒩 tal que

axf(u)𝑑u𝒩(x). (4.33)

Do teorema fundamental do cálculo, temos que

𝒩(x)=𝒩(a)+axf(u)𝑑u (4.34)

com

𝒩(x)=f(x), (4.35)

sendo arbitrário o valor de 𝒩(a).

Logo, escolhendo um valor arbitrário para 𝒩(a), podemos treinar 𝒩 com base na função de perda

ε=1nss=1ns|𝒩(xs)f(xs)|2. (4.36)
Exemplo 4.4.1.

Vamos treinar uma rede para a computação de

0xcos(πu)𝑑u. (4.37)
1import torch
2
3# modelo
4## n camadas escondidas
5nh = 2
6## n neurônios por camada
7nn = 50
8## fun de ativação
9fh = torch.nn.Tanh()
10## arquitetura
11model = torch.nn.Sequential()
12model.add_module('layer_1', torch.nn.Linear(1,nn))
13model.add_module('fun_1', fh)
14for layer in range(2, nh+1):
15    model.add_module(f'layer_{layer}', torch.nn.Linear(nn,nn))
16    model.add_module(f'fun_{layer}', fh)
17model.add_module(f'layer_{nh+1}', torch.nn.Linear(nn,1))
18
19# otimizador
20optim = torch.optim.Adam(model.parameters(),
21                        lr = 1e-2)
22
23# treinamento
24ns = 100
25nepochs = 10000
26nout_loss = 100
27tol = 1e-5
28
29for epoch in range(nepochs):
30
31  # samples
32  X = 2.*torch.rand((ns,1)) - 1.
33
34  f_exp = torch.cos(torch.pi*X)
35
36  # forward
37  X.requires_grad = True
38  F = model(X)
39
40  f_est = torch.autograd.grad(
41    F, X,
42    grad_outputs=torch.ones_like(F),
43    retain_graph=True,
44    create_graph=True)[0]
45
46  # loss
47  loss = torch.mean((f_exp - f_est)**2)
48
49  if ((epoch % nout_loss) == 0):
50    print(f'epoch {epoch}: loss = {loss.item():.4e}')
51
52  if (loss.item() < tol):
53    print('onvergiu')
54    break
55
56  optim.zero_grad()
57  loss.backward()
58  optim.step()
Refer to caption
Figura 4.4: Computação da primitiva de cos(πx) no intervalo de [1,1]. Linha contínua: valores esperados y=1πsen(πx), para C=0. Linha tracejada: valores estimados y=𝒩(x).

Neste caso, podemos verificar a solução, uma vez que

1xcos(πu)𝑑u=1πsen(πx)+C, (4.38)

onde C é uma constante arbitrária. Na Figura 4.4, temos uma comparação entre o resultado estimado pela rede e o esperado. Observamos que a cada treinamento, a rede pode fornecer uma primitiva diferente.


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!