Herramientas de usuario

Herramientas del sitio


clase:iabd:pia:2eval:tema08

8. Optimización de redes neuronales

Sobreajuste

El sobreajuste (en inglés Overfitting) es cuando nuestro modelo, en vez de aprender lo que hace es memorizar los resultados. Tambien existe el concepto de subajuste (en inglés underfitting) que es cuando el modelo no es lo suficientemente ponente para adecuarse a los datos. En redes neuronales suele darse menos el underfitting ya que las redes las podemos haces bastantes complejos y solemos pecar de ello.

¿Como podemos evitar el sobre ajuste? Hay varias formas:

  • Regularización
  • Dropout

Y otras técnicas para mejorar la red son:

  • Normalization
  • Tamaño de Batch
  • Parada anticipada
  • Validación cruzada
  • Mejor modelo

Mas información:

Regularización

Para hacer el modelo mas sencillo, la regularización intenta que los pesos sean mas pequeños. En una red neuronal tenemos una serie de pesos. w. Si penalizamos la función de pérdida cuando los pesos son mas grandes, habremos "hecho" la regularización.

Se consigue que el tener el w muy bajo esa neurona "no exista" y por lo tanto simplifica el modelo.

from tensorflow.keras import layers
from tensorflow.keras import regularizers

layer = layers.Dense(
    units=64,
    kernel_regularizer=regularizers.L1L2(l1=1e-5, l2=1e-4),
    bias_regularizer=regularizers.L2(1e-4)
)

Más información:

Dropout

Es hacer que ciertas neuronas se vayan desactivando cada vez en el entrenamiento. Se hace añadiendo capas de Dropout.

model.add(Dropout(0.2))

Normalization

Entradas

from sklearn.preprocessing import StandardScaler

standard_scaler = StandardScaler()
data = standard_scaler.fit_transform(dada)

Batch Normalization

Hace que las salida sigan con valores alrededor de media 0 y desviación 1.

model.add(BatchNormalization())

Tamaño del Batch

history=model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=40,verbose=False,batch_size=20)

def fit(x, y_true,epochs,batch_size,learning_rate,w_2,w_3,w_4,w_52,w_53,w_54,b_2,b_3,b_4,b_5):
    #Divide los datos en batchs
    x_batchs=np.split(x, np.arange(batch_size,len(x),batch_size))
    y_true_batchs=np.split(y_true, np.arange(batch_size,len(y_true),batch_size))
    num_batchs=len(x_batchs)

    for epoch in range(epochs):
        for i in range(num_batchs):

            x_batch=x_batchs[i]
            y_true_batch=y_true_batchs[i]

            w_2,w_3,w_4,w_52,w_53,w_54,b_2,b_3,b_4,b_5=descenso_gradiente(x_batch,y_true_batch,learning_rate,w_2,w_3,w_4,w_52,w_53,w_54,b_2,b_3,b_4,b_5)   

    return w_2,w_3,w_4,w_52,w_53,w_54,b_2,b_3,b_4,b_5

Parada anticipada

La parada anticipada resuelve el problema de cuántas épocas debemos entregar nuestro modelo. Lo que hace es detener el entrenamiento si la métrica no mejora. Para ello se usa la clase de callback de keras llamado EarlyStopping().

La clase contiene entre otros los siguientes parámetros:

  • monitor: La métrica a monitorizar. Por defecto monitoriza val_loss.
  • min_delta: El mínimo valor que consideramos como una mejora. Si mejora menos que este valor lo consideraremos como que no ha mejorado. Por defecto si valor es 0.
  • patience: Cuántas épocas puede estar sin mejorar antes de que paremos el entrenamiento. Por defecto vale 0.
  • mode: Indica el tipo de métrica que es. Es decir si la métrica es mejor cuanto mayor valor tiene (max) o la métrica es mejor cuanto menor valor tiene (min). Por defecto es valor es auto y keras sabrá el tipo de la métrica por el nombre que tiene.


history=model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=40,verbose=False,callbacks=[EarlyStopping()])
 

Más información:

Validación cruzada

Se hace el entrenamiento varias veces usando cada vez una partición distinta de los datos de entrenamiento y validación.

Mejor modelo

clase/iabd/pia/2eval/tema08.txt · Última modificación: 2022/05/23 17:08 por admin