Muy buenas, les saluda Miguel y para hoy les traigo un nuevo tutorial.
En esta publicación, te mostraré cómo usar herramientas de aprendizaje automático para principiantes (Semantic Reactor y TensorFlow.js) para crear una aplicación que funcione con lenguaje natural.
Actualización: ¡Semantic Reactor está disponible! Agrégalo a Google Sheets aquí.
La mayoría de la gente es mejor para describir el mundo en lenguaje que para describir el mundo en código (bueno… la mayoría de la gente). Entonces, sería bueno si el aprendizaje automático pudiera ayudar a cerrar la brecha entre los dos.
Ahí es donde entra en juego el «aprendizaje automático semántico», un término general para las técnicas de aprendizaje automático que capturan el significado semántico de palabras o frases. En esta publicación, le mostraré cómo puede usar herramientas amigables para principiantes (Semantic Reactor y Tensorflow.js) para crear prototipos rápidamente de aplicaciones impulsadas por el lenguaje.
Desplácese hacia abajo para sumergirse directamente en el código y las herramientas, o siga leyendo para conocer algunos antecedentes:
Índice
Comprensión del aprendizaje automático semántico
¿Qué son las incrustaciones?
Una forma simple (pero poderosa) en la que Semantic ML puede ayudarnos a construir software basado en lenguaje natural es a través de una técnica llamada incrustaciones.
En el aprendizaje automático, las incrustaciones son una forma aprendida de representar datos en el espacio (es decir, puntos trazados en una cuadrícula de n dimensiones) de modo que las distancias entre los puntos sean significativas. Los vectores de palabras son un ejemplo popular:
Visualización de incrustaciones de palabras.
La imagen de arriba muestra palabras («Inglaterra», «él», «rápido») trazadas en el espacio de manera que palabras similares («perro» y «perros», «Italia» y «Roma», «mujer» y «reina») están cerca uno del otro. Cada palabra está representada por un conjunto de coordenadas (o un vector), por lo que la palabra «reina» podría estar representada por las coordenadas [0.38, 0.48, 0.99, 0.48, 0.28, 0.38].
¿De dónde vienen estos números? Se aprenden mediante un modelo de aprendizaje automático a través de datos. En particular, el modelo aprende qué palabras tienden a aparecer en los mismos puntos de las oraciones. Considere estas dos oraciones:
Mi madre dio a luz a un hijo.
Mi madre dio a luz a una hija.
Debido a que las palabras «hija» e «hijo» se usan a menudo en contextos similares, el modelo de aprendizaje automático aprenderá que deben estar representados uno cerca del otro en el espacio.
Las incrustaciones de palabras son extremadamente útiles en el procesamiento del lenguaje natural. Se pueden usar para encontrar sinónimos («similitud semántica»), para hacer agrupaciones o como un paso de preprocesamiento para un modelo nlp más complicado.
Incrustar oraciones completas
Resulta que las oraciones completas (e incluso los párrafos cortos) también se pueden incrustar de manera efectiva en el espacio, utilizando un tipo de modelo llamado codificador universal de frases. Usando incrustaciones de oraciones, podemos averiguar si dos oraciones son similares. Esto es útil, por ejemplo, si está creando un chatbot y desea saber si una pregunta que hizo un usuario (es decir, «¿Cuándo me despertarás?») Es semánticamente similar a una pregunta que tú, el programador del chatbot, has anticipado. y escribió una respuesta a («¿A qué hora es mi alarma?»).
Reactor semántico: prototipo con aprendizaje automático semántico en una hoja de Google
Muy bien, ahora vamos a las cosas divertidas de construcción parcial.
Primero, algo de inspiración: originalmente me emocioné con Semantic ML cuando Anna Kipnis (ex diseñadora de juegos en Double Fine, ahora en Stadia / Google) me mostró cómo lo usaba para automatizar las interacciones de los videojuegos. Usando un modelo de codificador de oraciones, construyó un mundo de videojuegos que infiere cómo debería reaccionar el entorno a las entradas del jugador usando ML. Me voló la cabeza. Mira nuestro chat aquí:
En el juego de Anna, los jugadores interactúan con un zorro virtual haciendo cualquier pregunta que se les ocurra:
«Fox, ¿puedo tomar un café?»
Luego, usando Semantic ML, el motor del juego (o el sistema de utilidad) considera todas las posibles formas en que el juego podría responder:
Usando un modelo de codificador de oraciones, el juego decide cuál es la mejor respuesta y la ejecuta (en este caso, la mejor respuesta es que Fox te trae taza, por lo que el juego anima a Fox que te trae una taza). Si eso suena un poco abstracto, definitivamente mire el video que vinculé arriba.
Uno de los aspectos más bonitos de este proyecto fue que Anna creó un prototipo en gran parte en una hoja de Google utilizando una herramienta llamada Semantic Reactor.
Reactor semántico es un complemento para Hojas de cálculo de Google que le permite usar modelos de codificador de oraciones directamente en sus propios datos, en una hoja. Acceder a él aquí. Es una excelente manera de crear prototipos de aplicaciones de aprendizaje automático semántico rápidamente, que luego puede convertir en código usando Modelos de TensorFlow.js (pero más sobre eso en un minuto).
Aquí hay un pequeño gif de cómo se ve la herramienta:
Gif de usar Semantic Reactor.
Para usar Semantic Reactor, cree una nueva hoja de Google y escriba algunas oraciones en la primera columna. Aquí, voy a recrear libremente la demostración del zorro de Anna (para todos los detalles, echa un vistazo a su publicación original). Pongo estas oraciones en la primera columna de mi hoja de Google:
Tendrás que usar tu imaginación aquí y pensar en estas «acciones» que un personaje potencial (por ejemplo, un chatbot o un actor en un videojuego) podría realizar.
Una vez que haya instalado Semantic Reactor, podrá habilitarlo haciendo clic en «Complementos -> Semantic Reactor -> Iniciar».
Habilite Semantic Reactor desde el menú desplegable de complementos.
Al hacer clic en «Inicio» se abrirá un panel que le permite escribir una entrada y presionar «Reaccionar»:
Pruebe las clasificaciones de entrada / respuesta.
Cuando presiona «Reaccionar», Semantic Reactor usa un modelo para incrustar todas las respuestas que ha escrito en esa primera columna, calcula una puntuación (¿qué tan buena es la respuesta de esta oración a la consulta?) Y ordena los resultados. Por ejemplo, cuando mi entrada fue «Quiero un café», las respuestas mejor clasificadas de mi hoja de cálculo fueron, «Voy a la taza» y «Te traigo la taza».
También notará que hay dos formas diferentes de clasificar las oraciones con esta herramienta: «Entrada / Respuesta» y «Similitud semántica». Como su nombre lo indica, el primero clasifica las oraciones por lo buenas que son como respuestas a la consulta dada, mientras que la «Similitud semántica» simplemente califica qué tan similares son las oraciones a la consulta.
De la hoja de cálculo al código con TensorFlow.js
Debajo del capó, Semantic Reactor funciona con los modelos de código abierto TensorFlow.js encontrados aquí.
Echemos un vistazo a cómo usar esos modelos en JavaScript, para que pueda convertir su prototipo de hoja de cálculo en una aplicación que funcione.
- Cree un nuevo proyecto de nodo e instale el módulo:
npm init npm install @tensorflow/tfjs @tensorflow-models/universal-sentence-encoder
2. Cree un archivo nuevo (use_demo.js
) y requieren la biblioteca:
require('@tensorflow/tfjs'); const encoder = require('@tensorflow-models/universal-sentence-encoder');
3. Cargue el modelo:
const model = await encoder.loadQnA();
4. Codifique sus oraciones y consulta:
const input = queries: ["I want some coffee"], responses: [ "I grab a ball", "I go to you", "I play with a ball", "I go to school.", "I go to the mug.", "I bring you the mug."] ;const embeddings = await model.embed(input);
5. ¡Voila! Ha transformado sus respuestas y consultas en vectores. Desafortunadamente, los vectores son solo puntos en el espacio. Para clasificar las respuestas, querrá calcular la distancia entre esos puntos (puede hacerlo calculando el producto escalar, que te da el cuadrado distancia euclidiana entre puntos):
// zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]const zipWith = (f, xs, ys) => const ny = ys.length; return (xs.length <= ny ? xs : xs.slice(0, ny)) .map((x, i) => f(x, ys[i])); // Calculate the dot product of two vector arrays. const dotProduct = (xs, ys) => const sum = xs => xs ? xs.reduce((a, b) => a + b, 0) : undefined; return xs.length === ys.length ? sum(zipWith((a, b) => a * b, xs, ys)) : undefined;
Si ejecuta este código, debería ver un resultado como:
[ response: 'I grab a ball', score: 10.788130270345432 , response: 'I go to you', score: 11.597091717283469 , response: 'I play with a ball', score: 9.346379028479209 , response: 'I go to school.', score: 10.130473646521292 , response: 'I go to the mug.', score: 12.475453722603106 , response: 'I bring you the mug.', score: 13.229019199245684 ]
Consulte el ejemplo de código completo aquí.
Y eso es todo: ¡así es como se pasa de una hoja de cálculo de aprendizaje automático semántico a programar rápidamente!
Añadir comentario