Te va a interesar!

6/recent/ticker-posts

Hablemos de testing en Machine Learning e IA, pero de verdad!

Photo by Alec Favale on Unsplash
Escuchan eso? Si, es el auge de Machine Learning e Inteligencia Artificial viniendo con todo, dispuestos a arrasar todo lo que creías saber sobre Testing.

Vivimos en una época en la que estas dos tendencias crecen exponencialmente. Todos los días hay 20 nuevos bots para atención al cliente, programas para reconocimiento de animales, plantas, productos, otros que analizan big data para mejorar la experiencia del usuario ajustando los parámetros según los hábitos de las personas...en fin, para todos los gustos. Turing estaría orgulloso de todo lo que se avanzó!

Pero hay algo que estoy seguro más de uno se preguntó y, sino, se va a preguntar en este mismo momento: Cómo testear algo cuya naturaleza es justamente la de cambiar y adaptarse? Sobre todo...qué papel juega Automation en este tipo de testing? Pasemos a analizar el problema, las posibles soluciones e iniciemos el debate!

Qué es Machine Learning y qué es Inteligencia Artificial?

Sin entrar en tecnicismos muy duros, voy a explicar primero lo que se entiende por ML y por IA. Machine Learning es la capacidad de un sistema de "aprender" sobre la marcha y ajustar sus variables para acercarse al resultado deseado. Y te estarás preguntando "para qué acercarse a un resultado si simplemente le puedo decir que lo que se espera es tal cosa?". Una pregunta super válida! Y el motivo por el que surge ML es la necesidad de que se adapte a cambios inesperados y responda de manera satisfactoria. Un ejemplo en el que estuve trabajando: Quiero que el sistema sea capaz de reconocer si la imagen que le estoy presentando es una hoja de eucalipto, de sauce, de roble o de cerezo. Para eso, el sistema cuenta con modelos entrenados capaces de darle una buena dirección. Con ese conocimiento previo, va a responder lo que más se acerque.

El entrenamiento usualmente se hace entrenando un modelo de red neural. Estas redes, tal cual nuestro querido y viscoso cerebro, tienen tantas interconexiones como complejidad le introduzcamos. Y un delta entre lo que es la respuesta correcta y lo que para el modelo es la respuesta correcta. En base a esa diferencia, entrena todos estos nodos de manera que la próxima iteración se acerque más al resultado esperado. Este delta que se busca achicar se llama "loss" y es una parte fundamental de las redes neurales.

La inteligencia artificial, por otro lado, es como el concepto más general, del que ML es solo una aplicación. La IA es la capacidad de tomar decisiones de una manera "inteligente" en un sistema. Un simple State Machine, una de las IAs más sencillas, es usada, por ejemplo, en videojuegos, para determinar si un personaje ataca al healer o si ataca al tanque (perdón para aquellos que no juegan por la analogía!).

Entonces...qué testear de estos bichos raros?

Bueno...esto es lo primero que tenemos que considerar, no? Qué vamos a testear? Porque por un lado podemos decir "Ok, yo, el humano detrás de ésto, sé cuál es el resultado esperado ya que la test data la preparé yo!" Por lo que al momento de probar vamos a tener una ventaja frente a nuestro robótico amigo: Vamos a saber si lo que tiene que reconocer es un gato, un árbol o un auto. De ahí vamos a poder validar que el reconocimiento funciona bien.

Pero claro, acá estamos hablando de un modelo ya entrenado. Siguiendo la filosofía de Shift-left y pensando en encontrar errores en las etapas más tempranas del SDLC, podríamos argumentar que una porción importante del testing debería llevarse a cabo durante el entrenamiento de los modelos.

Sabían que hace relativamente poco se descubrió que muchos modelos científicos estaban completamente errados y eso había sido debido al uso no adecuado de Machine Learning?
Toda una crisis científica se desató a raíz de Machine Learning debido a que los modelos creados solo pensaban en el set de datos presentado. Imaginate que en base a los datos demográficos de un barrio se decida el menú para un restaurant que abre sus puertas como franquicia en todo el mundo!

Tenemos, entonces, que podemos testear al modelo entrenado, al entrenamiento del modelo y, por otro lado, la lógica que entrena el modelo.

Pero...cómo se puede testear ésto?

El punto de esta nota, no? Habiendo identificado las posibles áreas de testing para Machine Learning e Inteligencia Artificial, crucemos eso con las técnicas de testing que conocemos para ver cómo podríamos apuntar a un objetivo que está en constante e inesperado movimiento.

Lo primero que atacaría, para evitar que el modelo entrenado termine concluyendo en que hay que desaparecer todos los hospitales porque de todas maneras los humanos vamos a morir, sería el proceso de entrenamiento. Necesitamos testear que estamos construyendo algo sobre una base sólida, adecuada y que considere las cosas importantes.

