Capítulo 4. Algoritmos para la IA de perímetro
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
Hay dos categorías principales de algoritmos que son importantes en la IA de perímetro: la ingeniería de rasgos y la inteligencia artificial. Ambos tipos tienen numerosas subcategorías; en este capítulo vamos a explorar una muestra representativa de ellas.
El objetivo es proporcionar una visión general de cada tipo de algoritmo desde una perspectiva de ingeniería, destacando su uso típico, sus puntos fuertes y débiles y su idoneidad para la implementación en hardware de perímetro. Esto debería darte un punto de partida para planificar proyectos del mundo real, que recorreremos en los próximos capítulos.
Ingeniería de funciones
En la ciencia de datos, la ingeniería de características es el proceso de convertir los datos brutos en entradas utilizables por las herramientas estadísticas que empleamos para describir y modelizar situaciones y procesos. La ingeniería de rasgos implica utilizar tu experiencia en el campo para comprender qué partes de los datos brutos contienen la información relevante, y luego extraer esa señal del ruido circundante.
Desde la perspectiva de la IA de perímetro, la ingeniería de características consiste en transformar los datos brutos de los sensores en información utilizable. Cuanto mejor sea tu ingeniería de características, más fácil les resultará la vida a los algoritmos de IA que intenten interpretarla. Cuando se trabaja con datos de sensores, la ingeniería de características utiliza naturalmente algoritmos de procesamiento digital de señales. También puede implicar la división de los datos en trozos manejables.
Trabajar con flujos de datos
Como hemos visto, la mayoría de los sensores producen datos de series temporales. El objetivo de una aplicación de IA de perímetro es tomar estos flujos de datos de series temporales y darles sentido.
La forma más habitual de gestionar las secuencias es trocear una serie temporal en trozos, a menudo llamados ventanas, y luego analizar los trozos de uno en uno.1 Esto produce una serie temporal de resultados que puedes interpretar para comprender lo que está pasando. La Figura 4-1 muestra cómo se toma una ventana de un flujo de datos.
Se tarda un cierto tiempo en procesar un trozo de datos: podemos llamarlo la latencia de nuestro sistema. Esto limita la frecuencia con la que podemos tomar y procesar una ventana de datos. La velocidad a la que podemos capturar y procesar datos se conoce como velocidad de fotogramas de un sistema, a menudo expresada en el número de ventanas que se pueden procesar por segundo. Los fotogramas pueden ser secuenciales o solaparse, como se muestra en la Figura 4-2.
Cuanto menor sea la latencia, más ventanas de datos podrán analizarse en un periodo de tiempo determinado. Cuantos más análisis puedas hacer, más fiables serán los resultados. Por ejemplo, imagina que estamos utilizando un modelo de aprendizaje automático para reconocer un comando. Si las ventanas están demasiado separadas, podríamos pasar por alto partes críticas de un comando hablado y no ser capaces de reconocerlo (ver Figura 4-3).
La elección del tamaño de la ventana es muy importante. Cuanto mayor es la ventana, más tiempo se tarda en procesar los datos que contiene. Sin embargo, las ventanas más grandes contienen más información sobre la señal, lo que significa que pueden facilitar la vida a los algoritmos de procesamiento de señales y de IA que se utilicen. El equilibrio entre el tamaño de la ventana y la velocidad de fotogramas es algo importante que debes explorar cuando desarrolles un sistema.
Como veremos más adelante, hay muchos algoritmos de IA diferentes, y algunos son más sensibles al tamaño de la ventana que otros. Algunos algoritmos (normalmente los que mantienen una memoria interna de lo que ocurre en una señal) son capaces de trabajar bien con tamaños de ventana muy pequeños, mientras que otros requieren tamaños de ventana grandes para poder analizar correctamente una señal. La elección del algoritmo también influye en la latencia, que también limita el tamaño de la ventana. Es un complejo sistema de compensaciones entre el tamaño de la ventana, la latencia y la elección del algoritmo.
La ventana también se aplica a los flujos de vídeo: en este caso, cada "ventana" del vídeo es un cierto número de imágenes fijas -normalmente una sola, pero algunos algoritmos de IA pueden analizar potencialmente varias imágenes al mismo tiempo-.
Las técnicas más sofisticadas para tratar flujos de datos pertenecen a la categoría del procesamiento digital de señales. Estas técnicas pueden combinarse con el windowing para crear datos que alimenten los algoritmos de IA.
Algoritmos de procesamiento digital de señales
Hay cientos de algoritmos diferentes de procesamiento de señales que pueden ayudar a digerir las señales producidas por los sensores. En esta sección, cubriremos algunos de los algoritmos DSP más importantes para la IA de perímetro.
Remuestreo
Todas las señales de series temporales tienen una frecuencia de muestreo (también conocida como frecuencia), a menudo descrita en términos del número de muestras de datos por segundo (Hz). A menudo es necesario cambiar la frecuencia de muestreo de una señal. Por ejemplo, puede que quieras reducir la frecuencia de una señal (lo que se conoce como muestreo descendente) si está produciendo datos más rápido de lo que puedes procesarlos. Por otro lado, puede que quieras aumentar la frecuencia de una señal(upsampling) para poder analizarla convenientemente junto a otra señal que tenga una frecuencia más alta.
El muestreo descendente funciona "desechando" algunas de las muestras para alcanzar la frecuencia objetivo. Por ejemplo, si desecharas uno de cada dos fotogramas de una señal de 10 Hz (10 muestras por segundo), se convertiría en una señal de 5 Hz. Sin embargo, debido a un fenómeno llamado aliasing, reducir la frecuencia de esta forma puede provocar distorsión en la salida. Para combatirlo, hay que eliminar parte de la información de alta frecuencia de las señales antes de reducir la muestra. Esto se consigue utilizando un filtro de paso bajo, que se describe en el siguiente apartado.
El sobremuestreo funciona de forma opuesta: se crean e insertan nuevas muestras para aumentar la frecuencia de una señal. Por ejemplo, si se insertara una muestra extra después de cada muestra en una señal de 10 Hz, se convertiría en una señal de 20 Hz. Lo difícil es saber qué insertar. No hay forma de saber qué habría estado ocurriendo realmente durante el tiempo transcurrido entre dos muestras, pero puede utilizarse una técnica de conocida como interpolación para rellenar los espacios en blanco con una aproximación.
Además de las series temporales, las imágenes también pueden ser aumentadas o disminuidas. En este caso, lo que se aumenta o disminuye es la resolución espacial (píxeles por imagen). Al igual que el remuestreo de series temporales, el cambio de tamaño de las imágenes también requiere técnicas de antialiasing o interpolación.
Tanto el muestreo ascendente como el descendente son importantes, pero el descendente es más frecuente en la IA de perímetro. Es típico que los sensores produzcan una salida a una frecuencia determinada, dejando al desarrollador la tarea de reducir el muestreo y obtener la frecuencia que mejor se adapte al resto de su canal de procesamiento de señales.
Para las aplicaciones de IA de perímetro, el muestreo ascendente es útil sobre todo si deseas combinar dos señales con frecuencias diferentes en una sola serie temporal. Sin embargo, esto también se puede conseguir reduciendo el muestreo de la señal de frecuencia más alta, lo que podría sermás barato computacionalmente.
Filtrado
Un filtro digital es una función que, aplicada a una señal de series temporales, la transforma de determinadas maneras. Existen muchos tipos diferentes de filtros, y pueden ser muy útiles para preparar los datos para los algoritmos de IA de perímetro.
Los filtros de paso bajo están diseñados para dejar pasar los elementos de baja frecuencia de una señal, al tiempo que eliminan los elementos de alta frecuencia. La frecuencia de corte del filtro describe la frecuencia a partir de la cual se verán afectadas las señales de alta frecuencia, y la respuesta en frecuencia describe en qué medida se verán afectadas esas señales.
Los filtros de paso alto son lo mismo a la inversa: dejan pasar las frecuencias superiores a una frecuencia de corte y atenúan (reducen) las inferiores. Un filtro pasa banda combina las dos cosas, permitiendo el paso de frecuencias dentro de una banda determinada pero atenuando las que están fuera de ella.
El objetivo del filtrado en la IA de perímetro es aislar las partes útiles de una señal, eliminando las que no contribuyen a resolver el problema. Por ejemplo, una aplicación de reconocimiento del habla podría utilizar un filtro pasa banda para permitir las frecuencias en el rango normal del habla humana (125 Hz a 8 kHz), rechazando la información en otras frecuencias. Esto podría facilitar que un modelo de aprendizaje automático interpretara el habla sin distraerse con otra información de la señal.
Los filtros pueden aplicarse a cualquier tipo de datos. Por ejemplo, si se aplica un filtro de paso bajo a una imagen, tendrá un efecto de desenfoque o suavizado. Si se aplica un filtro de paso alto a la misma imagen, "afinará" los detalles.
Un tipo de filtro de paso bajo es el filtro de media móvil. Dada una serie temporal, calcula una media móvil de valores dentro de una ventana determinada. Además de suavizar los datos, tiene el efecto de hacer que un único valor represente información de un amplio intervalode tiempo.
Si se calculan y apilan varias medias móviles, cada una con diferentes longitudes de ventana, una instantánea momentánea de la señal (que contiene varias medias móviles diferentes) contiene información sobre los cambios en la señal a lo largo de una ventana de tiempo y una serie de frecuencias diferentes. Esto puede ser una técnica útil en la ingeniería de características, ya que significa que un algoritmo de IA puede observar una amplia ventana de tiempo utilizando relativamente pocos puntos de datos.
El filtrado es una operación de procesamiento de señales muy común. Muchos procesadores integrados ofrecen soporte hardware para algunos tipos de filtrado, lo que reduce la latencia y el consumo de energía.
Análisis espectral
Se puede decir que una señal de serie temporal está en el dominio del tiempo, lo que significa que representa cómo cambia un conjunto de variables a lo largo del tiempo. Utilizando algunas herramientas matemáticas comunes, es posible transformar una señal de serie temporal en el dominio de la frecuencia. Los valores obtenidos mediante la transformación describen qué parte de la señal se encuentra en diversas bandas de frecuencia a lo largo de un rango de frecuencias: un espectro.
Cortando una señal en varias ventanas finas y transformando cada ventana en el dominio de la frecuencia, como se muestra en la Figura 4-5, es posible crear un mapa de cómo cambian las frecuencias de la señal a lo largo del tiempo. Este mapa, conocido como espectrograma, sirve como entrada muy eficaz para los modelos de aprendizaje automático.
Los espectrogramas se utilizan habitualmente en aplicaciones del mundo real, sobre todo en torno al audio. Separar los datos en bandas de frecuencia con ventanas permite interpretarlos con modelos relativamente pequeños y sencillos.2 También es posible que los humanos distingan visualmente una palabra de otra al mirar los espectrogramas; algunas personas incluso han aprendido a leerlos.
Hay muchos algoritmos que pueden transformar una señal del dominio temporal al dominio frecuencial, pero el más común es la transformada de Fourier. Es una operación muy común, y a menudo hay soporte de hardware (o al menos implementaciones optimizadas) disponible para realizar transformadas de Fourier en dispositivos integrados.
Hay un gran número de algoritmos y técnicas para el procesamiento digital de señales y el análisis de series temporales; son campos importantes de la ingeniería y el estudio. Algunos grandes recursos sobre estos temas son:
-
The Scientist and Engineer's Guide to Digital Signal Processing, de Steven W. Smith (California Technical, 1997)
-
Análisis práctico de series temporales, de Aileen Nielsen (O'Reilly, 2019)
Detección de rasgos de la imagen
Todo un subconjunto de algoritmos de procesamiento de señales se ocupa de la extracción de características útiles3 de las imágenes. Tradicionalmente se han denominado algoritmos de visión por ordenador. Algunos ejemplos comunes son:
- Detección de perímetros
-
Sirve para identificar los límites de una imagen (ver Figura 4-6)
- Detección de esquinas
-
Se utiliza para encontrar puntos en una imagen que tengan una estructura bidimensional interesante
- Detección de manchas
-
Se utiliza para identificar regiones de una imagen que tienen algo en común
- Detección de crestas
-
Se utiliza para identificar curvas dentro de una imagen
La detección de rasgos de imagen reduce una imagen grande y desordenada a una representación más compacta de las estructuras visuales presentes en ella. Esto puede facilitar potencialmente la vida a los algoritmos de IA que operen a continuación.
La detección de características no siempre es necesaria cuando se trabaja con imágenes. Normalmente, los modelos de aprendizaje profundo son capaces de aprender sus propias formas de extraer características, lo que reduce la utilidad del preprocesamiento. Sin embargo, sigue siendo habitual realizar la detección de rasgos cuando se interpretan datos de imágenes utilizando otros tipos de algoritmos de IA de perímetro.
El proyecto OpenCV proporciona un conjunto de bibliotecas para la detección de rasgos (y otras tareas de procesamiento de imágenes) que se ejecutarán en la mayoría de los dispositivos SoC. Para los microcontroladores, OpenMV proporciona una biblioteca de código abierto de implementaciones de algoritmos de detección de rasgos junto con hardware diseñado para ejecutarlos.
Combinar funciones y sensores
Nada te impide combinar varias características y señales diferentes como entrada para tus algoritmos de IA. Por ejemplo, podrías calcular varias medias móviles de una serie temporal en varias ventanas diferentes y pasarlas todas juntas a un modelo de aprendizaje automático. No hay reglas rígidas, así que siéntete libre para experimentar y ser creativo con la forma en que cortas y rebanas tus datos. Los capítulos siguientes te proporcionarán un marco para la experimentación.
Más allá de combinar características de la misma señal, la fusión de sensores es el concepto de integrar datos de múltiples sensores. Por ejemplo, un rastreador de fitness con IA de perímetro podría combinar información de un acelerómetro, un giroscopio y un sensor de frecuencia cardiaca para intentar detectar qué deporte practica el usuario.
En un escenario de IA de perímetro más complejo, los sensores ni siquiera tienen que estar integrados en el mismo dispositivo. Imagina un sistema de climatización inteligente que utilice sensores de temperatura y ocupación distribuidos por un edificio para optimizar el uso del aire acondicionado.
Hay tres categorías de fusión de sensores:
- Complementario
-
Cuando varios sensores se combinan para proporcionar una comprensión más completa de una situación de lo que sería posible con un solo sensor, por ejemplo, los diversos sensores de nuestro hipotético rastreador de fitness.
- Competitivo
-
Cuando varios sensores miden exactamente lo mismo para reducir la probabilidad de mediciones erróneas; por ejemplo, varios sensores redundantes que monitorean la temperatura de un equipo crítico.
- Cooperativa
-
Cuando la información de varios sensores se combina para crear una señal que de otro modo no estaría disponible; por ejemplo, dos cámaras que producen una imagen estereoscópica que proporciona información sobre la profundidad.
El reto inherente a la fusión de sensores es cómo combinar múltiples señales que incluso pueden producirse a ritmos diferentes. Debes tener en cuenta lo siguiente:
-
Alinear las señales en el tiempo. Para muchos algoritmos, es importante que todas las señales que pretendemos fusionar estén muestreadas a la misma frecuencia, y que los valores reflejen mediciones simultáneas. Esto puede conseguirse mediante el remuestreo: por ejemplo, aumentando la muestra de una señal de baja frecuencia para que tenga la misma frecuencia que la señal de alta frecuencia con la que se fusiona.
-
Escala de las señales. Es fundamental que los valores de las señales estén en la misma escala, para que una señal con valores típicamente grandes no abrume a una señal con valores típicamente más pequeños.
-
Combinar numéricamente las señales. Esto puede hacerse mediante operaciones matemáticas sencillas (suma, multiplicación o promedio) o con algoritmos más sofisticados, como el filtro de Kalman (que veremos más adelante), o simplemente concatenando los datos y pasándolos al algoritmo como una única matriz.
Puedes realizar la fusión de sensores antes o después de otras etapas de la ingeniería de características. Por poner un ejemplo arbitrario: si pretendes fusionar dos series temporales, podrías optar por ejecutar primero un paso bajo sobre una de ellas, luego escalarlas a la misma escala, combinar las dos mediante promediado y transformar los valores combinados en el dominio de la frecuencia. ¡No tengas miedo de experimentar!
Ahora tenemos algunas herramientas importantes para procesar los datos. En la siguiente sección, exploraremos los algoritmos de IA que nos ayudarán a comprenderlos.
Algoritmos de Inteligencia Artificial
Hay dos formas de pensar en los algoritmos de IA. Una se basa en la funcionalidad: ¿para qué están diseñados? La otra se basa en la implementación: ¿cómo funcionan? Ambos aspectos son importantes. La funcionalidad es fundamental para la aplicación que intentas crear, y la implementación es importante a la hora de pensar en tus limitaciones, lo que generalmente significa tu conjunto de datos y el dispositivo en el que vas a realizar la implementación.
Tipos de algoritmos según su funcionalidad
En primer lugar, veamos los tipos de algoritmo más importantes desde una perspectiva funcional. Asignar el problema que intentas resolver a estos tipos de algoritmos se conoce como encuadre, y profundizaremos en el encuadre en el Capítulo 6.
Clasificación
Los algoritmos de clasificación intentan resolver el problema de distinguir entre varios tipos, o clases, de cosas. Esto puede significar
-
Un monitor de fitness con un acelerómetro que clasifica el caminar frente al correr
-
Un sistema de seguridad con un sensor de imagen que clasifica una habitación vacía frente a una habitación con una persona presente
-
Una cámara de fauna clasifica cuatro especies diferentes de animales
La Figura 4-7 muestra un clasificador que se utiliza para determinar si una carretilla elevadora está parada o en movimiento, basándose en los datos recogidos por un acelerómetro.
La clasificación puede clasificarse de varias formas distintas, según la tarea:
- Clasificación binaria
-
La entrada pertenece a una de dos clases.
- Clasificación multiclase
-
La entrada pertenece a una de más de dos clases.
- Clasificación multietiqueta
-
La entrada pertenece a cero o más de cualquier número de clases.
Las formas más comunes de clasificación son la binaria y la multiclase. Con estas formas de clasificación, siempre necesitas al menos dos clases. Aunque sólo haya una cosa que te interese (por ejemplo, una persona en la habitación), también necesitas una clase que represente todo lo que no te interesa (por ejemplo, las habitaciones en las que no hay personas). La clasificación multietiqueta es comparativamente poco frecuente.
Regresión
Los algoritmos de regresión intentan obtener cifras. Esto puede significar
-
Un termostato inteligente que predice la temperatura dentro de una hora
-
Una balanza virtual que calcula el peso de un producto alimenticio mediante una cámara
-
Un sensor virtual que estima la velocidad de giro de un motor basándose en su sonido
Los sensores virtuales, como los dos últimos ejemplos, son un caso especialmente interesante de regresión. Pueden utilizar los datos de los sensores disponibles para predecir mediciones de distintos tipos de sensores, sin necesidad de que éstos estén presentes.
Detección y segmentación de objetos
Los algoritmos de detección de objetos toman una imagen o un vídeo e identifican las ubicaciones de objetos concretos dentro de ellos, a menudo dibujando cuadros delimitadores a su alrededor. Combinan la clasificación y la regresión, identificando tipos concretos de objetos y prediciendo sus coordenadas numéricas, como se ve en la Figura 4-8.
Existen algoritmos especializados de detección de objetos para determinados tipos de objetos. Por ejemplo, los modelos de estimación de la pose están diseñados para reconocer partes del cuerpo humano e identificar su ubicación dentro de una imagen, como se muestra en la Figura 4-9.
Los algoritmos de segmentación son similares a los de detección de objetos, pero clasifican las imágenes a nivel de píxel. Esto da lugar a un mapa de segmentación, como se ve en la Figura 4-10, que intenta etiquetar zonas de la entrada con su contenido.
He aquí algunos ejemplos de casos de uso para la detección y segmentación de objetos:
Detección de anomalías
Los algoritmos de detección de anomalías reconocen cuándo una señal se ha desviado de su comportamiento normal. Son útiles en muchas aplicaciones:
-
Un sistema industrial de mantenimiento predictivo que puede reconocer cuándo un motor ha empezado a averiarse por su consumo de corriente
-
Un robot aspirador que puede identificar cuándo circula por una superficie inusual mediante un acelerómetro
-
Una cámara de rastreo que sabe cuándo ha pasado un animal desconocido
Los algoritmos de detección de anomalías son muy útiles para el mantenimiento predictivo. También son muy útiles cuando se combinan con modelos de aprendizaje automático. Muchos modelos de aprendizaje automático producen resultados espurios y aleatorios si se les presenta una entrada que no está en su conjunto de entrenamiento.
Para evitarlo, se puede emparejar un modelo ML con un algoritmo de detección de anomalías que le indique cuándo algo está fuera de distribución, de modo que se puedan descartar sus resultados espurios. Algunos tipos de modelos también pueden calibrarse para que su salida represente una distribución de probabilidad real que pueda interpretarse para reconocer cuándo el modelo es incierto.
Agrupación
Los algoritmos de agrupación intentan agrupar las entradas por similitud y pueden reconocer cuando una entrada no es similar a lo que ha visto antes. Suelen utilizarse cuando un dispositivo de IA de perímetro necesita aprender de su entorno, incluso para aplicaciones de detección de anomalías. Por ejemplo, considera:
-
Un asistente de voz que aprende qué voz pertenece a cada uno de sus usuarios
-
Una aplicación de mantenimiento predictivo que aprende un estado "normal" de funcionamiento y puede detectar desviaciones del mismo
-
Una máquina expendedora que puede recomendar bebidas basándose en las elecciones anteriores de un usuario
Un algoritmo de agrupación puede aprender sus agrupaciones sobre la marcha (después de la implementación) o tenerlas configuradas de antemano.
Reducción de la dimensionalidad
Los algoritmos de reducción de la dimensionalidad toman una señal y producen una representación de ella que contiene información equivalente pero ocupa mucho menos espacio. Así, las representaciones de dos señales pueden compararse fácilmente entre sí. He aquí algunos ejemplos de aplicación:
-
Compresión de audio, para abaratar la transmisión de sonidos desde un dispositivo remoto
-
Reconocimiento de huella dactilar, que garantiza que una huella dactilar coincide con la del propietario de un dispositivo
-
Reconocimiento facial, reconocer rostros individuales en una secuencia de vídeo
La reducción de la dimensionalidad tiende a utilizarse junto con otros algoritmos de IA, en lugar de utilizarse por sí sola. Por ejemplo, puede utilizarse junto con un algoritmo de agrupación para identificar señales similares en tipos de datos complejos, como audio y vídeo.
Transformación
Los algoritmos de transformación toman una señal y emiten otra. He aquí algunosejemplos:
-
Auriculares con supresión de ruido que identifican y eliminan ruidos específicos en una señal
-
Una cámara de marcha atrás que mejora la imagen en condiciones de oscuridad o lluvia
-
Un dispositivo de reconocimiento de voz que toma una señal de audio y emite unatranscripción
La entrada y la salida de los algoritmos de transformación pueden ser muy diferentes. En el caso de la transcripción, la entrada es un flujo de datos de audio y la salida es una secuencia de palabras.
Combinar algoritmos
No hay ninguna razón por la que no puedas mezclar distintos tipos de algoritmos en la misma aplicación. Más adelante exploraremos técnicas para combinar algoritmos (ver "Combinar algoritmos").
Tipos de algoritmos por aplicación
Explorar los algoritmos por funcionalidades nos ayuda a comprender para qué se utilizan, pero desde una perspectiva de ingeniería es importante hacerse una idea de las distintas formas en que pueden implementarse estas funcionalidades. Hay cientos de formas distintas de construir un algoritmo de clasificación, por ejemplo, resultado de décadas de investigación en informática. Cada método tiene sus propios puntos fuertes y débiles, que se ven amplificados por las limitaciones que plantea el hardware de IA de perímetro.
En la siguiente sección, exploraremos las formas más importantes en que se implementan los algoritmos de IA de perímetro. Ten en cuenta que no se trata de una lista exhaustiva: nos centramos en la IA de perímetro, por lo que nos centramos en las tecnologías que funcionan bien en el dispositivo.
Condicionales y heurísticos
El tipo más sencillo de algoritmos de IA se basa en la lógica condicional: simples sentencias if
que dan lugar a decisiones. Volvamos al fragmento de código que exploramos en "Inteligencia Artificial":
current_speed
=
10
# In meters per second
distance_from_wall
=
50
# In meters
seconds_to_stop
=
3
# The minimum time in seconds required to stop the car
safety_buffer
=
1
# The safety margin in seconds before hitting the brakes
# Calculate how long we’ve got before we hit the wall
seconds_until_crash
=
distance_from_wall
/
current_speed
# Make sure we apply the brakes if we’re likely to crash soon
if
seconds_until_crash
<
seconds_to_stop
+
safety_buffer
:
applyBrakes
()
Este sencillo algoritmo realiza un cálculo básico utilizando algunos valores definidos por el ser humano (seconds_to_stop
, etc.) y decide si debe aplicar los frenos de un coche. ¿Esto cuenta como IA? Es una pregunta que puede suscitar debate, pero la respuesta es rotundamente sí.4
La comprensión común de la inteligencia artificial es que se trata de una búsqueda para crear máquinas que puedan pensar como los seres humanos. La definición de ingeniería es mucho más realista: La IA permite a los ordenadores realizar tareas que normalmente requieren inteligencia humana. En este caso, controlar los frenos de un coche para evitar una colisión es definitivamente algo que ha requerido típicamente inteligencia humana. Hace veinte años se habría considerado extremadamente impresionante, pero el frenado automático es una característica habitual enlos vehículos modernos.
Nota
Antes de que te rías de la idea de que las afirmaciones if
puedan ser inteligencia artificial, considera que los árboles de decisión -unade las categorías más populares y eficaces de algoritmos de aprendizaje automático- no son más que afirmaciones if
bajo el capó. Hoy en día, incluso los modelos de aprendizaje profundo pueden implementarse como redes neuronales binarias, que son esencialmente lógica condicional. La inteligencia proviene de la aplicación, ¡no de la implementación!
La lógica condicional de nuestro algoritmo de frenado del coche es, en realidad, una implementación de la clasificación. Dada una entrada (la velocidad del coche y la distancia a un muro), el algoritmo clasifica la situación en uno de dos tipos: conducción segura o choque inminente. La lógica condicional se utiliza de forma natural para la clasificación, ya que su salida es categórica; una afirmación if
nos da una salida u otra.
La lógica condicional está relacionada con la idea de heurística. Una heurística es una regla artesanal que puede aplicarse a una situación para ayudar a comprenderla o reaccionar ante ella. Por ejemplo, el algoritmo de frenado de nuestro coche utiliza la heurística de que si tenemos menos de cuatro segundos antes de chocar contra una pared, debemos aplicar los frenos.
La heurística la diseñan los seres humanos utilizando el conocimiento del dominio. Este conocimiento del dominio puede basarse en datos recogidos sobre una situación del mundo real. En este sentido, nuestro algoritmo de frenado de coches, aparentemente sencillo, podría representar en realidad un conocimiento profundo y bien documentado del mundo real. Tal vez se haya llegado al valor de seconds_to_stop
tras millones de dólares en pruebas de choque y represente el valor ideal de la constante. Con esto en mente, es fácil ver cómo incluso una declaración if
puede representar una cantidad significativa de inteligencia y conocimiento humanos, capturados y destilados en un trozo de código simple y elegante.
Nuestro ejemplo del frenado de un coche es muy sencillo, pero cuando se combina con el procesamiento de señales, la lógica condicional puede tomar decisiones bastante sofisticadas. Por ejemplo, imagina que estás construyendo un sistema de mantenimiento predictivo que pretende alertar a los trabajadores del estado de salud de una máquina industrial basándose en los sonidos que emite. Tal vez la máquina emita un característico quejido agudo cuando está a punto de averiarse. Si capturas el audio y lo traduces al dominio de la frecuencia mediante una transformada de Fourier, puedes utilizar una sencilla sentencia if
para determinar cuándo se produce el quejido y avisar a los trabajadores.
Más allá de las declaraciones if
, puedes utilizar una lógica más compleja para interpretar situaciones basándote en reglas conocidas. Por ejemplo, una máquina industrial puede utilizar un algoritmo codificado a mano para evitar daños variando su velocidad en función de las mediciones de la temperatura y la presión internas. El algoritmo podría tomar la temperatura y la presión y calcular directamente una RPM, utilizando la información humana que se captura en el código.
Si funciona para tu situación, la lógica condicional y otros algoritmos codificados a mano pueden ser asombrosos. Es fácil de entender, fácil de depurar y fácil de probar. No hay riesgo de comportamiento no especificado: el código se bifurca en un sentido o en otro, y todos los caminos pueden ejercitarse con pruebas automatizadas. Se ejecuta increíblemente rápido y funciona en cualquier dispositivo imaginable.
La heurística tiene dos grandes inconvenientes. En primer lugar, desarrollarlas puede requerir importantes conocimientos del dominio y experiencia en programación. El conocimiento del dominio no siempre está disponible; por ejemplo, una empresa pequeña puede no tener los recursos necesarios para llevar a cabo la costosa investigación necesaria para comprender las reglas matemáticas fundamentales de un sistema. Además, incluso teniendo conocimientos del dominio, no todo el mundo tiene la experiencia necesaria para diseñar e implementar un algoritmo heurístico en código eficiente.
El segundo gran inconveniente es la idea de explosión combinatoria. Cuantas más variables estén presentes en una situación, más difícil será modelarla con los algoritmos informáticos tradicionales. Un buen ejemplo de ello es el juego del ajedrez: hay tantas piezas y tantos movimientos posibles que decidir qué hacer a continuación requiere una enorme cantidad de cálculo. Incluso los ordenadores de ajedrez más avanzados construidos con lógica condicional pueden ser derrotados fácilmente por jugadores humanos expertos.
Algunos problemas de IA de perímetro son mucho más complejos que las partidas de ajedrez. Por ejemplo, imagina que intentas escribir a mano una lógica condicional que pueda determinar si la imagen de una cámara muestra una naranja o un plátano. Con algunos trucos ("amarillo significa plátano, naranja significa naranja") podrías tener éxito para algunas categorías de imágenes, pero sería imposible generalizarla más allá de las escenas más simples.
Una buena regla general para la lógica codificada a mano es que cuantos más valores de datos tengas que manejar, más difícil será obtener una solución satisfactoria. Afortunadamente, hay un montón de algoritmos que pueden intervenir cuando falla un enfoque codificado a mano.
Aprendizaje automático clásico
El aprendizaje automático es un enfoque especial para crear algoritmos. Mientras que los algoritmos heurísticos se crean codificando a mano una lógica basada en reglas conocidas, los algoritmos de aprendizaje automático descubren sus propias reglas explorando grandes cantidades de datos.
La siguiente descripción, tomada del libro TinyML, presenta las ideas básicas del aprendizaje automático:
Para crear un programa de aprendizaje automático, un programador introduce datos en un tipo especial de algoritmo y deja que el algoritmo descubra las reglas. Esto significa que, como programadores, podemos crear programas que hagan predicciones basadas en datos complejos sin tener que comprender toda la complejidad nosotros mismos. El algoritmo de aprendizaje automático construye un modelo del sistema basándose en los datos que le proporcionamos, mediante un proceso que llamamos entrenamiento. El modelo es un tipo de programa informático. Pasamos los datos por este modelo para hacer predicciones, en un proceso llamado inferencia.
TinyML (O'Reilly, 2019)
Los algoritmos de aprendizaje automático pueden realizar todas las tareas funcionales descritas anteriormente en este capítulo, desde la clasificación hasta la transformación. El requisito clave para utilizar el aprendizaje automático es que dispongas de un conjunto de datos. Se trata de un gran almacén de datos, generalmente recogidos en condiciones del mundo real, que se utiliza para entrenar el modelo.
Normalmente, los datos necesarios para entrenar un modelo de aprendizaje automático se recopilan durante el proceso de desarrollo, agregados de tantas fuentes como sea posible. Como veremos en capítulos posteriores, un conjunto de datos amplio y variado es fundamental para trabajar con la IA de perímetro, pero especialmente con el aprendizaje automático.
Como el aprendizaje automático depende de grandes conjuntos de datos, y como entrenar un modelo de aprendizaje automático es caro desde el punto de vista informático, la parte de entrenamiento suele tener lugar antes de la implementación, y la inferencia se produce en el perímetro. Sin duda es posible entrenar modelos de aprendizaje automático en el dispositivo, pero la falta de datos combinada con la escasa capacidad de cálculo lo convierten en un reto.
En la IA de perímetro, hay dos formas principales de trabajar con conjuntos de datos de aprendizaje automático:
- Aprendizaje supervisado
-
Cuando el conjunto de datos ha sido etiquetado por un experto para ayudar al algoritmo de aprendizaje automático a comprenderlo
- Aprendizaje no supervisado
-
Cuando el algoritmo identifica estructuras en los datos sin ayuda humana
El aprendizaje automático tiene un gran inconveniente relacionado con el conjunto de datos. Los algoritmos de ML dependen totalmente de sus datos de entrenamiento para saber cómo responder a las entradas. Mientras reciban entradas similares a sus datos de entrenamiento, deberían funcionar bien. Sin embargo, si reciben una entrada muy distinta a la de su conjunto de datos de entrenamiento -lo que se conoce como una entrada fuera de distribución-, producirán una salida completamente inútil.
La parte complicada es que no hay una forma obvia de decir, a partir de la salida, que una entrada estaba fuera de distribución. Esto significa que siempre existe el riesgo de que un modelo proporcione predicciones inútiles. Evitar este problema es una preocupación fundamental cuando se trabaja con aprendizaje automático.
Hay muchos tipos diferentes de algoritmos de aprendizaje automático. El aprendizaje automático clásico engloba la gran mayoría de los que se utilizan en la práctica, con la gran excepción del aprendizaje profundo (que exploraremos en la siguiente sección).
He aquí algunos de los tipos de algoritmos clásicos de ML más útiles para la IA de perímetro. El título indica si son algoritmos supervisados o no supervisados:
- Análisis de regresión (supervisado)
-
Aprende las relaciones matemáticas entre la entrada y la salida para predecir un valor continuo. Fácil de entrenar, rápido de ejecutar, requiere pocos datos y es muy interpretable, pero sólo puede aprender sistemas sencillos.
- Regresión logística (supervisada)
-
Un tipo de análisis de regresión orientado a la clasificación, la regresión logística aprende la relación entre los valores de entrada y las categorías de salida, en sistemas relativamente sencillos.
- Máquina de vectores de apoyo (supervisada)
-
Utiliza matemáticas sofisticadas para aprender relaciones mucho más complejas que el análisis de regresión básico. Requiere pocos datos, se ejecuta rápidamente, puede aprender sistemas complejos, pero es difícil de entrenar y poco interpretable.
- Árboles de decisión y bosques aleatorios (supervisados)
-
Utiliza un proceso iterativo para construir una serie de afirmaciones
if
que predigan una categoría o valor de salida. Fácil de entrenar, rápido de ejecutar, muy interpretable, puede aprender sistemas complejos, pero puede requerir muchos datos de entrenamiento. - Filtro Kalman (supervisado)
-
Predice el siguiente punto de referencia a partir de un historial de mediciones. Puede tener en cuenta múltiples variables para mejorar la precisión. A menudo se entrena en el dispositivo, requiere pocos datos, es rápido de ejecutar y fácil de interpretar, pero sólo puede modelar sistemas relativamente sencillos.
- Vecinos más próximos (sin supervisión)
-
Clasifica los datos según su similitud con puntos de datos conocidos. A menudo se entrena en el dispositivo, requiere pocos datos y es fácil de interpretar, pero sólo puede modelar sistemas relativamente sencillos y puede ser lento con muchos puntos de datos.
- Agrupación (no supervisada)
-
Aprende a agrupar las entradas por similitud, pero no necesita etiquetas. A menudo se entrena en el dispositivo, requiere pocos datos, es rápido de ejecutar y fácil de interpretar, pero sólo puede modelar sistemas relativamente sencillos.
Los algoritmos clásicos de ML son un conjunto increíble de herramientas para interpretar la salida de tu canal de ingeniería de características y tomar decisiones con los datos. Cubren el espectro desde altamente eficientes a altamente flexibles, y pueden realizar muchas tareas funcionales. Otra gran ventaja es que tienden a ser muy explicables: es fácil entender cómo toman sus decisiones. Y dependiendo del algoritmo, los requisitos de datos pueden ser bastante bajos (el aprendizaje profundo suele requerir conjuntos de datos muy grandes).
La diversidad de algoritmos clásicos de ML (hay literalmente cientos) es a la vez una bendición y una maldición para la IA de perímetro. Por un lado, hay algoritmos muy adecuados para muchas situaciones diferentes, lo que hace posible encontrar uno que sea -teóricamente- ideal para un caso de uso concreto. Por otro lado, la gran constelación de algoritmos puede resultar difícil de explorar.
Aunque las bibliotecas como scikit-learn facilitan la prueba de muchos algoritmos diferentes, afinar cada uno de ellos para que funcione de forma óptima e interpretar sus resultados es un arte y una ciencia. Además, si esperas implementarlo en un microcontrolador, puede que tengas que escribir tu propia implementación eficiente de un algoritmo: aún no hay muchas versiones de código abierto disponibles.
Uno de los principales inconvenientes de los algoritmos clásicos de ML es que se topan con un techo relativamente bajo en cuanto a la complejidad de los sistemas que pueden modelar. Esto significa que, para obtener los mejores resultados, a menudo tienen que ir acompañados de una gran ingeniería de características, cuyo diseño puede ser complejo y costoso desde el punto de vista informático. Incluso con ingeniería de características, hay algunas tareas -como la clasificación de datos de imágenes- en las que los algoritmos clásicos de ML no funcionan bien.
Dicho esto, los algoritmos clásicos de ML son un conjunto fantástico de herramientas para tomar decisiones en el dispositivo. Pero si te encuentras con sus limitaciones, el aprendizaje profundo puede ayudarte.
Aprendizaje profundo
El aprendizaje profundo es un tipo de aprendizaje automático que se centra en las redes neuronales. Éstas han demostrado ser una herramienta tan eficaz que el aprendizaje profundo se ha convertido en un campo gigantesco, en el que las redes neuronales profundas se aplican a muchos tipos de aplicaciones.
Nota
Este libro se centra en las propiedades importantes de los algoritmos de aprendizaje profundo desde una perspectiva de ingeniería. La mecánica subyacente del aprendizaje profundo es interesante, pero no son conocimientos necesarios para construir un producto de IA de perímetro. Utilizando herramientas modernas, cualquier ingeniero puede implementar modelos de aprendizaje profundo sin una formación formal en aprendizaje automático. Compartiremos algunas de las herramientas para hacerlo en los capítulos tutoriales más adelante.
El aprendizaje profundo comparte los mismos principios que el ML clásico. Se utiliza un conjunto de datos para entrenar un modelo, que puede implementarse en un dispositivo para realizar inferencias. No hay nada mágico en un modelo: es sólo una combinación de un algoritmo y una colección de números que se introducen en él, junto con la entrada del modelo, para producir la salida deseada.
Los números del modelo se llaman pesos, o parámetros, y se generan durante el proceso de entrenamiento. El término red neuronal se refiere a la forma en que el modelo combina su entrada con sus parámetros, que se inspira en la forma en que se conectan entre sí las neuronas del cerebro de un animal.
Muchas de las hazañas más alucinantes de la ingeniería de IA que hemos visto en la última década han hecho uso de modelos de aprendizaje profundo. He aquí algunos de los más populares:
-
AlphaGo, un programa informático que utilizó el aprendizaje profundo para vencer a los mejores jugadores de Go, un antiguo juego que antes se creía imposible de dominar por los ordenadores
-
GPT-3, un modelo que puede generar un lenguaje escrito indistinguible de la escritura humana
-
Control del reactor de fusión, utilizando el aprendizaje profundo para controlar la forma del plasma dentro de un reactor de fusión
-
DALL-E, un modelo que puede generar imágenes realistas y arte abstracto basándose en indicaciones de texto
-
GitHub Copilot, software que ayuda a los ingenieros de software escribiendo código automáticamente
Más allá de la fantasía, el aprendizaje profundo destaca en todas las tareas de nuestras subsecciones de tipos de algoritmos (ver "Tipos de algoritmos por funcionalidad"). Ha demostrado ser flexible, adaptable y una herramienta increíblemente útil para permitir que los ordenadores comprendan el mundo e influyan en él.
Los modelos de aprendizaje profundo son eficaces porque funcionan como aproximadores universales de funciones. Se ha demostrado matemáticamente que, siempre que puedas describir algo como una función continua, una red de aprendizaje profundo puede modelarlo. Esto significa básicamente que para cualquier conjunto de datos que muestre varias entradas y salidas deseadas, existe un modelo de aprendizaje profundo que puede convertir una cosa en la otra.
Un resultado realmente emocionante de esta capacidad es que, durante el entrenamiento, los modelos de aprendizaje profundo pueden averiguar cómo hacer su propia ingeniería de características. Si se necesita una transformación especial para ayudar a interpretar los datos, un modelo de aprendizaje profundo puede aprender potencialmente cómo hacerlo. Esto no hace que la ingeniería de características sea obsoleta, pero definitivamente reduce la carga del desarrollador para hacer las cosas exactamente bien.
La razón por la que los modelos de aprendizaje profundo son tan buenos aproximando funciones es que pueden tener un gran número de parámetros. Con cada parámetro, el modelo adquiere un poco más de flexibilidad, lo que le permite describir una función ligeramente más compleja.
Esta propiedad conduce a los dos principales inconvenientes de los modelos de aprendizaje profundo. En primer lugar, encontrar los valores ideales para todos estos parámetros es un proceso difícil. Implica entrenar un modelo con muchos datos. Los datos suelen ser un recurso escaso y precioso, difícil y caro de obtener, por lo que esto puede suponer un gran obstáculo. Afortunadamente, hay muchas técnicas que pueden ayudar a sacar el máximo partido de unos datos limitados: las veremos más adelante en el libro.
El segundo gran inconveniente es el riesgo de sobreajuste. El sobreajuste se produce cuando un modelo de aprendizaje automático aprende un conjunto de datos demasiado bien. En lugar de modelar las reglas generales que conducen de las salidas a las entradas en su conjunto de datos, memoriza el conjunto de datos por completo. Esto significa que no funcionará bien con datos que no haya visto antes.
El sobreajuste es un riesgo con todos los modelos de aprendizaje automático, pero es especialmente un reto para los modelos de aprendizaje profundo porque pueden tener muchos parámetros. Cada parámetro adicional proporciona al modelo algo más de capacidad para memorizar su conjunto de datos.
Hay muchos tipos diferentes de modelos de aprendizaje profundo. He aquí algunos de los más importantes para la IA de perímetro:
- Modelos totalmente conectados
-
El tipo más simple de modelo de aprendizaje profundo, los modelos totalmente conectados constan de capas apiladas de neuronas. La entrada de un modelo totalmente conectado se introduce directamente como una larga serie de números. Los modelos totalmente conectados son capaces de aprender cualquier función, pero en su mayoría son ciegos a las relaciones espaciales en sus entradas (por ejemplo, qué valores de una entrada están próximos entre sí).
En un contexto integrado, esto significa que funcionan bien para valores discretos (por ejemplo, si las características de entrada son un conjunto de estadísticas sobre una serie temporal), pero no son tan buenos con series temporales en bruto o datos de imágenes.
Los modelos totalmente conectados están muy bien soportados en dispositivos integrados, con optimizaciones de hardware y software comúnmente disponibles.
- Modelos convolucionales
-
Los modelos convolucionales están diseñados para aprovechar la información espacial de sus entradas. Por ejemplo, pueden aprender a reconocer formas en imágenes, o las estructuras de las señales en series temporales de datos de sensores. Esto los hace extremadamente útiles en aplicaciones integradas, ya que la información espacial es importante en muchas de las señales con las que tratamos.
Al igual que los modelos totalmente conectados, los modelos convolucionales son muy compatibles con los dispositivos integrados.
- Modelos de secuencia
-
Los modelos secuenciales se diseñaron originalmente para su uso en secuencias de datos, como las señales de series temporales o incluso el lenguaje escrito. Para ayudarles a reconocer patrones a largo plazo en series temporales, suelen incluir cierta "memoria" interna.
Resulta que los modelos secuenciales son muy flexibles, y cada vez hay más pruebas de que pueden ser muy eficaces en cualquier señal en la que la información espacial sea importante. Muchos creen que acabarán sustituyendo a los modelos convolucionales.
Actualmente, los modelos secuenciales están peor soportados que los modelos convolucionales y totalmente conectados en los dispositivos embebidos; hay pocas bibliotecas de código abierto que proporcionen implementaciones optimizadas para ellos. Esto se debe más a la inercia que a limitaciones técnicas, por lo que es probable que la situación cambie en los próximos dos años.
- Incorporación de modelos
-
Un modelo de incrustación es un modelo de aprendizaje profundo preentrenado que está diseñado para reducir la dimensionalidad: toma una entrada grande y desordenada y la representa como un conjunto más pequeño de números que la describen dentro de un contexto determinado. Se utilizan del mismo modo que un algoritmo de procesamiento de señales: producen características que pueden ser interpretadas por otro modelo de ML.
Existen modelos de incrustación para muchas tareas, desde el procesamiento de imágenes (convertir una gran imagen desordenada en una descripción numérica de su contenido) hasta el reconocimiento del habla (convertir audio en bruto en una descripción numérica de los sonidos vocales que contiene).
El uso más común para incrustar modelos es el aprendizaje por transferencia, que es una forma de reducir la cantidad de datos necesarios para entrenar un modelo. Más adelante aprenderemos más sobre ello.
Los modelos de incrustación pueden ser modelos totalmente conectados, convolucionales o secuenciales, por lo que su compatibilidad con los dispositivos integrados varía, pero los modelos de incrustación convolucionales son los más comunes.
Sólo en los últimos años se han llevado los modelos de aprendizaje profundo al hardware de IA de perímetro. Dado que a menudo son grandes e implican un cálculo significativo para ejecutarse, ha sido la llegada de MCU y SoC de gama alta con procesadores relativamente potentes y grandes cantidades de ROM y RAM lo que les ha permitido dar el salto.
Es posible ejecutar un pequeño modelo de aprendizaje profundo utilizando sólo unos pocos kilobytes de memoria, pero para los modelos que hacen cosas más complejas -desde la clasificación de audio a la detección de objetos- es habitual que los modelos requieran como mínimo docenas o cientos de kilobytes.
Esto ya es impresionante, puesto que los modelos tradicionales de aprendizaje automático del lado del servidor pueden tener un tamaño de entre decenas de megabytes y varios terabytes. Utilizando una optimización inteligente, y limitando el alcance, los modelos integrados pueden hacerse mucho más pequeños; en breve presentaremos algunas de estas técnicas.
Hay varias formas de ejecutar un modelo de aprendizaje profundo en un dispositivo integrado. He aquí un resumen rápido:
- Intérpretes
-
Los intérpretes de aprendizaje profundo, como TensorFlow Lite para Microcontroladores, utilizan un intérprete para ejecutar un modelo que se almacena como un archivo. Son flexibles y fáciles de usar, pero conllevan cierta sobrecarga computacional y de memoria, y no admiten todos los tipos de modelos.
- Generación de código
-
Las herramientas de generación de código, como EON, toman un modelo de aprendizaje profundo entrenado y lo traducen en código fuente integrado optimizado. Esto es más eficaz que un enfoque basado en un intérprete, y el código es legible para el ser humano, por lo que se puede depurar, pero sigue sin ser compatible con todos los tipos de modelos posibles.
- Compiladores
-
Los compiladores de aprendizaje profundo, como microTVM, toman un modelo entrenado y generan bytecode optimizado que puede incluirse en aplicaciones integradas. La implementación que generan puede ser muy eficiente, pero no es tan fácil de depurar y mantener como el código fuente real. Pueden admitir tipos de modelos no soportados explícitamente por los intérpretes y la generación de código. Es habitual que los proveedores de hardware embebido proporcionen intérpretes o compiladores personalizados para ayudar a ejecutar modelos de aprendizaje profundo en su hardware.
- Codificación manual
-
Es posible implementar una red de aprendizaje profundo escribiendo código a mano, incorporando los valores de los parámetros de un modelo entrenado. Se trata de un proceso difícil y que requiere mucho tiempo, pero permite un control total sobre la optimización y te permite admitir cualquier tipo de modelo.
El entorno para la implementación de modelos de aprendizaje profundo es muy diferente entre los SoC y los microcontroladores. Dado que los SoC ejecutan sistemas operativos completos y modernos, también son compatibles con la mayoría de las herramientas que se utilizan para ejecutar modelos de aprendizaje profundo en servidores. Esto significa que prácticamente cualquier tipo de modelo funcionará en un SoC Linux. Dicho esto, la latencia del modelo variará en función de la arquitectura del modelo y del procesador del SoC.
También hay intérpretes diseñados específicamente para dispositivos SoC. Por ejemplo, TensorFlow Lite proporciona herramientas que permiten ejecutar modelos de aprendizaje profundo de forma más eficiente en SoC, normalmente los que se utilizan en los teléfonos inteligentes. Incluyen implementaciones optimizadas de operaciones de aprendizaje profundo que aprovechan las funciones disponibles en algunos SoC, como las GPU.
Los SoC que tienen aceleradores de aprendizaje profundo integrados son un caso especial. Normalmente, el proveedor de hardware proporciona un compilador o intérprete especial que permite al modelo hacer uso de la aceleración por hardware. Los aceleradores normalmente sólo aceleran determinadas operaciones, por lo que la cantidad de aumento de velocidad depende de la arquitectura del modelo.
Como los microcontroladores no ejecutan sistemas operativos completos, las herramientas estándar para ejecutar modelos de aprendizaje profundo no están disponibles. En su lugar, marcos como TensorFlow Lite para microcontroladores proporcionan una base de apoyo a los modelos. Suelen ir un poco por detrás de las herramientas estándar en cuanto a compatibilidad con operadores, lo que significa que no ejecutarán algunas arquitecturas de modelos.
Operadores y núcleos
En el aprendizaje automático de perímetro, un operador, o núcleo, es una implementación de una operación matemática concreta utilizada para ejecutar un modelo de aprendizaje profundo. Se trata de términos sobrecargados con distintos significados en otros campos, incluso en otras partes del aprendizaje profundo.
Los microcontroladores típicos de gama alta tienen características de hardware como instrucciones SIMD que mejorarán drásticamente el rendimiento de los modelos de aprendizaje profundo. TensorFlow Lite para microcontroladores incluye implementaciones optimizadas de operadores, que hacen uso de estas instrucciones, para varios vendedores. Al igual que con los SoC, los vendedores de aceleradores de hardware basados en microcontroladores suelen proporcionar compiladores o intérpretes personalizados que permiten que los modelos se ejecuten en su hardware.
Las principales ventajas del aprendizaje profundo son su flexibilidad, la reducción de los requisitos para la ingeniería de características y la capacidad de aprovechar grandes cantidades de datos gracias al elevado número de parámetros de los modelos. El aprendizaje profundo destaca por su capacidad para aproximarse a sistemas complejos, yendo más allá de la simple predicción para realizar tareas como generar arte y reconocer con precisión objetos en imágenes. El aprendizaje profundo ofrece mucha libertad, y los investigadores apenas han empezado a explorar su potencial.
Las principales desventajas son sus elevados requisitos de datos, su propensión al sobreajuste, el tamaño relativamente grande y la complejidad computacional de los modelos de aprendizaje profundo, y la complejidad del proceso de entrenamiento. Además, los modelos de aprendizaje profundo pueden ser difíciles de interpretar: puede ser complicado explicar por qué hacen una predicción en lugar de otra. Dicho esto, existen herramientas y técnicas que ayudan a mitigar la mayoría de estos inconvenientes.
Combinar algoritmos
Una sola aplicación de IA de perímetro puede utilizar varios tipos diferentes de algoritmos. He aquí algunas formas típicas de hacerlo:
- Conjuntos
-
Un conjunto es una colección de modelos de aprendizaje automático que reciben la misma entrada. Sus resultados se combinan matemáticamente para tomar una decisión. Dado que cada modelo de aprendizaje automático tiene sus puntos fuertes y débiles, un conjunto de modelos suele ser más preciso en conjunto que sus partes constituyentes. El inconveniente de los conjuntos es la complejidad adicional, la memoria y el cálculo necesarios para almacenar y ejecutar varios modelos.
- Cascadas
-
Una cascada es un conjunto de modelos ML que se ejecutan en secuencia. Por ejemplo, en un teléfono móvil con asistente digital incorporado, se ejecuta constantemente un modelo pequeño y ligero para detectar cualquier señal de habla humana. Una vez detectado el habla, se activa un modelo más grande y costoso desde el punto de vista informático para determinar lo que se ha dicho.
Las cascadas son una gran forma de ahorrar energía, ya que permiten evitar el cálculo innecesario. En un entorno informático heterogéneo, en el que se dispone de varios tipos de procesadores, los componentes individuales de una cascada pueden incluso ejecutarse en procesadores diferentes.
- Extractores de rasgos
-
Como hemos aprendido antes, los modelos de incrustación toman una entrada de alta dimensión, como una imagen, y la reducen a un conjunto de números que describen su contenido. La salida de un modelo de incrustación puede introducirse en otro modelo, diseñado para hacer predicciones basadas en lo que el modelo de incrustación describe sobre la entrada original. En este caso, el modelo de incrustación se utiliza como extractor de características.
Si se utiliza un modelo de incrustación preentrenado, esta técnica -conocida como aprendizaje por transferencia- puedereducir masivamente la cantidad de datos necesarios para entrenar un modelo. En lugar de aprender a interpretar la entrada original de alta dimensión, el modelo sólo necesita aprender a interpretar la salida simple devuelta por el extractor de características.
Por ejemplo, imagina que quieres entrenar un modelo para identificar distintas especies de aves a partir de fotografías. En lugar de entrenar un modelo entero desde cero, podrías utilizar la salida de un extractor de características preentrenado como entrada de tu modelo. Esto podría reducir la cantidad de datos y el tiempo de entrenamiento necesarios para obtener buenos resultados.
Muchos extractores de características de aprendizaje profundo preentrenados están disponibles bajo licencias de código abierto. Suelen utilizarse para tareas relacionadas con las imágenes, ya que se dispone de grandes conjuntos de datos públicos de imágenes para el preentrenamiento.
- Modelos multimodales
-
Un modelo multimodal es un modelo único que toma entradas de varios tipos de datos simultáneamente. Por ejemplo, un modelo multimodal podría aceptar conjuntamente datos de audio y de acelerómetro. Esta técnica puede utilizarse como mecanismo de fusión de sensores, utilizando un único modelo para combinar tipos de datos dispares.
Algoritmos de postprocesamiento
En los dispositivos de IA de perímetro, solemos trabajar con flujos de datos; por ejemplo, una serie temporal continua de datos de audio. Cuando ejecutamos un algoritmo de IA de perímetro en ese flujo de datos, producirá una segunda serie temporal que representa los resultados del algoritmo a lo largo del tiempo.
Esto plantea un problema. ¿Cómo interpretamos esta segunda serie temporal para decidir? Por ejemplo, imagina que estamos analizando audio para detectar cuándo alguien dice una palabra clave, de modo que podamos activar alguna funcionalidad en un producto. Lo que realmente queremos saber es cuándo oímos la palabra clave.
Por desgracia, la serie temporal de resultados de inferencia no es ideal para este fin. En primer lugar, contiene muchos eventos que no representan una palabra clave detectada. Para limpiarlos, podemos ignorar cualquiera cuya confianza en que se ha detectado una palabra clave esté por debajo de un determinado umbral.
En segundo lugar, el modelo puede detectar ocasionalmente (y brevemente) una palabra clave que en realidad no se pronunció. Tenemos que filtrar estos "blips" para limpiar nuestro resultado. Esto equivale a aplicar un filtro de paso bajo a la serie temporal.
Por último, en lugar de decirnos cada vez que se pronunció la palabra clave, la serie temporal sin procesar nos dice a un ritmo determinado si la palabra clave se está pronunciando en ese momento. Esto significa que tenemos que hacer algún ajuste de salida para obtener la información que realmente queremos.
Tras limpiar la salida sin procesar, ahora tenemos una señal que nos indica cuándo se ha detectado realmente una palabra clave. Esto es algo que podemos utilizar en nuestra lógica de aplicación para controlar nuestro dispositivo.
Este tipo de postprocesamiento es muy común en las aplicaciones de IA de perímetro. El algoritmo exacto de postprocesamiento utilizado y sus parámetros particulares -por ejemplo, el umbral para considerar que algo coincide- pueden determinarse caso por caso. Herramientas como la Calibración del rendimiento de Edge Impulse (tratada en "Calibración del rendimiento") permiten a los desarrolladores automatizar el descubrimiento del algoritmo de postprocesamiento ideal para su aplicación.
Diseño a prueba de fallos
Hay muchas cosas que pueden ir mal con una aplicación de IA de perímetro, por lo que es fundamental que siempre haya salvaguardas para protegerse de problemas inesperados.
Por ejemplo, imagina una cámara para la vida salvaje que utiliza un modelo de aprendizaje profundo para identificar cuándo se ha fotografiado un animal de interés y sube la imagen del animal a través de una conexión por satélite. En condiciones normales de funcionamiento, puede enviar unas pocas fotografías al día, lo que no supone un gran coste en tarifas de datos.
Pero sobre el terreno, un problema físico con el hardware de la cámara -como suciedad o reflejos en el objetivo- puede hacer que se tomen imágenes muy distintas de las del conjunto de datos de entrenamiento original. Estas imágenes fuera de distribución podrían provocar un comportamiento no especificado del modelo de aprendizaje profundo, lo que podría significar que el modelo empezara a informar constantemente de que el animal de interés está presente.
Estos falsos positivos, causados por entradas fuera de distribución, podrían dar lugar a la carga de cientos de imágenes a través de la conexión por satélite. No sólo se inutilizaría la cámara, sino que podría costar grandes cantidades en tarifas de transferencia de datos.
En las aplicaciones del mundo real, no hay forma de evitar cosas como daños en los sensores o comportamientos inesperados de los algoritmos. En su lugar, es importante que diseñes tu aplicación para que sea a prueba de fallos. Esto significa que si una parte del sistema fallara, la aplicación minimizaría los daños.
La mejor forma de hacerlo varía según la situación. En el caso de una cámara para la vida salvaje, podría ser inteligente incorporar un límite de velocidad que se active si se sube un número excesivo de fotografías. En otra aplicación, podrías apagar el sistema por completo en lugar de arriesgarte a causar daños.
Construir aplicaciones a prueba de fallos es una parte importante de la IA responsable, y de la buena ingeniería en general. Es algo en lo que hay que pensar desde el principio de cualquier proyecto.
Optimización para dispositivos de perímetro
Con los modelos de aprendizaje automático, y en particular con los modelos de aprendizaje profundo, a menudo hay un equilibrio entre lo bien que un modelo realiza su tarea y la cantidad de memoria y cálculo que requiere el modelo.
Esta compensación es muy importante para la IA de perímetro. Los dispositivos de perímetro suelen estar limitados computacionalmente. Están diseñados para minimizar el coste y el consumo de energía, no para maximizar la computación. Al mismo tiempo, se espera que manejen datos de sensores en tiempo real, a menudo a altas frecuencias, y que reaccionen potencialmente en tiempo real a los acontecimientos del flujo de datos.
Los modelos de aprendizaje automático más grandes suelen ser mejores en tareas complejas, ya que tienen más capacidad, lo que resulta útil para aprender relaciones complicadas entre entradas y salidas. Esta capacidad extra significa que pueden necesitar más ROM y RAM, y también significa que tardan más en computar. El tiempo de cálculo adicional se traduce en un mayor consumo de energía, como aprenderemos en "Ciclo de trabajo".
Encontrar el equilibrio correcto entre el rendimiento de la tarea y el rendimiento computacional es esencial en cualquier aplicación. Es cuestión de hacer malabarismos con las restricciones. Por un lado, existe una norma mínima de rendimiento en una tarea determinada. Por otro lado, las opciones de hardware crean límites duros en la memoria disponible, la latencia y la energía.
Gestionar este equilibrio es una de las partes más difíciles -aunque fascinantes- del desarrollo de la IA de perímetro. Es parte de lo que hace que este campo sea especialmente interesante, y la razón por la que herramientas como AutoML (del que hablaremos en "Aprendizaje automático de máquinas (AutoML)") deben rediseñarse para la IA de perímetro.
Estos son algunos de los factores que pueden ayudarnos a minimizar los requisitos de computación al tiempo que maximizamos el rendimiento de la tarea.
Elección del algoritmo
Cada algoritmo de IA de perímetro tiene un perfil ligeramente diferente de uso de memoria y complejidad computacional. Las limitaciones de tu hardware objetivo deben informar tu elección de algoritmo. Normalmente, los algoritmos clásicos de ML son más pequeños y eficientes que los algoritmos de aprendizaje profundo.
Sin embargo, lo habitual es que los algoritmos de ingeniería de características utilicen mucho más cálculo que cualquiera de ellos, lo que hace que la elección entre el ML clásico y el aprendizaje profundo sea menos significativa. La excepción a esta regla es el análisis de datos de imágenes, que suele requerir poca ingeniería de características pero modelos de aprendizaje profundo relativamente grandes.
Aquí tienes algunas formas habituales de reducir la latencia y la memoria que requieren los algoritmos que elijas:
-
Reduce la complejidad de la ingeniería de funciones. Más matemáticas significa mayor latencia.
-
Reduce la cantidad de datos que llegan al algoritmo de IA.
-
Utiliza el ML clásico en lugar del aprendizaje profundo.
-
Intercambia la complejidad entre la ingeniería de características y el modelo de aprendizaje automático, dependiendo de cuál funcione con más eficacia en tu dispositivo.
-
Reduce el tamaño (el número de pesos y capas) de los modelos de aprendizaje profundo.
-
Elige los tipos de modelo que sean compatibles con el acelerador del dispositivo que elijas.
Compresión y optimización
Existen muchas técnicas de optimización diseñadas para reducir la cantidad de datos y cálculos que requiere un algoritmo determinado. He aquí algunos de lostipos másimportantes:
- Cuantización
-
Una forma de reducir la cantidad de memoria y cálculo que necesita un algoritmo o modelo es disminuir la precisión de sus representaciones numéricas. Como se menciona en "¿Cómo se representan los valores?", hay muchas formas distintas de representar los números en el cálculo, algunas con más precisión que otras.
La cuantización es el proceso de tomar un conjunto de valores y reducir su precisión conservando la información importante que contienen. Se puede hacer tanto para algoritmos de procesamiento de señales como para modelos de ML. Es especialmente útil para los modelos de aprendizaje profundo, que por defecto suelen tener pesos en coma flotante de 32 bits. Reduciendo los pesos a enteros de 8 bits puedes reducir un modelo a 1/4 de su tamaño, normalmente sin mucha reducción de la precisión.
Otra ventaja de la cuantización es que el código para realizar operaciones matemáticas con enteros es más rápido y portátil que el código para realizar operaciones matemáticas con coma flotante. Esto significa que la cuantización produce un aumento significativo de la velocidad en muchos dispositivos, y que los algoritmos cuantizados funcionarán en dispositivos que carezcan de unidades de coma flotante.
La cuantificación es una optimización con pérdidas, lo que significa que suele reducir el rendimiento de la tarea del algoritmo. En los modelos ML, esto puede mitigarse entrenando con una precisión menor para que el modelo aprenda a compensarlo.
- Fusión de operadores
-
En la fusión de operadores, se utiliza un algoritmo consciente del cómputo para inspeccionar los operadores que se utilizan cuando se ejecuta un modelo de aprendizaje profundo. Cuando ciertos grupos de operadores se utilizan juntos, es posible sustituirlos por una única implementación fusionada que se ha escrito para maximizar la eficiencia computacional.
La fusión de operadores es una técnica sin pérdidas: mejora el rendimiento computacional sin causar ninguna reducción en el rendimiento de la tarea. El inconveniente es que las implementaciones fusionadas sólo están disponibles para determinadas combinaciones de operadores, por lo que su impacto depende en gran medida de la arquitectura de un modelo.
- Poda
-
La poda es una técnica con pérdidas que se aplica durante el entrenamiento de un modelo de aprendizaje profundo. Obliga a que muchos de los pesos del modelo tengan valor cero, creando lo que se conoce como un modelo disperso. En teoría, esto debería permitir un cálculo más rápido, ya que cualquier multiplicación que implique un peso cero dará invariablemente como resultado un cero.
Sin embargo, en este momento hay muy poco hardware y software de IA de perímetro diseñado para aprovechar los pesos dispersos. Esto cambiará en los próximos años, pero por ahora la principal ventaja de la poda es que los modelos dispersos son más fáciles de comprimir, debido a sus grandes bloques de valores idénticos. Esto es útil cuando los modelos deben enviarse por aire.
- Destilación de conocimientos
-
La destilación de conocimientos es otra técnica de entrenamiento de aprendizaje profundo con pérdida que permite que un modelo "maestro" grande ayude a entrenar a un modelo "alumno" más pequeño para que reproduzca su funcionalidad. Aprovecha el hecho de que suele haber mucha redundancia en los pesos de un modelo de aprendizaje profundo, lo que significa que es posible encontrar un modelo equivalente que sea más pequeño pero que funcione casi igual de bien.
La destilación del conocimiento es un poco complicada, por lo que todavía no es una técnica habitual, pero es probable que se convierta en una buena práctica en los próximos años.
- Redes neuronales binarias (BNN)
-
Las BNN son modelos de aprendizaje profundo en los que cada peso es un único número binario. Dado que la aritmética binaria es extremadamente rápida en los ordenadores, las redes neuronales binarias pueden ser muy eficientes de ejecutar. Sin embargo, son una tecnología relativamente nueva y las herramientas para entrenar y ejecutar inferencias con ellas aún no se utilizan ampliamente. La binarización es similar a la cuantización y, por tanto, es una técnica con pérdidas.
- Redes neuronales con pico (SNN)
-
Una red neuronal spiking es una red neuronal artificial en la que las señales transmitidas a través de la red tienen un componente temporal. Como sistemas "neuromórficos", están diseñados para parecerse más al funcionamiento de las neuronas biológicas. Presentan diferentes ventajas y desventajas en comparación con los modelos tradicionales de aprendizaje profundo, ya que ofrecen un mejor rendimiento y eficiencia para algunas tareas. Sin embargo, requieren un hardware especializado (en forma de acelerador) para ofrecer alguna ventaja.
Las SNN pueden entrenarse directamente o crearse a partir de un modelo tradicional de aprendizaje profundo en un proceso de conversión. Este proceso puede tener pérdidas.
La compresión de modelos tiene dos grandes inconvenientes. El primero es que la ejecución de modelos comprimidos suele requerir software o hardware específicos, o una combinación de ambos. Esto puede limitar los dispositivos en los que se puede implementar un modelo comprimido.
El segundo inconveniente es más peligroso. La naturaleza con pérdidas de la compresión a menudo provoca una sutil degradación del rendimiento predictivo de un modelo que puede ser difícil de detectar. La reducción de la precisión puede predisponer a un modelo a funcionar bien en los casos comunes, pero a perder rendimiento en la "larga cola" de entradas menos frecuentes.
Este problema puede amplificar los sesgos inherentes a los conjuntos de datos y los algoritmos. Por ejemplo, si un conjunto de datos recogidos para entrenar un wearable de salud con ML contiene menos ejemplos de personas pertenecientes a grupos minoritarios, la compresión del modelo puede dar lugar a un rendimiento degradado para las personas de estos grupos. Como son una minoría, el impacto en la precisión general del modelo puede ser difícil de detectar. Esto hace que sea extremadamente importante evaluar el rendimiento de tu sistema en cada subgrupo de tu conjunto de datos (consulta "Recopilación de metadatos").
Hay dos excelentes artículos científicos sobre este tema de la investigadora Sara Hooker et al. Uno es "What Do Compressed Deep Neural Networks Forget?" (¿Qué olvidan las redes neuronales profundas comprimidas ?), y el otro es "Characterising Bias in Compressed Models" (Caracterización del sesgo en modelos comprimidos).
Formación en el dispositivo
En la gran mayoría de los casos, los modelos de aprendizaje automático utilizados en la IA de perímetro se entrenan antes de su implementación en un dispositivo. El entrenamiento requiere grandes cantidades de datos, normalmente anotados con etiquetas, e implica un cálculo significativo: el equivalente a cientos o miles de inferencias por punto de datos. Esto limita la utilidad del entrenamiento en el dispositivo, ya que, por naturaleza, las aplicaciones de IA en el perímetro están sujetas a graves limitaciones de memoria, cálculo, energía y conectividad.
Dicho esto, hay algunas situaciones en las que la formación en el dispositivo tiene sentido. He aquíun resumen:
- Mantenimiento predictivo
-
Un ejemplo habitual de entrenamiento en el dispositivo se da en el mantenimiento predictivo, cuando se está monitorizando una máquina para determinar si funciona con normalidad. Se puede entrenar un pequeño modelo en el dispositivo con datos que representen un estado "normal". Si las señales de la máquina empiezan a desviarse de esa línea de base, la aplicación puede darse cuenta y tomar medidas.
Este caso de uso sólo es posible cuando se puede suponer que las señales anormales son poco frecuentes, y que en un momento dado es probable que la máquina funcione con normalidad. Esto permite que el aparato trate los datos recogidos como si tuvieran una etiqueta implícita de "normal". Si los estados anormales fueran habituales, sería imposible hacer suposiciones sobre el estado en un momento dado.
- Personalización
-
Otro ejemplo en el que el entrenamiento en el dispositivo tiene sentido es cuando se pide al usuario que proporcione etiquetas deliberadamente. Por ejemplo, algunos smartphones utilizan el reconocimiento facial como método de seguridad. Cuando el usuario configura el dispositivo, se le pide que registre imágenes de su cara. Se almacena una representación numérica de estas imágenes faciales.
Este tipo de aplicaciones suelen utilizar modelos de incrustación cuidadosamente diseñados que convierten los datos brutos en representaciones numéricas compactas de su contenido. Las incrustaciones se diseñan de forma que la distancia euclidiana entre dos incrustaciones5 corresponda a la similitud entre ellas. En nuestro ejemplo de reconocimiento facial, esto facilita la determinación de si una cara nueva coincide con las representaciones almacenadas durante la configuración: se calcula la distancia entre la cara nueva y la cara registrada, y si es lo suficientemente cercana, se considera que las caras son iguales.
Esta forma de personalización funciona bien porque, normalmente, el algoritmo utilizado para determinar la similitud de incrustación puede ser muy sencillo: un cálculo de distancia o un algoritmo de vecinos más próximos. El modelo de incrustación ha hecho todo el trabajo duro.
- Asociación implícita
-
Otro ejemplo de entrenamiento en el dispositivo es cuando las etiquetas están disponibles por asociación. Por ejemplo, las funciones de gestión de la batería, como la Carga optimizada de la batería de Apple, entrenan modelos en el dispositivo para predecir a qué hora es probable que un usuario utilice su dispositivo. Una forma de hacerlo sería entrenar un modelo de previsión para que emita una probabilidad de uso a una hora determinada, dado un registro del uso de las horas anteriores.
En este caso, es fácil recoger y etiquetar datos de entrenamiento en un solo dispositivo. Los registros de uso se recogen en segundo plano, y las etiquetas se aplican según alguna métrica (como si la pantalla estaba activada). La asociación implícita entre el tiempo y el contenido del registro permite etiquetar los datos. A continuación, se puede entrenar un modelo sencillo.
- Aprendizaje federado
-
Uno de los obstáculos del entrenamiento en el dispositivo es la falta de datos de entrenamiento. Además, los datos en el dispositivo suelen ser privados y los usuarios no se sienten cómodos transmitiéndolos. El aprendizaje federado es una forma de entrenar modelos de forma distribuida, a través de muchos dispositivos, preservando la privacidad. En lugar de transmitir datos brutos, los modelos parcialmente entrenados se transmiten entre dispositivos (o entre cada dispositivo y un servidor central). Los modelos parcialmente entrenados pueden combinarse y distribuirse de nuevo a los dispositivos una vez que estén listos.
El aprendizaje federado a menudo parece atractivo, ya que parece proporcionar una forma de que los modelos aprendan y mejoren sobre el terreno. Sin embargo, tiene algunas limitaciones importantes. Es costoso desde el punto de vista informático y requiere grandes cantidades de transferencia de datos, lo que va en contra de las principales ventajas de la IA de perímetro. El proceso de entrenamiento es muy complejo y requiere componentes tanto en el dispositivo como en el servidor, lo que aumenta el riesgo del proyecto.
Como los datos no se almacenan globalmente, no hay forma de validar que el modelo entrenado funciona bien en toda la implementación. El hecho de que los modelos se carguen desde dispositivos locales presenta un vector de ataques a la seguridad. Por último, y lo más importante, no resuelve el problema de las etiquetas. Si no se dispone de datos etiquetados, el aprendizaje federado es inútil.
- Actualizaciones por aire
-
Aunque en realidad no es una técnica de entrenamiento en el dispositivo, la forma más habitual de actualizar los modelos sobre el terreno es mediante actualizaciones por aire. Se puede entrenar un nuevo modelo en el laboratorio, utilizando los datos recogidos sobre el terreno, y distribuirlo a los dispositivos mediante actualizaciones del firmware.
Esto depende de la comunicación en red, y no resuelve el problema de obtener datos etiquetados, pero es la forma más habitual de mantener los modelos actualizados a lo largo del tiempo .
1 Los trozos pueden ser discretos o superponerse, o incluso tener huecos entre ellos.
2 Una de las razones es que el audio bruto de la Figura 4-5 consta de 44.100 muestras, mientras que el espectrograma equivalente sólo tiene 3.960 elementos. Una entrada más pequeña significa un modelo más pequeño.
3 En el procesamiento de imágenes, una característica es una información concreta sobre una imagen, como la posición de determinadas estructuras visuales. La página de Wikipedia titulada "Característica (visión por ordenador)" enumera muchas características comunes de las imágenes.
4 Existe un fenómeno bien documentado conocido como "efecto IA", según el cual en el momento en que los investigadores de IA descubren cómo hacer que un ordenador realice una tarea, los críticos dejan de considerar esa tarea representativa de la inteligencia.
5 Una incrustación puede considerarse como una coordenada en un espacio multidimensional. La distancia euclidiana entre dos incrustaciones es la distancia entre las dos coordenadas.
Get IA en la periferia now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.