Introducció

En aquest tema, explorarem els conceptes d'optimització i funció de pèrdua, que són fonamentals per entrenar xarxes neuronals. La funció de pèrdua mesura com de bé està funcionant el model, mentre que els algoritmes d'optimització ajusten els pesos del model per minimitzar aquesta pèrdua.

Conceptes Clau

Funció de Pèrdua

La funció de pèrdua (o funció de cost) és una mètrica que quantifica la discrepància entre les prediccions del model i els valors reals. L'objectiu de l'entrenament és minimitzar aquesta pèrdua.

Tipus de Funcions de Pèrdua

  1. Error Quadràtic Mitjà (MSE): \[ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 \] Utilitzada principalment en problemes de regressió.

  2. Entropia Creuada (Cross-Entropy): \[ L = -\frac{1}{n} \sum_{i=1}^{n} \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right] \] Utilitzada en problemes de classificació binària.

  3. Entropia Creuada Categòrica: \[ L = -\sum_{i=1}^{n} \sum_{j=1}^{k} y_{ij} \log(\hat{y}_{ij}) \] Utilitzada en problemes de classificació multiclasse.

Algoritmes d'Optimització

Els algoritmes d'optimització ajusten els pesos del model per minimitzar la funció de pèrdua. Els més comuns són:

  1. Gradient Descent: \[ \theta = \theta - \alpha \nabla_\theta J(\theta) \] On \(\theta\) són els pesos del model, \(\alpha\) és la taxa d'aprenentatge, i \(\nabla_\theta J(\theta)\) és el gradient de la funció de pèrdua respecte als pesos.

  2. Stochastic Gradient Descent (SGD): Actualitza els pesos utilitzant un sol exemple de dades a cada iteració, el que pot accelerar l'entrenament però introduir més variabilitat.

  3. Mini-batch Gradient Descent: Una combinació de Gradient Descent i SGD, utilitzant petits lots de dades per actualitzar els pesos.

  4. Optimitzadors Avançats:

    • Adam: Combina les millors propietats de AdaGrad i RMSProp.
    • RMSProp: Ajusta la taxa d'aprenentatge per cada paràmetre.
    • AdaGrad: Ajusta la taxa d'aprenentatge basant-se en la freqüència de les actualitzacions dels pesos.

Exemples Pràctics

Implementació de la Funció de Pèrdua i Optimització en Python

import numpy as np

# Funció de pèrdua MSE
def mse_loss(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)

# Gradient Descent
def gradient_descent(X, y, learning_rate=0.01, epochs=1000):
    m, n = X.shape
    theta = np.zeros(n)
    for epoch in range(epochs):
        y_pred = X.dot(theta)
        loss = mse_loss(y, y_pred)
        gradient = (2/m) * X.T.dot(y_pred - y)
        theta -= learning_rate * gradient
        if epoch % 100 == 0:
            print(f'Epoch {epoch}, Loss: {loss}')
    return theta

# Exemple d'ús
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
y = np.dot(X, np.array([1, 2])) + 3

theta = gradient_descent(X, y)
print(f'Weights: {theta}')

Explicació del Codi

  1. Funció de pèrdua MSE: Calcula l'error quadràtic mitjà entre les prediccions i els valors reals.
  2. Gradient Descent: Actualitza els pesos del model per minimitzar la funció de pèrdua. El codi imprimeix la pèrdua cada 100 iteracions per monitoritzar l'entrenament.
  3. Exemple d'ús: Genera dades sintètiques i aplica Gradient Descent per trobar els pesos òptims.

Exercicis Pràctics

Exercici 1: Implementar la funció de pèrdua d'entropia creuada

Implementa la funció de pèrdua d'entropia creuada per un problema de classificació binària.

def binary_cross_entropy_loss(y_true, y_pred):
    epsilon = 1e-15
    y_pred = np.clip(y_pred, epsilon, 1 - epsilon)
    return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))

# Exemple d'ús
y_true = np.array([1, 0, 1, 1])
y_pred = np.array([0.9, 0.1, 0.8, 0.7])
loss = binary_cross_entropy_loss(y_true, y_pred)
print(f'Binary Cross-Entropy Loss: {loss}')

Solució

def binary_cross_entropy_loss(y_true, y_pred):
    epsilon = 1e-15
    y_pred = np.clip(y_pred, epsilon, 1 - epsilon)
    return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))

# Exemple d'ús
y_true = np.array([1, 0, 1, 1])
y_pred = np.array([0.9, 0.1, 0.8, 0.7])
loss = binary_cross_entropy_loss(y_true, y_pred)
print(f'Binary Cross-Entropy Loss: {loss}')

Resum

En aquesta secció, hem après sobre la funció de pèrdua i els algoritmes d'optimització, que són essencials per entrenar xarxes neuronals. Hem explorat diferents tipus de funcions de pèrdua i algoritmes d'optimització, i hem implementat exemples pràctics en Python. Aquests conceptes són fonamentals per comprendre com les xarxes neuronals aprenen i milloren amb el temps.

© Copyright 2024. Tots els drets reservats