Autoencoders: una serie de lecciones aprendidas
Estos días pasados he tenido que usar autoencoders como mecanismos para reducir la dimensión de una serie de conjuntos de datos. El principal problema al que me he enfrentado —cómo no— ha sido el de diseñar una arquitectura adecuada para el problema en cuestión. El principal motivo es que la práctica totalidad de los tutoriales, ejemplos, etc. disponibles por ahí tienen como aplicación principal el tratamiento de imágenes y en mi caso no.
¿Es esto importante? ¿Por qué?
Lo es y lo es porque las imágenes tienen una estructura muy concreta: como vectores, son números positivos y acotados (con un rango que depende de la condificación). Y no tienen outliers.
Sin embargo, los datos que uno encuentra en casi todas las aplicaciones tradicionales tienen datos de todo pelaje: positivos y negativos, ¡enteros!, con outliers, etc. Vamos, lo que uno se encuentra cuando piensa en aplicar PCA por el mundo.
La principal recomendación genérica que puedo hacer para aplicar exitosamente los autoencoders en esta situación es:
- Normalizar los datos de serie (por supuesto)
- Usar
tanh
como función de activación (¡nunca la sigmoide!). - No usar función de activación (o usar la identidad) en la última capa del decoder.
La tangente hiperbólica es la opción menos mala en el exiguo menú de funciones de activación que proporciona, en mi caso, Keras. Una función de activación más interesante sería una que:
- Creciese como $f(x) = x$ cerca del cero.
- Creciese como $f(x) = x^\alpha$ con $\alpha$ típicamnete en $(0, 1)$ para valores positivos grandes.
- Fuese simétrica: $f(-x) = f(x)$.
Creo que permitiría gestionar el problema de los outliers mejor que la tanh
.
Y unas notas finales sobre la gestión de outliers que, seguramente, serán conocidas de muchos pero que tampoco he visto explicitadas por ahí a menudo. El problema de los outliers es que desdibujan la información proporcionada por las observaciones normales. Pero no se sabe cuál es dicha información —y cuáles son las observaciones normales— hasta que no tratas de extralerla modelizando. Una estrategia, pues, para eliminar las observaciones anómalas es la siguiente:
- Ajustar un primer modelo (autoencoder en particular).
- Calcular el error de reconstrucción observación a observación.
- Descartar —¡con sumo cuidado!— aquellas observaciones con un mayor error.
- Repetir varias veces.
Obviamente, los puntos 3 y 4 son muy delicados: hay que tener cuidado de, como dicen, no tirar al niño con el agua sucia de la bañera. Dudo que exista un criterio universal para hacerlo bien que se atenga a principios estrictamente estadísticos.