El auge de las soluciones de Machine Learning y de IA es innegable. Tenemos todo habilitado para la inteligencia artificial, desde la optimización de los diagnósticos médicos, RR.HH y los procesos de elaboración de cereza.
Pero, gracias a este auge, también nos dimos cuenta de que desarrollar y producir dichos productos es realmente muy difícil. Y no fue mucho antes de que empezáramos a ver estos tipos de artículos en prácticamente todos lados:
Artificial Intelligence Confronts a ‘Reproducibility’ Cris by Wired
Hutson M., revista Science, febrero de 2018, volumen 359, p. 725.
Un resultado es reproducible cuando los mismos pasos de análisis realizados en el mismo conjunto de resultados generan de manera uniforme la misma respuesta.
El Machine Learning reproducible pueden evitar errores y costos importantes en el futuro. Además, también facilita llevar un seguimiento de las conclusiones o predicciones generadas y explicarlas.
Pero más allá de eso, el uso de la reproducibilidad facilita los procesos de colaboración y revisión, garantiza la continuidad del trabajo y conserva el conocimiento institucional y las pruebas futuras del trabajo. Esto es muy importante, ya que la mayoría de las veces no se trabaja solo, sino con un grupo de científicos de datos, ingenieros de software y muchas otras partes interesadas.
La verdad es que la reproducibilidad en Machine Learning es un problema al que cada profesional se enfrenta a diario.
¿Alguna vez se ha preguntado algo de esto?
Foto de Paolo Nicolello en Unsplash
Créame… a todos nos ha pasado.
Por tanto, sin más demora, vamos a profundizar en cómo hacer que los flujos de trabajo sean más reproducibles.
La base de los flujos de trabajo reproducibles radica en poder hacer un seguimiento de los datos, del entorno informático y del código y reproducirlos.
Así es que verá que la mayoría de estas recomendaciones se centra en estos tres recursos críticos:
No voy a profundizar mucho en esto, porque merece una publicación entera. Pero idealmente querrá hacer la reproducibilidad de todo su trabajo en tres niveles:
Todos sabemos que los datos de buena calidad son fundamentales para una buena calidad y Machine Learning confiable. Así es que siempre tenemos que saber qué esperamos de los datos en todo momento: qué tipos, distribuciones, intervalos y esquemas.
Una de mis herramientas favoritas para hacerlo es Great expectations, porque se integra con otras herramientas que uso como Spark, Airflow, Jupyter Notebooks y Pandas (entre otras). Es una herramienta excelente para la validación, prueba y documentación de los datos.
Por ejemplo, si tiene un origen de datos sin procesar en el que hace alguna manipulación antes de almacenarlos en una base de datos, puede agregar varios pasos de validación para los datos de entrada y salida.
Si va a recopilar datos desde API de terceros, puede usar el esquema JSON para realizar la validación con el meta esquema.
La mejor manera de realizar un seguimiento de todas las salidas, entradas, métricas, modelos y datos, incluso antes de usar herramientas especializadas, es poder realizar un seguimiento de cada una de las tareas que se llevan a cabo.
Muchas herramientas le permiten crear canalizaciones sólidas. Muchas de ellas se centran en el concepto de grafos acíclicos dirigidos. Algunas de mis favoritas son:
Estas agregan mucha complejidad:
Pero debe tener en cuenta esta regla general si decide implementar sus canalizaciones:
✨ Sugerencia principal: Divida las tareas en unidades atómicas de trabajo, en las que cada nodo del DAG o cada paso de la canalización realiza una sola tarea.
Esto ayuda a evitar el problema en el que, si se cambia algo, se cambia todo (Scully et al).
La aleatoriedad está en todos lados:
El mejor consejo que encontrará en todos lados es que siempre debe establecer y guardar su inicialización.
Si trabaja con Python, a menudo debería verse haciendo una versión de este ritual:
import os
import tensorflow
import numpy
os.environ['PYTHONHASHSEED'] = str(seed)
random.seed(seed)
tensorflow.random.set_seed(seed)
numpy.random.seed(seed)
tensorflow.keras.layers.Dropout(x, seed=SEED)
tensorflow.image.random_flip_left_right(x, seed=seed)
tensorflow.random_normal_initializer(x, y, seed=seed)
Otro origen de aleatoriedad son los datos. Cuando dividimos los datos para el entrenamiento y la validación, a menudo usamos divisiones distintas.
La solución: corrija las divisiones de entrenamiento y validación antes del entrenamiento. Si usa métodos como test_split_train
de scikit-learn, asegúrese de especificar también el argumento seed
.
La búsqueda de los hiperparámetros correctos para sus modelos puede ser un proceso bastante complicado. Estos pueden ser especialmente problemáticos cuando se ejecutan varios experimentos con distintas arquitecturas de red.
✨ Sugerencia principal: Como regla general, no solo haga un seguimiento de los parámetros, sino también de las métricas de salida de cada modelo asociado y del proceso o la base de referencia de selección.
Puede encontrar un excelente ejemplo de cómo hacer el seguimiento de los hiperparámetros de una manera correcta en el ejemplo de ajuste de los hiperparámetros distribuidos de Pachyderm.
El uso de canalizaciones para dividir, entrenar, probar y seleccionar los modelos y el hiperparámetro facilita mucho realizar un seguimiento de las salidas en todas las fases, así como informar con respecto a la lógica que explica por qué eligió hiperparámetros específicos.
¿Con qué frecuencia ha trabajado en fragmentos de código con líneas como esta?
import pandas as pd
df = pd.read_csv("../../../data.csv")
En este escenario, los datos y el código están estrechamente acoplados. Para garantizar la reproducibilidad, debe hacer un seguimiento del código y de las versiones de los datos, no solo para las salidas finales, sino también para los resultados intermedios.
Imagine que tiene un flujo de trabajo como este:
Aunque se trata de una canalización ligeramente simplificada, de todos modos, hay varias salidas a las que quiere hacer un seguimiento (datos, código y archivos serializados).
Una herramienta ideal para esto es dvc, que permite llevar un seguimiento de todos los recursos con Git sin tener que * almacenar los datos en Git*.
Esto le permite desacoplar los datos y el código, así como sus versiones respectivas, para garantizar la reproducibilidad:
En Machine Learning, las pruebas pueden ser muy complejas. Como ya dije, no voy a profundizar demasiado en esto porque las estrategias de pruebas merecen una publicación exclusiva. Así es que aquí tenemos una lista de comprobación de los elementos y las estrategias de pruebas que debe tener en cuenta:
✨ Sugerencia principal: Un paquete que uso una y otra vez es Hypothesis para las pruebas basadas en propiedades. No solo me ha permitido simplificar las estrategias de pruebas, sino también ha aumentado mi confianza en las pruebas.
Estas son algunas extensiones de Hypothesis que vale la pena revisar: https://hypothesis.readthedocs.io/en/latest/strategies.html.
Para que un trabajo se pueda reproducir, se debe capturar el entorno informático donde se realizó para que otros puedan replicarlo.
Muchas herramientas le permiten crear entornos reproducibles o, al menos, acercarse.
En función de los proyectos en los que estoy trabajando, suelo combinar algunas de estas herramientas:
Y me sigue encantando Make porque es fantástico.
✨ Sugerencias principales:
Se pueden producir muchos errores cuando se depende demasiado del humano en el bucle para los flujos de trabajo.
Por lo tanto, recurrir a la automatización cada vez que sea posible no solo le permitirá ahorrar tiempo, sino que también optimizará los flujos de trabajo y aumentará su confianza.
Estas son algunas de las excelentes herramientas que uso para la automatización:
✨ Sugerencia principal: Comience a automatizar las partes más críticas: implementación, creación de contenedores, pruebas y avance desde ahí.
Lee también: Machine Learning vs. Deep Learning
Con la infinidad de herramientas y flujos de trabajo que existen, no hay una solución única para el problema de la reproducibilidad.
Pero lo que he aprendido es que la coherencia es crítica. Estas son mis últimas ✨ Sugerencias principales:
¡Eso es todo! Estas son algunas sugerencias prácticas para empezar a usar Machine Learning reproducible.
¿Cree que me faltó alguna sugerencia? Cuénteme en los comentarios.
El futuro lo construimos hoy y lo que en el pasado fueron películas de ciencia ficción que nos dejaban con la boca abierta; ahora con el acceso a capacidades de cómputo superiores, tenemos las herramientas para darle forma a lo que nuestra imaginación puede crear y con Platzi, aprendemos ¿cómo hacerlo?.
Recomiendo este blog de @pachocamacho donde habla sobre El futuro de la inteligencia artificial.
Solo quiero decir: Hacia allá voy, quiero ser parte de esta revolución.
Escuela de Ciencia de Datos.
Me apunto
Me gustó el artículo. Desde que inicié con el machine learning he visto y tenido estas debilidades, y lamentablemente, las fuentes que había consultado hasta el momento no me ayudaron a comprenderlo y aplicarlo.
Interesante! Muchas gracias!! 💚
Excelente articulo para tomar en cuenta
Excelente articulo, creo que poco a poco voy entendiendo un poco más al respecto del Machine Lerning, si bien es cierto pasamos de una etapa donde teníamos que elaborar todo el código para poder llegar a un resultado a simplemente consumir una api y obtener resultados.
La revolución que estamos viviendo con la IA no esta disponible para todos y se requiere de una gran cantidad de conocimientos y recursos, cosa por la cual deja vulnerables a los individuos ante las grandes ambiciones.
Es el articulo mas completo que he leído, quiero conocer a quien lo escribió, ya me dio síndrome del impostor y me sentí totalmente ignorante y apenas son las 7am