Què són les Xarxes Neuronals Recurrents (RNNs)?
Les Xarxes Neuronals Recurrents (RNNs) són un tipus de xarxa neuronal especialment dissenyada per treballar amb dades seqüencials. A diferència de les xarxes neuronals tradicionals, les RNNs tenen connexions recurrents que permeten que la informació persisteixi. Això les fa ideals per a tasques on l'ordre de les dades és important, com ara el processament del llenguatge natural (NLP), la predicció de sèries temporals i el reconeixement de veu.
Característiques Clau de les RNNs:
- Memòria: Les RNNs poden recordar informació de passos anteriors en la seqüència, cosa que les fa adequades per a dades seqüencials.
- Pesos Compartits: Els mateixos pesos i biaixos s'apliquen a cada element de la seqüència, reduint la complexitat del model.
- Capacitat de Processar Seqüències de Longitud Variable: Les RNNs poden manejar seqüències de diferents longituds, cosa que és útil per a moltes aplicacions reals.
Arquitectura Bàsica d'una RNN
Una RNN típica consisteix en una capa recurrent que processa una seqüència d'entrades. Cada unitat recurrent pren una entrada de la seqüència i l'estat ocult de l'últim pas de temps per produir una sortida i un nou estat ocult.
Fórmules Clau:
- Estat Ocult: \( h_t = \sigma(W_{hx} x_t + W_{hh} h_{t-1} + b_h) \)
- Sortida: \( y_t = W_{hy} h_t + b_y \)
On:
- \( x_t \) és l'entrada en el pas de temps \( t \).
- \( h_t \) és l'estat ocult en el pas de temps \( t \).
- \( W_{hx} \), \( W_{hh} \), i \( W_{hy} \) són matrius de pesos.
- \( b_h \) i \( b_y \) són biaixos.
- \( \sigma \) és una funció d'activació, com ara tanh o ReLU.
Implementació Bàsica d'una RNN amb PyTorch
A continuació, es mostra un exemple bàsic d'implementació d'una RNN utilitzant PyTorch.
Exemple de Codi:
import torch
import torch.nn as nn
class SimpleRNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(SimpleRNN, self).__init__()
self.hidden_size = hidden_size
self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
h0 = torch.zeros(1, x.size(0), self.hidden_size).to(x.device)
out, _ = self.rnn(x, h0)
out = self.fc(out[:, -1, :])
return out
# Paràmetres del model
input_size = 10
hidden_size = 20
output_size = 1
# Creació del model
model = SimpleRNN(input_size, hidden_size, output_size)
# Mostra del model
print(model)Explicació del Codi:
- Definició de la Classe: Definim una classe
SimpleRNNque hereta denn.Module. - Inicialització: En el mètode
__init__, inicialitzem la capa RNN i una capa lineal per a la sortida. - Forward Pass: En el mètode
forward, inicialitzem l'estat oculth0amb zeros, passem l'entrada a través de la capa RNN i després a través de la capa lineal per obtenir la sortida final.
Exercici Pràctic
Exercici:
Implementa una RNN per predir la següent paraula en una seqüència de text. Utilitza un conjunt de dades de text senzill i entrena la RNN per predir la següent paraula donada una seqüència de paraules.
Solució:
import torch
import torch.nn as nn
import torch.optim as optim
from torchtext.legacy.data import Field, TabularDataset, BucketIterator
# Definició del camp de text
TEXT = Field(tokenize='spacy', lower=True)
# Creació del conjunt de dades
datafields = [("text", TEXT)]
train_data, valid_data = TabularDataset.splits(
path=".", train="train.csv", validation="valid.csv", format="csv", fields=datafields
)
# Construcció del vocabulari
TEXT.build_vocab(train_data, min_freq=2)
# Creació dels iteradors
train_iterator, valid_iterator = BucketIterator.splits(
(train_data, valid_data), batch_size=32, device=torch.device('cuda' if torch.cuda.is_available() else 'cpu')
)
class TextRNN(nn.Module):
def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim):
super(TextRNN, self).__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim)
self.rnn = nn.RNN(embedding_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
embedded = self.embedding(x)
h0 = torch.zeros(1, x.size(0), self.hidden_dim).to(x.device)
out, _ = self.rnn(embedded, h0)
out = self.fc(out[:, -1, :])
return out
# Paràmetres del model
vocab_size = len(TEXT.vocab)
embedding_dim = 100
hidden_dim = 256
output_dim = vocab_size
# Creació del model
model = TextRNN(vocab_size, embedding_dim, hidden_dim, output_dim)
# Definició de la pèrdua i l'optimitzador
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters())
# Entrenament del model
for epoch in range(10):
model.train()
for batch in train_iterator:
optimizer.zero_grad()
predictions = model(batch.text)
loss = criterion(predictions, batch.text[:, 1:].contiguous().view(-1))
loss.backward()
optimizer.step()
print(f'Epoch {epoch+1}, Loss: {loss.item()}')
print("Entrenament completat!")Explicació del Codi:
- Preparació del Conjunt de Dades: Utilitzem
torchtextper carregar i processar el conjunt de dades de text. - Definició del Model: Definim una classe
TextRNNque inclou una capa d'embeddings, una capa RNN i una capa lineal. - Entrenament: Entrenem el model utilitzant l'optimitzador Adam i la pèrdua de cross-entropy.
Conclusió
En aquesta secció, hem introduït les Xarxes Neuronals Recurrents (RNNs) i hem vist com implementar una RNN bàsica amb PyTorch. Les RNNs són molt potents per a tasques que impliquen dades seqüencials, i la seva capacitat de recordar informació passada les fa ideals per a aplicacions com el processament del llenguatge natural i la predicció de sèries temporals. En la següent secció, explorarem com construir una RNN des de zero amb més detall.
PyTorch: De Principiant a Avançat
Mòdul 1: Introducció a PyTorch
- Què és PyTorch?
- Configuració de l'Entorn
- Operacions Bàsiques amb Tensor
- Autograd: Diferenciació Automàtica
Mòdul 2: Construcció de Xarxes Neuronals
- Introducció a les Xarxes Neuronals
- Creació d'una Xarxa Neuronal Simple
- Funcions d'Activació
- Funcions de Pèrdua i Optimització
Mòdul 3: Entrenament de Xarxes Neuronals
- Càrrega i Preprocessament de Dades
- Bucle d'Entrenament
- Validació i Prova
- Desament i Càrrega de Models
Mòdul 4: Xarxes Neuronals Convolucionals (CNNs)
- Introducció a les CNNs
- Construcció d'una CNN des de Zero
- Aprenentatge per Transferència amb Models Preentrenats
- Ajust Fi de les CNNs
Mòdul 5: Xarxes Neuronals Recurrents (RNNs)
- Introducció a les RNNs
- Construcció d'una RNN des de Zero
- Xarxes de Memòria a Llarg i Curt Termini (LSTM)
- Unitats Recurrents Gated (GRUs)
Mòdul 6: Temes Avançats
- Xarxes Generatives Adversàries (GANs)
- Aprenentatge per Reforç amb PyTorch
- Desplegament de Models PyTorch
- Optimització del Rendiment
