6. Redes neuronales: Apendices

Inicialización de parámetros

El siguiente código en Python nos muestra las funciones de distribución de cada uno de los inicializadores. El ejemplo no tiene utilidad real mas allá de mostrar los datos y las gráficas de los inicializadores.

Ahora vamos a ver como se comportan 4 redes distintas según el número de capas, el inicializador y la función de activación usada

Mas información:

He/Xavier initialization & activation functions: choose wisely

Hyper-parameters in Action! Part II — Weight Initializers: Demostración sencilla de las fórmulas de Glorot y He.

Kaiming He initialization: Demostración del inicializador He

Artículos académicos originales sobre Glorot, He y LeCun:

Understanding the difficulty of training deep feedforward neural networks: Artículo original de Xavier Glorot sobre su inicializador.

Delving Deep into Rectifiers:Surpassing Human-Level Performance on ImageNet Classification: Artículo original de Kaiming He sobre su inicializador.

Efficient BackProp: Artículo original de Yann LeCun sobre su inicializador.

Artículos académicos sobre la importancia de la inicialización en distintas redes:

A Comparison of Weight Initializers in Deep Learning-based Side-channel Analysis

Finding optimal hyperparameters of feedforward neural networks for solving differential equations using a genetic algorithm

Usando funciones de activación en Keras

Funciones personalizadas

Podemos crear nuestra propia función de activación

Y usarla de las siguientes formas

Usando directamente la función de activación

Creando una capa de activación en base a la función de activación con tf.keras.layers.Activation o tf.keras.layers.Lambda

Funciones personalizadas parametrizadas

Pero si nuestra función tiene un parámetro

Solo podremos usar tf.keras.layers.Lambda

Funciones con nombre

Para acabar vamos a ver como poder usar el nombre en una capa que nos hayamos creado nosotros usando el método tf.keras.utils.get_custom_objects

Vamos a definir un nombre de función de activación llamado relu_0_3 usando get_custom_objects()

Y simplemente lo usamos indicando el nombre de relu_0_3

Tipos de funciones de activación en capas ocultas

ReLU y Leaky ReLU

Ahora vamos a complicarlo un poco. Resulta que la función de activación tf.keras.activations.relu tiene un parámetro llamado alpha que hace que comporte como la función Leaky ReLU. Y también la capa tf.keras.layers.ReLU() tiene el mismo parámetro pero llamado negative_slope y obviamente hace exactamente lo mismo. Por lo tanto es igual a Leaky ReLU

Con el siguiente código podemos ver el resultado:

Además en el código cuente de TensorFlow podemos ver como realmente son iguales:

https://github.com/tensorflow/tensorflow/blob/r2.4/tensorflow/python/keras/layers/advanced_activations.py#L74

https://github.com/tensorflow/tensorflow/blob/r2.4/tensorflow/python/keras/layers/advanced_activations.py#L417

PReLU

Existe otra capa de activación llamada PReLU que es similar a Leaky ReLU pero el valor de se calcula automáticamente durante el entrenamiento, es decir que es como un parámetro mas de la red.

Mas información:

How to use PReLU with Keras?

GELU

GELU es de la últimas funciones de activación "famosas" que han aparecido. GELU: Se usa con Transformers. La usa Google con BERT y OpenAI en GPT-2 y GPT-3.1) https://mlfromscratch.com/activation-functions-explained/#gelu

Uso en Keras

Mas información:

Gaussian Error Linear Unit Activates Neural Networks Beyond ReLU

tf.keras.activations.gelu

Gaussian Error Linear Units (GELUS)

Swish

Se usa cuando ReLU pero es un poco más lenta pero es mejor

Uso en Keras

Activation functions you might have missed

Swish: A Self-Gated Activation Function: Paper original de Swish

Mish

Se usa cuando ReLU pero aunque es un poco más lenta es mejor. Es muy similar a Swish

tfa.activations.mish(x)

Activation functions you might have missed

Mish: A Self Regularized Non-Monotonic Activation Function: Paper original de Mish

Poetry

Para usar Mish deberemos instalar TensorFlow Addons. Desde conda a veces falla la instalación así que lo recomendable es usar Poetry

Para usar poetry debemos primero instalarlo en el sistema operativo mediante los comandos:

Una vez instalado (se puede comprobar con poetry --version) iremos a la carpeta donde tenemos nuestro programa en Python (o donde lo vamos a tener) y ejecutaremos lo siguiente:

Para ejecutar el código hay 2 formas:

Desde la línea de comandos:

Desde VS Code seleccionar en los entornos de ejecución la carpeta .venv del propio proyecto: