Les funcions d'activació són components essencials en les xarxes neuronals, ja que introdueixen no-linealitat en el model, permetent que la xarxa aprengui relacions complexes entre les dades d'entrada i sortida. En aquesta secció, explorarem les funcions d'activació més comunes utilitzades en les xarxes neuronals.
Objectius d'Aprenentatge
- Comprendre la importància de les funcions d'activació.
- Conèixer les funcions d'activació més utilitzades.
- Implementar funcions d'activació en PyTorch.
- Importància de les Funcions d'Activació
Les funcions d'activació transformen la sortida lineal d'una neurona en una sortida no-lineal. Sense aquestes funcions, una xarxa neuronal, independentment del nombre de capes, es comportaria com un model lineal. Les funcions d'activació permeten que la xarxa aprengui patrons complexos i no-lineals.
- Funcions d'Activació Comunes
2.1. Sigmoid
La funció sigmoid és una funció logística que mapeja qualsevol valor real a un rang entre 0 i 1.
Matemàticament: \[ \sigma(x) = \frac{1}{1 + e^{-x}} \]
Propietats:
- Sortida entre 0 i 1.
- Bona per a la sortida de probabilitats.
- Pot patir de gradients que desapareixen.
Implementació en PyTorch:
import torch import torch.nn as nn sigmoid = nn.Sigmoid() x = torch.tensor([-1.0, 0.0, 1.0]) output = sigmoid(x) print(output)
2.2. Tanh
La funció tanh (tangent hiperbòlica) mapeja qualsevol valor real a un rang entre -1 i 1.
Matemàticament: \[ \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} \]
Propietats:
- Sortida entre -1 i 1.
- Centrada en zero, el que pot ajudar a la convergència.
- També pot patir de gradients que desapareixen.
Implementació en PyTorch:
2.3. ReLU (Rectified Linear Unit)
La funció ReLU és una de les funcions d'activació més utilitzades en xarxes neuronals profundes.
Matemàticament: \[ \text{ReLU}(x) = \max(0, x) \]
Propietats:
- Simple i eficient.
- No pateix de gradients que desapareixen.
- Pot patir de neurones mortes (valors que queden a zero).
Implementació en PyTorch:
2.4. Leaky ReLU
La funció Leaky ReLU és una variant de la ReLU que permet un petit gradient quan l'entrada és negativa.
Matemàticament:
\[ \text{Leaky ReLU}(x) = \begin{cases}
x & \text{si } x > 0
\alpha x & \text{si } x \leq 0
\end{cases} \]
Propietats:
- Evita el problema de neurones mortes.
- \(\alpha\) és un petit valor positiu (per exemple, 0.01).
Implementació en PyTorch:
2.5. Softmax
La funció Softmax es sol utilitzar a la capa de sortida per a problemes de classificació multiclasse.
Matemàticament: \[ \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} \]
Propietats:
- Converteix les sortides en probabilitats.
- La suma de les sortides és 1.
Implementació en PyTorch:
- Implementació en una Xarxa Neuronal
Vegem com utilitzar aquestes funcions d'activació en una xarxa neuronal simple amb PyTorch.
import torch import torch.nn as nn import torch.optim as optim # Definim una xarxa neuronal simple class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(10, 50) self.relu = nn.ReLU() self.fc2 = nn.Linear(50, 1) self.sigmoid = nn.Sigmoid() def forward(self, x): x = self.fc1(x) x = self.relu(x) x = self.fc2(x) x = self.sigmoid(x) return x # Creem una instància de la xarxa model = SimpleNN() # Definim una pèrdua i un optimitzador criterion = nn.BCELoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # Exemple de dades d'entrada inputs = torch.randn(1, 10) labels = torch.tensor([1.0]) # Forward pass outputs = model(inputs) loss = criterion(outputs, labels) # Backward pass i optimització optimizer.zero_grad() loss.backward() optimizer.step() print(f'Sortida: {outputs.item()}, Pèrdua: {loss.item()}')
Exercicis Pràctics
- Implementa una xarxa neuronal amb la funció d'activació Tanh en lloc de ReLU.
- Experimenta amb Leaky ReLU canviant el valor de \(\alpha\). Observa com afecta l'entrenament.
- Utilitza la funció Softmax en una xarxa per a un problema de classificació multiclasse.
Solucions
Exercici 1: Implementació amb Tanh
class SimpleNN_Tanh(nn.Module): def __init__(self): super(SimpleNN_Tanh, self).__init__() self.fc1 = nn.Linear(10, 50) self.tanh = nn.Tanh() self.fc2 = nn.Linear(50, 1) self.sigmoid = nn.Sigmoid() def forward(self, x): x = self.fc1(x) x = self.tanh(x) x = self.fc2(x) x = self.sigmoid(x) return x
Exercici 2: Experimentació amb Leaky ReLU
class SimpleNN_LeakyReLU(nn.Module): def __init__(self, alpha=0.01): super(SimpleNN_LeakyReLU, self).__init__() self.fc1 = nn.Linear(10, 50) self.leaky_relu = nn.LeakyReLU(alpha) self.fc2 = nn.Linear(50, 1) self.sigmoid = nn.Sigmoid() def forward(self, x): x = self.fc1(x) x = self.leaky_relu(x) x = self.fc2(x) x = self.sigmoid(x) return x
Exercici 3: Classificació Multiclasse amb Softmax
class SimpleNN_Softmax(nn.Module): def __init__(self): super(SimpleNN_Softmax, self).__init__() self.fc1 = nn.Linear(10, 50) self.relu = nn.ReLU() self.fc2 = nn.Linear(50, 3) # Suposem 3 classes self.softmax = nn.Softmax(dim=1) def forward(self, x): x = self.fc1(x) x = self.relu(x) x = self.fc2(x) x = self.softmax(x) return x
Resum
En aquesta secció, hem après sobre les funcions d'activació més comunes utilitzades en les xarxes neuronals, incloent Sigmoid, Tanh, ReLU, Leaky ReLU i Softmax. Hem vist com implementar-les en PyTorch i com utilitzar-les en una xarxa neuronal simple. Les funcions d'activació són crucials per introduir no-linealitat en el model i permetre que la xarxa aprengui relacions complexes.
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