Para los que no estén metidos en el tema, los sistemas que usan Machine Learning generalmente tienen una red neural de fondo modificando sus nodos o variables progresivamente en búsqueda del mejor resultado. Entonces...deberíamos nosotros probar que efectivamente está aprendiendo? Deberíamos probar que se acerca al resultado después de X cantidad de iteraciones sobre el set de datos? Todo eso es algo que tenemos que definir para estar seguros que estamos testeando lo que el proyecto requiere. Porque como les decía, puede ser intrincado y confuso si no se sabe de qué va la cosa. Últimamente hay mucha charla y post de "testear con Machine Learning" que, en definitiva, no dice nada. Está bien, es un término de moda y no muchos lo entienden, pero es importante dar los pasos adecuados y para eso, sí o sí, necesitamos entender la ciencia detrás.

Volvamos al ejemplo de un sistema que identifica formas de hojas de plantas y las clasifica. Qué y cómo podemos testear en este sistema? Hagamos un ejercicio práctico, se animan?

Objetivo: Testear el sistema "Hojas del mundo".

Este sistema va a usar una red neural, junto a un set de datos de 20000 tipos de hojas de plantas clasificadas, para ser entrenado y así poder identificar según las imágenes que un usuario provea.

Como tester, lo primero que querría testear es que el proceso mediante el cuál la red neural se entrena es el correcto. Cómo hacerlo? Hablamos más arriba sobre el concepto de "loss" o "delta" entre lo que realmente es y lo que el modelo predice. Este número, por lógica, debería bajar a medida que entrenamos, significando ésto que efectivamente está aprendiendo a dar resultados más acertados.

Por otro lado deberíamos probar que, una vez el modelo se encuentra bajo un número esperado de eficacia, es capaz de responder a nueva test data de manera satisfactoria, después de todo, es el objetivo, no? Que pueda predecir con eficacia cada hoja de planta nueva que se le presenta. Para eso vamos a tener que ser muy claros sobre el % de "puntería" que tiene, basado en la cantidad de datos que le suministramos en el entrenamiento y la cantidad de entrenamiento que le dimos.

Entonces, a ver, vamos a poner por escrito los casos de prueba que se nos ocurrieron:


  1. El modelo de la red neural va a reducir el valor del delta entre lo esperado y lo predicho (loss) en cada nueva iteración.
  2. El modelo que alcanzó el % de eficacia deseado con el set de datos, es capaz de responder de manera acorde a nueva test data.
  3. El modelo es capaz de leer los datos de prueba de manera satisfactoria para poder predecir el resultado.
  4. El modelo responde de forma acorde ante casos negativos de prueba (no estaría bueno que si le ponemos la foto de un Fiat 600 nos diga que es una hoja de palta).

A todo ésto, tenemos que entender que el reporte de resultados ya no es tan "definitivo" por así decirlo. Vamos a estar hablando de porcentajes de eficacia. Olviden que un modelo de Machine Learning alcance 100% de efectividad, incluso con cantidades abismales de datos suministrados y años de entrenamiento. Por eso es que tenemos que saber cómo reportar los resultados.

Esto es, quizás, la parte más importante y fundamental de testear modelos de Machine Learning. No es lo mismo decir "el modelo pasó las pruebas!" que decir "el modelo presenta un 78% de eficacia en los resultados predichos con una base de 20000 datos y luego de 300 iteraciones de entrenamiento".

Los resultados van a diferir mucho (todavía recuerdo a mi modelo confundiendo gatos con barcos...por algún motivo la forma del gato rompía los algoritmos!) dependiendo de qué tanto entrenamiento y datos tengan detrás. Incluso una vez el sistema está maduro, introducir nuevos sets de datos va a ser menos preciso que la vieja test data, al no haber sido entrenado con ellos.

Conclusión: Empezamos a entender cómo testear Machine Learning!

En este primer post les quería contar, de forma introductoria, cómo es el escenario cuando tenemos que testear aplicaciones de Machine Learning e Inteligencia Artificial. Hemos definido conceptos, puesto un ejemplo práctico y pensado cómo testearíamos esos requerimientos.

Qué opinás? Estás de acuerdo con esta manera? Testeaste modelos de Machine Learning alguna vez? Qué técnicas usaste? Dejame tu comentario!

Casi me olvido...creé un canal de Youtube en el que van a encontrar charlas sobre Testing, pruebas que hago a herramientas de testing y mucho sobre Automation! Me encuentran como The Free Range Tester! Suscríbanse y activen campana para saber cuando subo un nuevo video!

Publicar un comentario

2 Comentarios

  1. Muy buen artículo.. da mucho para pensar. Gracias por compartirlo.

    ResponderBorrar
    Respuestas
    1. Gracias! Es la idea, que entre todo pensemos y lleguemos a conclusiones interesantes!

      Borrar