Asumiré que no está hablando de crear software para implementar algoritmos de aprendizaje automático desde cero, sino de empaquetar bibliotecas ML en una tubería de datos (R, python scikit-learn, Spark …).
Algunos patrones:
Procesamiento asincrónico usando colas
Los sistemas de aprendizaje automático son complejos y pueden ser bastante impredecibles en términos de latencia. Dependiendo de sus datos, los óptimos se pueden encontrar más o menos fácilmente. También desea crear un sistema que pueda probar diferentes algoritmos A / B, por lo que la latencia puede variar según su complejidad (el registro logístico VS el bosque aleatorio es un ejemplo). Finalmente, cuanto más ingrese a algoritmos muy complejos (NN, apilamiento …), menos carga de trabajo se verá sincrónica. El uso de colas como kafka también lo ayuda a construir sistemas distribuidos para agregar más trabajadores si sus datos son lo suficientemente grandes.
Bucle de retroalimentación oculto y canales de datos
Esto es para sistemas donde su predicción influye en su propia verificación.
El bucle de retroalimentación oculto es un fenómeno bien conocido explicado por el hecho de que si influyes en una experiencia no puedes aprender de ella al mismo tiempo. Un ejemplo clásico es el sistema de recomendación de patrullas policiales. Si siempre predices que algo va a suceder en algún lugar y envías a la policía allí, solo podrán arrestar personas allí y no en otras zonas. Sus predicciones se confirmarán, su algoritmo aprenderá de eso y se sesgará cada vez más. Una solución a este fenómeno es dividir sus datos en dos o más canales: los datos de los que aprende y los datos que predice. Para los datos que aprende, realiza una predicción aleatoria, para que no se sesgue y vea su resultado más adelante para aprender de ella. Para el otro conjunto de datos, hace su mejor predicción para maximizar el ROI / lo que sea. Luego necesita un sistema capaz de dividir sus datos en varios algoritmos (aleatorio, algoritmo A, algoritmo B …), y dividirlo en algunas condiciones (10% de la entrada, muestreo equilibrado entre objetivos o variables …). Una buena manera de implementar eso es … colas.
Hachís truco y manejo novedad
El truco de hashing es una solución MUY práctica para arquitecturas de aprendizaje automático (es incluso mejor que las colas … imagínense). Básicamente, cuando entrena algoritmos de aprendizaje automático y desea obtener predicciones de él, esperará un número definido de variables. Este número es precisamente el número de variables que ha visto en el conjunto de entrenamiento. ¿Qué sucede si una nueva variable entra en su sistema después de una actualización? ¿O un nuevo valor para una variable categórica? El truco de hash es una solución muy sólida para eso. La idea es que defina una serie de variables que vendrán en su sistema (200 000, por ejemplo), emite todos los datos a un int (por ejemplo, crea una cadena age_22 si la siguiente línea es alguien 22 y la divide en hash un int) luego calcula el módulo de ese int sobre 200 000. El número que obtiene es el número de la columna para su valor, coloca 1 en esta columna. Por otro lado, obtiene datos escasos, que pueden no ser los mejores para algunos algoritmos como los árboles de decisión …
Esto es muy útil, también porque de todos modos tendrá que transformar sus variables categóricas en una matriz de N columnas con N el número de valores posibles. Por ejemplo :
N a menudo está cambiando, el orden de las variables también puede cambiar y así sucesivamente … no desea administrar eso. Un gran marco de ML que utiliza este truco es el vocal de wappal, que se centra en el aprendizaje en línea: JohnLangford / votepal_wabbit
(Falso) arquitectura Lambda
Excepto si opta por el aprendizaje en línea (actualice el modelo después de cada ejemplo), tendrá que volver a entrenar su modelo regularmente y validar su rendimiento de forma cruzada. Por otro lado, necesita su modelo para poder predecir datos en tiempo real o simplemente entrantes. Eso significa que necesitas dos capas. Uno donde los datos van para predicciones, uno donde se historizan y se usan para entrenamientos regulares. Habrá mucho código en común, como sus procesos para la creación de funciones, limpieza de datos, configuración para las bibliotecas de aprendizaje automático, etc. Hay mucha literatura sobre la arquitectura lambda, pero la idea general aquí es escribir código que es capaz de ejecutarse de forma continua y por lotes.
El descargo de responsabilidad “falso” se debe a que no tiene una capa de servicio (y la mayoría de las arquitecturas lambda de las que se habla no son arquitecturas lambda … ¡pero eso es para otro día!)
Arquitectura Kappa
Me gusta kappa Es una arquitectura propuesta para manejar las necesidades que acabo de describir, pero sin la complejidad de una arquitectura lambda real (escribir todo dos veces en una transmisión y un marco por lotes, creando una capa de servicio que pega las ventanas de tiempo …). La idea es que solo construya una arquitectura de transmisión y la use tanto para predicciones en tiempo real como para reproducir grandes lotes.
Cuestionando la arquitectura Lambda
El almacenamiento en caché se une a los datos entrantes
Una tarea común en el aprendizaje automático es agregar variables al ejemplo con el que intenta predecir. A veces puede ser bastante largo o complejo calcularlos, o puede estar muy por encima de los requisitos previos de latencia. Preparar estas características de antemano es un buen patrón. Supongamos que tiene una acción del cliente en su sistema de transmisión y desea agregar información sobre sus compras anteriores (promedio de 2 meses, compra máxima de su ciudad …). Puede calcularlos en lote y cargarlos en un caché de valores clave (redis, hashmap en memoria …). Simplemente se une con la identificación del cliente cuando el cliente ingresa al sistema de transmisión.
Además, en general:
- Mantenga las cosas simples, use marcos bien entendidos
- No intentes escalar si no necesitas
- Piense en el perímetro funcional de su aplicación antes de pensar en un marco (Spark, por ejemplo)
- Prefiero un conjunto bien escrito de líneas de Python en lugar de un desorden de tecnologías de big data juntas (kafka spark cassandra elastic search wombocombo)
- Piense en la facilidad con que su sistema permite que su equipo de I + D ponga su modelo en producción. Si codifican en R y usted crea un código de escala personalizado para cada algoritmo, sugieren que no será muy ágil. Intente utilizar los mismos marcos para I + D y producción, y si no lo hace, intente utilizar herramientas estándar para traducir los modelos de un idioma a otro (PMML, por ejemplo).