Hands-On Large Language Models (Traducido)
Hands-On Large Language Models (Traducido)
Hands-On Large Language Models (Traducido)
Esta es una guía excepcional sobre el mundo de los modelos lingüísticos y sus
aplicaciones prácticas en la industria. Su cobertura altamente visual de las
aplicaciones generativas, representacionales y de recuperación de los modelos
lingüísticos permite a los lectores comprender, usar y perfeccionar rápidamente los modelos lingüísticos.
¡Muy recomendable!
—Nils Reimers, director de aprendizaje automático en Cohere | creador
de los transformadores de oraciones
No puedo pensar en otro libro que sea más importante para leer en este momento. En
cada página, aprendí algo que es fundamental para el éxito en esta era de modelos
lingüísticos.
—Josh Starmer, StatQuest
Si buscas ponerte al día en todo lo relacionado con los LLM, ¡no busques más! En este
maravilloso libro, Jay y Maarten te llevarán de cero a experto en la historia y los últimos
avances en modelos de lenguaje grandes. Con explicaciones muy intuitivas,
excelentes ejemplos de la vida real, ilustraciones claras y laboratorios de código
completos, este libro levanta el telón sobre las complejidades de los modelos de
transformadores, tokenizadores, búsqueda semántica, RAG y muchas otras
tecnologías de vanguardia. ¡Una lectura obligada para cualquier persona interesada en la
última tecnología de IA!
—Luis Serrano, PhD, Fundador y Director Ejecutivo de Serrano
Academy
Machine Translated by Google
HandsOn Large Language Models aporta claridad y ejemplos prácticos para superar el
revuelo en torno a la IA. Ofrece una gran cantidad de excelentes diagramas y ayudas
visuales para complementar las explicaciones claras. Los ejemplos prácticos y el
código concretan lo que otros libros dejan en abstracto. El libro comienza con una
introducción sencilla y va ampliando su alcance de forma constante. En los capítulos
finales, estará perfeccionando y construyendo sus propios modelos de lenguaje
de gran tamaño con confianza.
—Leland McInnes, investigador del Instituto Tutte para
Matemáticas y Computación
Por fin, un libro que no solo evita la cobertura superficial de grandes modelos
lingüísticos, sino que también explora a fondo los antecedentes de un modo accesible
y atractivo. Los autores han creado con maestría una guía definitiva que seguirá
siendo una lectura imprescindible a pesar de los rápidos avances en este campo.
OceanofPDF.com
Machine Translated by Google
OceanofPDF.com
Machine Translated by Google
Copyright © 2024 Jay Alammar y Maarten Pieter Grootendorst. Reservados todos los
derechos.
Publicado por O'Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA
95472.
El logotipo de O'Reilly es una marca registrada de O'Reilly Media, Inc. HandsOn Large
Language Models, la imagen de portada y la imagen comercial relacionada son marcas
comerciales de O'Reilly Media, Inc.
Las opiniones expresadas en este trabajo son las de los autores y no representan
las opiniones del editor. Si bien el editor y los autores han hecho todos los esfuerzos
posibles para garantizar que la información y las instrucciones contenidas en este
trabajo sean precisas, el editor y los autores declinan toda responsabilidad por errores u
omisiones, incluida, sin limitación, la responsabilidad por daños resultantes del uso o
la confianza depositada en este trabajo. El uso de la información y las instrucciones
contenidas en este trabajo se realiza bajo su propio riesgo. Si algún ejemplo de código u
otra tecnología que este trabajo contiene o describe está sujeto a licencias de código abierto
o a los derechos de propiedad intelectual de terceros, es su responsabilidad asegurarse
de que su uso de los mismos cumpla con dichas licencias y/o derechos.
9781098150969
[LSI]
OceanofPDF.com
Machine Translated by Google
Prefacio
Los grandes modelos lingüísticos (LLM) han tenido un impacto profundo y de largo
alcance en el mundo. Al permitir que las máquinas comprendan mejor y generen un
lenguaje similar al humano, los LLM han abierto nuevas posibilidades en el campo de la IA y
han impactado en industrias enteras.
Este libro ofrece una introducción completa y muy visual al mundo de los LLM, que abarca
tanto los fundamentos conceptuales como las aplicaciones prácticas. Desde las
representaciones de palabras que precedieron al aprendizaje profundo hasta la arquitectura de
vanguardia (en el momento de escribir este artículo) Transformer, exploraremos la historia y la
evolución de los LLM. Profundizaremos en el funcionamiento interno de los LLM,
explorando sus arquitecturas, métodos de entrenamiento y técnicas de ajuste. También
examinamos varias aplicaciones de los LLM en la clasificación de texto, la agrupación, el
modelado de temas, los chatbots, los motores de búsqueda y
más.
Para lograr esta filosofía de intuición primero, hacemos un uso generoso del lenguaje visual.
Las ilustraciones ayudarán a dar una identidad visual a los conceptos y procesos principales
involucrados en el proceso de aprendizaje de los LLM.1 Con nuestras ilustraciones
Machine Translated by Google
Mediante nuestro método de contar historias, queremos llevarte a un viaje a este campo
apasionante y potencialmente transformador del mundo.
A lo largo del libro, hacemos una clara distinción entre modelos de lenguaje de representación y
modelos de lenguaje generativos. Los modelos de representación son modelos de lenguaje
generativos que no generan texto, pero se utilizan comúnmente para casos de uso específicos
de tareas, como la clasificación, mientras que los modelos de generación son modelos de lenguaje
generativos que generan texto, como los modelos GPT. Aunque los modelos generativos suelen
ser lo primero que viene a la mente cuando se piensa en modelos de lenguaje generativos,
los modelos de representación siguen teniendo mucho uso. También utilizamos de forma vaga la
palabra "grande" en los modelos de lenguaje grandes y, a menudo, optamos por llamarlos
simplemente modelos de lenguaje, ya que las descripciones de tamaño suelen ser bastante
arbitrarias y no siempre indican capacidad.
Prerrequisitos
Este libro asume que tienes algo de experiencia en programación en Python y estás familiarizado
con los fundamentos del aprendizaje automático. El enfoque estará en desarrollar una intuición sólida
en lugar de derivar ecuaciones matemáticas. Como tal, las ilustraciones combinadas con
ejemplos prácticos impulsarán los ejemplos y el aprendizaje a lo largo de este libro. Este libro no
asume ningún conocimiento previo de marcos de aprendizaje profundo populares como PyTorch o
TensorFlow ni ningún conocimiento previo de modelado generativo.
Si no está familiarizado con Python, un excelente lugar para comenzar es Learn Python. donde
encontrarás muchos tutoriales sobre los conceptos básicos del lenguaje. Para facilitar aún más el
proceso de aprendizaje, hemos puesto todo el código a disposición en Google Colab, una plataforma
donde puedes ejecutar todo el código sin necesidad de instalar nada localmente.
Machine Translated by Google
NOTA
No todos los capítulos requieren un mínimo de 16 GB de VRAM, ya que algunos ejemplos, como el
entrenamiento y el ajuste fino, requieren un uso más intensivo de recursos informáticos que otros, como la
ingeniería de indicaciones. En el repositorio, encontrará los requisitos mínimos de GPU para cada capítulo.
Todo el código, los requisitos y los tutoriales adicionales están disponibles en el repositorio de este
libro . Si desea ejecutar los ejemplos localmente, le recomendamos que tenga acceso a una GPU
NVIDIA con un mínimo de 16 GB de VRAM. Para una instalación local, por ejemplo con conda,
Claves API
Usamos modelos de código abierto y de propiedad exclusiva en todos los ejemplos para demostrar
las ventajas y desventajas de ambos. Para los modelos de propiedad exclusiva,
utilizando la oferta de OpenAI y Cohere, deberá crear una cuenta gratuita:
IA abierta
Haga clic en “Registrarse” en el sitio para crear una cuenta gratuita. Esta cuenta le permite crear
una clave API, que puede usarse para acceder a GPT3.5. Luego,
Adherirse
Registre una cuenta gratuita en el sitio web. Luego, vaya a “Claves API” para crear
Tenga en cuenta que con ambas cuentas se aplican límites de velocidad y que estas claves API
gratuitas solo permiten una cantidad limitada de llamadas por minuto. En todos los
ejemplos, hemos tenido eso en cuenta y brindamos alternativas locales si es necesario.
necesario.
Para los modelos de código abierto, no es necesario crear una cuenta, con la excepción del modelo
Llama 2 del Capítulo 2. Para usar ese modelo, necesitará una cuenta de Hugging Face:
Machine Translated by Google
Cara abrazada
Haga clic en “Registrarse” en el sitio web de Hugging Face para crear una cuenta gratuita.
Itálico
Ancho constante
Se utiliza para listados de programas, así como dentro de párrafos para hacer
referencia a elementos del programa, como nombres de variables o funciones, bases de
datos, tipos de datos, variables de entorno, declaraciones y palabras clave.
Muestra texto que debe reemplazarse con valores proporcionados por el usuario o por
valores determinados por el contexto.
CONSEJO
NOTA
Este elemento significa una nota general.
Este libro está aquí para ayudarle a hacer su trabajo. En general, si se ofrece código de
ejemplo con este libro, puede usarlo en sus programas y documentación.
No necesita ponerse en contacto con nosotros para solicitar permiso a menos que esté
reproduciendo una parte importante del código. Por ejemplo, escribir un programa
que utilice varios fragmentos de código de este libro no requiere permiso. Vender o
distribuir ejemplos de los libros de O'Reilly sí requiere permiso. Responder a una
pregunta citando este libro y citando código de ejemplo no requiere permiso. Incorporar
una cantidad significativa de código de ejemplo de este libro en la documentación
de su producto sí requiere permiso.
Si considera que su uso de ejemplos de código no se ajusta al uso justo o al permiso otorgado
NOTA
Durante más de 40 años, O'Reilly Media Ha proporcionado capacitación, conocimiento y visión
tecnológica y empresarial para ayudar a las empresas a tener éxito.
Cómo contactarnos
Por favor, dirija sus comentarios y preguntas sobre este libro al editor:
Sebastopol, CA 95472
7078290104 (fax)
soporte@oreilly.com
Machine Translated by Google
https://www.oreilly.com/about/contact.html
Contamos con una página web para este libro, donde enumeramos erratas, ejemplos y
cualquier información adicional. Puede acceder a esta página
en https://oreil.ly/hands_on_LLMs_1e.
Expresiones de gratitud
Escribir este libro ha sido una experiencia, una colaboración y un viaje increíble para
nosotros.
El campo de los modelos lingüísticos (de gran tamaño) es una de las áreas más dinámicas
de la tecnología actual y, en el lapso en que se escribió este libro, hemos sido
testigos de avances extraordinarios. Sin embargo, a pesar del rápido ritmo de cambio,
los principios fundamentales siguen siendo sorprendentemente consistentes, lo que hizo que
el proceso de escritura fuera particularmente fascinante. Estamos agradecidos de haber
tenido la oportunidad de explorar este campo en profundidad en un momento tan crucial.
¡Trabajar con nuestro equipo de O'Reilly fue increíble! Un agradecimiento especial a Michele
Cronin por sus increíbles comentarios, apoyo y entusiasmo por este libro desde el primer
día. No podríamos haber pedido una mejor editora, ¡eres increíble! Gracias, Nicole
Butterfield, por dar inicio a este libro y ayudarnos a mantener un enfoque estructurado
durante la escritura. Gracias a Karen Montgomery por crear nuestra maravillosa portada,
¡nos encanta el canguro! Muchas gracias a Kate Dullea por ser tan paciente con nosotros
cuando tuvimos que revisar cientos de ilustraciones muchas veces. Los lanzamientos
tempranos y oportunos de Clare Laylock nos ayudaron a ver crecer nuestro trabajo, lo
que fue una gran motivación, gracias. Gracias a Ashley Stussy y Charles Roumeliotis por
el desarrollo en las etapas finales del libro y a todos los demás en O'Reilly que contribuyeron.
Machine Translated by Google
Gracias a nuestro increíble equipo de revisores técnicos. Harm Buisman, Emir Muñoz,
Luba Elliott, Guarav Chawla, Rafael V. Pierre, Luba Elliott, Tarun Narayanan, Nikhil
Buduma y Patrick Harrison nos brindaron valiosos comentarios.
Arrendajo
No podría concebir que este proyecto se hubiera logrado al nivel que lo ha hecho sin el
extraordinario talento y el esfuerzo incansable de Maarten, mi coautor.
Tu capacidad para clavar repetidamente los detalles técnicos (desde la versión fijada de la
enésima dependencia de importación hasta lo último en cuantificación LLM) mientras tejes
algunas de las mejores narrativas visuales del mundo es absolutamente
impresionante.
Por último, quiero agradecer a la increíble escena de cafeterías de Riad, Arabia Saudita, por
proporcionarme cafeína y un buen lugar para concentrarme desde el amanecer hasta la
medianoche. Es donde leí la mayoría de estos artículos y donde aprendí a trabajar (te estoy
mirando a ti, Elixir Bunn).
Martín
—Nuestras pausas para tomar café los lunes por la mañana para hablar sobre este libro fueron
una fuente constante de aliento.
1
J. Alammar. “Comunicación de la investigación sobre aprendizaje automático a través de artículos web ilustrados e
interactivos”. Más allá de los artículos estáticos: replanteando cómo compartimos la comprensión científica en el aprendizaje automático.
Taller ICLR 2021 (2021).
OceanofPDF.com
Machine Translated by Google
OceanofPDF.com
Machine Translated by Google
Como resultado, 2023 siempre será conocido, al menos para nosotros, como el
año que cambió drásticamente nuestro campo, la Inteligencia Artificial del Lenguaje
(Language AI), un campo caracterizado por el desarrollo de sistemas capaces de
comprender y generar lenguaje humano.
Sin embargo, los LLM ya existen desde hace algún tiempo y los modelos más pequeños
siguen siendo relevantes hoy en día. Los LLM son mucho más que un modelo único y
existen muchas otras técnicas y modelos en el campo de la IA lingüística que vale la pena
explorar.
Machine Translated by Google
En este libro, nuestro objetivo es brindar a los lectores una comprensión sólida
de los fundamentos de los LLM y del campo de la IA lingüística en general. Este capítulo
sirve como andamiaje para el resto del libro y presentará conceptos y términos que
utilizaremos a lo largo de los capítulos.
Pero sobre todo, en este capítulo pretendemos responder a las siguientes preguntas:
¿Cuáles son los casos de uso y aplicaciones comunes de los modelos de lenguaje
grandes?
Usamos el término IA del lenguaje para abarcar tecnologías que técnicamente podrían no ser
LLM, pero que aún así tienen un impacto significativo en el campo, como por ejemplo, cómo los
sistemas de recuperación pueden otorgarles superpoderes a los LLM (ver Capítulo 8).
En este libro, queremos centrarnos en los modelos que han tenido un papel importante en
la configuración del campo de la IA lingüística. Esto significa explorar más que solo los LLM de
forma aislada. Sin embargo, eso nos lleva a la pregunta: ¿qué son los grandes modelos
lingüísticos? Para comenzar a responder esta pregunta en este capítulo, exploremos primero la
historia de la IA lingüística.
La historia de la IA del lenguaje abarca muchos desarrollos y modelos que apuntan a representar
y generar lenguaje, como se ilustra en la Figura 11.
Sin embargo, el lenguaje es un concepto complicado para las computadoras. El texto no tiene
estructura por naturaleza y pierde su significado cuando se representa con ceros y unos
(caracteres individuales). Como resultado, a lo largo de la historia de la IA del lenguaje,
Machine Translated by Google
Se ha puesto mucho énfasis en representar el lenguaje de una manera estructurada para que las
computadoras puedan utilizarlo más fácilmente. En la Figura 12 se ofrecen ejemplos de estas tareas de
Figura 12. La IA del lenguaje es capaz de realizar muchas tareas procesando la entrada de texto.
de palabras, un método para representar texto no estructurado.2 Se mencionó por primera vez alrededor de
El modelo de bolsa de palabras funciona de la siguiente manera: supongamos que tenemos dos oraciones para
las que queremos crear representaciones numéricas. El primer paso del modelo de bolsa de palabras es
Figura 13. Cada oración se divide en palabras (tokens) al dividirlas en un espacio en blanco.
El método más común para la tokenización es dividir un espacio en blanco para crear palabras
individuales. Sin embargo, esto tiene sus desventajas, ya que algunos idiomas, como el
mandarín, no tienen espacios en blanco alrededor de las palabras individuales. En el próximo
capítulo, analizaremos en profundidad la tokenización y cómo esa técnica influye en los modelos de
lenguaje. Como se ilustra en la Figura 14, después de la tokenización, combinamos todas las
palabras únicas de cada oración para crear un vocabulario que podemos usar para representar
las oraciones.
Figura 14. Se crea un vocabulario conservando todas las palabras únicas en ambas oraciones.
Utilizando nuestro vocabulario, simplemente contamos la frecuencia con la que aparece una palabra
en cada oración, creando literalmente una bolsa de palabras. Como resultado, un modelo de bolsa
de palabras tiene como objetivo crear representaciones de texto en forma de números, también
Machine Translated by Google
denominados vectores o representaciones vectoriales, que se observan en la Figura 15. A lo largo del libro, nos
Figura 15. Se crea una bolsa de palabras contando palabras individuales. Estos valores se denominan
representaciones vectoriales.
no es más que una bolsa de palabras casi literal e ignora la naturaleza semántica, o el significado, del texto.
Lanzado en 2013, word2vec fue uno de los primeros intentos exitosos de capturar el significado del texto
3
en incrustaciones, es decir, representaciones de datos que intentan Las incrustaciones son vectoriales
mediante el entrenamiento con grandes cantidades de datos textuales, como la totalidad de Wikipedia.
Para generar estas representaciones semánticas, word2vec utiliza redes neuronales. Estas redes
consisten en capas interconectadas de nodos que procesan información. Como se ilustra en la Figura 16,
Muchas capas en las que cada conexión tiene un peso determinado en función de la
entrada. Estos pesos suelen denominarse parámetros del modelo.
Figura 16. Una red neuronal consta de capas de nodos interconectados donde cada conexión es una
ecuación lineal.
Figura 17. Se entrena una red neuronal para predecir si dos palabras son vecinas. Durante este proceso, las
incrustaciones se actualizan para que estén en línea con la realidad básica.
Las incrustaciones resultantes capturan el significado de las palabras, pero ¿qué significa eso
exactamente? Para ilustrar este fenómeno, simplifiquemos un poco e imaginemos que tenemos
incrustaciones de varias palabras, a saber, "manzana" y "bebé". Las incrustaciones intentan
capturar el significado al representar las propiedades de las palabras. Por ejemplo, la
palabra "bebé" puede tener una puntuación alta en las propiedades "recién nacido" y "humano",
mientras que la palabra "manzana" tiene una puntuación baja en estas propiedades.
Como se ilustra en la Figura 18, las incrustaciones pueden tener muchas propiedades
para representar el significado de una palabra. Dado que el tamaño de las incrustaciones
es fijo, sus propiedades se eligen para crear una representación mental de la palabra.
Figura 18. Los valores de las incrustaciones representan propiedades que se utilizan para representar palabras. Podemos
simplificar demasiado imaginando que las dimensiones representan conceptos (lo cual no es así), pero esto ayuda a
expresar la idea.
En la práctica, estas propiedades suelen ser bastante oscuras y rara vez se relacionan con
una sola entidad o concepto identificable por el ser humano. Sin embargo, en conjunto, estas
Machine Translated by Google
Las propiedades tienen sentido para una computadora y sirven como una buena manera de
traducir el lenguaje humano al lenguaje de computadora.
Las incrustaciones son tremendamente útiles, ya que nos permiten medir la similitud
semántica entre dos palabras. Mediante el uso de diversas métricas de distancia, podemos juzgar
qué tan cerca está una palabra de otra. Como se ilustra en la Figura 19, si comprimiéramos
estas incrustaciones en una representación bidimensional, observaríamos que las
palabras con significados similares tienden a estar más cerca. En el Capítulo 5, exploraremos cómo
comprimir estas incrustaciones en un espacio ndimensional.
Figura 19. Las incrustaciones de palabras que son similares estarán próximas entre sí en el espacio dimensional.
Tipos de incrustaciones
Hay muchos tipos de incrustaciones, como incrustaciones de palabras e incrustaciones de
oraciones que se utilizan para indicar diferentes niveles de abstracciones (palabra versus
oración), como se ilustra en la Figura 110.
A lo largo del libro, las incrustaciones tendrán un papel central, ya que se utilizan en
muchos casos de uso, como la clasificación (véase el Capítulo 4), la agrupación (véase el
Capítulo 5) y la búsqueda semántica y la generación aumentada por recuperación
(véase el Capítulo 8). En el Capítulo 2, profundizaremos por primera vez en las
incrustaciones de tokens.
de palabras. Por ejemplo, la palabra “banco” siempre tendrá la misma incrustación independientemente del
contexto en el que se utilice. Sin embargo, “banco” puede referirse tanto a un banco financiero como a la orilla
de un río. Su significado, y por lo tanto sus incrustaciones, deberían cambiar según el contexto.
Para ello, estas RNN se utilizan para dos tareas: codificar o representar una oración de
entrada y decodificar o generar una oración de salida. La figura 111 ilustra este concepto
mostrando cómo una oración como “Me encantan las llamas” se traduce al holandés “Ik
hou van lama's”.
Figura 111. Dos redes neuronales recurrentes (decodificador y codificador) que traducen una secuencia de
entrada del inglés al holandés.
Figura 112. Cada token de salida anterior se utiliza como entrada para generar el siguiente token.
Figura 113. Al utilizar incrustaciones de word2vec, se genera una incrustación de contexto que representa la
secuencia completa.
Sin embargo, esta incrustación de contexto dificulta el manejo de oraciones más largas,
ya que se trata simplemente de una única incrustación que representa toda la entrada.
En 2014, se presentó una solución llamada atención Se introdujo una nueva
arquitectura que mejoró enormemente la arquitectura original.4 La atención permite que un
modelo se centre en partes de la secuencia de entrada que son relevantes entre sí
(«prestar atención» entre sí) y amplifique su señal, como se muestra en la Figura 114.
La atención determina de forma selectiva qué palabras son las más importantes en una oración determinada.
Por ejemplo, la palabra de salida “lama’s” significa “llamas” en holandés, por lo que la
atención entre ambas es alta. De manera similar, las palabras “lama’s” y “yo” tienen una
atención menor, ya que no están tan relacionadas. En el Capítulo 3, profundizaremos más
en el mecanismo de atención.
Machine Translated by Google
Figura 114. La atención permite que un modelo “preste atención” a ciertas partes de secuencias que podrían estar
más o menos relacionadas entre sí.
Figura 115. Después de generar las palabras “Ik”, “hou” y “van”, el mecanismo de atención del decodificador le
permite centrarse en la palabra “llamas” antes de generar la traducción al holandés (“lama's”).
Machine Translated by Google
Como resultado, durante la generación de “Ik hou van lama's”, la RNN lleva un registro
de las palabras a las que presta mayor atención para realizar la traducción. En comparación
con word2vec, esta arquitectura permite representar la naturaleza secuencial del texto y
el contexto en el que aparece al “prestar atención” a la oración completa. Sin
embargo, esta naturaleza secuencial impide la paralelización durante el entrenamiento
del modelo.
Figura 116. El transformador es una combinación de bloques codificadores y decodificadores apilados donde la
entrada fluye a través de cada codificador y decodificador.
Figura 118. La autoatención atiende a todas las partes de la secuencia de entrada de modo que puede “mirar” tanto hacia
adelante como hacia atrás en una sola secuencia.
Figura 119. El decodificador tiene una capa de atención adicional que atiende la salida del codificador.
Figura 120. Preste atención únicamente a los tokens anteriores para evitar “mirar hacia el futuro”.
Machine Translated by Google
La arquitectura Transformer es mucho más compleja de lo que hemos explorado hasta ahora.
En los capítulos 2 y 3, analizaremos las diversas razones por las que los modelos
Transformer funcionan tan bien, incluida la atención de múltiples cabezas, las
incrustaciones posicionales y la normalización de capas.
Estos bloques codificadores son los mismos que vimos antes: autoatención
seguida de redes neuronales de retroalimentación. La entrada contiene un token adicional,
el [CLS] o token de clasificación, que se utiliza como representación de
toda la entrada. A menudo, utilizamos este token [CLS] como la incrustación de entrada
para ajustar el modelo en tareas específicas, como la clasificación.
El entrenamiento de estas pilas de codificadores puede ser una tarea difícil que BERT
aborda adoptando una técnica llamada modelado de lenguaje enmascarado (consulte los
capítulos 2 y 11). Como se muestra en la Figura 122, este método enmascara una parte
de la entrada para que el modelo la prediga. Esta tarea de predicción es difícil, pero
permite a BERT crear representaciones más precisas (intermedias) de la entrada.
Machine Translated by Google
Figura 122. Entrene un modelo BERT mediante el uso de modelado de lenguaje enmascarado.
Figura 123. Después de entrenar previamente BERT en el modelo de lenguaje enmascarado, lo ajustamos para tareas específicas.
Una gran ventaja de los modelos preentrenados es que la mayor parte del entrenamiento ya
está hecho por nosotros. El ajuste fino de tareas específicas generalmente requiere
menos recursos computacionales y menos datos. Además, los modelos tipo BERT
generan incrustaciones en casi cada paso de su arquitectura. Esto también hace que
Machine Translated by Google
Los modelos BERT cuentan con máquinas de extracción sin necesidad de afinarlas para una
tarea específica.
En muchas partes del libro se utilizarán modelos basados sólo en codificador, como BERT.
Durante años, se han utilizado y se siguen utilizando para tareas comunes, incluidas tareas de
clasificación (véase el Capítulo 4), tareas de agrupamiento (véase el Capítulo 5) y búsqueda
semántica (véase el Capítulo 8).
A lo largo del libro, nos referiremos a los modelos que solo incluyen codificadores
como modelos de representación para diferenciarlos de los que solo incluyen decodificadores, a
los que llamaremos modelos generativos. Tenga en cuenta que la principal distinción no radica
entre la arquitectura subyacente y la forma en que funcionan estos modelos.
Los modelos de representación se centran principalmente en la representación del lenguaje, por
ejemplo, mediante la creación de incrustaciones, y normalmente no generan texto. Por el
contrario, los modelos generativos se centran principalmente en la generación de texto y
normalmente no están entrenados para generar incrustaciones.
GPT1 se entrenó con un corpus de 7000 libros y Common Crawl, un gran conjunto de datos de
páginas web. El modelo resultante consistió en 117 millones de parámetros. Cada
parámetro es un valor numérico que representa la comprensión del lenguaje por parte del modelo.
Machine Translated by Google
Si todo sigue igual, esperamos que más parámetros influyan en gran medida
en las capacidades y el rendimiento de los modelos de lenguaje. Teniendo esto
en cuenta, vimos que se lanzaban modelos cada vez más grandes a un ritmo
constante. Como se ilustra en la Figura 125, GPT2 tenía 1.500 millones de
parámetros8 y GPT3 utilizó 175.000 millones de parámetros9 .
Figura 124. Arquitectura de un GPT1. Utiliza una arquitectura que solo incluye decodificador y elimina el bloqueo
de atención del codificador.
Machine Translated by Google
Figura 125. Los modelos GPT crecieron rápidamente en tamaño con cada iteración.
Estos modelos generativos que solo incluyen decodificadores, especialmente los modelos “más
grandes”, se conocen comúnmente como modelos de lenguaje grandes (LLM). Como veremos más
adelante en este capítulo, el término LLM no solo se reserva para los modelos generativos
(solo incluyen decodificadores), sino también para los modelos de representación (solo incluyen codificadores).
Los LLM generativos, como máquinas secuencia a secuencia, toman un texto e intentan completarlo
automáticamente. Si bien es una característica útil, su verdadero poder se demostró al estar
entrenados como chatbots. En lugar de completar un texto, ¿qué pasaría si se los pudiera entrenar
para que respondieran preguntas? Al ajustar estos modelos, podemos crear modelos de instrucción o
chat que puedan seguir instrucciones.
Como se ilustra en la Figura 126, el modelo resultante podría tomar una consulta (solicitud) del usuario
y generar una respuesta que probablemente seguiría a esa solicitud.
Por ello, a menudo oirás que los modelos generativos son modelos de completitud .
Machine Translated by Google
Figura 126. Los modelos LLM generativos toman una determinada información e intentan completarla. Con los modelos de instrucción,
esto es más que simplemente completar automáticamente e intentar responder la pregunta.
Una parte vital de estos modelos de finalización es algo llamado longitud de contexto
o ventana de contexto. La longitud de contexto representa la cantidad máxima de
tokens que el modelo puede procesar, como se muestra en la Figura 127. Una ventana
de contexto grande permite que se pasen documentos completos al LLM. Tenga en
cuenta que debido a la naturaleza autorregresiva de estos modelos, la longitud de
contexto actual aumentará a medida que se generen nuevos tokens.
Machine Translated by Google
Figura 127. La longitud del contexto es el contexto máximo que un LLM puede manejar.
El año de la IA generativa
Figura 128. Una visión integral del Año de la IA Generativa. ¡Tenga en cuenta que todavía faltan muchos
modelos en esta descripción general!
Además de la popular arquitectura Transformer, han surgido nuevas arquitecturas prometedoras como
13 Estas novelas
Mamba11,12 y RWKV. Las arquitecturas intentan alcanzar el rendimiento de nivel
Transformer con ventajas adicionales, como ventanas de contexto más grandes o inferencia
más rápida.
Estos avances ejemplifican la evolución del campo y muestran que 2023 será un año verdaderamente
agitado para la IA. Tuvimos que hacer todo lo posible para mantenernos al día con los numerosos avances,
tanto dentro como fuera de la IA lingüística.
En este sentido, este libro no solo explora los últimos LLM. Exploraremos cómo otros modelos, como los
modelos de incrustación, los modelos de solo codificador e incluso los modelos de bolsa de palabras,
se pueden usar para potenciar los LLM.
¿Qué sucedería si creáramos un modelo con las mismas capacidades que GPT3 pero diez veces
más pequeño? ¿Quedaría fuera de la categoría de modelo de lenguaje “grande”?
De manera similar, ¿qué pasaría si lanzáramos un modelo tan grande como GPT4 que puede
realizar una clasificación de texto precisa pero no tiene capacidades generativas?
¿Podría seguir calificándose como un gran “modelo de lenguaje” si su función principal no es la
generación de lenguaje, aunque todavía represente texto?
El problema con este tipo de definiciones es que excluimos a los modelos capaces. El nombre
que le demos a un modelo u otro no cambia su comportamiento.
Dado que la definición del término “modelo de lenguaje grande” tiende a evolucionar con el
lanzamiento de nuevos modelos, queremos ser explícitos en lo que significa para este libro.
“Grande” es arbitrario y lo que podría considerarse un modelo grande hoy podría ser pequeño
mañana. Actualmente hay muchos nombres para lo mismo y para nosotros, los “modelos de
lenguaje grande” también son modelos que no generan texto y pueden ejecutarse en hardware
de consumo.
Por lo tanto, además de cubrir los modelos generativos, este libro también cubrirá los modelos
con menos de mil millones de parámetros que no generan texto. Exploraremos cómo otros
modelos, como los modelos de incrustación, los modelos de representación e incluso los modelos
de bolsa de palabras, pueden usarse para potenciar los LLM.
Figura 129. El aprendizaje automático tradicional implica un solo paso: entrenar un modelo para una
tarea específica, como clasificación o regresión.
El primer paso, llamado preentrenamiento, ocupa la mayor parte del tiempo de cómputo y
Sintonia FINA
el modelo entrenado previamente y entrenarlo aún más en una tarea más específica.
deseado. Por ejemplo, podríamos ajustar un modelo base para que funcione bien.
En general, requiere datos y recursos informáticos que están fuera del alcance de la
mayoría de las personas y organizaciones. Por ejemplo, Llama 2 se entrenó con un conjunto
¡Es necesario crear ese modelo! En el Capítulo 12, repasaremos varios métodos para ajustar
Cualquier modelo que pase por el primer paso, el preentrenamiento, se considera un modelo
preentrenado, que también incluye modelos ajustados. Este enfoque de entrenamiento en dos
pasos se visualiza en la Figura 130.
Figura 130. En comparación con el aprendizaje automático tradicional, el entrenamiento LLM adopta un enfoque de varios pasos.
Se pueden agregar pasos de ajuste adicionales para alinear aún más el modelo con las
preferencias del usuario, como exploraremos en el Capítulo 12.
solo codificador como de solo decodificador, ya sea con modelos entrenados previamente
Esta es una clasificación (no supervisada) para la que no tenemos etiquetas predefinidas.
la clasificación en sí y los modelos de solo decodificador para etiquetar los temas (ver
Capítulo 5).
Recursos externos de información. Mediante la búsqueda semántica, podemos crear sistemas que
nos permitan acceder y encontrar fácilmente información para que la utilice un LLM (consulte el
El poder de los LLM se puede encontrar a través de componentes adicionales. Métodos como la
ingeniería de avisos (ver Capítulo 6), la generación aumentada por recuperación (ver
Construir un LLM capaz de escribir recetas a partir de una imagen que muestre los productos
de tu refrigerador
Esta es una tarea multimodal donde el LLM toma una imagen y razona
sobre lo que ve (ver Capítulo 9). Los LLM se están adaptando a otras modalidades, como la
casos.
Machine Translated by Google
Las aplicaciones LLM son increíblemente satisfactorias de crear, ya que están parcialmente
limitadas por las cosas que uno puede imaginar. A medida que estos modelos se vuelven
más precisos, su uso en la práctica para casos de uso creativos, como juegos de rol y la escritura
de libros para niños, se vuelve cada vez más divertido.
Sesgo y equidad
Los LLM se entrenan con grandes cantidades de datos que pueden contener sesgos.
potencialmente amplificarlos. Dado que los datos con los que se entrenan los LLM rara vez
se comparten, no queda claro qué posibles sesgos podrían contener a menos que los
pruebes.
Debido a las increíbles capacidades de los LLM, no siempre queda claro cuándo estás
hablando con un humano o con un LLM. Por ello, el uso de LLM cuando
No hay ningún ser humano involucrado. Por ejemplo, las aplicaciones basadas en LLM que
se utilizan en el campo médico podrían ser reguladas como dispositivos médicos, ya que
Un LLM no necesariamente genera contenido veraz y puede generar texto incorrecto con
Propiedad intelectual
acceso a los datos de entrenamiento no queda claro cuándo el LLM utiliza material
Regulación
A medida que desarrolla y utiliza sus LLM, queremos destacar la importancia de las
consideraciones éticas e instarlo a aprender más sobre el uso seguro y responsable
de los LLM y de los sistemas de IA en general.
Cuanto más VRAM tenga, mejor. La razón es que algunos modelos simplemente no se
pueden utilizar si no se dispone de suficiente VRAM.
Debido a que el entrenamiento y el ajuste fino de los LLM puede ser un proceso costoso
en términos de GPU, a quienes no tienen una GPU potente se les ha denominado
a menudo pobres en GPU. Esto ilustra la batalla por los recursos informáticos para
entrenar estos enormes modelos. Para crear la familia de modelos Llama 2, por
ejemplo, Meta utilizó GPU A10080 GB. Suponiendo que alquilar una GPU de
este tipo costaría $1,50/hora, ¡los costos totales de creación de estos
modelos superarían los $5 000 000!15
Este libro es para aquellos que no tienen GPU. Usaremos modelos que los usuarios
pueden ejecutar sin las GPU más caras disponibles o un gran presupuesto. Para ello,
pondremos todo el código a disposición en instancias de Google Colab. Al momento de
escribir este artículo, una instancia gratuita de Google Colab le proporcionará una GPU T4
con 16 GB de VRAM, que es la cantidad mínima de VRAM que sugerimos.
Puede acceder a estos modelos a través de una interfaz que se comunica con el LLM,
llamada API (interfaz de programación de aplicaciones), como se ilustra en la Figura
131. Por ejemplo, para usar ChatGPT en Python, puede usar el paquete de
OpenAI para interactuar con el servicio sin acceder directamente a él.
Figura 131. Se accede a los LLM de código cerrado mediante una interfaz (API). Como resultado, los detalles
del LLM en sí, incluido su código y arquitectura, no se comparten con el usuario.
Una gran ventaja de los modelos propietarios es que el usuario no necesita tener una
GPU potente para utilizar el LLM. El proveedor se encarga de alojar y ejecutar el modelo
y, por lo general, tiene más recursos informáticos disponibles. No se necesita
experiencia en cuanto al alojamiento y el uso del modelo, lo que reduce significativamente
la barrera de entrada. Además, estos modelos tienden a tener un mejor rendimiento
que sus contrapartes de código abierto debido a la importante inversión de estas
organizaciones.
Una desventaja de esto es que puede ser un servicio costoso. El proveedor administra
el riesgo y los costos de hospedaje del LLM, lo que a menudo se traduce en un
servicio pago. Además, dado que no hay acceso directo al modelo, no hay ningún
método para ajustarlo usted mismo. Por último, sus datos se comparten con el proveedor,
lo que no es deseable en muchos casos de uso comunes, como compartir datos de
pacientes.
Machine Translated by Google
Modelos abiertos
Los modelos LLM abiertos son modelos que comparten sus ponderaciones y
arquitectura con el público para su uso. Aún son desarrollados por organizaciones
específicas, pero a menudo comparten su código para crear o ejecutar el modelo
localmente, con distintos niveles de licencia que pueden permitir o no el uso
comercial del modelo. Command R de Cohere, los modelos Mistral, Phi de
Microsoft y los modelos Llama de Meta son todos ejemplos de modelos abiertos.
NOTA
Actualmente se debate qué es lo que verdaderamente representa un modelo de código abierto. Por
ejemplo, algunos modelos compartidos públicamente tienen una licencia comercial permisiva, lo que
significa que el modelo no se puede utilizar con fines comerciales. Para muchos, esta no es la verdadera
definición de código abierto, que establece que el uso de estos modelos no debería tener ninguna restricción.
De manera similar, los datos con los que se entrena un modelo, así como su código fuente, rara vez se
comparten.
Figura 132. Los LLM de código abierto son creados directamente por el usuario. Como resultado, los detalles del
LLM en sí, incluido su código y arquitectura, se comparten con el usuario.
procesos que conducen a la salida del modelo. Este beneficio se ve reforzado por las
grandes comunidades que permiten estos procesos, como Hugging Face, demostrando
las posibilidades de los esfuerzos colaborativos.
Una desventaja es que se necesita un hardware potente para ejecutar estos modelos y
aún más para entrenarlos o ajustarlos. Además, se requieren conocimientos específicos para
configurar y usar estos modelos (que cubriremos a lo largo de este libro).
En general, preferimos utilizar modelos de código abierto siempre que sea posible.
La libertad que esto nos brinda para experimentar con opciones, explorar el funcionamiento
interno y utilizar el modelo localmente ofrece, sin duda, más beneficios que utilizar
modelos LLM propietarios.
¡Como resultado, es posible que incluso te pierdas tu marco favorito en este libro!
En lugar de intentar cubrir todos los marcos de LLM existentes (hay demasiados y su número
sigue aumentando), nuestro objetivo es brindarle una base sólida para aprovechar los
LLM. La idea es que después de leer este libro, pueda comprender fácilmente la mayoría
de los demás marcos, ya que todos funcionan de manera muy similar.
CONSEJO
Cubriremos principalmente los marcos para interactuar con modelos de lenguaje grandes
a través del código. Si bien te ayuda a aprender los fundamentos de estos marcos, a veces
solo quieres una interfaz similar a ChatGPT con un LLM local. Afortunadamente, hay
muchos marcos increíbles que lo permiten. Algunos ejemplos incluyen textgeneration
webui, KoboldCpp, y LM Studio.
Tenga en cuenta que con frecuencia se publican nuevos y mejorados LLM. Para
garantizar que este libro se mantenga actualizado, la mayoría de los ejemplos están diseñados
para funcionar con cualquier LLM. También destacaremos diferentes modelos en el repositorio
asociado con este libro para que los pruebe.
El modelo generativo en sí
Su tokenizador subyacente
Podemos usar transformadores para cargar tanto el tokenizador como el modelo. Tenga
en cuenta que asumimos que tiene una GPU NVIDIA (device_map="cuda"), pero puede
elegir un dispositivo diferente. Si no tiene acceso a una GPU, puede usar los cuadernos
gratuitos de Google Colab que pusimos a su disposición en el repositorio de este libro:
Aunque ya tenemos suficiente para empezar a generar texto, hay un truco muy útil en
transformers que simplifica el proceso, llamado
transformers.pipeline. Este truco encapsula el modelo, el tokenizador y el proceso de
generación de texto en una única función:
# Crear un generador de
canalización = pipeline( "text
generation", model=model,
tokenizer=tokenizer,
return_full_text=False,
max_new_tokens=500,
do_sample=False
devolver_texto_completo
do_sample Si el
Para generar nuestro primer texto, le indicaremos al modelo que cuente un chiste
sobre gallinas. Para ello, formateamos el mensaje en una lista de diccionarios, donde
cada diccionario se relaciona con una entidad de la conversación. Nuestro rol es el de
“usuario” y usamos la clave “contenido” para definir nuestro mensaje:
¿Por qué a las gallinas no les gusta ir al gimnasio? ¡Porque no pueden soportar la
resistencia del gimnasio!
¡Y eso es todo! El primer texto generado en este libro fue un chiste decente sobre gallinas.
Resumen
En este primer capítulo del libro, profundizamos en el impacto revolucionario que han
tenido los LLM en el campo de la IA lingüística. Ha cambiado significativamente nuestro
enfoque en tareas como la traducción, la clasificación, el resumen y más. A través de
una historia reciente de la IA lingüística, exploramos los fundamentos de
varios tipos de LLM, desde una simple representación de bolsa de palabras hasta
representaciones más complejas utilizando redes neuronales.
En general, el capítulo proporcionó una descripción general del panorama de la IA del lenguaje,
incluidas sus aplicaciones, implicaciones sociales y éticas, y la
recursos necesarios para ejecutar dichos modelos. Terminamos generando nuestro primer texto
utilizando Phi3, un modelo que se utilizará a lo largo del libro.
2
Fabrizio Sebastiani. “Aprendizaje automático en la categorización automática de textos”. ACM Computing
Encuestas (CSUR) 34.1 (2002): 1–47.
3
Tomas Mikolov et al. “Estimación eficiente de representaciones de palabras en el espacio vectorial”. arXiv
preimpresión arXiv:1301.3781 (2013).
4
Dzmitry Bahdanau, Kyunghyun Cho y Yoshua Bengio. “Traducción automática neuronal por
“Aprendiendo conjuntamente a alinear y traducir”. preimpresión arXiv arXiv:1409.0473 (2014).
5
Ashish Vaswani et al. “La atención es todo lo que necesitas”. Avances en el procesamiento de información neuronal
Sistemas 30 (2017).
6
Jacob Devlin et al. “BERT: preentrenamiento de transformadores bidireccionales profundos para el lenguaje
comprensión.” preimpresión arXiv arXiv:1810.04805 (2018).
7
Alec Radford et al. “Mejorar la comprensión del lenguaje mediante el preentrenamiento generativo”, (2018).
8
Alec Radford et al. “Los modelos de lenguaje son aprendices multitarea no supervisados”. OpenAI Blog 1.8
(2019): 9.
9
Tom Brown et al. “Los modelos de lenguaje son aprendices de pocas oportunidades”. Avances en la información neuronal
Sistemas de procesamiento 33 (2020): 1877–1901.
10
OpenAI, “Informe técnico Gpt4”. Preimpresión arXiv arXiv:2303.08774 (2023).
11
Albert Gu y Tri Dao. “Mamba: Modelado de secuencias de tiempo lineal con espacios de estados selectivos”.
Preimpresión de arXiv arXiv:2312.00752 (2023).
12
Consulte “Una guía visual para los modelos Mamba y de espacio de estados” para una guía ilustrada y visual de
Mamba como alternativa a la arquitectura Transformer.
Machine Translated by Google
13
Bo Peng et al. “RWKV: Reinventando las RNN para la era de los transformadores”. Preimpresión de arXiv
arXiv:2305.13048 (2023).
14
Hugo Touvron et al. “Llama 2: Bases abiertas y modelos de chat perfeccionados”. Preimpresión de arXiv
arXiv:2307.09288 (2023).
15
Los modelos se entrenaron durante 3.311.616 horas de GPU, que se refiere a la cantidad de tiempo que toma
para entrenar un modelo en una GPU, multiplicado por la cantidad de GPU disponibles.
16
Marah Abdin et al. “Informe técnico Phi3: Un modelo de lenguaje altamente capaz a nivel local en su
teléfono.” preimpresión arXiv arXiv:2404.14219 (2024).
OceanofPDF.com
Machine Translated by Google
Capítulo 2. Tokens e
incrustaciones
Los tokens y las incrustaciones son dos de los conceptos centrales del uso de
modelos de lenguaje grandes (LLM). Como hemos visto en el primer capítulo, no solo
son importantes para comprender la historia de la IA del lenguaje, sino que no podemos
tener una idea clara de cómo funcionan los LLM, cómo se construyen y hacia dónde
se dirigirán en el futuro sin un buen conocimiento de los tokens y las incrustaciones,
como podemos ver en la Figura 21.
Figura 21. Los modelos de lenguaje procesan el texto en pequeños fragmentos llamados tokens. Para que el modelo de
lenguaje calcule el lenguaje, necesita convertir los tokens en representaciones numéricas llamadas incrustaciones.
En este capítulo, analizamos más de cerca qué son los tokens y los
métodos de tokenización que se utilizan para impulsar los LLM. Luego,
profundizaremos en el famoso método de incrustación de word2vec que precedió a los
LLM modernos y veremos cómo extiende el concepto de incrustaciones de tokens para construir
Machine Translated by Google
sistemas de recomendación comercial que impulsan muchas de las aplicaciones que utilizas.
Finalmente, pasamos de incrustaciones de tokens a incrustaciones de oraciones o texto ,
donde una oración o documento completo puede tener un vector que lo representa, lo que
permite aplicaciones como la búsqueda semántica y el modelado de temas que vemos en
la Parte II de este libro.
Tokenización LLM
La forma en que la mayoría de las personas interactúan con los modelos de lenguaje, en el
momento de escribir este artículo, es a través de un entorno web que presenta una interfaz
de chat entre el usuario y un modelo de lenguaje. Es posible que notes que un modelo no
produce su respuesta de salida de una sola vez; en realidad, genera un token a la vez.
Pero los tokens no son solo el resultado de un modelo, también son la forma en que el modelo
ve sus entradas. Un mensaje de texto enviado al modelo primero se divide en tokens,
como veremos a continuación.
Vistos desde afuera, los LLM generativos toman una solicitud de entrada y generan
una respuesta, como podemos ver en la Figura 22.
Figura 23. Un tokenizador descompone el texto en palabras o partes de palabras antes de que el modelo procese el
texto. Lo hace de acuerdo con un método y un procedimiento de entrenamiento específicos (de https://oreil.ly/ovUWO).
Luego podemos proceder a la generación real. Primero declaramos nuestro mensaje, luego lo tokenizamos y luego
pasamos esos tokens al modelo, que genera su salida. En este caso, le pedimos al modelo que genere solo 20
tokens nuevos:
prompt = "Escribe un correo electrónico pidiendo disculpas a Sarah por el trágico accidente de
jardinería. Explica cómo sucedió.<|assistant|>"
# Generar el texto
generation_output = model.generate( input_ids=input_ids,
max_new_tokens=20
# Imprimir la salida
print(tokenizer.decode(generation_output[0]))
Producción:
<s> Escribe un correo electrónico para disculparte con Sarah por el trágico accidente de
jardinería. Explica cómo sucedió.<|assistant|> Asunto: Mis más sinceras disculpas por el accidente de
jardinería
Estimado
Machine Translated by Google
Al observar el código, podemos ver que, de hecho, el modelo no recibe el mensaje de texto. En
cambio, los tokenizadores procesaron el mensaje de entrada y devolvieron la información
que el modelo necesitaba en la variable input_ids, que el modelo utilizó como entrada.
tensor([[1, 14350, 385, 4876, 27746, 5281, 304, 19235, 363, 278, 25305, 293, 16423,
292, 286, 728, 481, 29889, 12027, 7420, 920, 372, 9559, 29889, 32001]], dispositivo='cuda:0')
Esto revela las entradas a las que responden los LLM, una serie de números enteros como se
muestra en la Figura 24. Cada uno es el identificador único de un token específico (carácter,
palabra o parte de una palabra). Estos identificadores hacen referencia a una tabla dentro del
tokenizador que contiene todos los tokens que conoce.
Figura 24. Un tokenizador procesa la solicitud de entrada y prepara la entrada real en el modelo de lenguaje: una lista
de identificadores de token. Los identificadores de token específicos en la figura son solo demostrativos.
Si queremos inspeccionar esos ID, podemos usar el método de decodificación del tokenizador para
traducir los ID nuevamente a texto que podamos leer:
<s>
Escribir
un
correo electrónico
Disculpa
enriquecimiento
Sara
para
el
Tragar
yo
jardín
En
metro
eso es
ap
Exp
Mentir
cómo
él
Machine Translated by Google
sucedió
<|asistente|>
Algunos tokens son palabras completas (por ejemplo, escribir, un, correo electrónico).
Algunos tokens son partes de palabras (por ejemplo, disculpa, izing, trag, ic).
Observe cómo el carácter de espacio no tiene su propio token. En cambio, los tokens parciales
(como "izing" e "ic") tienen un carácter oculto especial al principio que indica que están
conectados con el token que los precede en el texto. Se supone que los tokens sin ese carácter
especial tienen un espacio antes de ellos.
En el lado de salida, también podemos inspeccionar los tokens generados por el modelo
imprimiendo la variable generation_output. Esto muestra los tokens de entrada y de salida
(resaltaremos los nuevos tokens en negrita):
tensor([[ 1, 14350, 385, 4876, 27746, 5281, 304, 19235, 363, 278,
25305, 293, 16423, 292, 286, 728, 481, 29889, 12027, 7420,
920, 372, 9559, 29889, 32001, 3323, 622, 29901, 1619, 317,
3742, 406, 6225, 11763, 363, 278, 19906, 292, 341, 728,
Esto nos muestra que el modelo generó el token 3323, 'Sub', seguido del token 622, 'ject'. Juntos formaron
la palabra 'Subject'. Luego fueron seguidos por el token 29901, que son los dos puntos ':'... y así
sucesivamente.
Al igual que en el lado de entrada, necesitamos que el tokenizador del lado de salida traduzca el ID
del token al texto real. Lo hacemos usando el método de decodificación del tokenizador. Podemos pasarle
imprimir(tokenizador.decodificar(3323))
imprimir(tokenizador.decodificar(622))
imprimir(tokenizador.decodificar([3323, 622]))
imprimir(tokenizador.decodificar(29901))
Esto produce:
Sub
objeto
Sujeto
Hay tres factores principales que determinan cómo un tokenizador descompone una solicitud de entrada.
En primer lugar, en el momento del diseño del modelo, el creador del modelo elige un método de tokenización.
Los métodos populares incluyen la codificación de pares de bytes (BPE) (ampliamente utilizada por los modelos
GPT) y WordPiece (utilizado por BERT). Estos métodos son similares en el sentido de que apuntan a optimizar
un conjunto eficiente de tokens para representar un conjunto de datos de texto, pero llegan a ello de
diferentes maneras.
En segundo lugar, después de elegir el método, debemos tomar una serie de decisiones sobre el diseño del
tokenizador, como el tamaño del vocabulario y los tokens especiales que se utilizarán. Encontrará más
En tercer lugar, el tokenizador debe entrenarse con un conjunto de datos específico para establecer el
mejor vocabulario que puede utilizar para representar ese conjunto de datos. Incluso si establecemos
los mismos métodos y parámetros, un tokenizador entrenado con un conjunto de datos de texto en
inglés será diferente de otro entrenado con un conjunto de datos de código o un conjunto de datos
de texto multilingüe.
Además de usarse para procesar el texto de entrada en un modelo de lenguaje, los tokenizadores
se utilizan en la salida del modelo de lenguaje para convertir el ID de token resultante en la palabra de
salida o el token asociado con él, como muestra la Figura 25 .
Figura 25. Los tokenizadores también se utilizan para procesar la salida del modelo convirtiendo el ID del token
de salida en la palabra o token asociado con ese ID.
Fichas de palabras
Este enfoque era común en métodos anteriores como word2vec, pero se utiliza cada vez menos en el
procesamiento del lenguaje natural. Sin embargo, su utilidad hizo que se utilizara fuera del procesamiento
del lenguaje natural para casos de uso como los sistemas de recomendación, como veremos más adelante en
este capítulo.
Un desafío con la tokenización de palabras es que el tokenizador puede no ser capaz de manejar
nuevas palabras que ingresan al conjunto de datos después de que el tokenizador fue entrenado. Esto también
da como resultado un vocabulario que tiene muchos tokens con diferencias mínimas entre ellos (por
ejemplo, disculpa, disculparse, disculparse, apologista). Este último desafío se resuelve con la
tokenización de subpalabras , ya que tiene un token para disculparse y luego tokens de sufijo (por
ejemplo, y, ize, etic, ist) que son comunes con muchos otros tokens, lo que da como resultado un vocabulario
más expresivo.
Fichas de subpalabras
Este método contiene palabras completas y parciales. Además de la expresividad del vocabulario
mencionada anteriormente, otro beneficio de este enfoque es su capacidad para representar palabras
nuevas descomponiendo el nuevo símbolo en caracteres más pequeños, que tienden a ser parte del vocabulario.
Machine Translated by Google
Figura 26. Existen múltiples métodos de tokenización que dividen el texto en diferentes tamaños.
Fichas de personajes
Este es otro método que puede manejar con éxito palabras nuevas porque tiene las
letras sin procesar como recurso. Si bien eso hace que la representación sea más fácil
Los tokens de subpalabras presentan una ventaja sobre los tokens de caracteres en la
capacidad de incluir más texto dentro de la longitud de contexto limitada de un
modelo de Transformer. Por lo tanto, con un modelo con una longitud de contexto de 1024, es
posible que pueda incluir aproximadamente tres veces más texto utilizando subpalabras.
Machine Translated by Google
tokenización que usar tokens de caracteres (los tokens de subpalabras suelen tener un promedio
de tres caracteres por token).
Fichas de bytes
Los métodos de representación del lenguaje como este, que también se denominan “codificación sin tokenización”,
se describen en otros trabajos como “ByT5: Towards a tokenfree future with pretrained bytetobyte
models” (ByT5: Hacia un futuro sin tokens con modelos byte a byte previamente entrenados) que muestran que este
Una distinción que se debe destacar aquí: algunos tokenizadores de subpalabras también incluyen
bytes como tokens en su vocabulario como el bloque de construcción final al que recurrir cuando
encuentran caracteres que no pueden representar de otra manera. Los tokenizadores GPT2 y
RoBERTa hacen esto, por ejemplo. Esto no los convierte en tokenizadores a nivel de bytes libres
de tokenización, porque no usan estos bytes para representar todo, solo un subconjunto, como
veremos en la siguiente sección.
Si desea profundizar en los tokenizadores, se analizan con más detalle en Diseño de aplicaciones
de modelos de lenguaje grandes.
texto = """
Inglés y MAYÚSCULAS
show_tokens False Ninguno elif == >= else: dos pestañas:" " Tres pestañas:
" "
12.0*50=600
"""
Esto nos permitirá ver cómo cada tokenizador maneja distintos tipos de tokens:
Capitalización.
Emojis.
Números y dígitos.
Tokens especiales. Son tokens únicos que tienen una función distinta a la de
representar texto. Incluyen tokens que indican el comienzo del texto o el final
del texto (que es la forma en que el modelo le indica al sistema que ha
completado esta generación) u otras funciones, como veremos.
Pasemos de los tokenizadores más antiguos a los más nuevos para ver cómo
tokenizan este texto y qué podría decir eso sobre el modelo de lenguaje. Tokenizaremos
el texto y luego imprimiremos cada token con un color de fondo usando esta función:
lista_colores = [
Machine Translated by Google
Fichas especiales:
unk_token [UNK]
token_sep [SEP]
Un separador que permite realizar determinadas tareas que requieren dar al modelo dos
Un token de relleno utilizado para rellenar posiciones no utilizadas en la entrada del modelo (dado
token_cls [CLS]
Machine Translated by Google
el Capítulo 4.
mask_token [MÁSCARA]
Texto tokenizado:
[CLS] inglés y ##ización de mayúsculas [UNK] [UNK] mostrar token ##s falso ninguno _
"
eli ##f = = > = else : dos pestañas ##s :
"" *
"tres pestañas ##s: 12 . 0 50 = 600 [SEP]
BERT se lanzó en dos versiones principales: con mayúsculas y minúsculas (donde se conservan
las mayúsculas) y sin mayúsculas y minúsculas (donde todas las letras mayúsculas se
convierten primero en minúsculas). Con la versión sin mayúsculas y minúsculas (y más
popular) del tokenizador BERT, notamos lo siguiente:
Los saltos de línea han desaparecido, lo que hace que el modelo sea ciego a la
información codificada en las líneas nuevas (por ejemplo, un registro de chat cuando cada
turno es en una línea nueva).
Texto tokenizado:
600 [SEPTIEMBRE]
GPT2 (2019)
Inglés y MAYÚSCULAS
Machine Translated by Google
espectáculo _ t ok ens Falso Ninguno el if == >= else : dos pestañas :" "
""
Tres pestañas:
*
12 . 0 50 = 600
Los personajes ahora están representados por múltiples fichas cada uno.
Si bien vemos estos tokens impresos como el carácter , en realidad
representan diferentes símbolos. Por ejemplo, el emoji se divide en dos partes.
en los tokens con los identificadores de token 8582, 236 y 113. El tokenizador es
tuvo éxito en reconstruir el carácter original de estos
tokens. Podemos comprobarlo imprimiendo
tokenizer.decode([8582, 236, 113]), que imprime
afuera .
Las dos pestañas se representan como dos tokens (token número 197 en
ese vocabulario) y los cuatro espacios se representan como tres fichas
(número 220) con el espacio final siendo parte de la ficha para el
carácter de cita de cierre.
Las dos pestañas se representan como dos tokens (token número 197 en
ese vocabulario) y los cuatro espacios se representan como tres fichas
(número 220) con el espacio final siendo parte de la ficha para el
carácter de cita de cierre.
Machine Translated by Google
NOTA
¿Cuál es la importancia de los espacios en blanco? Son importantes para los modelos
comprender o generar código. Un modelo que utiliza un solo token para representar cuatro
Los caracteres de espacio en blanco consecutivos se ajustan mejor a un conjunto de datos de código Python.
El modelo puede vivir representándolo como cuatro tokens diferentes, lo que hace que el modelado sea más fácil.
más difícil ya que el modelo necesita realizar un seguimiento del nivel de sangría, que a menudo
conduce a un peor rendimiento. Este es un ejemplo de cómo las opciones de tokenización pueden ayudar
El modelo mejora en una determinada tarea.
FlanT5 (2022)
Fichas especiales:
token desconocido
pad_token <pad>
Texto tokenizado:
Los caracteres emoji y chinos son reemplazados por el token, lo que hace
que el modelo sea completamente ciego para ellos.
GPT4 (2023)
Método de tokenización: BPE
Fichas especiales:
Rellene los tokens del medio. Estos tres tokens permiten que el LLM
Generar una terminación teniendo en cuenta no solo el texto anterior,
sino también el texto posterior. Este método se explica con más detalle
en el artículo “Entrenamiento eficiente de modelos de lenguaje para
completar el medio”; los detalles exactos quedan fuera del alcance de este libro.
Estos tokens especiales son:
<|prefijo_fim|>
<|fim_medio|>
<|sufijo_fim|>
Texto tokenizado:
Inglés y MAYÚSCULAS
mostrar _tokens Falso Ninguno elif == >= else : dos pestañas :" "
" "
Tres pestañas:
12 . 0 * 50 = 600
La palabra clave de Python elif tiene su propio token en GPT4. Tanto este
punto como el anterior se derivan del enfoque del modelo en el código
además del lenguaje natural.
El tokenizador GPT4 utiliza menos tokens para representar la mayoría de las palabras.
Algunos ejemplos incluyen “CAPITALIZACIÓN” (dos tokens versus cuatro)
y “tokens” (un token versus tres).
StarCoder2 (2024)
<prefijo_fim>
<fim_medio>
<sufijo_fim>
<fim_pad>
<nombre de archivo>
<gh_estrellas>
Texto tokenizado:
Inglés y MAYÚSCULAS
_ tokens Falso Ninguno elif == >= else : dos pestañas :" "
espectáculo
" "
Tres pestañas:
12.0 * 50=600
Una diferencia importante con todo lo que hemos visto hasta ahora es que a
cada dígito se le asigna su propio token (por lo que 600 se convierte
en 6 0 0). La hipótesis aquí es que esto conduciría a una mejor representación
de los números y las matemáticas. En GPT2, por ejemplo, el número 870 se
representa como un solo token. Pero 871 se representa como dos tokens
(8 y 71). Puedes ver intuitivamente cómo esto puede ser confuso para
el modelo y cómo representa los números.
Galáctica
Atención a la tokenización que la hace más sensible a los matices del conjunto de
datos que representa. Por ejemplo, incluye tokens especiales para citas,
razonamiento, matemáticas, secuencias de aminoácidos y ADN.
secuencias.
Fichas especiales:
<s>
<pad>
</s>
<unun>
[INICIO_REF]
[FIN_REF]
Texto tokenizado:
Inglés y MAYÚSCULAS
Machine Translated by Google
""
_ tokens Falso Ninguno elif == > = else : dos pestañas :
espectáculo
" "
Tres pestañas:
*
12.0 50=600
El tokenizador de Galactica se comporta de manera similar a StarCoder2 en el sentido de que tiene código en
mente. También codifica los espacios en blanco de la misma manera: asignando un solo token
a secuencias de espacios en blanco de diferentes longitudes. Se diferencia en que también hace
Eso es para las pestañas, sin embargo. De todos los tokenizadores que hemos visto hasta ahora, es el
solo uno que asigna un solo token a la cadena formada por dos pestañas
('_t_t').
Phi3 (y Llama 2)
El modelo Phi3 En este libro analizamos la reutilización del tokenizador de Llama 2. todavía
Añade una serie de tokens especiales.
Fichas especiales:
Tokens de chat: a medida que los LLM de chat ganaron popularidad en 2023,
La naturaleza conversacional de los LLM comenzó a ser un caso de uso principal.
Los tokenizadores se han adaptado a esta dirección mediante la adición de
fichas que indican los turnos en una conversación y los roles de
Cada orador. Estos obsequios especiales incluyen:
<|usuario|>
<|asistente|>
<|sistema|>
Ahora podemos resumir nuestro recorrido mirando todos estos ejemplos uno al lado del otro:
Machine Translated by Google
modelo (sin carcasa) Ay _ token ##s falso ninguno eli ##f = = > = else : dos
"" *
Pestaña ##s : " " tres pestañas ##s: 12 . 0 50 = 600 [SE
PAGS]
Base BERT [CLS] Inglés y CA ##PI ##TA ##L ##I ##Z ##AT ##I
modelo (en caja) EN [UNK] [UNK] mostrar _ token ##s F ##als ##e Ninguno el
##if = = > = else : dos etiquetas ##bs : " " Tres pestañas:
"" *
12 . 0 50 = 600 [SEP]
12.0 * 50=600
12.0 * 50=600
12.0 * 50=600
Métodos de tokenización
Como hemos visto, hay varios métodos de tokenización con pares de bytes.
La codificación BPE es la más popular. Cada uno de estos métodos
describe un algoritmo sobre cómo elegir un conjunto apropiado de tokens para
representar un conjunto de datos. Puede encontrar una excelente descripción general de todos estos métodos en
Después de elegir un método de tokenización, un diseñador de LLM debe tomar algunas decisiones sobre
A menudo se utilizan como valores de tamaño de vocabulario, pero cada vez más los usamos.
Fichas especiales
¿Qué tokens especiales queremos que el modelo controle? Podemos agregar tantos como queramos,
especialmente si queremos crear un LLM para casos de uso especiales. Las opciones más comunes incluyen:
Token de relleno
Token desconocido
Token CLS
Token de enmascaramiento
Machine Translated by Google
Capitalización
los nombres suele contener información útil, pero ¿queremos desperdiciar espacio
Para el código, por ejemplo, hemos visto que un tokenizador centrado en texto
puede tokenizar los espacios de sangría de esta manera (resaltaremos algunos
tokens en color):
...devuelve a + b
Esto puede no ser óptimo para un modelo centrado en el código. Los modelos centrados
en el código suelen mejorarse al tomar diferentes decisiones de tokenización:
...devuelve a + b
Machine Translated by Google
Incrustaciones de tokens
Ahora que entendemos la tokenización, hemos resuelto una parte del problema de
representar el lenguaje en un modelo de lenguaje. En este sentido, el lenguaje es una
secuencia de tokens. Y si entrenamos un modelo lo suficientemente bueno en un conjunto de
tokens lo suficientemente grande, comienza a capturar los patrones complejos que
aparecen en su conjunto de datos de entrenamiento:
Como hemos visto en el Capítulo 1, eso es lo que son las incrustaciones: el espacio de
representación numérica utilizado para capturar los significados y patrones del lenguaje.
Machine Translated by Google
NOTA
¡Ups!: Sin embargo, lograr un buen umbral de coherencia lingüística y una generación de hechos
mejor que el promedio comienza a presentar un nuevo problema. Algunos usuarios comienzan a confiar en
la capacidad de generación de hechos del modelo (por ejemplo, a principios de 2023 algunos modelos
lingüísticos fueron denominados "asesinos de Google"). Los usuarios avanzados no tardaron mucho en darse
cuenta de que los modelos de generación por sí solos no son motores de búsqueda fiables. Esto dio
lugar al surgimiento de la generación aumentada por recuperación (RAG), que combina la búsqueda y los
LLM. Tratamos la RAG con más detalle en el Capítulo 8.
sin entrenamiento.
Antes del inicio del proceso de entrenamiento, estos vectores se inicializan aleatoriamente
como el resto de los pesos del modelo, pero el proceso de entrenamiento les asigna los
valores que habilitan el comportamiento útil que están entrenados para realizar.
Machine Translated by Google
Figura 27. Un modelo de lenguaje contiene un vector de incrustación asociado con cada token en su tokenizador.
En lugar de representar cada token o palabra con un vector estático, los modelos de
lenguaje crean incrustaciones de palabras contextualizadas (mostradas en la Figura 28)
que representan una palabra con un token diferente según su contexto. Estos vectores
pueden ser utilizados por otros sistemas para una variedad de tareas. Además de las
aplicaciones de texto que mencionamos en el párrafo anterior, estos
vectores contextualizados, por ejemplo, son los que impulsan los sistemas de generación
de imágenes de IA como DALL∙E, Midjourney y Stable Diffusion, por ejemplo.
Machine Translated by Google
Figura 28. Los modelos de lenguaje producen incrustaciones de tokens contextualizadas que mejoran las incrustaciones de tokens
estáticas y sin procesar.
# Cargar un tokenizador
tokenizer = AutoTokenizer.from_pretrained("microsoft/deberta base")
El modelo que estamos usando aquí se llama DeBERTa v3, que al momento de
escribir este artículo es uno de los modelos de lenguaje con mejor
desempeño para incrustaciones de tokens, además de ser pequeño y altamente
eficiente. Se describe en el artículo “DeBERTaV3: Improving DeBERTa using
ELECTRAstyle pretraining gradientdisentangled embedding sharing”.
Machine Translated by Google
salida.forma
Esto imprime:
antorcha.Tamaño([1, 4, 384])
Omitiendo la primera dimensión, podemos leer esto como cuatro tokens, cada uno
integrado en un vector de 384 valores. La primera dimensión es la dimensión de
lote que se utiliza en casos (como el entrenamiento) cuando queremos enviar múltiples
oraciones de entrada al modelo al mismo tiempo (se procesan al mismo tiempo, lo que
acelera el proceso).
Pero ¿qué son estos cuatro vectores? ¿El tokenizador dividió las dos palabras en cuatro
tokens o está sucediendo algo más? Podemos usar lo que hemos aprendido sobre los
tokenizadores para inspeccionarlos:
Esto imprime:
[CLS]
Hola
Mundo
[SEP]
Figura 29. Un modelo de lenguaje opera con incrustaciones estáticas y sin procesar como entrada y produce
incrustaciones de texto contextuales.
Una imagen como ésta es esencial para el próximo capítulo, cuando comenzamos a ver
cómo funcionan los LLM basados en Transformer.
incrustaciones: un vector único que representa un fragmento de texto más largo que un solo
token.
Figura 210. En el paso 1, utilizamos el modelo de incrustación para extraer las características y convertir el texto de entrada
en incrustaciones.
Existen múltiples formas de producir un vector de incrustación de texto . Una de las formas
más comunes es promediar los valores de todas las incrustaciones de tokens producidas
por el modelo. Sin embargo, los modelos de incrustación de texto de alta calidad tienden a ser
entrenados específicamente para tareas de incrustación de texto.
# Cargar modelo
model = SentenceTransformer("transformadoresdesentencias/allmpnetbasev2")
La cantidad de valores, o las dimensiones, del vector de incrustación dependen del modelo
de incrustación subyacente. Analicemos esto para nuestro modelo:
vector.forma
(768,)
Esta oración ahora está codificada en este vector con una dimensión de 768 valores
numéricos. En la Parte II de este libro, una vez que comencemos a analizar
las aplicaciones, comenzaremos a ver la inmensa utilidad de estos vectores de
incrustaciones de texto para impulsar todo, desde la categorización hasta la búsqueda
semántica y RAG.
# Descargar incrustaciones (66 MB, guante, entrenado en wikipedia, tamaño del vector: 50)
gigaword50")
modelo.más_similar([modelo['king']], topn=11)
Esto produce:
Word2vec ilustrado. Las ideas centrales se condensan aquí, a medida que las desarrollamos
al analizar un método para crear incrustaciones para motores de recomendación
en la siguiente sección.
Al igual que los LLM, word2vec se entrena con ejemplos generados a partir de texto. Digamos,
por ejemplo, que tenemos el texto “No harás una máquina a semejanza de una mente
humana” de las novelas Dune de Frank Herbert. El algoritmo utiliza una ventana deslizante
para generar ejemplos de entrenamiento. Podemos, por ejemplo, tener un tamaño de ventana
dos, lo que significa que consideramos dos vecinos a cada lado de una palabra central.
Las incrustaciones se generan a partir de una tarea de clasificación. Esta tarea se utiliza
para entrenar una red neuronal para predecir si las palabras suelen aparecer en el mismo
contexto o no ( en este caso, contexto significa en muchas oraciones del conjunto de datos
de entrenamiento que estamos modelando). Podemos pensar en esto como una red
neuronal que toma dos palabras y genera 1 si tienden a aparecer en el mismo contexto y 0 si
no es así.
Figura 211. Se utiliza una ventana deslizante para generar ejemplos de entrenamiento para el algoritmo word2vec para
predecir posteriormente si dos palabras son vecinas o no.
En cada uno de los ejemplos de entrenamiento producidos, la palabra del centro se utiliza
como una entrada, y cada uno de sus vecinos es una segunda entrada distinta en
cada ejemplo de entrenamiento. Esperamos que el modelo entrenado final sea capaz de
clasificar esta relación de vecinos y generar 1 si las dos palabras de entrada que recibe son,
de hecho, vecinas. Estos ejemplos de entrenamiento se visualizan en la Figura 212.
Machine Translated by Google
Figura 212. Cada ejemplo de entrenamiento generado muestra un par de palabras vecinas.
Sin embargo, si tenemos un conjunto de datos con un valor objetivo de solo 1, entonces un modelo
puede hacer trampa y tener éxito generando un valor 1 todo el tiempo. Para solucionar esto,
necesitamos enriquecer nuestro conjunto de datos de entrenamiento con ejemplos de palabras
que normalmente no son vecinas. Estos se denominan ejemplos negativos y se muestran en la
Figura 213.
Figura 213. Necesitamos presentar nuestros modelos con ejemplos negativos: palabras que no suelen
ser vecinas. Un mejor modelo es capaz de distinguir mejor entre los ejemplos positivos y negativos.
Resulta que no tenemos que ser demasiado científicos a la hora de elegir los ejemplos
negativos. Muchos modelos útiles resultan de la simple capacidad de detectar ejemplos positivos
a partir de ejemplos generados aleatoriamente (inspirados en un
Machine Translated by Google
Con esto, hemos visto dos de los conceptos principales de word2vec (Figura 214): skip
gram, el método de selección de palabras vecinas, y muestreo negativo, agregar
ejemplos negativos mediante muestreo aleatorio del conjunto de datos.
Figura 214. El salto de gramo y el muestreo negativo son dos de las ideas principales detrás del algoritmo
word2vec y son útiles en muchos otros problemas que pueden formularse como problemas de secuencia de tokens.
Figura 215. Un vocabulario de palabras y sus vectores de incrustación iniciales, aleatorios y no inicializados.
Luego, se entrena un modelo en cada ejemplo para que tome dos vectores de
incrustación y prediga si están relacionados o no. Podemos ver cómo se ve esto
en la Figura 216.
Figura 216. Se entrena una red neuronal para predecir si dos palabras son vecinas. Actualiza las
incrustaciones en el proceso de entrenamiento para producir las incrustaciones finales entrenadas.
más correcto. Y al final del proceso de entrenamiento, tenemos mejores integraciones para
todos los tokens en nuestro vocabulario.
Esta idea de un modelo que toma dos vectores y predice si tienen una determinada relación es
una de las ideas más poderosas en el aprendizaje automático y, una y otra vez, ha demostrado que
funciona muy bien con los modelos de lenguaje. Por eso, dedicamos el Capítulo 10 a este concepto y
a cómo optimiza los modelos de lenguaje para tareas específicas (como la incorporación y
recuperación de oraciones).
La misma idea también es fundamental para unir modalidades como texto e imágenes, lo cual es
clave para los modelos de generación de imágenes de IA, como veremos en el Capítulo 9 sobre
modelos multimodales. En esa formulación, se presenta un modelo con una imagen y un título, y debe
predecir si ese título describe la imagen o no.
Figura 217. Para las incrustaciones de canciones que capturan la similitud de las canciones, utilizaremos un conjunto de datos compuesto por una
Empecemos por darle “Billie Jean” de Michael Jackson, la canción con identificación
3822:
recomendaciones_de_impresión(842)
¡Otra lista bastante razonable! Ahora que sabemos que funciona, veamos cómo
Construir un sistema así.
Comenzaremos cargando el conjunto de datos que contiene las listas de reproducción de canciones, así como
# Analizar el archivo del conjunto de datos de la lista de reproducción. Omitir las dos primeras líneas ya
que # solo contienen metadatos lines =
data.read().decode("utf8").split('\n')[2:]
Ahora que los hemos guardado, examinemos la lista de listas de reproducción. Cada elemento que
contiene es una lista de reproducción que contiene una lista de identificadores de canciones:
Lista de reproducción n.° 1: ['0', '1', '2', '3', '4', '5', ..., '43']
Lista de reproducción n.° 2: ['78', '79', '80', '3', '62', ..., '210']
Entrenemos el modelo:
min_count=1, trabajadores=4 )
ID de canción = 2172
Esto produce:
Esa es la lista de las canciones cuyas incrustaciones son más similares a la canción
2172.
imprimir(canciones_df.iloc[2172])
Esto da como resultado recomendaciones que pertenecen todas al mismo género de heavy
metal y hard rock:
def print_recomendaciones(id_canción):
canciones_similares = np.array(
modelo.wv.most_similar(positivo=str(id_canción),topn=5)
)[:,0]
devolver canciones_df.iloc[canciones_similares]
# Extraer recomendaciones
recomendaciones_de_impresión(2172)
Resumen
En este capítulo, hemos cubierto los tokens LLM, los tokenizadores y las herramientas útiles.
Enfoques para el uso de incrustaciones de tokens. Esto nos prepara para comenzar a analizar
En el próximo capítulo nos adentraremos más en los modelos lingüísticos y también abriremos la puerta a
Descubra cómo se utilizan las incrustaciones más allá de los modelos de lenguaje.
Un recorrido por tokenizadores preentrenados del mundo real (desde BERT hasta GPT2, GPT4
y otros modelos) nos mostró áreas en las que algunos tokenizadores son mejores (por ejemplo,
preservando información como mayúsculas, nuevas líneas o tokens en otros idiomas) y otras
áreas en las que los tokenizadores son simplemente diferentes entre sí (por ejemplo, cómo
descomponen ciertas palabras).
Tres de las principales decisiones de diseño del tokenizador son el algoritmo del tokenizador (por
ejemplo, BPE, WordPiece, SentencePiece), los parámetros de tokenización (incluido el tamaño del
vocabulario, los tokens especiales, la capitalización, el tratamiento de la capitalización y los
diferentes idiomas) y el conjunto de datos en el que se entrena el tokenizador.
Antes de los LLM, los métodos de incrustación de palabras como word2vec, GloVe y
fastText eran populares. En el procesamiento del lenguaje, esto ha sido reemplazado en
gran medida por incrustaciones de palabras contextualizadas producidas por modelos de
lenguaje. El algoritmo word2vec se basa en dos ideas principales: skipgram y muestreo negativo.
También utiliza entrenamiento contrastivo similar al tipo que veremos en el Capítulo 10.
Las incrustaciones son útiles para crear y mejorar sistemas de recomendación, como analizamos en
el recomendador de música que creamos a partir de listas de reproducción de canciones
seleccionadas.
1
Nils Reimers e Iryna Gurevych. “SentenceBERT: incrustaciones de oraciones utilizando siameses
Redes BERT”. Preimpresión arXiv arXiv:1908.10084 (2019).
OceanofPDF.com
Machine Translated by Google
Ahora que tenemos una idea de la tokenización y las incrustaciones, estamos listos para
profundizar en el modelo de lenguaje y ver cómo funciona. En este capítulo, veremos
algunas de las principales intuiciones de cómo funcionan los modelos de lenguaje de
Transformer. Nos centraremos en los modelos de generación de texto para obtener
una idea más profunda de los LLM generativos en particular.
importar antorcha
desde transformadores importar AutoModelForCausalLM, AutoTokenizer, pipeline
max_new_tokens=50,
hacer_muestra=Falso,
)
Comencemos nuestra exploración con una descripción general de alto nivel del modelo y
luego veremos cómo el trabajo posterior ha mejorado el modelo Transformer desde su
introducción en 2017.
Figura 31. En un alto nivel de abstracción, los LLM de Transformer toman un mensaje de texto y
generan un texto.
Figura 32. Los LLM de Transformer generan un token a la vez, no todo el texto a la vez.
Figura 33. Se agrega un token de salida al mensaje y luego este nuevo texto se presenta nuevamente al modelo para
que se realice otro pase hacia adelante para generar el siguiente token.
Esto nos da una imagen más precisa del modelo, ya que simplemente predice el siguiente token
en función de una solicitud de entrada. El software que rodea a la red neuronal
básicamente lo ejecuta en un bucle para expandir secuencialmente el texto generado hasta
completarlo.
Existe una palabra específica que se utiliza en el aprendizaje automático para describir los
modelos que consumen sus predicciones anteriores para realizar predicciones posteriores (por
ejemplo, el primer token generado del modelo se utiliza para generar el segundo token). Se
denominan modelos autorregresivos . Por eso, escuchará que los modelos LLM de generación
de texto se denominan modelos autorregresivos. Esto se suele utilizar para diferenciar
los modelos de generación de texto de los modelos de representación de texto como BERT,
que no son autorregresivos.
Esta generación autorregresiva, token por token, es lo que sucede en segundo plano cuando
generamos texto con LLM, como vemos aquí:
salida = generador(prompt)
imprimir(salida[0]['texto_generado'])
Solución 1:
Machine Translated by Google
Querida Sarah,
Espero que este mensaje te llegue bien. Te escribo para expresarte mi profundo pesar.
Podemos ver que el modelo comienza a escribir el correo electrónico comenzando por
el asunto. Se detuvo abruptamente porque alcanzó el límite de tokens que
establecimos al configurar max_new_tokens a 50 tokens. Si lo aumentamos,
continuará hasta concluir el correo electrónico.
Después del tokenizador viene la red neuronal: una pila de bloques Transformer que
realizan todo el procesamiento. Luego, esa pila va seguida del cabezal LM, que traduce
la salida de la pila en puntuaciones de probabilidad para determinar cuál es el token
más probable que aparecerá a continuación.
Figura 34. Un LLM de Transformer está compuesto por un tokenizador, una pila de bloques de Transformer y un
cabezal de modelado de lenguaje.
Machine Translated by Google
Figura 35. El tokenizador tiene un vocabulario de 50 000 tokens. El modelo tiene incrustaciones de
tokens asociadas a esas incrustaciones.
El flujo del cálculo sigue la dirección de la flecha de arriba hacia abajo. Para cada
token generado, el proceso fluye una vez a través de cada uno de los bloques
Transformer en la pila en orden, luego al cabezal LM, que finalmente genera la
distribución de probabilidad para el siguiente token, como se ve en la Figura 36.
Machine Translated by Google
Figura 36. Al final del pase hacia adelante, el modelo predice una puntuación de probabilidad para cada
token del vocabulario.
El cabezal LM es en sí mismo una capa de red neuronal simple. Es uno de los múltiples
“cabezales” posibles que se pueden conectar a una pila de bloques Transformer para construir
diferentes tipos de sistemas. Otros tipos de cabezales Transformer incluyen cabezales
de clasificación de secuencias y cabezales de clasificación de tokens.
Podemos visualizar el orden de las capas simplemente imprimiendo la variable del modelo.
Para este modelo, tenemos:
Phi3ForCausalLM((modelo): Phi3Model(
(embed_tokens): Incrustación(32064, 3072, padding_idx=32000) (embed_dropout):
Dropout(p=0.0, inplace=False) (capas): ModuleList( (031): 32 x
Phi3DecoderLayer( (self_attn):
Phi3Attention(
) (mlp):
Phi3MLP( (gate_up_proj):
Lineal(características_de_entrada=3072, características_de_salida=16384, sesgo=Falso)
(proyección_abajo): Lineal(en_características=8192,
Machine Translated by Google
) (capa_de_entrada_norma): Phi3RMSNorm()
(abandono_de_atención_residual): Abandono(p=0.0, inplace=Falso)
(abandono_de_mlp_residual): Abandono(p=0.0, inplace=Falso)
(capa_de_atención_posterior): Phi3RMSNorm()
)
) (norma): Phi3RMSNorm()
Esto nos muestra las distintas capas anidadas del modelo. La mayor parte del modelo
está etiquetada como modelo, seguida de lm_head.
Cada uno de estos bloques de Transformador incluye una capa de atención y una red
neuronal de retroalimentación (también conocida como mlp o perceptrón multinivel).
Los abordaremos con más detalle más adelante en este capítulo.
Distribución (Muestreo/Decodificación)
Al final del procesamiento, el resultado del modelo es una puntuación de probabilidad
para cada token del vocabulario, como vimos anteriormente en la Figura 36. El
método de elegir un solo token de la distribución de probabilidad se denomina estrategia
de decodificación. La Figura 37 muestra cómo esto lleva a elegir el token “Estimado” en
un ejemplo.
Lo que esto significa para el ejemplo de la Figura 37 es que si el token “Estimado” tiene
una probabilidad del 40 % de ser el siguiente token, entonces tiene una probabilidad del
40 % de ser elegido (en lugar de la búsqueda voraz, que lo elegiría directamente por
tener la puntuación más alta). Por lo tanto, con este método, todos los demás tokens
tienen una probabilidad de ser elegidos según su puntuación.
Figura 37. Los tokens con la mayor probabilidad después del pase hacia adelante del modelo. Nuestra estrategia
de decodificación decide cuál de los tokens generar mediante un muestreo basado en las probabilidades.
Elegir la ficha con mayor puntuación cada vez se llama decodificación codiciosa.
Esto es lo que sucede si estableces el parámetro de temperatura en cero en un LLM.
Machine Translated by Google
Veamos más de cerca el código que demuestra este proceso. En este bloque de
código, pasamos los tokens de entrada a través del modelo y luego lm_head:
Ahora, lm_head_output tiene la forma [1, 6, 32064]. Podemos acceder a los puntajes de
probabilidad de token para el último token generado usando
lm_head_output[0,1], que usa el índice 0 en toda la dimensión del lote; el índice 1
nos da el último token en la secuencia. Esta es ahora una lista de puntajes de probabilidad
para los 32,064 tokens. Podemos obtener el ID del token con la puntuación más alta y
luego decodificarlo para llegar al texto del token de salida generado:
token_id = lm_head_output[0,1].argmax(1)
tokenizador.decode(token_id)
París
Machine Translated by Google
Figura 38. Cada token se procesa a través de su propio flujo de cálculo (con cierta interacción entre ellos
en los pasos de atención, como veremos más adelante).
Machine Translated by Google
Cada uno de los flujos de tokens comienza con un vector de entrada (el vector de incrustación
y cierta información posicional; analizaremos las incrustaciones posicionales más adelante en
este capítulo). Al final del flujo, surge otro vector como resultado del procesamiento del
modelo, como se muestra en la Figura 39.
Figura 39. Cada flujo de procesamiento toma un vector como entrada y produce un vector resultante final del
mismo tamaño (a menudo denominado dimensión del modelo).
Para la generación de texto, solo se utiliza el resultado de salida del último flujo para
predecir el siguiente token. Ese vector de salida es la única entrada en el cabezal LM, ya que
calcula las probabilidades del siguiente token.
Machine Translated by Google
Quizás te preguntes por qué nos tomamos la molestia de calcular todos los flujos de
tokens si descartamos las salidas de todos los tokens excepto el último. La respuesta es
que los cálculos de los flujos anteriores son necesarios y se utilizan para calcular el
flujo final. Sí, no estamos utilizando su vector de salida final, pero usamos las salidas
anteriores (en cada bloque Transformer) en el mecanismo de atención del bloque
Transformer.
Si sigue los ejemplos de código, recuerde que la salida de lm_head tenía la forma [1, 6,
32064]. Esto se debió a que la entrada tenía la forma [1, 6, 3072], que es un lote de una
cadena de entrada, que contiene seis tokens, cada uno de ellos representado por
un vector de tamaño 3072 correspondiente a los vectores de salida después de la pila de
bloques Transformer.
modelo_salida[0].forma
Esto produce:
antorcha.Tamaño([1, 6, 3072])
Esto produce:
antorcha.Tamaño([1, 6, 32064])
Si le damos al modelo la capacidad de almacenar en caché los resultados del cálculo anterior
(especialmente algunos de los vectores específicos en el mecanismo de atención), ya no
necesitamos repetir los cálculos de los flujos anteriores. Esta vez, el único cálculo necesario es
para el último flujo. Esta es una técnica de optimización llamada caché de claves y
valores (kv) y proporciona una aceleración significativa del proceso de generación. Las claves y
los valores son algunos de los componentes centrales del mecanismo de atención, como
veremos más adelante en este capítulo.
Figura 310. Al generar texto, es importante almacenar en caché los resultados de los cálculos de
tokens anteriores en lugar de repetir el mismo cálculo una y otra vez.
prompt = "Escribe un correo electrónico muy largo pidiendo disculpas a Sarah por el trágico accidente de
jardinería. Explica cómo sucedió".
# Tokenizar el mensaje de entrada input_ids
= tokenizer(prompt, return_tensors="pt").input_ids input_ids = input_ids.to("cuda")
Luego cronometramos cuánto tiempo lleva generar 100 tokens con almacenamiento en
caché. Podemos usar el comando mágico %%timeit en Jupyter o Colab para cronometrar
cuánto tiempo lleva la ejecución (ejecuta el comando varias veces y obtiene el promedio):
%%timeit n 1 #
Generar el texto generation_output
= model.generate( input_ids=input_ids, max_new_tokens=100,
use_cache=True
En un Colab con una GPU T4, esto supone 4,5 segundos. Sin embargo, ¿cuánto tiempo tardaría
si deshabilitamos la memoria caché?
%%timeit n 1 #
Generar el texto generation_output
= model.generate( input_ids=input_ids, max_new_tokens=100,
use_cache=False
Esto equivale a 21,8 segundos. Una diferencia drástica. De hecho, desde el punto de vista de
la experiencia del usuario, incluso el tiempo de generación de cuatro segundos tiende a ser
mucho tiempo de espera para un usuario que está mirando una pantalla y esperando un
resultado del modelo. Esta es una de las razones por las que las API de LLM transmiten el resultado
Machine Translated by Google
tokens a medida que el modelo los genera en lugar de esperar a que se complete
toda la generación.
Ahora podemos hablar de dónde se produce la mayor parte del procesamiento: los
bloques Transformer. Como muestra la Figura 311 , los LLM Transformer
están compuestos por una serie de bloques Transformer (que suelen estar en el rango
de seis en el artículo original de Transformer, hasta más de cien en muchos LLM
grandes). Cada bloque procesa sus entradas y luego pasa los resultados de su
procesamiento al bloque siguiente.
Figura 311. La mayor parte del procesamiento del LLM del Transformador ocurre dentro de una serie de bloques del
Transformador, cada uno de los cuales entrega el resultado de su procesamiento como entrada al bloque siguiente.
capacidad de procesamiento
Figura 312. Un bloque Transformador está formado por una capa de autoatención y una red neuronal de propagación
hacia adelante.
Un ejemplo simple que da la intuición de la red neuronal de propagación hacia adelante sería si pasamos
la entrada simple “The Shawshank” a un modelo de lenguaje, con la expectativa de que generará
“Redención” como la siguiente palabra más probable (en referencia a la película de 1994).
La red neuronal de retroalimentación (en conjunto, en todas las capas del modelo) es la fuente de esta
información, como se muestra en la Figura 313 . Cuando el modelo se entrenó con éxito para modelar
un archivo de texto masivo (que incluía muchas menciones de “Cadena perpetua”), aprendió y almacenó la
Figura 313. El componente de red neuronal de propagación hacia adelante de un bloque Transformador probablemente
realiza la mayor parte de la memorización e interpolación del modelo.
Para que un LLM se entrene con éxito, necesita memorizar mucha información.
Pero no es simplemente una gran base de datos. La memorización es solo un ingrediente
en la receta de una generación de texto impresionante. El modelo puede usar esta
misma maquinaria para interpolar entre puntos de datos y patrones más complejos
para poder generalizar, lo que significa que funciona bien con entradas que no
había visto en el pasado y que no estaban en su conjunto de datos de entrenamiento.
Machine Translated by Google
NOTA
Cuando se utiliza un LLM comercial moderno, los resultados que se obtienen no son los
mencionados anteriormente en el sentido estricto de un “modelo de lenguaje”. Pasar
“The Shawshank” a un LLM de chat como GPT4 produce un resultado:
"The Shawshank Redemption" es una película de 1994 dirigida por Frank Darabont y está
basada en la novela corta "Rita Hayworth and Shawshank Redemption" escrita
por Stephen King. ...etc.
Esto se debe a que los modelos de lenguaje en bruto (como GPT3) son difíciles de utilizar correctamente
para las personas. Por eso, el modelo de lenguaje se entrena para ajustar las instrucciones y las preferencias
humanas y ajustar la retroalimentación para que coincida con las expectativas de las personas sobre lo que el
modelo debería generar.
Para que el modelo prediga qué viene después de “it”, necesita saber a qué se refiere
“it”. ¿Se refiere al perro o a la ardilla?
Figura 314. La capa de autoatención incorpora información relevante de posiciones anteriores que
ayudan a procesar el token actual.
Figura 315. Un esquema simplificado de la atención: una secuencia de entrada y una posición actual en proceso.
Como nos interesa principalmente esta posición, la figura muestra un vector de entrada y un vector de salida que
incorpora información de los elementos anteriores en la secuencia según el mecanismo de atención.
1. Una forma de puntuar la relevancia de cada uno de los tokens de entrada anteriores
con respecto al token actual que se está procesando (en la flecha rosa).
Figura 316. Atención se compone de dos pasos principales: puntuación de relevancia para cada posición y, luego, un paso
en el que combinamos la información en función de esas puntuaciones.
Machine Translated by Google
La figura 317 muestra la intuición de cómo los cabezales de atención funcionan en paralelo con
un paso anterior de división de información y un paso posterior de combinación de los
resultados de todos los cabezales.
Figura 317. Obtenemos mejores LLM al realizar la atención varias veces en paralelo, lo que aumenta la capacidad del
modelo para prestar atención a diferentes tipos de información.
El objetivo es producir una nueva representación de la posición actual que incorpore información
La figura 318 muestra la posición inicial de todos estos componentes antes de que comiencen los cálculos
de atención. Para simplificar, observemos solo un cabezal de atención porque los demás cabezales
tienen cálculos idénticos pero con sus matrices de proyección individuales.
Machine Translated by Google
Figura 318. Antes de comenzar el cálculo de autoatención, tenemos las entradas a las matrices de
capas y proyecciones para consultas, claves y valores.
La atención comienza multiplicando las entradas por las matrices de proyección para
crear tres nuevas matrices. Estas se denominan matrices de consultas, claves y valores.
Estas matrices contienen la información de los tokens de entrada proyectados a tres
espacios diferentes que ayudan a llevar a cabo los dos pasos de la atención:
1. Puntuación de relevancia
2. Combinación de información
La Figura 319 muestra estas tres nuevas matrices y cómo la fila inferior de las tres matrices está
asociada con la posición actual, mientras que las filas superiores están asociadas con las
posiciones anteriores.
Machine Translated by Google
Figura 319. La atención se lleva a cabo mediante la interacción de las matrices de consultas, claves y valores.
Estos se producen multiplicando las entradas de la capa con las matrices de proyección.
Figura 321. Atención combina la información relevante de posiciones anteriores multiplicando sus puntuaciones
de relevancia por sus respectivos vectores de valores.
Atención local/dispersa
A medida que los Transformers comenzaron a hacerse más grandes, surgieron ideas
como la atención dispersa ("Generar secuencias largas con transformadores dispersos")
y la atención de la ventana deslizante (“Longformer: El transformador de documentos
largos”) proporcionó mejoras para la eficiencia del cálculo de la atención.
La atención dispersa limita el contexto de los tokens anteriores a los que el modelo puede
prestar atención, como podemos ver en la Figura 322.
Figura 322. La atención local mejora el rendimiento al prestar atención únicamente a una pequeña cantidad de
posiciones anteriores.
Un modelo que incorpora un mecanismo de este tipo es GPT3, pero no lo utiliza para todos
los bloques Transformer (la calidad de la generación se degradaría enormemente si el modelo solo
pudiera ver una pequeña cantidad de tokens anteriores). La arquitectura GPT3 entrelazó
bloques Transformer de atención completa y de atención eficiente. De modo que los bloques
Transformer alternan entre atención completa (por ejemplo, bloques 1 y 3) y atención dispersa
Para demostrar los diferentes tipos de atención, revise la Figura 323, que muestra cómo
funcionan los diferentes mecanismos de atención. Cada figura muestra a qué tokens anteriores
(azul claro) se puede prestar atención al procesar el token actual (azul oscuro).
Machine Translated by Google
Figura 323. Atención total versus atención dispersa. La figura 324 explica la coloración. (Fuente:
“Generación de secuencias largas con transformadores dispersos”).
Figura 324. Las figuras de atención muestran qué token se está procesando y a qué tokens anteriores un mecanismo
de atención le permite prestar atención.
3. La figura 325 muestra estos diferentes tipos de atención y la siguiente sección continúa
explicándolos.
Figura 325. Comparación de diferentes tipos de atención: atención multicabezal original, atención de consulta
agrupada y atención multiconsulta (fuente: “Decodificación rápida de transformadores: un cabezal de escritura es todo lo
que necesita”).
matrices de valores para realizar la operación de atención. La Figura 326 muestra cómo cada
“cabeza de atención” tiene sus propias matrices de consulta, clave y valores distintas calculadas para
una entrada determinada.
La forma en que la atención de consultas múltiples optimiza esto es compartiendo las matrices de
claves y valores entre todos los encabezados. Por lo tanto, las únicas matrices únicas para cada
encabezado serían las matrices de consultas, como podemos ver en la Figura 327.
Machine Translated by Google
Figura 326. La atención se lleva a cabo utilizando matrices de consultas, claves y valores. En la atención
multicabezal, cada cabeza tiene una versión distinta de cada una de estas matrices.
Machine Translated by Google
Figura 327. La atención de múltiples consultas presenta un mecanismo de atención más eficiente al compartir las matrices
de claves y valores entre todos los encabezados de atención.
Sin embargo, a medida que el tamaño de los modelos aumenta, esta optimización puede
ser demasiado exigente y podemos permitirnos usar un poco más de memoria para
mejorar la calidad de los modelos. Aquí es donde entra en juego la atención de consultas
agrupadas. En lugar de reducir la cantidad de matrices de claves y valores a una de cada
una, nos permite usar más (pero menos que la cantidad de cabezas). La Figura 328
muestra estos grupos y cómo cada grupo de cabezas de atención comparte matrices de claves y valores.
Machine Translated by Google
Figura 328. La atención de consultas agrupadas sacrifica un poco de la eficiencia de la atención de consultas múltiples
a cambio de una gran mejora en la calidad al permitir múltiples grupos de matrices de clave/valor compartidas;
cada grupo tiene su respectivo conjunto de encabezados de atención.
Atención flash
Los últimos modelos de Transformer en el momento de escribir este artículo aún conservan
los componentes principales, aunque realizan una serie de ajustes como podemos ver en la Figura
330.
Una de las diferencias que vemos en esta versión del bloque Transformador es que la
Figura 330. El bloque Transformer de un Transformer de la era 2024 como Llama 3 presenta algunos ajustes
como la prenormalización y una atención optimizada con atención de consultas agrupadas e
incrustaciones rotativas.
Machine Translated by Google
Por ejemplo, uno de los desafíos que presenta el entrenamiento eficiente de modelos con un contexto
amplio es que muchos documentos en el conjunto de entrenamiento son mucho más cortos
que ese contexto. Sería ineficiente asignar todo el contexto (por ejemplo, 4K) a una oración corta
de 10 palabras. Por lo tanto, durante el entrenamiento del modelo, los documentos se empaquetan
juntos en cada contexto en el lote de entrenamiento, como se muestra en la Figura 331 .
Machine Translated by Google
En lugar de las incrustaciones estáticas y absolutas que se agregan al comienzo del paso hacia
adelante, las incrustaciones rotativas son un método para codificar información posicional
de manera que capture información de posición absoluta y relativa del token. Se basa en
la idea de rotar vectores en su espacio de incrustaciones. En el paso hacia adelante, se
agregan en el paso de atención, como se muestra en la Figura 332 .
Machine Translated by Google
Figura 332. Las incrustaciones rotatorias se aplican en el paso de atención, no al comienzo del paso hacia adelante.
Figura 333. Se agregan incrustaciones posicionales rotatorias a la representación de tokens justo antes del paso
de puntuación de relevancia en la autoatención.
Resumen
En este capítulo, analizamos las principales intuiciones de Transformers y los desarrollos
recientes que permiten los últimos LLM de Transformers. Repasamos muchos conceptos
nuevos, así que analicemos los conceptos clave que analizamos en este capítulo:
El pase hacia adelante fluye a través de todas las etapas una vez, una por una.
Cerca del final del proceso, el líder del LM puntúa las probabilidades del siguiente
token posible. Las estrategias de decodificación indican qué token real elegir como
salida para este paso de generación (a veces es el siguiente token más probable,
pero no siempre).
Una de las razones por las que Transformer se destaca es su capacidad de procesar
tokens en paralelo. Cada uno de los tokens de entrada fluye hacia sus pistas o
flujos de procesamiento individuales. La cantidad de flujos es el "tamaño del
contexto" del modelo y representa la cantidad máxima de tokens con los que
puede operar el modelo.
Debido a que los LLM de Transformer realizan un bucle para generar el texto un token a la vez,
es una buena idea almacenar en caché los resultados del procesamiento de cada paso para que
Machine Translated by Google
En la segunda parte del libro, abordaremos algunas de estas aplicaciones prácticas de los
LLM. En el capítulo 4, comenzamos con la clasificación de textos, una tarea común en la
IA del lenguaje. El siguiente capítulo sirve como introducción a la aplicación de modelos
generativos y de representación.
OceanofPDF.com
Machine Translated by Google
OceanofPDF.com
Machine Translated by Google
En este capítulo, analizaremos varias formas de utilizar modelos de lenguaje para clasificar
textos. Servirá como una introducción accesible al uso de modelos de lenguaje que ya han sido
entrenados. Debido al amplio campo de la clasificación de textos, analizaremos varias
técnicas y las utilizaremos para explorar el campo de los modelos de lenguaje:
Se utiliza para clasificar textos. Como se ilustra en la Figura 42, examinaremos tanto los
modelos de representación como los de lenguaje y exploraremos sus diferencias.
Figura 42. Aunque tanto los modelos de representación como los generativos pueden utilizarse para la clasificación,
sus enfoques difieren.
Este capítulo sirve como introducción a una variedad de modelos de lenguaje, tanto
generativos como no generativos. Encontraremos paquetes comunes para cargar y usar
estos modelos.
CONSEJO
Aunque este libro se centra en los LLM, se recomienda encarecidamente comparar estos ejemplos
con líneas de base clásicas, pero sólidas, como la representación de texto con TFIDF y el entrenamiento
de un clasificador de regresión logística sobre eso.
Para cargar estos datos, utilizamos el paquete datasets, que se utilizará a lo largo del libro:
DatasetDict({ tren:
Dataset({ características:
['texto', 'etiqueta'], num_rows: 8530
})
validación: Conjunto de
datos({ características: ['texto', 'etiqueta'],
num_filas: 1066
})
prueba: Conjunto de
datos({ características: ['texto', 'etiqueta'],
num_filas: 1066
})
})
datos["tren"][0, 1]
"
{'text': ['la roca está destinada a ser la nueva del siglo XXI
Conan " y que va a causar un revuelo aún mayor que
Arnold Schwarzenegger, JeanClaude van Damme o Steven Segal... las cosas realmente se ponen
Estas reseñas breves se etiquetan como positivas (1) o negativas (0). Esto significa que nos
centraremos en la clasificación binaria de sentimientos.
Figura 43. Un modelo de base se ajusta para tareas específicas; por ejemplo, para realizar una clasificación
o generar incrustaciones de propósito general.
Figura 44. Realice la clasificación directamente con un modelo específico de la tarea o indirectamente con
incrustaciones de propósito general.
Aprovecharemos modelos previamente entrenados que otros ya han perfeccionado para nosotros
y exploraremos cómo se pueden utilizar para clasificar nuestras reseñas de películas seleccionadas.
Selección de modelo
Elegir los modelos correctos no es tan sencillo como podría pensarse con más de 60.000 modelos
en Hugging Face Hub para la clasificación de texto. y más de 8.000 modelos que generan
incrustaciones En el momento de escribir este artículo, es fundamental seleccionar un
modelo que se adapte a su caso de uso y tener en cuenta su compatibilidad con el lenguaje, la
arquitectura subyacente, el tamaño y el rendimiento.
Varios contextos. Puede encontrar una descripción general de algunos modelos similares a BERT
Figura 45. Cronología de versiones de modelos similares a BERT comunes. Se consideran modelos básicos y, en
su mayoría, están pensados para perfeccionarse en una tarea posterior.
Seleccionar el modelo adecuado para el trabajo puede ser una forma de arte en sí misma.
Probar miles de modelos preentrenados que se pueden encontrar en el Hub de Hugging Face no
es factible, por lo que debemos ser eficientes con los modelos que elegimos.
Dicho esto, existen varios modelos que son excelentes puntos de partida y que te dan una idea
del rendimiento básico de este tipo de modelos. Considéralos puntos de referencia sólidos:
bertpequeño
Base ALBERT v2
A medida que cargamos nuestro modelo, también cargamos el tokenizador, que es responsable
de convertir el texto de entrada en tokens individuales, como se ilustra en la Figura 46.
Aunque ese parámetro no es necesario ya que se carga automáticamente, ilustra lo que
está sucediendo bajo el capó.
Machine Translated by Google
Figura 46. Una oración de entrada se introduce primero en un tokenizador antes de que pueda ser procesada por el modelo específico
de la tarea.
Estos tokens son el núcleo de la mayoría de los modelos de lenguaje, como se explora en
profundidad en el Capítulo 2. Un beneficio importante de estos tokens es que se pueden
combinar para generar representaciones incluso si no estaban en los datos de
entrenamiento, como se muestra en la Figura 47.
Machine Translated by Google
Figura 47. Al descomponer una palabra desconocida en tokens, aún se pueden generar incrustaciones de palabras.
Después de cargar todos los componentes necesarios, podemos continuar y utilizar nuestro
modelo en la división de prueba de nuestros datos:
# Ejecutar inferencia
y_pred = [] para
salida en tqdm(pipe(KeyDataset(data["test"], "text")), total=len(data["test"])): puntuación_negativa
= salida[0]["puntuación"] puntuación_positiva
= salida[2]["puntuación"] asignación =
np.argmax([puntuación_negativa, puntuación_positiva])
y_pred.append(asignación)
Ahora que hemos generado nuestras predicciones, lo único que nos queda es la evaluación. Creamos
una pequeña función que podemos utilizar fácilmente a lo largo de este capítulo:
Machine Translated by Google
evaluar_rendimiento(datos["prueba"]["etiqueta"], y_pred)
Para leer el informe de clasificación resultante, comencemos primero por explorar cómo
Podemos identificar predicciones correctas e incorrectas. Hay cuatro
combinaciones dependiendo de si predecimos algo correctamente (Verdadero)
versus incorrectamente (Falso) y si predecimos la clase correcta
(Positivo) versus clase incorrecta (Negativo). Podemos ilustrar estos
combinaciones como una matriz, comúnmente denominada matriz de confusión, en
Figura 48.
Machine Translated by Google
Figura 48. La matriz de confusión describe cuatro tipos de predicciones que podemos hacer.
Utilizando la matriz de confusión, podemos derivar varias fórmulas para describir la calidad del
modelo. En el informe de clasificación generado anteriormente podemos ver cuatro de estos
métodos, a saber, precisión, recuperación, exactitud y F1.
puntaje:
Estas cuatro métricas se ilustran en la Figura 49, que las describe utilizando el informe de clasificación
mencionado anteriormente.
Machine Translated by Google
Figura 49. El informe de clasificación describe varias métricas para evaluar el rendimiento de un modelo.
Para mejorar el rendimiento de nuestro modelo seleccionado, podríamos hacer algunas cosas
diferentes, entre ellas seleccionar un modelo entrenado con los datos de nuestro dominio, reseñas
de películas en este caso, como DistilBERT base uncased finetuned SST2.
También podríamos trasladar nuestro enfoque a otro tipo de modelos de representación,
concretamente los modelos de inserción.
Puede haber ocasiones en las que desee ajustar el modelo usted mismo si dispone de suficientes
recursos informáticos (consulte el Capítulo 11). Sin embargo, no todo el mundo tiene
acceso a recursos informáticos extensos. Aquí es donde entran en juego los modelos de incrustación
de propósito general.
Clasificación supervisada
A diferencia del ejemplo anterior, podemos realizar parte del proceso de entrenamiento
nosotros mismos al abordarlo desde una perspectiva más clásica. En lugar de utilizar
directamente el modelo de representación para la clasificación, utilizaremos un modelo
de incrustación para generar características. Esas características pueden luego introducirse
en un clasificador, creando así un enfoque de dos pasos como se muestra en la Figura 410.
Figura 410. El paso de extracción de características y los pasos de clasificación están separados.
Una de las principales ventajas de esta separación es que no necesitamos ajustar nuestro
modelo de incrustación, lo que puede resultar costoso. Por el contrario, podemos entrenar un
clasificador, como una regresión logística, en la CPU.
Figura 411. En el paso 1, utilizamos el modelo de incrustación para extraer las características y convertir el texto de entrada
en incrustaciones.
# Cargar modelo
model = SentenceTransformer("transformadoresdesentencias/allmpnetbasev2")
incrustaciones_de_tren.forma
(8530, 768)
Esto demuestra que cada uno de nuestros 8.530 documentos de entrada tiene una
dimensión de incrustación de 768 y, por lo tanto, cada incrustación contiene 768 valores
numéricos.
Figura 412. Utilizando las incrustaciones como nuestras características, entrenamos un modelo de regresión logística en nuestros
datos de entrenamiento.
Mantendremos este paso simple y utilizaremos una regresión logística como clasificador.
Para entrenarlo, solo necesitamos utilizar las incrustaciones generadas
Machine Translated by Google
CONSEJO
En nuestro ejemplo anterior, habíamos etiquetado datos que podíamos aprovechar, pero
esto no siempre sucede en la práctica. Obtener datos etiquetados es una tarea que
consume muchos recursos y puede requerir una cantidad significativa de trabajo humano.
Además, ¿realmente vale la pena recopilar estas etiquetas?
Para probar esto, podemos realizar una clasificación de cero disparos, donde no
tenemos datos etiquetados para explorar si la tarea parece factible. Aunque conocemos la
definición de las etiquetas (sus nombres), no tenemos datos etiquetados para
respaldarlas. La clasificación de cero disparos intenta predecir las etiquetas del texto de
entrada aunque no haya sido entrenado con ellas, como se muestra en la Figura 413.
Figura 413. En la clasificación de cero disparos, no tenemos datos etiquetados, solo las etiquetas mismas. El
modelo de cero disparos decide cómo se relaciona la entrada con las etiquetas candidatas.
Machine Translated by Google
Para realizar una clasificación de cero disparos con incrustaciones, hay un truco muy útil que
podemos utilizar. Podemos describir nuestras etiquetas en función de lo que deberían
representar. Por ejemplo, una etiqueta negativa para críticas de películas se puede describir como
"Esta es una crítica negativa de una película". Al describir e incrustar las etiquetas y los
documentos, tenemos datos con los que podemos trabajar. Este proceso, como se ilustra en la
Figura 414, nos permite generar nuestras propias etiquetas de destino sin la necesidad
de tener realmente ningún dato etiquetado.
Figura 414. Para insertar las etiquetas, primero debemos darles una descripción, como por ejemplo “una crítica negativa de
una película”. Esto puede insertarse luego mediante transformadores de oraciones.
Podemos crear estas incrustaciones de etiquetas utilizando la función .encode como lo hicimos
anteriormente:
Para asignar etiquetas a los documentos, podemos aplicar la similitud de coseno a los
pares de etiquetas de los documentos. Este es el coseno del ángulo entre los vectores, que
Machine Translated by Google
se calcula a través del producto escalar de las incrustaciones y se divide por el producto
de sus longitudes, como se ilustra en la Figura 415.
Figura 415. La similitud del coseno es el ángulo entre dos vectores o incrustaciones. En este ejemplo, calculamos la similitud
entre un documento y las dos etiquetas posibles, positiva y negativa.
Figura 416. Después de incorporar las descripciones de las etiquetas y los documentos, podemos utilizar la similitud de coseno
para cada par de etiquetas y documentos.
Machine Translated by Google
¡Y eso es todo! Solo nos faltaba pensar en nombres para nuestras etiquetas.
Realizamos nuestras tareas de clasificación. Veamos qué tan bien funciona este método:
evaluar_rendimiento(datos["prueba"]["etiqueta"], y_pred)
NOTA
Si está familiarizado con la clasificación de disparo cero Con modelos basados en Transformers, usted
Tal vez se pregunten por qué elegimos ilustrar esto con incrustaciones. Aunque
Los modelos de inferencia de lenguaje natural son sorprendentes para la clasificación de disparo cero, el ejemplo
Aquí se demuestra la flexibilidad de las incrustaciones para una variedad de tareas. Como verás
A lo largo del libro, se pueden encontrar incrustaciones en la mayoría de los casos de uso de inteligencia artificial del lenguaje y son
Una puntuación F1 de 0,78 es bastante impresionante teniendo en cuenta que no utilizamos ningún
¡Datos etiquetados en absoluto! Esto demuestra lo versátiles y útiles que son las incrustaciones.
lo son, especialmente si eres un poco creativo con la forma en que se utilizan.
Machine Translated by Google
CONSEJO
Pongamos a prueba esa creatividad. Hemos decidido que el nombre de nuestras etiquetas sea “Una
reseña negativa/positiva”, pero se puede mejorar. En su lugar, podemos hacerlas un poco más
concretas y específicas respecto de nuestros datos utilizando “Una reseña de película muy negativa/
positiva”. De esta manera, la incrustación captará que se trata de una reseña de película y se centrará
un poco más en los extremos de las dos etiquetas. Pruébelo y explore cómo afecta los resultados.
Figura 417. Un modelo específico de tarea genera valores numéricos a partir de secuencias de tokens, mientras
que un modelo generativo genera secuencias de tokens a partir de secuencias de tokens.
En cambio, debemos ayudarlo a comprender el contexto y guiarlo hacia las respuestas que
estamos buscando. Como se muestra en la Figura 418, este proceso de guía se
realiza principalmente a través de la instrucción o indicación que le damos .
Machine Translated by Google
Proporcione un modelo de este tipo. Mejorar iterativamente su propuesta para obtener el resultado
deseado se denomina ingeniería de propuestas.
Figura 418. La ingeniería de indicaciones permite actualizar las indicaciones para mejorar el resultado generado por
el modelo.
En esta sección, demostraremos cómo podemos aprovechar diferentes tipos de modelos generativos
para realizar la clasificación sin nuestro conjunto de datos Rotten Tomatoes.
Figura 419. La arquitectura T5 es similar al modelo Transformer original, una arquitectura decodificadorcodificador.
Figura 420. En el primer paso del entrenamiento, es decir, el preentrenamiento, el modelo T5 debe predecir
máscaras que podrían contener múltiples tokens.
El segundo paso del entrenamiento, es decir, el ajuste fino del modelo base, es
donde ocurre la verdadera magia. En lugar de ajustar el modelo para una tarea
específica, cada tarea se convierte en una tarea secuencia a secuencia y se
entrena simultáneamente. Como se ilustra en la Figura 421, esto permite entrenar
el modelo en una amplia variedad de tareas.
Figura 421. Al convertir tareas específicas en instrucciones textuales, el modelo T5 puede entrenarse en una
variedad de tareas durante el ajuste fino.
Machine Translated by Google
En comparación con nuestro modelo específico para tareas, no podemos simplemente darle
un texto al modelo y esperar que muestre el sentimiento. En cambio, tendremos que indicarle
al modelo que lo haga.
Por lo tanto, anteponemos a cada documento la pregunta “¿La siguiente oración es positiva
o negativa?”:
DatasetDict({ tren:
Dataset({ características:
['texto', 'etiqueta', 't5'], num_rows: 8530
})
validación: Conjunto de datos({
Machine Translated by Google
Después de crear nuestros datos actualizados, podemos ejecutar la canalización de manera similar al
# Ejecutar inferencia
y_pred = []
para salida en tqdm(pipe(KeyDataset(data["test"], "t5")),
total=len(datos["prueba"])):
texto = salida[0]["texto_generado"]
y_pred.append(0 si el texto == "negativo" de lo contrario 1)
Dado que este modelo genera texto, necesitábamos convertir la salida textual a
Estos valores numéricos ahora nos permiten probar la calidad del modelo en el
evaluar_rendimiento(datos["prueba"]["etiqueta"], y_pred)
Con una puntuación F1 de 0,84, está claro que este modelo FlanT5 es un primer modelo sorprendente.
Aunque a lo largo del libro nos centramos en los modelos de código abierto, otro
componente importante del campo de la IA del lenguaje son los modelos de código
cerrado; en particular, ChatGPT.
Figura 422. Se utilizaron datos etiquetados manualmente que consisten en una instrucción (indicador) y una salida
para realizar un ajuste fino (ajuste de instrucciones).
OpenAI utilizó el modelo resultante para generar múltiples resultados que se clasificaron
manualmente de mejor a peor. Como se muestra en la Figura 423, esta clasificación
demuestra una preferencia por determinados resultados (datos de preferencia) y se utilizó
para crear su modelo final, ChatGPT.
Machine Translated by Google
Figura 423. Se utilizaron datos de preferencias clasificados manualmente para generar el modelo final, ChatGPT.
Antes de pasar al ejemplo de clasificación, primero deberá crear una cuenta gratuita en https://
oreil.ly/AEXvA y crea una clave API aquí: https://oreil.ly/lrTXl. Después de hacerlo,
puede usar su API para comunicarse con los servidores de OpenAI.
importar openai
Usando este cliente, creamos la función chatgpt_generation, que nos permite generar un
texto basado en un mensaje específico, un documento de entrada y el modelo seleccionado:
Machine Translated by Google
{
"rol": "usuario",
"contenido": prompt.replace("[DOCUMENTO]", documento) }
] chat_completion = cliente.chat.completions.create(
mensajes=mensajes,
modelo=modelo,
temperatura=0
) devuelve chat_completion.choices[0].message.content
A continuación, necesitaremos crear una plantilla para solicitarle al modelo que realice
la clasificación:
[DOCUMENTO]
"""
Antes de utilizar esta función en un conjunto de datos potencialmente grande, es importante que
lleves un registro de tu uso. Las API externas, como la que ofrece OpenAI, pueden volverse
costosas rápidamente si realizas muchas solicitudes. Al momento de escribir este artículo, ejecutar
nuestro conjunto de datos de prueba utilizando el modelo “gpt3.5turbo0125” cuesta 3 centavos,
que están cubiertos por la cuenta gratuita, pero esto podría cambiar en el futuro.
CONSEJO
Al trabajar con API externas, es posible que se produzcan errores de límite de velocidad. Estos aparecen
cuando se llama a la API con demasiada frecuencia, ya que algunas API pueden limitar la velocidad con la
que se puede usar por minuto u hora.
Para evitar estos errores, podemos implementar varios métodos para volver a intentar la solicitud,
incluido algo conocido como retroceso exponencial. Realiza una suspensión breve cada vez que
alcanzamos un error de límite de velocidad y luego vuelve a intentar la solicitud fallida. Cada vez que no
tiene éxito nuevamente, la duración de la suspensión se incrementa hasta que la solicitud se realiza
correctamente o alcanzamos un número máximo de reintentos.
Para usarlo con OpenAI, hay una excelente guía que puede ayudarle a empezar.
A continuación, podemos ejecutar esto para todas las revisiones en el conjunto de datos de prueba para obtener sus predicciones.
Puedes omitir este paso si deseas guardar tus créditos (gratuitos) para otras tareas.
# Evaluar el desempeño
evaluar_rendimiento(datos["prueba"]["etiqueta"], y_pred)
En el Capítulo 12, exploraremos cómo podemos evaluar tanto el código abierto como
modelos de código cerrado en tareas más generalizadas.
Resumen
En este capítulo, analizamos muchas técnicas diferentes para realizar una
Amplia variedad de tareas de clasificación, desde ajustar todo el modelo hasta
¡No hay ningún ajuste! La clasificación de datos textuales no es tan sencilla como parece.
Parece que en la superficie hay una increíble cantidad de técnicas creativas.
por hacerlo.
En este capítulo, exploramos la clasificación de texto utilizando tanto la clasificación generativa como la clasificación de texto.
modelos de lenguaje de representación. Nuestro objetivo era asignar una etiqueta o clase a
Texto de entrada para la clasificación del sentimiento de una reseña.
De manera similar, exploramos dos tipos de modelos generativos, uno de código abierto
modelo codificadordecodificador (FlanT5) y un modelo de código cerrado que solo incluye decodificador
(GPT3.5). Usamos estos modelos generativos en la clasificación de texto sin
requiriendo entrenamiento específico (adicional) sobre datos de dominio o conjuntos de datos etiquetados.
1
Bo Pang y Lillian Lee. “Ver estrellas: explotar las relaciones de clase para generar sentimientos”
categorización con respecto a escalas de calificación”. arXiv preprint cs/0506075 (2005).
2
Yinhan Liuet et al. “RoBERTa: un enfoque de preentrenamiento BERT optimizado de manera sólida”. arXiv
preimpresión arXiv:1907.11692 (2019).
3
Victor Sanh et al. “DistilBERT, una versión destilada de BERT: más pequeña, más rápida, más barata y
más ligero.” preimpresión arXiv arXiv:1910.01108 (2019).
4
Zhenzhong Lan et al. “ALBERT: un BERT ligero para el aprendizaje autosupervisado del lenguaje”
representaciones.” preimpresión arXiv arXiv:1909.11942 (2019).
5
Pengcheng He et al. “DeBERTa: BERT mejorado con decodificación y atención desenredada”.
Preimpresión de arXiv arXiv:2006.03654 (2020).
6
Nils Reimers e Iryna Gurevych. “SentenceBERT: incrustaciones de oraciones utilizando siameses
Redes BERT”. Preimpresión arXiv arXiv:1908.10084 (2019).
7
Colin Raffel et al. “Explorando los límites del aprendizaje por transferencia con un sistema unificado de texto a texto”
transformador.” The Journal of Machine Learning Research 21.1 (2020): 5485–5551.
8
Hyung Won Chung et al. “Escalado de modelos de lenguaje ajustados a la instrucción”. Preimpresión de arXiv
arXiv:2210.11416 (2022).
OceanofPDF.com
Machine Translated by Google
Figura 52. El modelado de temas es una forma de dar significado a grupos de documentos textuales.
Cargamos los datos y creamos variables separadas para los resúmenes, títulos y años de
cada artículo:
Si bien existen muchos métodos para agrupar texto, desde redes neuronales basadas en
gráficos hasta técnicas de agrupamiento basadas en centroides, un proceso común que ha
ganado popularidad implica tres pasos y algoritmos:
Incorporación de documentos
El primer paso es convertir nuestros datos textuales en incrustaciones, como se ilustra en la Figura 53.
Recuerde que en los capítulos anteriores las incrustaciones son representaciones numéricas del texto que
Como hicimos en el capítulo anterior, utilizaremos la tabla de clasificación de MTEB Para seleccionar un
modelo de incrustación, necesitaremos un modelo de incrustación que tenga una puntuación aceptable en
las tareas de agrupamiento, pero que también sea lo suficientemente pequeño para ejecutarse rápidamente.
Es un modelo más reciente que supera al modelo anterior en tareas de agrupamiento y, debido a su pequeño
tamaño, es incluso más rápido para la inferencia. Sin embargo, ¡siéntete libre de experimentar con los
(44949, 384)
Como resultado, los datos de alta dimensión pueden resultar problemáticos para muchas
técnicas de agrupamiento, ya que resulta más difícil identificar grupos significativos. En su
lugar, podemos hacer uso de la reducción de dimensionalidad. Como se ilustra en la Figura
54, esta técnica nos permite reducir el tamaño del espacio dimensional y representar
los mismos datos con menos dimensiones. Las técnicas de reducción de dimensionalidad
tienen como objetivo preservar la estructura global de los datos de alta dimensión mediante
la búsqueda de representaciones de baja dimensión.
Machine Translated by Google
Figura 54. La reducción de dimensionalidad permite que los datos en un espacio de alta dimensión se compriman a
una representación de menor dimensión.
Tenga en cuenta que se trata de una técnica de compresión y que el algoritmo subyacente
no elimina dimensiones de manera arbitraria. Para ayudar al modelo de clúster a crear
clústeres significativos, el segundo paso en nuestro proceso de agrupamiento es la
reducción de la dimensionalidad, como se muestra en la Figura 55.
Figura 55. Paso 2: Las incrustaciones se reducen a un espacio de menor dimensión mediante la reducción de
dimensionalidad.
Machine Translated by Google
Los métodos conocidos para la reducción de dimensionalidad son el análisis de componentes principales
utilizaremos UMAP, ya que tiende a manejar las relaciones y estructuras no lineales un poco mejor
que el PCA.
NOTA
Sin embargo, las técnicas de reducción de dimensionalidad no son perfectas. No capturan
perfectamente datos de alta dimensión en una representación de menor dimensión. Con este
procedimiento siempre se perderá información. Existe un equilibrio entre reducir la dimensionalidad
y conservar la mayor cantidad de información posible.
UMAP( n_components=5,
min_dist=0.0, metric='cosine', random_state=42 ) reduction_embeddings =
umap_model.fit_transform(embeddings)
Podemos utilizar el parámetro n_components para decidir la forma del espacio de menor
dimensión, es decir, 5 dimensiones. En general, los valores entre 5 y 10 funcionan bien para capturar
estructuras globales de alta dimensión.
Tenga en cuenta que configurar un random_state en UMAP hará que los resultados sean
reproducibles en todas las sesiones, pero deshabilitará el paralelismo y, por lo tanto, ralentizará el proceso.
Machine Translated by Google
Entrenamiento descendente.
Figura 56. Paso 3: Agrupamos los documentos utilizando las incrustaciones con dimensionalidad reducida.
Aunque una opción común es un algoritmo basado en centroides como kmeans, que requiere
que se genere un conjunto de clústeres, no sabemos la cantidad de clústeres de antemano. En
cambio, un algoritmo basado en densidad calcula libremente la cantidad de clústeres y no obliga a
que todos los puntos de datos formen parte de un clúster, como se ilustra en la Figura 57.
Machine Translated by Google
Figura 57. El algoritmo de agrupamiento no solo afecta la forma en que se generan los clústeres, sino también la forma en
que se visualizan.
Al igual que con los paquetes anteriores, el uso de HDBSCAN es sencillo. Solo
necesitamos crear una instancia del modelo y pasarle nuestras incrustaciones reducidas:
clústeres = hdbscan_model.labels_
156
Este trabajo tiene como objetivo diseñar una traducción automática estadística de texto en inglés a
lenguaje de señas americano
(ASL). El sistema se basa en la herramienta Moses con algunas modificaciones y los resultados se
sintetizan a través de
un avatar 3D para su interpretación. En primer lugar, traducimos el texto de entrada a glosa, un
formato escrito...
Las investigaciones sobre lenguas de signos aún disocian fuertemente las cuestiones lingüísticas
relacionadas con los
aspectos fonológicos y fonéticos y los estudios de gestos con fines de reconocimiento y síntesis.
Este artículo se
centra en la imbricación del movimiento y el significado para el análisis, la síntesis y la evaluación de las
lenguas de signos...
Machine Translated by Google
Podemos llevar esto un paso más allá e intentar visualizar nuestros resultados en lugar
de revisar todos los documentos manualmente. Para ello, necesitaremos reducir las
incrustaciones de nuestros documentos a dos dimensiones, ya que eso nos permite
trazar los documentos en un plano x/y:
# Reduce las incrustaciones de 384 dimensiones a dos dimensiones para una visualización más sencilla.
reduction_embeddings
= UMAP( n_components=2, min_dist=0.0,
metric="cosine", random_state=42 ).fit_transform(embeddings)
También creamos un marco de datos para nuestros clústeres (clusters_df) y para los
valores atípicos (outliers_df) por separado, ya que generalmente queremos centrarnos
en los clústeres y resaltarlos.
Machine Translated by Google
NOTA
El uso de cualquier técnica de reducción de dimensionalidad con fines de visualización
genera pérdida de información. Es simplemente una aproximación de cómo se ven nuestras
incrustaciones originales. Si bien es informativo, puede agrupar los clústeres y separarlos más de
lo que realmente están. ¡La evaluación humana, inspeccionando los clústeres nosotros mismos,
es por lo tanto un componente clave del análisis de clústeres!
) plt.axis("desactivado")
Como podemos ver en la Figura 58, tiende a capturar bastante bien los principales grupos.
Observe cómo los grupos de puntos están coloreados del mismo color, lo que indica que
HDBSCAN los colocó en un grupo. Dado que tenemos una gran cantidad de grupos, la
biblioteca de gráficos alterna los colores entre los grupos, por lo que no piense que todos
los puntos verdes son un grupo, por ejemplo.
Machine Translated by Google
Figura 58. Los clústeres generados (en color) y los valores atípicos (en gris) se representan como una
visualización 2D.
Esto es visualmente atractivo, pero aún no nos permite ver lo que sucede dentro
de los clústeres. En cambio, podemos ampliar esta visualización pasando de la agrupación
de texto al modelado de temas.
Esta idea de encontrar temas o tópicos latentes en una colección de datos textuales se
conoce a menudo como modelado de tópicos. Tradicionalmente, implica encontrar un conjunto de
Machine Translated by Google
palabras clave o frases que mejor representen y capturen el significado del tema, como
ilustramos en la Figura 59.
Figura 59. Tradicionalmente, los temas se representan mediante una serie de palabras clave, pero pueden adoptar otras formas.
Los enfoques clásicos, como la asignación latente de Dirichlet, suponen que cada tema se
caracteriza por una distribución de probabilidad de palabras en el vocabulario de un
5
corpus, que La figura 510 demuestra cómo se escribe cada palabra en un vocabulario.
se califica en función de su relevancia para cada tema.
Machine Translated by Google
Figura 510. Las palabras clave se extraen en función de su distribución en un único tema.
Estos enfoques generalmente utilizan una técnica de bolsa de palabras para las
características principales de los datos textuales, que no tiene en cuenta ni el contexto ni el
significado de las palabras y frases. Por el contrario, nuestro ejemplo de agrupamiento de
texto sí tiene en cuenta ambos, ya que se basa en incrustaciones basadas en Transformer
que están optimizadas para la similitud semántica y el significado contextual a través de la
atención.
En primer lugar, como se ilustra en la Figura 511, seguimos el mismo procedimiento que
usamos antes en nuestro ejemplo de agrupamiento de texto. Incorporamos documentos,
reducimos su dimensionalidad y, por último, agrupamos la incorporación reducida para crear
grupos de documentos semánticamente similares.
Machine Translated by Google
Figura 511. La primera parte del proceso de BERTopic consiste en crear grupos de documentos semánticamente
similares.
En segundo lugar, modela una distribución de las palabras del vocabulario del
corpus aprovechando un método clásico, el bagofwords. El bagofwords, como
analizamos brevemente en el Capítulo 1 e ilustramos en la Figura 512, hace
exactamente lo que su nombre implica: contar la cantidad de veces que aparece cada
palabra en un documento. La representación resultante se podría utilizar para
extraer las palabras más frecuentes dentro de un documento.
Figura 512. Una bolsa de palabras cuenta la cantidad de veces que aparece cada palabra dentro de un documento.
Machine Translated by Google
Sin embargo, hay dos salvedades. En primer lugar, se trata de una representación
a nivel de documento y nos interesa una perspectiva a nivel de clúster. Para
solucionar esto, la frecuencia de las palabras se calcula dentro de todo el clúster en lugar
de solo en el documento, como se ilustra en la Figura 513.
Figura 513. Generación de cTF contando la frecuencia de palabras por grupo en lugar de por documento.
En segundo lugar, las palabras vacías como “the” y “I” tienden a aparecer a menudo en
los documentos y aportan poco significado a los documentos en sí. BERTopic utiliza una
variante basada en clases de frecuencia de términosfrecuencia inversa de documentos (c
TFIDF) para dar más peso a las palabras que son más significativas para un grupo y dar
menos peso a las palabras que se utilizan en todos los grupos.
Cada palabra del conjunto de palabras, cTF en cTFIDF, se multiplica por el valor IDF
de cada palabra. Como se muestra en la Figura 514, el valor IDF se calcula
tomando el logaritmo de la frecuencia promedio de todas las palabras en todos los
grupos dividido por la frecuencia total de cada palabra.
Machine Translated by Google
El resultado es un peso (“IDF”) para cada palabra que podemos multiplicar por su
frecuencia (“cTF”) para obtener los valores ponderados (“cTFIDF”).
Figura 515. La segunda parte del pipeline de BERTopic representa los temas: el cálculo del peso del término *x* en una
clase *c*.
Figura 516. El proceso completo de BERTopic consta, en líneas generales, de dos pasos: agrupamiento y
representación de temas.
Una ventaja importante de este proceso es que los dos pasos, la agrupación y la representación
de temas, son en gran medida independientes entre sí. Por ejemplo, con cTFIDF, no
dependemos de los modelos utilizados para agrupar los documentos. Esto permite
una modularidad significativa en todos los componentes del proceso. Y, como
exploraremos más adelante en este capítulo, es un excelente punto de partida para ajustar
las representaciones de temas.
Machine Translated by Google
Como se ilustra en la Figura 517, aunque se utilizan los transformadores de oraciones como
modelo de incrustación predeterminado, podemos intercambiarlos por cualquier otra
técnica de incrustación. Lo mismo se aplica a todos los demás pasos. Si no desea que se
generen valores atípicos con HDBSCAN, puede utilizar kmeans en su lugar.
Figura 517. La modularidad de BERTopic es un componente clave que le permite crear su propio modelo de
temas de la forma que desee.
Puedes pensar en esta modularidad como si estuviéramos construyendo con bloques Lego; cada
parte de la cadena de montaje es completamente reemplazable por otro algoritmo similar.
Gracias a esta modularidad, los modelos recién lanzados se pueden integrar en su arquitectura.
A medida que crece el campo de la IA lingüística, también crece BERTopic.
Machine Translated by Google
LA MODULARIDAD DE BERTOPIC
Etc.
Para ejecutar BERTopic con nuestro conjunto de datos ArXiv, podemos utilizar
nuestros modelos e incrustaciones previamente definidos (aunque no es obligatorio):
tema_modelo.obtener_información_del_tema()
1 14520 1_el_de_y_a
0 2290 0_reconocimiento_de_voz_asr_fin
1 1403 1_pat_biomédico_clínico_médico
2 1156 2_revisión_del_análisis_del_aspecto_de_sentimiento
3 986 3_traducción_nmt_máquina_neuronal
150 54 150_coherencia_discurso_párrafo
152 53 152_oraciones_sts_incrustaciones_sim
153 53 153_asesoramiento_en_salud_mental_la
154 50 154_ataques_de_puerta_trasera_ataque_activador
Cada uno de estos temas está representado por varias palabras clave, que son
concatenado con un “_” en la columna Nombre. Esta columna Nombre nos permite
para tener una idea rápida de lo que trata el tema, ya que muestra los cuatro
Palabras clave que mejor lo representan.
NOTA
También habrás notado que el primer tema está etiquetado como 1. Ese tema contiene todos los
documentos que no pudieron encajar en un tema y se consideran atípicos. Se trata de un
resultado del algoritmo de agrupamiento, HDBSCAN, que no obliga a que todos los puntos sean
agrupados. Para eliminar los valores atípicos, podríamos utilizar un algoritmo que no detecte valores atípicos, como kmeans.
o utilice la función reduce_outliers() de BERTopic para reasignar los valores atípicos a los temas.
Podemos inspeccionar temas individuales y explorar qué palabras clave representan mejor
con la función get_topic. Por ejemplo, el tema 0 contiene el
Machine Translated by Google
tema_modelo.get_topic(0)
Por ejemplo, el tema 0 contiene las palabras clave “voz”, “asr” y “reconocimiento”.
Según estas palabras clave, parece que el tema trata sobre el reconocimiento automático
de voz (ASR).
Esto indica que el tema 22 tiene una similitud relativamente alta (0,95) con nuestro término
de búsqueda. Si luego examinamos el tema, podemos ver que, en efecto, se trata de un tema
sobre modelado de temas:
tema_modelo.get_topic(22)
Aunque sabemos que este tema trata sobre modelado de temas, veamos si
El resumen de BERTopic también está asignado a este tema:
22
¡Sí lo es! Estas funcionalidades nos permiten encontrar rápidamente los temas que nos
interesan.
CONSEJO
Para facilitar un poco la exploración de los temas, podemos volver a nuestro ejemplo de
agrupación de texto. Allí, creamos una visualización estática para ver la estructura
general del tema creado. Con BERTopic, podemos crear una variante interactiva que nos
permita explorar rápidamente qué temas existen y qué documentos contienen.
inclusiones_reducidas=incrustaciones_reducidas,
ancho=1200,
ocultar_anotaciones=True
)
Como podemos ver en la Figura 518, este gráfico interactivo nos da una idea rápida
de los temas creados. Puede hacer zoom para ver documentos individuales o
hacer doble clic en un tema del lado derecho para verlo únicamente.
En BERTopic hay una amplia gama de opciones de visualización. Hay tres que vale la
pena explorar para tener una idea de las relaciones entre los temas:
tema_modelo.visualizar_gráfico_de_barras()
Figura 519. Ajuste las representaciones de los temas reordenando las distribuciones cTFIDF originales.
Como resultado, podemos diseñar un nuevo bloque Lego, como se muestra en la Figura
520, que toma esta primera representación del tema y genera una
representación mejorada.
Machine Translated by Google
Figura 521. Después de aplicar la ponderación cTFIDF, los temas se pueden ajustar con una amplia variedad de modelos
de representación, muchos de los cuales son modelos de lenguaje de gran tamaño.
Antes de explorar cómo podemos usar estos bloques de representación, primero debemos
hacer dos cosas. Primero, vamos a guardar nuestras representaciones de temas
originales para que sea mucho más fácil compararlas con y sin modelos de representación:
En segundo lugar, vamos a crear un contenedor corto que podamos usar para visualizar
rápidamente las diferencias en las palabras del tema para comparar con y sin modelos
de representación:
Machine Translated by Google
devolver df
Inspirado en KeyBERT
4 resumen | resumen |
resúmenes | resumen | resumidores |
abstracto... resúmenes | suma...
El modelo actualizado muestra que los temas son más fáciles de leer en comparación con
el modelo original. También demuestra la desventaja de utilizar técnicas basadas en
incrustaciones. Las palabras del modelo original, como nmt (tema 3), que significa
traducción automática neuronal, se eliminan porque el modelo no podía representar
adecuadamente la entidad. Para los expertos en el dominio, estas abreviaturas son muy
informativas.
Machine Translated by Google
Con cTFIDF y las técnicas KeyBERTInspired mostradas anteriormente, aún tenemos una
redundancia significativa en las representaciones de temas resultantes. Por ejemplo, tener
las palabras “resúmenes” y “resumen” en una representación de tema introduce
redundancia ya que son bastante similares.
4 resumen | resumen |
resúmenes | resumen | documento | extractivo |
abstracto... rojo...
Los temas resultantes muestran una mayor diversidad en sus representaciones. Por
ejemplo, el tema 4 solo muestra una palabra que parece un “resumen” y, en su lugar,
agrega otras palabras que podrían contribuir más a la representación general.
CONSEJO
Tanto KeyBERTInspired como MMR son técnicas sorprendentes para mejorar el primer conjunto
de representaciones de temas. KeyBERTInspired tiende especialmente a eliminar casi todas
las palabras vacías, ya que se centra en las relaciones semánticas entre palabras y documentos.
Machine Translated by Google
Figura 523. Utilice LLM generativos de texto e ingeniería de indicaciones para crear etiquetas para temas a partir de
palabras clave y documentos relacionados con cada tema.
El mensaje ilustrado consta de dos componentes. En primer lugar, los documentos que
se insertan mediante la etiqueta [DOCUMENTS] son un pequeño subconjunto de
documentos, normalmente cuatro, que representan mejor el tema. Se seleccionan los
documentos con la mayor similitud de coseno de sus valores cTFIDF con los del
tema. En segundo lugar, las palabras clave que componen un tema también se pasan
al mensaje y se hace referencia a ellas mediante la etiqueta [KEYWORDS].
Machine Translated by Google
Las palabras clave podrían generarse mediante cTFIDF o cualquiera de las otras
representaciones que hemos discutido hasta ahora.
Como resultado, solo necesitamos usar el modelo generativo una vez para cada tema, de los cuales
potencialmente podría haber cientos, en lugar de una vez para cada documento, de los cuales
potencialmente podría haber millones. Hay muchos modelos generativos entre los que podemos
elegir, tanto de código abierto como propietarios. Comencemos con un modelo que
hemos explorado en el capítulo anterior, el modelo FlanT5.
Creamos un mensaje que funciona bien con el modelo y lo usamos en BERTopic a través del
parámetro representation_model:
"En base a los documentos y palabras clave, ¿de qué trata este tema?"
representation_model = TextGeneration(
generador, prompt=prompt, doc_length=50,
tokenizer="espacio en
blanco" ) topic_model.update_topics(resúmenes,
representation_model=representation_model)
Machine Translated by Google
biomédico | paciente |
él...
4 resumen | Resumen
resúmenes | resumen |
abstracto...
importar openai
desde bertopic.representación importar OpenAI
Machine Translated by Google
"""
aviso =
Tengo un tema que contiene los siguientes documentos:
[DOCUMENTOS]
tema_modelo.update_topics(resúmenes,
modelo_de_representación=modelo_de_representación)
Mejoras
4 resumen | Documento
resúmenes | resumen | Resumen
abstracto... Técnicas
CONSEJO
incrustaciones_reducidas=incrustaciones_reducidas,
ancho=1200,
tamaño_de_fuente_de_etiqueta=11,
ancho_de_ajuste_de_etiqueta=20,
use_medoids=True,
)
Machine Translated by Google
Resumen
En este capítulo, exploramos cómo se pueden utilizar los métodos de aprendizaje directo, tanto
generativos como representativos, en el ámbito del aprendizaje no supervisado. A pesar de
que los métodos supervisados, como la clasificación, han prevalecido en los últimos años, los
enfoques no supervisados, como la agrupación de textos, tienen un potencial inmenso
debido a su capacidad para agrupar textos en función del contenido semántico sin etiquetado previo.
Machine Translated by Google
Hemos cubierto un proceso común para agrupar documentos de texto que comienza con
la conversión del texto de entrada en representaciones numéricas, a las que llamamos
incrustaciones. Luego, se aplica una reducción de dimensionalidad a estas incrustaciones
para simplificar los datos de alta dimensión y obtener mejores resultados de agrupamiento.
Por último, se aplica un algoritmo de agrupamiento en las incrustaciones de
dimensionalidad reducida para agrupar el texto de entrada. La inspección
manual de los grupos nos ayudó a comprender qué documentos contenían y cómo
interpretarlos.
1
Harold Hotelling. “Análisis de un complejo de variables estadísticas en componentes principales”.
Revista de Psicología Educacional 24.6 (1933): 417.
2
Leland McInnes, John Healy y James Melville. “UMAP: aproximación y proyección
de variedades uniformes para reducción de dimensión”. Preimpresión arXiv arXiv:1802.03426
(2018).
Machine Translated by Google
3
Leland McInnes, John Healy y Steve Astels. “hdbscan: densidad jerárquica basada
agrupamiento”. J. Software de código abierto. 2.11 (2017): 205.
4
Martin Ester et al. “Un algoritmo basado en la densidad para descubrir cúmulos en grandes áreas espaciales”
bases de datos con ruido”. KDD'96, agosto de 1996: 226–231.
5
David M. Blei, Andrew Y. Ng y Michael I. Jordan. "Asignación latente de Dirichlet". Diario de
Investigación en aprendizaje automático 3 de enero (2003): 993–1022.
6
Maarten Grootendorst. “BERTopic: Modelado de temas neuronales con un TFIDF basado en clases
procedimiento.” preimpresión arXiv arXiv:2203.05794 (2022).
7
Maarten Grootendorst. "KeyBERT: extracción mínima de palabras clave con BERT". (2020).
OceanofPDF.com
Machine Translated by Google
En los primeros capítulos de este libro, dimos nuestros primeros pasos en el mundo de los
grandes modelos lingüísticos (LLM). Profundizamos en diversas aplicaciones, como la
clasificación supervisada y no supervisada, empleando modelos que se centran en la
representación de texto, como BERT y sus derivados.
En este capítulo, exploraremos estos modelos generativos con más detalle y nos sumergiremos
en el ámbito de la ingeniería rápida, el razonamiento con modelos generativos, la
verificación e incluso la evaluación de sus resultados.
La Figura 61 muestra una pequeña selección de modelos de base de gran impacto, LLM
que han sido entrenados previamente en grandes cantidades de datos de texto y a menudo
ajustados para aplicaciones específicas.
Figura 61. Los modelos de base suelen lanzarse en varios tamaños diferentes.
Te recomendamos empezar con un modelo de base pequeño. Así que sigamos usando
Phi3mini, que tiene 3.8 mil millones de parámetros. Esto lo hace adecuado para
ejecutarse con dispositivos de hasta 8 GB de VRAM. En general, ampliar a modelos más
grandes tiende a ser una experiencia más agradable que reducir. Los modelos más
pequeños brindan una excelente introducción y sientan una base sólida para avanzar a
modelos más grandes.
El método más sencillo para cargar un modelo, como lo hemos hecho en capítulos
anteriores, es aprovechar la biblioteca de transformadores:
importar antorcha
desde transformadores importar AutoModelForCausalLM, AutoTokenizer, pipeline
mapa_de_dispositivo="cuda",
tipo_de_d_antorcha="automático",
código_remoto_de_confianza=Verdadero,
# Mensajes
de aviso = [
{"role": "user", "content": "Crea una broma divertida sobre
pollos."} ]
¿Por qué a las gallinas no les gusta ir al gimnasio? ¡Porque no pueden soportar la
resistencia del gimnasio!
<s><|user|>
Crea un chiste divertido sobre gallinas.<|end|> <|assistant|>
Es posible que reconozca los tokens especiales <|user|> y <|assistant|> del Capítulo 2.
Esta plantilla de mensaje, ilustrada con más detalle en la Figura 62, se utilizó durante el
entrenamiento del modelo. No solo proporciona información sobre quién dijo qué, sino
que también se utiliza para indicar cuándo el modelo debe dejar de generar texto
(consulte el token <|end|>). Este mensaje se pasa directamente al LLM y se
procesa de una sola vez.
Figura 63. El modelo elige el siguiente token a generar en función de sus puntuaciones de probabilidad.
Temperatura La
respuesta cada vez porque siempre elige la palabra más probable. Como se ilustra en la
Figura 64, un valor más alto permite que se generen palabras menos probables.
Figura 64. Una temperatura más alta aumenta la probabilidad de que se generen tokens
menos probables y viceversa.
Como resultado, una temperatura más alta (por ejemplo, 0,8) generalmente da como resultado
una salida más diversa, mientras que una temperatura más baja (por ejemplo, 0,2) crea una
salida más determinista.
¿Por qué a las gallinas no les gusta subirse a la montaña rusa? ¡Porque tienen miedo
de convertirse de repente en sopa de pollo!
Tenga en cuenta que cada vez que vuelva a ejecutar este fragmento de código, ¡la salida
cambiará! La temperatura introduce un comportamiento estocástico ya que el modelo
ahora selecciona tokens aleatoriamente.
arriba_p
top_p, también conocido como muestreo de núcleo, es una técnica de muestreo que
controla qué subconjunto de tokens (el núcleo) puede considerar el LLM. Considerará tokens
hasta que alcance su probabilidad acumulada. Si establecemos
Machine Translated by Google
Si configuramos top_p en 0,1, se considerarán los tokens hasta alcanzar ese valor. Si
configuramos top_p en 1, se considerarán todos los tokens.
Como se muestra en la Figura 65, al reducir el valor, se considerarán menos tokens y, en general,
se obtendrá un resultado menos “creativo”, mientras que al aumentar el valor, el LLM podrá elegir
entre más tokens.
Figura 65. Un top_p más alto aumenta la cantidad de tokens que se pueden seleccionar para generar y viceversa.
viceversa.
¿Por qué las gallinas no son buenos comediantes? ¡Porque sus "chistes" siempre "desmaquillan" la
verdad!
Como se muestra en la Tabla 61, estos parámetros permiten al usuario tener una escala móvil
entre ser creativo (temperatura alta y top_p) y ser predecible (temperatura más baja y top_p).
Machine Translated by Google
Ejemplo de uso
caso Temperatura arriba_p Descripción
predecible, centrado,
y conservador
Salidas.
produce creatividad
salidas pero aún así
permanece coherente.
Ejemplo de uso
caso Temperatura arriba_p Descripción
gama de vocabulario,
dando lugar a resultados
con variedad
lingüística.
La ingeniería de avisos es más que diseñar avisos efectivos. Puede utilizarse como herramienta para
evaluar el resultado de un modelo, así como para diseñar salvaguardas y métodos de mitigación
de la seguridad. Se trata de un proceso iterativo de optimización de avisos y requiere
experimentación. No existe y es poco probable que exista un diseño de aviso perfecto.
Figura 66. Ejemplo básico de una instrucción. No se dan instrucciones, por lo que el estudiante de maestría en derecho simplemente
intentará completar la oración.
Por ejemplo, y como se muestra en la Figura 67, podríamos pedirle al LLM que clasifique
una oración en función de si tiene un sentimiento positivo o negativo. Esto amplía la
instrucción más básica a una que consta de dos componentes: la instrucción
en sí y los datos relacionados con la instrucción.
Machine Translated by Google
Figura 67. Dos componentes de una instrucción básica: la instrucción en sí y los datos a los que hace referencia
a.
Los casos de uso más complejos pueden requerir más componentes en un mensaje.
Por ejemplo, para asegurarnos de que el modelo solo genere “negativo” o “positivo”,
podemos introducir indicadores de salida que ayuden a guiar el modelo. En la Figura
68, anteponemos la oración con “Texto:” y agregamos “Sentimento:” para evitar que
el modelo genere una oración completa. En cambio, esta estructura indica que
esperamos “negativo” o “positivo”. Aunque es posible que el modelo no haya sido
entrenado con estos componentes directamente, se le proporcionaron
suficientes instrucciones para poder generalizar a esta estructura.
Machine Translated by Google
Figura 68. Ampliación del mensaje con un indicador de salida que permite una salida específica.
Aunque una indicación es un fragmento de texto único, resulta de gran ayuda pensar
en las indicaciones como piezas de un rompecabezas más grande. ¿He descrito el
contexto de mi pregunta? ¿La indicación incluye un ejemplo del resultado?
La figura 69 ilustra varios casos de uso en los que la indicación basada en
instrucciones desempeña un papel importante. Ya hemos utilizado uno de ellos en
el ejemplo anterior, concretamente la clasificación supervisada.
Figura 610. Ejemplos de casos de uso comunes. Observe cómo, dentro de un caso de uso, se puede
cambiar la estructura y la ubicación de la instrucción.
Aunque estas tareas requieren instrucciones diferentes, en realidad hay mucha superposición
en las técnicas de estimulación utilizadas para mejorar la calidad del resultado. Una
lista no exhaustiva de estas técnicas incluye:
Especificidad
Describe con precisión lo que quieres lograr. En lugar de preguntar a los demás,
LLM para “Escribir una descripción de un producto” le pide que “Escriba una
Machine Translated by Google
Alucinación
Los LLM pueden generar información incorrecta con confianza, lo que se conoce como
Orden
largos, la información que se encuentra en el medio suele olvidarse.1 Los LLM tienden
Aquí repasaremos varias técnicas avanzadas para desarrollar sus indicaciones, comenzando
con el flujo de trabajo iterativo de creación de indicaciones complejas hasta el uso de
LLM de forma secuencial para obtener mejores resultados.
Con el tiempo, incluso llegaremos a desarrollar técnicas de razonamiento avanzadas.
Estos componentes avanzados pueden hacer que un mensaje se vuelva bastante complejo rápidamente.
Persona
Describa qué papel debe asumir el LLM. Por ejemplo, utilice “Usted es
astrofísica.
Instrucción
Contexto
Formato
El formato que debe utilizar el LLM para generar el texto. Sin él,
sistemas automatizados.
Audiencia
El objetivo del texto generado. También describe el nivel del resultado generado. Para fines
educativos, suele ser útil utilizar ELI5 (“Explícalo como si tuviera 5 años”).
Tono
El tono de voz que el LLM debe utilizar en el texto generado. Si está escribiendo un correo
Datos
Para ilustrarlo, ampliemos la instrucción de clasificación que teníamos antes y usemos todos los
componentes anteriores. Esto se muestra en la Figura 611.
Este mensaje complejo demuestra la naturaleza modular de los mensajes. Podemos agregar y
quitar componentes libremente y juzgar su efecto en el resultado.
Como se ilustra en la Figura 612, podemos desarrollar lentamente nuestro mensaje y explorar
el efecto de cada cambio.
Figura 612. La iteración sobre componentes modulares es una parte vital de la ingeniería rápida.
Vale la pena conservar las piezas del rompecabezas. Puedes utilizar tus propios
datos añadiéndolos a la variable de datos:
# El mensaje completo: elimine y agregue piezas para ver su impacto en la consulta de salida generada =
persona + instrucción + contexto
+ formato_datos + audiencia + tono + datos
CONSEJO
Hay todo tipo de componentes que podríamos agregar y componentes creativos como el uso
de estímulos emocionales (por ejemplo, “Esto es muy importante para mi carrera”2 ). Parte de la
diversión en la ingeniería de indicaciones es que puedes ser lo más creativo posible para
descubrir qué combinación de componentes de indicaciones contribuye a tu caso de uso.
Hay pocas limitaciones para desarrollar un formato que funcione para ti.
En cierto modo, se trata de un intento de aplicar ingeniería inversa a lo que el modelo ha aprendido y cómo
responde a determinadas indicaciones. Sin embargo, tenga en cuenta que algunas indicaciones funcionan
mejor para determinados modelos que para otros, ya que sus datos de entrenamiento pueden ser diferentes o
se los entrena para distintos fines.
Machine Translated by Google
Como se ilustra en la Figura 613, esto se presenta en varias formas según la cantidad de
ejemplos que muestre al LLM. Los estímulos de cero ejemplos no aprovechan los
ejemplos, los estímulos de un solo ejemplo utilizan un solo ejemplo y los estímulos de
pocos ejemplos utilizan dos o más ejemplos.
Retomando la frase original, creemos que “un ejemplo vale más que mil palabras”.
Estos ejemplos proporcionan un ejemplo directo de qué y cómo debe lograr el LLM.
Podemos ilustrar este método con un ejemplo simple tomado del artículo original que
describe este método.4 El objetivo del mensaje es generar una
Machine Translated by Google
Para ello, tendremos que diferenciar entre nuestra pregunta (usuario) y las
respuestas que nos proporcionó el modelo (asistente). Además,
mostramos cómo se procesa esta interacción mediante la plantilla:
# Utilice un solo ejemplo del uso de la palabra inventada en una oración one_shot_prompt = [ {
},
{
"role": "user", "content":
"'Screeg' algo es blandir una espada contra
Un ejemplo de una oración que utiliza la palabra screeg es: "
}
] imprimir(tokenizer.apply_chat_template(one_shot_prompt, tokenize=False))
<s><|user|> Un
'Gigamuru' es un tipo de instrumento musical japonés. Un ejemplo de una oración que utiliza la
palabra Gigamuru es:<|end|> <|assistant|> Tengo un Gigamuru que me regaló mi tío. Me encanta
tocarlo en casa.<|end|
> <|user|> 'Screeg' algo es blandir una espada contra él. Un ejemplo de una oración que utiliza la
palabra screeg es:<|end|> <|assistant|>
Machine Translated by Google
Al igual que con todos los componentes de indicaciones, la indicación de una o varias veces no es la
clave de la ingeniería de indicaciones. Podemos utilizarla como una pieza del rompecabezas para
mejorar aún más las descripciones que le dimos. El modelo aún puede “elegir”, mediante un
muestreo aleatorio, ignorar las instrucciones.
En lugar de dividir el problema dentro de una indicación, podemos hacerlo entre indicaciones.
Básicamente, tomamos el resultado de una indicación y lo usamos como entrada para la siguiente,
creando así una cadena continua de interacciones que resuelve nuestro problema.
Para ilustrarlo, digamos que queremos utilizar un LLM para crear un nombre de producto, un
eslogan y un discurso de ventas para nosotros basados en una serie de características del producto.
Aunque podemos pedirle al LLM que haga esto de una sola vez, podemos dividir el problema en partes.
Como resultado, y como se ilustra en la Figura 614, obtenemos una tubería secuencial que primero
crea el nombre del producto, lo usa con las características del producto como
Machine Translated by Google
entrada para crear el eslogan y, finalmente, utiliza las características, el nombre del producto y el
eslogan para crear el discurso de venta.
Figura 614. Utilizando una descripción de las características de un producto, se crean pautas en cadena para crear un nombre, un eslogan
y un discurso de venta adecuados.
Esta técnica de encadenar indicaciones permite al LLM dedicar más tiempo a cada pregunta
individual en lugar de abordar el problema en su conjunto. Ilustremos esto con un pequeño
ejemplo. Primero creamos un nombre y un eslogan para un chatbot:
outputs = pipe(product_prompt)
product_description = outputs[0]["generated_text"]
print(product_description)
Luego, podemos utilizar la salida generada como entrada para que el LLM genere un discurso
de ventas:
propuesta_de_ventas = outputs[0]
["generated_text"] print(sales_pitch)
Presentamos MindMeld Messenger, ¡tu mejor aliado en materia de comunicación! Da rienda suelta a
conversaciones inteligentes con nuestra innovadora plataforma de mensajería impulsada por IA. Con
MindMeld Messenger, cada respuesta es reflexiva, personalizada y oportuna. Dile adiós a las respuestas
genéricas y dale la bienvenida a las interacciones significativas.
Mejore su comunicación con MindMeld Messenger, donde cada mensaje es un paso hacia conversaciones
más inteligentes. ¡Pruébelo ahora y experimente el futuro de la mensajería!
Aunque necesitamos dos llamadas al modelo, una ventaja importante es que podemos darle
a cada llamada parámetros diferentes. Por ejemplo, la cantidad de tokens creados fue
relativamente pequeña para el nombre y el eslogan, mientras que el discurso puede ser mucho
más extenso.
Validación de respuesta
Indicaciones paralelas
Crea múltiples indicaciones en paralelo y haz una pasada final para fusionarlas.
Por ejemplo, pedir a varios LLM que generen múltiples recetas en paralelo
Machine Translated by Google
Escribiendo historias
Por ejemplo, primero escriba un resumen, desarrolle personajes y cree los elementos de la
creando el diálogo.
En el próximo capítulo, automatizaremos este proceso e iremos más allá del encadenamiento de LLM.
Encadenaremos otras piezas de tecnología, como la memoria, el uso de herramientas y más. Antes de
eso, esta idea del encadenamiento de indicaciones se explorará más a fondo en las siguientes
secciones, que describen métodos de encadenamiento de indicaciones más complejos, como la
autoconsistencia, la cadena de pensamiento y el árbol de pensamiento.
Sin embargo, el resultado que muestran puede demostrar un comportamiento complejo y, aunque puede
que no sea un razonamiento “verdadero”, se lo sigue llamando capacidades de razonamiento. En
otras palabras, trabajamos junto con el LLM a través de ingeniería rápida para poder imitar los
procesos de razonamiento con el fin de mejorar el resultado del LLM.
Machine Translated by Google
Para que este razonamiento sea posible, es un buen momento para dar un paso atrás y
explorar qué implica el razonamiento en el comportamiento humano. Para simplificar, nuestros
métodos de razonamiento pueden dividirse en procesos de pensamiento de los sistemas 1 y 2.
Figura 615. La estimulación mediante cadenas de pensamiento utiliza ejemplos de razonamiento para persuadir al modelo generativo a
utilizar el razonamiento en su respuesta.
# Generar la salida
Machine Translated by Google
salidas = pipe(cot_prompt)
print(salidas[0]["texto_generado"])
Observe cómo el modelo no solo genera la respuesta, sino que también proporciona
una explicación antes de hacerlo. De este modo, puede aprovechar el conocimiento que
ha generado hasta el momento para calcular la respuesta final.
Figura 616. Instrucción de cadena de pensamiento sin utilizar ejemplos. En su lugar, utiliza la frase “Pensemos
paso a paso” para impulsar el razonamiento en su respuesta.
Usando el ejemplo que usamos antes, podemos simplemente agregar esa frase al mensaje
para permitir un razonamiento tipo cadena de pensamientos:
# Generar la salida
Machine Translated by Google
CONSEJO
Para contrarrestar este grado de aleatoriedad y mejorar el rendimiento de los modelos generativos, se introdujo la
autoconsistencia. Este método plantea al modelo generativo la misma pregunta varias veces y toma el resultado de
Como se ilustra en la Figura 617, este método se puede mejorar aún más
agregando una secuencia de pensamientos para mejorar su razonamiento mientras
se usa solo la respuesta para el procedimiento de votación.
Figura 617. Al tomar muestras de múltiples caminos de razonamiento, podemos utilizar la votación por mayoría para extraer la
respuesta más probable.
Sin embargo, esto requiere que se haga una misma pregunta varias veces. Como
resultado, aunque el método puede mejorar el rendimiento, se vuelve n veces más lento,
donde n es el número de muestras de salida.
Estas técnicas son apenas una pequeña muestra de lo que se está haciendo actualmente
para imitar el razonamiento complejo. Una mejora de estos enfoques se puede
encontrar en el árbol de pensamiento, que permite una exploración en profundidad
de varias ideas.
Figura 618. Al aprovechar una estructura basada en árboles, los modelos generativos pueden generar pensamientos intermedios
para su clasificación. Se conservan los pensamientos más prometedores y se eliminan los menos prometedores.
Ha sido un intento exitoso de convertir el marco del árbol del pensamiento en una
técnica de estímulo simple.11
En lugar de llamar al modelo generativo varias veces, le pedimos al modelo que imite
ese comportamiento emulando una conversación entre múltiples expertos.
Estos expertos se interrogarán entre sí hasta llegar a un consenso. Un ejemplo de
un árbol de ideas es el siguiente:
Podemos utilizar este mensaje para explorar cómo un LLM podría responder a preguntas
complejas:
Experto 2: Paso 1 – Resta las manzanas utilizadas para el almuerzo: 23 – 20 = 3 manzanas restantes.
Experto 2: Paso 2 Revise los cálculos: 23 20 = 3, luego 3 + 6 = 9. Los cálculos son correctos.
Machine Translated by Google
Nuevamente obtenemos la respuesta correcta, pero en lugar de ello, mediante una “discusión
entre expertos”. Es interesante ver este tipo de conversación entre “expertos” que demuestra
la creatividad que conlleva la ingeniería rápida.
Verificación de salida
Los sistemas y aplicaciones creados con modelos generativos pueden acabar en producción.
Cuando eso sucede, es importante que verifiquemos y controlemos el resultado del modelo
para evitar que la aplicación se estropee y crear una aplicación de IA generativa sólida.
Salida estructurada
libre sin adherirse a estructuras específicas distintas de las definidas por los modelos naturales.
lenguaje. Algunos casos de uso requieren que su salida esté estructurada de cierta manera.
Salida válida
Incluso si permitimos que el modelo genere una salida estructurada, aún tiene la
tercero.
Ética
Machine Translated by Google
Por ejemplo, los casos de uso pueden requerir que el resultado esté libre de blasfemias,
Exactitud
Muchos casos de uso requieren que la salida cumpla con ciertos estándares o
Ejemplos
Gramática
Sintonia FINA
En esta sección, repasaremos los dos primeros métodos. El tercero, el ajuste fino de un
modelo, se deja para el Capítulo 12 , donde profundizaremos en los métodos de ajuste
fino.
Machine Translated by Google
Proporcionar ejemplos
Un método simple y directo para corregir el resultado es proporcionar al
modelo generativo ejemplos de cómo debería verse el resultado. Como hemos
explorado antes, el aprendizaje de pocos intentos es una técnica útil que
guía el resultado del modelo generativo. Este método se puede generalizar para
guiar también la estructura del resultado.
``json {
},
"atributos": {
"fuerza": 10, "destreza":
17, "constitución": 12,
"inteligencia": 12, "sabiduría":
10, "carisma"
Machine Translated by Google
{
"description": "UNA BREVE DESCRIPCIÓN", "name": "EL
NOMBRE DEL PERSONAJE", "armor": "UNA
PIEZA DE ARMADURA", "weapon": "UNA O
MÁS ARMAS"
}
"""
one_shot_prompt =
[ {"rol": "usuario", "contenido": plantilla_one_shot}
]
{
"description": "Un pícaro astuto con un pasado misterioso,
experta en sigilo y engaño.", "name": "Lysandra
Shadowstep", "armor": "Capa de cuero
de la noche", "weapon": "Daga de los susurros,
cuchillos arrojadizos"
}
Figura 619. Utilice un LLM para comprobar si el resultado sigue correctamente nuestras reglas.
Figura 620. Utilice un LLM para generar únicamente la información que no conocemos de antemano.
Machine Translated by Google
Este proceso se puede llevar un paso más allá y, en lugar de validar la salida, podemos realizar
la validación durante el proceso de muestreo de tokens. Al muestrear tokens, podemos
definir una serie de gramáticas o reglas que el LLM debe respetar al elegir su próximo token. Por
ejemplo, si le pedimos al modelo que devuelva “positivo”, “negativo” o “neutral” al realizar la
clasificación de sentimientos, es posible que devuelva algo diferente. Como se ilustra en la
Figura 621, al restringir el proceso de muestreo, podemos hacer que el LLM solo muestre lo
que nos interesa. Tenga en cuenta que esto aún se ve afectado por parámetros como top_p y
temperatura.
Figura 621. Restrinja la selección de tokens a solo tres tokens posibles: “positivo”, “neutral” y
“negativo”.
Ilustremos este fenómeno con llamacpppython, una biblioteca similar a transformers que podemos
usar para cargar en nuestro modelo de lenguaje.
Generalmente se utiliza para cargar y utilizar de manera eficiente modelos comprimidos (a través de
la cuantificación; consulte el Capítulo 12), pero también podemos usarlo para aplicar una
gramática JSON.
Cargamos el mismo modelo que usamos a lo largo de este capítulo, pero usamos un formato diferente,
concretamente GGUF. llamacpppython espera este formato, que generalmente se usa para modelos
comprimidos (cuantificados).
Dado que estamos cargando un nuevo modelo, se recomienda reiniciar la notebook. Esto borrará todos
los modelos anteriores y vaciará la VRAM. También puede ejecutar lo siguiente para vaciar la VRAM:
Machine Translated by Google
importar gc
importar antorcha
del modelo, tokenizador, tubería
# Vaciar la memoria
gc.collect()
antorcha.cuda.empty_cache()
Para generar la salida utilizando la gramática JSON interna, solo necesitamos especificar
response_format como un objeto JSON. En segundo plano, se aplicará una gramática
JSON para asegurarse de que la salida se ajuste a ese formato.
Para ilustrarlo, pidamos al modelo que cree un personaje de RPG en formato JSON para
usarlo en una sesión de Dungeons & Dragons:
temperatura=0, )
['opciones'][0]['mensaje']["contenido"]
importar json
{
"nombre": "Eldrin Portador de Tormentas", "clase":
"Guerrero", "nivel": 10,
"atributos":
{ "fuerza": 18, "destreza":
12, "constitución": 16,
"inteligencia": 9, "sabiduría":
14, "carisma": 10
},
"habilidades":
{ "combate cuerpo a
cuerpo": { "dominio de armas":
20, "clase de armadura":
18, "puntos de golpe": 35
},
"defensa":
{ "habilidad_de_escudo":
17, "posibilidad_de_bloqueo": 90
},
"resistencia":
{ "regeneración_de_salud": 2, "resistencia":
30
}
},
"equipo": [ {
{
"nombre": "Espada magna de acero", "tipo":
"Arma", "daño": 8,
"probabilidad_crítica":
20
}
],
"background": "Eldrin creció en un pequeño pueblo en las afueras de una tierra devastada por
la guerra. Al ser testigo de la brutalidad y el sufrimiento causados por el conflicto, dedicó su vida a
convertirse en un guerrero formidable que pudiera proteger a aquellos que no podían defenderse por sí
mismos". }
El resultado tiene el formato JSON correcto. Esto nos permite usar modelos
generativos con más confianza en aplicaciones en las que esperamos que el
resultado se ajuste a determinados formatos.
Resumen
En este capítulo, exploramos los conceptos básicos del uso de modelos generativos a
través de la ingeniería de indicaciones y la verificación de resultados. Nos centramos
en la creatividad y la complejidad potencial que conlleva la ingeniería de
indicaciones. Estos componentes de una indicación son clave para generar y
optimizar resultados adecuados para diferentes casos de uso.
En general, este capítulo demostró que la ingeniería rápida es un aspecto crucial del
trabajo con LLM, ya que nos permite comunicar de manera eficaz nuestras necesidades
y preferencias al modelo. Al dominar las técnicas de ingeniería rápida, podemos liberar
parte del potencial de los LLM y generar respuestas de alta calidad que cumplan con
nuestros requisitos.
Machine Translated by Google
1
Nelson F. Liu et al. “Perdidos en el medio: cómo los modelos de lenguaje utilizan contextos largos”. arXiv
preimpresión arXiv:2307.03172 (2023).
2
Cheng Li et al. “EmotionPrompt: Aprovechamiento de la psicología para grandes modelos lingüísticos”
Mejora a través del estímulo emocional”. preimpresión arXiv arXiv:2307.11760 (2023).
3
Tom Brown et al. “Los modelos de lenguaje son aprendices de pocas oportunidades”. Avances en la información neuronal
Sistemas de procesamiento 33 (2020): 1877–1901.
4
Ibídem.
5
Daniel Kahneman. Pensar rápido, pensar despacio. Macmillan (2011).
6
Jason Wei et al. “La inducción de cadenas de pensamiento genera razonamiento en modelos lingüísticos amplios”.
Avances en sistemas de procesamiento de información neuronal 35 (2022): 24824–24837.
7
Takeshi Kojima et al. “Los modelos de lenguaje grandes son razonadores de cero disparos”. Avances en el análisis neuronal
Sistemas de procesamiento de información 35 (2022): 22199–22213.
8
Chengrun Yang et al. “Grandes modelos lingüísticos como optimizadores”. Preimpresión de arXiv
arXiv:2309.03409 (2023).
9
Xuezhi Wang et al. “La autoconsistencia mejora el razonamiento en cadena de pensamiento en el lenguaje
modelos.” preimpresión arXiv arXiv:2203.11171 (2022).
10
Shunyu Yao et al. “Árbol de pensamientos: resolución deliberada de problemas con modelos de lenguaje de gran tamaño”.
Preimpresión de arXiv arXiv:2305.10601 (2023).
11
“Uso de la estimulación del árbol de pensamiento para potenciar el razonamiento de ChatGPT”. Disponible en
https://oreil.ly/a_Nos.
OceanofPDF.com
Machine Translated by Google
En este capítulo, continuaremos con esta línea de pensamiento. ¿Qué podemos hacer
para mejorar aún más la experiencia y los resultados que obtenemos del LLM sin
necesidad de ajustar el modelo en sí?
Modelo de E/S
Memoria
Agentes
Machine Translated by Google
Cadenas
Todos estos métodos están integrados con el marco LangChain que nos ayudarán a utilizar
fácilmente estas técnicas avanzadas a lo largo de este capítulo.
LangChain es uno de los primeros marcos que simplifican el trabajo con LLM mediante
abstracciones útiles. Entre los marcos más recientes que cabe destacar se encuentran DSPy y
pajar. Algunas de estas abstracciones se ilustran en la Figura 71. Tenga en cuenta que la recuperación
se analizará en el próximo capítulo.
Figura 71. LangChain es un marco completo para utilizar LLM. Tiene componentes modulares que se
pueden encadenar para permitir sistemas LLM complejos.
Cada una de estas técnicas tiene ventajas significativas por sí sola, pero su verdadero valor no
existe de forma aislada. Es cuando se combinan todas estas técnicas que se obtiene un sistema
basado en LLM con un rendimiento increíble.
La culminación de estas técnicas es realmente donde los LLM brillan.
Figura 72. Intentando representar pi con representaciones de 32 bits y 16 bits en coma flotante. Observe la
precisión reducida cuando reducimos a la mitad el número de bits.
Para ilustrar la cuantificación, considere esta analogía. Si le preguntaran qué hora es,
podría decir “14:16”, lo cual es correcto pero no es una respuesta totalmente precisa.
Podría haber dicho “14:16 y 12 segundos”, lo cual habría sido más preciso. Sin
embargo, mencionar segundos rara vez es útil y, a menudo, simplemente los ponemos
en números discretos, es decir, minutos completos.
La cuantificación es un proceso similar que reduce la precisión de un valor (por ejemplo,
eliminando segundos) sin eliminar información vital (por ejemplo, conservando horas y
minutos).
saber que utilizaremos una variante de 8 bits de Phi3 en comparación con la variante
original de 16 bits, reduciendo los requisitos de memoria casi a la mitad.
CONSEJO
Como regla general, busque modelos cuantificados de al menos 4 bits. Estos modelos
tienen un buen equilibrio entre compresión y precisión. Aunque es posible utilizar modelos
cuantificados de 3 bits o incluso de 2 bits, la degradación del rendimiento se hace notoria
y sería preferible elegir un modelo más pequeño con una mayor precisión.
!wget https://huggingface.co/microsoft/Phi3mini4kinstructgguf/resolve/main/Phi3
mini4kinstructfp16.gguf
# ¡Asegúrese de que la ruta del modelo sea correcta para su sistema! llm =
verbose=Falso
)
"
CONSEJO
Todos los ejemplos de este capítulo se pueden ejecutar con cualquier LLM. Esto significa que puede
elegir si desea utilizar Phi3, ChatGPT, Llama 3 o cualquier otro cuando revise los ejemplos.
Usaremos Phi3 como predeterminado en todo momento, pero el estado del arte cambia
rápidamente, así que considere usar un modelo más nuevo en su lugar. Puede utilizar el
Open LLM Leaderboard (una clasificación de LLM de código abierto) para elegir el que funcione mejor para usted .
caso de uso.
Si no tiene acceso a un dispositivo que pueda ejecutar LLM localmente, considere usar
ChatGPT en su lugar:
La forma más básica de una cadena en LangChain es una cadena simple. Aunque una
cadena puede adoptar muchas formas, cada una con una complejidad diferente,
generalmente conecta un LLM con alguna herramienta, solicitud o característica adicional.
Esta idea de conectar un componente a un LLM se ilustra en la Figura 73.
Figura 73. Una sola cadena conecta algún componente modular, como una plantilla de solicitud o una
memoria externa, al LLM.
En la práctica, las cadenas pueden volverse complejas con bastante rapidez. Podemos
ampliar la plantilla de indicaciones como queramos e incluso podemos combinar
varias cadenas separadas para crear sistemas intrincados. Para comprender a fondo
lo que sucede en una cadena, exploremos cómo podemos agregar la plantilla de
indicaciones de Phi3 al LLM.
Figura 74. Al encadenar una plantilla de solicitud con un LLM, solo necesitamos definir las solicitudes de entrada.
La plantilla se construirá para usted.
Para generar nuestra cadena simple, primero debemos crear una plantilla de solicitud que
se ajuste a la plantilla esperada de Phi3. Con esta plantilla, el modelo incorpora un
system_prompt, que generalmente describe lo que esperamos del LLM. Luego,
podemos usar el input_prompt para hacerle preguntas específicas al LLM:
# Crea una plantilla de solicitud con la variable "input_prompt" template = """<s><|user|> {input_prompt}
<|end|> <|assistant|>""" prompt =
PromptTemplate( template=template,
input_variables=["input_prompt"]
Para crear nuestra primera cadena, podemos utilizar tanto el mensaje que creamos como el
LLM y encadenarlos juntos:
# Utilice la cadena
basic_chain.invoke( {
La respuesta a 1 + 1 es 2. Es una operación aritmética básica en la que se suma una unidad a otra,
dando como resultado dos unidades en total.
Machine Translated by Google
El resultado nos da la respuesta sin tokens innecesarios. Ahora que hemos creado esta
cadena, no tenemos que crear la plantilla de solicitud desde cero cada vez que
usamos el LLM. Tenga en cuenta que no desactivamos el muestreo como antes,
por lo que su resultado puede ser diferente. Para que esta secuencia sea más
transparente, la Figura 76 ilustra la conexión entre una plantilla de solicitud y el LLM
usando una sola cadena.
Figura 76. Ejemplo de una cadena simple que utiliza la plantilla de Phi3.
NOTA
El ejemplo supone que el LLM necesita una plantilla específica. Esto no siempre es así. Con
GPT3.5 de OpenAI, su API maneja la plantilla subyacente.
También puede utilizar una plantilla de preguntas para definir otras variables que podrían cambiar
en sus preguntas. Por ejemplo, si queremos crear nombres divertidos para empresas, volver a
escribir esa pregunta una y otra vez para distintos productos puede llevar mucho tiempo.
# Crea una cadena que cree el nombre de nuestro negocio template = "Crea un
nombre divertido para un negocio que vende {producto}." name_prompt =
PromptTemplate( template=template,
input_variables=["product"]
Agregar una plantilla de solicitud a la cadena es solo el primer paso que necesita para
mejorar las capacidades de su LLM. A lo largo de este capítulo, veremos
Machine Translated by Google
Hay muchas formas en las que podemos añadir componentes modulares adicionales a las cadenas
existentes, empezando por la memoria.
En lugar de ello, podríamos dividir este mensaje complejo en subtareas más pequeñas que se
puedan ejecutar de forma secuencial. Esto requeriría múltiples llamadas al LLM, pero con mensajes
más pequeños y resultados intermedios, como se muestra en la Figura 77.
Figura 77. En las cadenas secuenciales, la salida de un mensaje se utiliza como entrada para el mensaje siguiente.
Este proceso de uso de múltiples indicaciones es una extensión de nuestro ejemplo anterior.
En lugar de utilizar una sola cadena, enlazamos cadenas en las que cada enlace se ocupa de
una subtarea específica.
Por ejemplo, pensemos en el proceso de generar una historia. Podríamos pedirle al LLM que
genere una historia junto con detalles complejos como el título, un resumen, una
descripción de los personajes, etc. En lugar de intentar poner todos los
Machine Translated by Google
esa información en un solo mensaje, podríamos dividir ese mensaje en tareas más pequeñas
y manejables.
Ilustremos esto con un ejemplo. Supongamos que queremos generar una historia que tiene tres
componentes:
Un titulo
Un resumen de la historia
En lugar de generar todo de una sola vez, creamos una cadena que solo requiere una única
entrada por parte del usuario y luego genera secuencialmente los tres componentes. Este proceso
se ilustra en la Figura 78.
Figura 78. La salida del mensaje del título se utiliza como entrada del mensaje del personaje. Para generar la
historia, se utiliza la salida de todos los mensajes anteriores.
Para generar esa historia, utilizamos LangChain para describir el primer componente, es decir,
el título. Este primer vínculo es el único componente que requiere alguna entrada del usuario.
Definimos la plantilla y utilizamos la variable "summary" como variable de entrada y "title"
como variable de salida.
Pedimos al LLM que “cree un título para una historia sobre {summary}” donde “{summary}”
será nuestro aporte:
input_variables=
["summary"]) title = LLMChain(llm=llm, prompt=title_prompt, output_key="title")
¡Esto ya nos da un título genial para la historia! Tenga en cuenta que podemos
ver tanto la entrada ("resumen") como la salida ("título").
# Crea una cadena para la descripción del personaje usando la plantilla de resumen y título = """<s><|user|>
Describe al
personaje principal de una historia sobre
{summary} con el título {title}. Usa solo dos oraciones.<|end|> <|assistant|>""" character_prompt =
PromptTemplate( template=template, input_variables=["summary", "title"]
Aunque ahora podríamos usar la variable de carácter para generar nuestra descripción
de personaje manualmente, se utilizará como parte de la cadena automatizada.
# Crea una cadena para la historia usando la plantilla de resumen, título y descripción
del personaje = """<s><|user|
> Crea una historia sobre
{summary} con el título {title}. El personaje principal es: {character}. Solo devuelve la
historia y no puede tener más de un párrafo. <|end|> <|assistant|>""" story_prompt =
PromptTemplate(
LLMChain(llm=llm, mensaje=mensaje_de_historia,
clave_de_salida="historia")
Ahora que hemos generado los tres componentes, podemos vincularlos para
crear nuestra cadena completa:
Podemos ejecutar esta cadena recién creada usando el mismo ejemplo que
usamos antes:
'historia': " En memoria amorosa: un viaje a través del duelo gira en torno a
Emily, una joven resiliente que pierde a su amada madre a una edad temprana,
lucha por sobrellevar un dolor abrumador y emprende un viaje de autodescubrimiento
y sanación, sacando fuerzas de los preciados recuerdos y la sabiduría que comparten
quienes la rodean. A través de este proceso transformador, Emily aprende valiosas
lecciones de vida sobre la resiliencia, el amor y el poder de la conexión humana, y
finalmente encuentra consuelo al honrar el legado de su madre mientras abraza una
nueva sensación de paz interior en medio de la dolorosa pérdida.
Al ejecutar esta cadena, obtenemos los tres componentes. Para ello, solo necesitamos introducir
un único mensaje breve: el resumen. Otra ventaja de dividir el problema en tareas más pequeñas
es que ahora tenemos acceso a estos componentes individuales. Podemos extraer
fácilmente el título; ese no habría sido el caso si hubiéramos utilizado un único mensaje.
Cuando utilizamos LLM de forma predeterminada, no recuerdan lo que se dijo en una conversación.
Puedes compartir tu nombre en una solicitud, pero lo habrá olvidado en la siguiente solicitud.
Ilustremos este fenómeno con un ejemplo utilizando la cadena básica que creamos antes. Primero,
le decimos nuestro nombre al LLM:
Como se ilustra en la Figura 79, conversar con un LLM que no tiene memoria no es la mejor
experiencia.
Para que estos modelos tengan estado, podemos agregar tipos específicos de memoria a la
cadena que creamos anteriormente. En esta sección, repasaremos dos métodos
comunes para ayudar a los LLM a recordar las conservaciones:
Buffer de conversación
Resumen de la conversación
Figura 79. Ejemplo de conversación entre un LLM con memoria y un LLM sin memoria.
Machine Translated by Google
Buffer de conversación
Una de las formas más intuitivas de brindarles memoria a los LLM es
simplemente recordarles exactamente lo que sucedió en el pasado. Como se
ilustra en la Figura 710, podemos lograr esto copiando el historial completo de la
conversación y pegándolo en nuestro mensaje.
Figura 710. Podemos recordarle a un LLM lo que sucedió anteriormente simplemente agregando el historial de
conversación completo al mensaje de entrada.
# Crear una plantilla de aviso actualizada para incluir una plantilla de historial de
chat = """<s><|user|> Conversación actual:{chat_history}
{input_prompt}<|fin|> <|
asistente|>"""
prompt =
{'input_prompt': '¡Hola! Mi nombre es Maarten. ¿Cuánto es 1 + 1?', 'chat_history': ', 'text': "Hola
Maarten! La respuesta a 1 +
1 es 2. Espero que estés
¡Que tengas un gran día!"}
que como es la primera vez que usamos esta cadena específica, no hay historial de chat.
Tu nombre es Maarten.
Al ampliar la cadena con memoria, el LLM pudo usar el historial de chat para encontrar el
nombre que le habíamos asignado anteriormente. Esta cadena más compleja se ilustra en la
Figura 711 para brindar una descripción general de esta funcionalidad
adicional.
Figura 711. Extendemos la cadena LLM con memoria agregando todo el historial de conversaciones al
mensaje de entrada.
Utilizando esta memoria, podemos probar una secuencia de preguntas para ilustrar lo que
se recordará. Empezamos con dos conversaciones:
En cuanto a tu nueva pregunta, 3 + 3 es igual a 6. Si necesitas ayuda con algo más o tienes
más preguntas, ¡estoy aquí para ayudarte!"}
A continuación, podemos comprobar si el modelo realmente conoce el nombre que le hemos dado:
Según la salida en 'texto' recuerda correctamente el nombre que le dimos. Tenga en cuenta que
el historial de chat se actualiza con la pregunta anterior.
A continuación, podemos comprobar si el modelo realmente conoce el nombre que le hemos dado:
Según la salida en 'texto' recuerda correctamente el nombre que le dimos. Tenga en cuenta que
el historial de chat se actualiza con la pregunta anterior.
De hecho, el LLM no tiene acceso a nuestra edad ya que ésta no quedó registrada en el
historial del chat.
Aunque este método reduce el tamaño del historial de chat, solo puede conservar las
últimas conversaciones, lo que no es ideal para conversaciones largas.
Exploremos cómo podemos resumir el historial de chat.
Resumen de la conversación
Como hemos comentado anteriormente, es fundamental que tu LLM tenga la capacidad de
recordar conversaciones para disfrutar de una buena experiencia interactiva. Sin
embargo, al utilizar ConversationBufferMemory, la conversación comienza a
aumentar de tamaño y se acerca lentamente al límite de tokens. Aunque
ConversationBufferWindowMemory resuelve el problema de los límites de tokens hasta
cierto punto, solo se conservan las últimas k conversaciones.
Aunque una solución sería utilizar un LLM con una ventana de contexto más grande, estos
tokens aún deben procesarse antes de generar tokens, lo que puede aumentar el tiempo
de procesamiento. En su lugar, veamos una técnica más sofisticada,
ConversationSummaryMemory. Como su nombre lo indica, esta técnica resume todo el
historial de una conversación para descomponerlo en los puntos principales.
Figura 712. En lugar de pasar el historial de la conversación directamente al mensaje, usamos otro LLM
para resumirlo primero.
Esto significa que cada vez que le hacemos una pregunta al LLM, hay dos llamadas:
El mensaje de resumen
)
Machine Translated by Google
memory_key="chat_history",
prompt=summary_prompt
)
# Encadenar el LLM, el indicador y la memoria juntos llm_chain =
LLMChain( prompt=prompt, llm=llm,
memory=memory
Una vez creada nuestra cadena, podemos probar sus capacidades de resumen
creando una conversación corta:
Después de hacer otra pregunta, el LLM actualizó el resumen para incluir la conversación
anterior e infirió correctamente la pregunta original.
Para obtener el resumen más reciente, podemos acceder a la variable de memoria que
creamos anteriormente:
Esta cadena más compleja se ilustra en la Figura 713 para brindar una descripción general
de esta funcionalidad adicional.
Figura 713. Extendemos la cadena LLM con memoria resumiendo todo el historial de conversaciones antes
de entregárselo al mensaje de entrada.
Este resumen ayuda a mantener el historial de chat relativamente pequeño sin utilizar
demasiados tokens durante la inferencia. Sin embargo, dado que la pregunta original
no se guardó explícitamente en el historial de chat, el modelo tuvo que inferirla en función
del contexto. Esto es una desventaja si es necesario almacenar información específica en el
historial de chat. Además, se necesitan varias llamadas al mismo LLM, una para la solicitud
y otra para el resumen. Esto puede ralentizar el tiempo de procesamiento.
Conversación
Velocidad
Buffer
Implementación más sencilla de generación
Los historiales
de chat más largos
dificultan la
recuperación
de información
Con ventana
Conversación Contexto amplio Solo captura las
No se necesitan últimas k
Buffer
LLM a menos que interacciones
el historial de chat
Sin compresión de las
sea extenso últimas k
No hay pérdida de interacciones
información en las
últimas k interacciones
Conversación
Captura la historia Es necesaria una
Resumen
completa llamada adicional para
cada
Permite
interacción.
conversaciones largas
Machine Translated by Google
el historial completo
Capacidades de
conceptos más prometedores de los LLM es su capacidad para determinar las acciones que pueden
realizar. Esta idea suele denominarse agentes, sistemas que aprovechan un modelo de lenguaje
Los agentes pueden hacer uso de todo lo que hemos visto hasta ahora, como el modelo
E/S, cadenas y memoria, y ampliarlo aún más con dos componentes vitales:
Herramientas que el agente puede utilizar para hacer cosas que no podría hacer por sí mismo
El tipo de agente, que planifica las acciones a realizar o las herramientas a utilizar.
A diferencia de las cadenas que hemos visto hasta ahora, los agentes son capaces de mostrar
comportamientos más avanzados como crear y autocorregir una hoja de ruta para alcanzar un objetivo.
Pueden interactuar con el mundo real mediante el uso de herramientas. Como resultado, estos agentes
pueden realizar una variedad de tareas que van más allá de lo que un LLM es capaz de hacer de forma
aislada.
Por ejemplo, los LLM son notoriamente malos en los problemas matemáticos y a menudo fallan en la
resolución de tareas matemáticas simples, pero podrían hacer mucho más si les proporcionamos acceso a
una calculadora. Como se ilustra en la Figura 714, la idea subyacente de los agentes es que utilizan
los LLM no solo para comprender nuestra consulta, sino también para decidir qué herramienta usar y cuándo.
Machine Translated by Google
Figura 714. Dar a los LLM la capacidad de elegir qué herramientas usar para un problema en particular da como
resultado un comportamiento más complejo y preciso.
En otras palabras, los agentes que utilizan LLM pueden ser potentes solucionadores de
problemas generales. Si bien las herramientas que utilizan son importantes, la fuerza
impulsora de muchos sistemas basados en agentes es el uso de un marco llamado
Reasoning and Acting (ReAct1 ).
La actuación es una historia un poco diferente. Los LLM no pueden actuar como tú y como
yo. Para darles la capacidad de actuar, podríamos decirles que pueden usar ciertas
herramientas, como una API de pronóstico del tiempo. Sin embargo, dado que los LLM
solo pueden generar texto, se les debería indicar que usen consultas específicas para activar
la API de pronóstico.
Machine Translated by Google
ReAct fusiona estos dos conceptos y permite que el razonamiento afecte a la acción y que las
acciones afecten al razonamiento. En la práctica, el marco consiste en seguir iterativamente
estos tres pasos:
Pensamiento
Acción
Observación
En la figura 715 se ilustra cómo se le pide al LLM que cree un “pensamiento” sobre la
indicación de entrada. Esto es similar a preguntarle al LLM qué cree que debería hacer a
continuación y por qué. Luego, en función del pensamiento, se desencadena una “acción”.
La acción generalmente es una herramienta externa, como una calculadora o un motor de búsqueda.
Finalmente, después de que los resultados de la “acción” se devuelven al
LLM, este “observa” la salida, que a menudo es un resumen del resultado
recuperado.
Para ilustrarlo con un ejemplo, imagina que estás de vacaciones en Estados Unidos y te
interesa comprar una MacBook Pro. No solo quieres saber el precio, sino que también
necesitas convertirlo a euros, ya que vives en Europa y te sientes más cómodo con esos
precios.
Como se ilustra en la Figura 716, el agente primero buscará en la web los precios actuales.
Puede encontrar uno o más precios según el motor de búsqueda.
Después de recuperar el precio, utilizará una calculadora para convertir USD a EUR
asumiendo que conocemos el tipo de cambio.
Machine Translated by Google
Durante este proceso, el agente describe sus pensamientos (lo que debería hacer), sus
acciones (lo que hará) y sus observaciones (los resultados de la acción). Es un ciclo de
pensamientos, acciones y observaciones que da como resultado el resultado del agente.
ReAct en LangChain
Para ilustrar cómo funcionan los agentes en LangChain, vamos a crear una
canalización que pueda buscar respuestas en la web y realizar cálculos con una calculadora.
Estos procesos autónomos generalmente requieren un LLM que sea lo suficientemente
potente como para seguir correctamente instrucciones complejas.
El modelo LLM que hemos utilizado hasta ahora es relativamente pequeño y no es suficiente
para ejecutar estos ejemplos. En su lugar, utilizaremos el modelo GPT3.5 de OpenAI, ya
que sigue estas instrucciones complejas con mayor precisión:
Machine Translated by Google
importar
sistema operativo desde langchain_openai importar ChatOpenAI
NOTA
Aunque el LLM que utilizamos a lo largo del capítulo es insuficiente para este ejemplo, no
significa que solo los LLM de OpenAI lo sean. Existen LLM más grandes y útiles, pero requieren
significativamente más computación y VRAM. Por ejemplo, los LLM locales suelen venir en
diferentes tamaños y dentro de una familia de modelos, aumentar el tamaño de un modelo
conduce a un mejor rendimiento. Para mantener la computación necesaria al mínimo, elegimos
un LLM más pequeño en todos los ejemplos de este capítulo.
Sin embargo, a medida que evoluciona el campo de los modelos generativos, también lo hacen estos
LLM más pequeños. No nos sorprendería en absoluto que, con el tiempo, LLM más pequeños, como el
que se utilizó en este capítulo, fueran capaces de ejecutar este ejemplo.
{herramientas}
¡Comenzar!
Pregunta: {entrada}
Pensamiento:{agent_scratchpad}"""
aviso = PromptTemplate(
plantilla=react_template,
variables_de_entrada=["herramientas", "nombres_de_herramientas",
"entrada",
"bloc_de_apuntes_del_agente"] )
Esta plantilla ilustra el proceso de comenzar con una pregunta y generar pensamientos,
acciones y observaciones intermedias.
Para que el LLM interactúe con el mundo exterior, describiremos las herramientas que puede
utilizar:
# Preparar herramientas
tools = load_tools (["llmmath"], llm=openai_llm) tools.append(search_tool)
"input": "¿Cuál es el precio actual de una MacBook Pro en dólares estadounidenses? ¿Cuánto
costaría en euros si el tipo de cambio es 0,85 euros por 1 dólar estadounidense? "
Teniendo en cuenta las herramientas limitadas que tiene el agente, ¡esto es bastante impresionante!
Con solo usar un motor de búsqueda y una calculadora, el agente podría darnos una respuesta.
Se debe tener en cuenta si esa respuesta es realmente correcta. Al crear este comportamiento
relativamente autónomo, no participamos en los pasos intermedios. Por lo tanto, no hay ningún
ser humano en el circuito que pueda juzgar la calidad del resultado o del proceso de
razonamiento.
Esta espada de doble filo requiere un diseño cuidadoso del sistema para mejorar su fiabilidad. Por
ejemplo, podríamos hacer que el agente devuelva la URL del sitio web donde encontró el precio de
la MacBook Pro o preguntar si el resultado es correcto en cada paso.
Resumen
En este capítulo, exploramos varias formas de ampliar las capacidades de los LLM mediante la
incorporación de componentes modulares. Comenzamos creando una cadena simple pero reutilizable
que conectaba el LLM con una plantilla de indicaciones. Luego, ampliamos este concepto agregando
memoria a la cadena, lo que permitió que el LLM recordara conversaciones. Exploramos tres métodos
diferentes para agregar memoria y analizamos sus fortalezas y debilidades.
Luego, nos adentramos en el mundo de los agentes que utilizan LLM para determinar sus acciones
y tomar decisiones. Exploramos el marco ReAct, que utiliza un marco de indicaciones intuitivo que
permite a los agentes razonar sobre sus pensamientos, tomar acciones y observar los resultados.
Esto nos llevó a crear un agente que puede usar libremente las herramientas a su disposición, como
buscar en la web y usar una calculadora, lo que demuestra el poder potencial de los agentes.
Con esta base establecida, ahora estamos preparados para explorar formas en las que los LLM
pueden usarse para mejorar los sistemas de búsqueda existentes e incluso convertirse en el núcleo
de sistemas de búsqueda nuevos y más poderosos, como se analiza en el próximo capítulo.
Machine Translated by Google
1
Shunyu Yao et al. “ReAct: Sinergia entre razonamiento y acción en modelos lingüísticos”. arXiv
preimpresión arXiv:2210.03629 (2022).
OceanofPDF.com
Machine Translated by Google
Por otra parte, la rápida adopción de modelos de generación de texto llevó a muchos
usuarios a plantearles preguntas y esperar respuestas basadas en hechos. Y, si bien los
modelos podían responder con fluidez y seguridad, sus respuestas no siempre eran
correctas o actualizadas. Este problema llegó a conocerse como “alucinaciones”
de los modelos, y una de las principales formas de reducirlo es construir
sistemas que puedan recuperar información relevante y proporcionársela al LLM para
ayudarlo a generar respuestas más basadas en hechos. Este método, llamado RAG, es
una de las aplicaciones más populares de los LLM.
Machine Translated by Google
Recuperación densa
Figura 81. La recuperación densa es uno de los tipos clave de búsqueda semántica, que se basa en la similitud
Reclasificación
Los sistemas de búsqueda suelen ser secuencias de varios pasos. Un modelo de lenguaje
de reclasificación es uno de estos pasos y su tarea es puntuar los resultados.
Machine Translated by Google
Relevancia de un subconjunto de resultados en relación con la consulta; luego, el orden de los resultados se
modifica en función de estas puntuaciones. La Figura 82 muestra en qué se diferencian los rerankers de la
recuperación densa en que toman una entrada adicional: un conjunto de resultados de búsqueda de un paso
Figura 82. Los rerankers, el segundo tipo clave de búsqueda semántica, toman una consulta de búsqueda y una
recopilación de resultados y reordenarlos por relevancia, lo que a menudo produce resultados enormemente mejorados.
TRAPO
La creciente capacidad de generación de texto de LLM dio lugar a un nuevo tipo de sistemas de búsqueda
que incluyen un modelo que genera una respuesta a una consulta. La figura 83 muestra un ejemplo
La búsqueda generativa es un subconjunto de una categoría más amplia de sistemas, mejor conocidos como
sistemas RAG. Se trata de sistemas de generación de texto que incorporan capacidades de búsqueda
para reducir las alucinaciones, aumentar la veracidad y/o fundamentar el modelo de generación en
Figura 83. Un sistema RAG formula una respuesta a una pregunta y (preferiblemente) cita su información
fuentes.
El resto del capítulo cubre estos tres tipos de sistemas con más detalle.
Si bien estas son las categorías principales, no son las únicas aplicaciones
de LLM en el dominio de la búsqueda.
Recuperación densa
Figura 84. La intuición de las incrustaciones: cada texto es un punto y los textos con significado similar están cerca unos
de otros.
Esta es la propiedad que se utiliza para crear sistemas de búsqueda. En este escenario,
cuando un usuario ingresa una consulta de búsqueda, incrustamos la consulta, proyectándola
así en el mismo espacio que nuestro archivo de texto. Luego, simplemente encontramos los
documentos más cercanos a la consulta en ese espacio, y esos serían los resultados de la
búsqueda (Figura 85).
Machine Translated by Google
Figura 85. La recuperación densa se basa en la propiedad de que las consultas de búsqueda estarán cerca de sus resultados
relevantes.
A juzgar por las distancias en la Figura 85, “texto 2” es el mejor resultado para esta consulta,
seguido de “texto 1”. Sin embargo, aquí podrían surgir dos preguntas:
¿Debería devolverse el texto 3 como resultado? Esa es una decisión que debe tomar
La figura 86 muestra cómo dividimos un documento en fragmentos antes de proceder a incrustar
cada fragmento. Luego, esos vectores de incrustación se almacenan en la base de datos de vectores
y están listos para su recuperación.
Machine Translated by Google
Figura 86. Conversión de una base de conocimiento externa a una base de datos vectorial. A continuación, podemos consultar esta
base de datos vectorial para obtener información sobre la base de conocimiento.
Veamos un ejemplo de recuperación densa utilizando Cohere para buscar la película Interstellar
en la página de Wikipedia. En este ejemplo, haremos lo siguiente:
1. Obtenga el texto que queremos que se pueda buscar y aplique algo de luz.
procesando para dividirlo en oraciones.
importar cohere
importar numpy como np
importar pandas como pd
desde tqdm importar tqdm
"
clave api =
"""
Interstellar
es una película épica de ciencia ficción de 2014 coescrita,
dirigida y producida por Christopher Nolan.
Está protagonizada por Matthew McConaughey, Anne Hathaway, Jessica Chastain,
Bill Irwin, Ellen Burstyn, Matt Damon y Michael Caine.
Ambientado en un futuro distópico donde la humanidad está luchando por...
Sobrevivir, la película sigue a un grupo de astronautas que viajan
a través de un agujero de gusano cerca de Saturno en busca de un nuevo hogar para
humanidad.
Ahora es considerada por muchos expertos en ciencia ficción como una de las mejores películas
de ciencia ficción de todos los tiempos.
Interstellar fue nominada a cinco premios en la 87.ª edición de los Premios Óscar, ganó el premio a los mejores efectos
visuales y recibió numerosos otros galardones.
Incorporemos ahora los textos. Los enviaremos a la API de Cohere y obtendremos un vector para
cada texto:
# Obtener la respuesta de
incrustaciones =
co.embed( texts=texts,
input_type="search_document", ).embeddings
incrustaciones = np.array(respuesta)
print(incrustaciones.forma)
Esto genera (15, 4096), lo que indica que tenemos 15 vectores, cada uno de tamaño 4096.
Antes de poder realizar una búsqueda, debemos crear un índice de búsqueda. Un índice
almacena las incrustaciones y está optimizado para recuperar rápidamente los puntos vecinos
más cercanos, incluso si tenemos una gran cantidad de puntos:
Buscar en el índice
Ahora podemos buscar en el conjunto de datos utilizando cualquier consulta que queramos.
Simplemente incorporamos la consulta y presentamos su incorporación al índice, que
recuperará la oración más similar del artículo de Wikipedia.
¡Ahora estamos listos para escribir una consulta y buscar los textos!
textos distancia
El primer resultado tiene la menor distancia y por tanto es el más similar a la consulta.
Al observarlo, responde perfectamente a la pregunta. Tenga en cuenta que esto no habría
sido posible si solo estuviéramos haciendo una búsqueda de palabras clave porque el
resultado principal no incluía las mismas palabras clave en la consulta.
def bm25_tokenizer(texto):
tokenized_doc = [] para
token en texto.lower().split(): token =
token.strip(cadena.puntuación)
tokenized_corpus = [] para el
pasaje en tqdm(textos):
tokenized_corpus.append(bm25_tokenizer(pasaje))
bm25 = BM25Okapi(corpus_tokenizado)
Resultados:
Tenga en cuenta que el primer resultado no responde realmente a la pregunta a pesar de que comparte
la palabra "ciencia" con la consulta. En la siguiente sección, veremos cómo agregar un reranker puede
mejorar este sistema de búsqueda. Pero antes de eso, completemos nuestra descripción general de la
recuperación densa observando sus advertencias y repasando algunos métodos para dividir textos en
fragmentos.
Es útil conocer algunos de los inconvenientes de la recuperación densa y cómo abordarlos. ¿Qué sucede, por
ejemplo, si los textos no contienen la respuesta? Aún así, obtenemos los resultados y sus distancias. Por
ejemplo:
textos distancia
En casos como este, una posible heurística es establecer un nivel de umbral (una
distancia máxima de relevancia, por ejemplo). Muchos sistemas de búsqueda presentan
al usuario la mejor información que pueden obtener y dejan que el usuario decida si es
relevante o no. Realizar un seguimiento de la información sobre si el usuario hizo clic en
un resultado (y quedó satisfecho con él) puede mejorar las versiones futuras del sistema de
búsqueda.
Otra advertencia de la recuperación densa es cuando un usuario quiere encontrar una coincidencia
exacta para una frase específica. Ese es un caso perfecto para la coincidencia de palabras
clave. Esa es una de las razones por las que se recomienda la búsqueda híbrida, que incluye
tanto la búsqueda semántica como la búsqueda de palabras clave, en lugar de confiar únicamente en la
recuperación densa.
Lo último que nos gustaría señalar es que este es un caso en el que cada oración contenía
un fragmento de información y mostramos consultas que solicitaban específicamente esa
información. ¿Qué sucede con las preguntas cuyas respuestas abarcan varias oraciones? Esto
pone de relieve uno de los parámetros de diseño importantes de los sistemas de
recuperación densos: ¿cuál es la mejor manera de fragmentar textos largos? ¿Y por qué
necesitamos fragmentarlos en primer lugar?
Una limitación de los modelos de lenguaje Transformer es que están limitados en cuanto al
tamaño de los contextos, lo que significa que no podemos incluir textos muy largos que superen
la cantidad de palabras o tokens que admite el modelo. Entonces, ¿cómo integramos textos
largos?
Hay varias formas posibles, y dos enfoques posibles que se muestran en la Figura 87
incluyen la indexación de un vector por documento y la indexación de múltiples vectores por
documento.
Figura 87. Es posible crear un vector que represente un documento completo, pero es mejor dividir los
documentos más largos en fragmentos más pequeños que tengan sus propias incrustaciones.
Machine Translated by Google
Incrustar solo una parte representativa del documento e ignorar el resto del
texto. Esto puede significar incrustar solo el título o solo el comienzo del documento.
Esto es útil para comenzar rápidamente a crear una demostración, pero deja mucha
información sin indexar y, por lo tanto, no se puede buscar. Como enfoque,
puede funcionar mejor para documentos en los que el comienzo captura
Pero realmente no es el mejor enfoque para un sistema real porque mucha información
quedaría fuera del índice y no sería posible buscarla.
Este enfoque puede satisfacer algunas necesidades de información, pero no otras. Muchas
veces, la búsqueda se centra en un fragmento de información específico contenido en un
artículo, que se capta mejor si el concepto tiene su propio vector.
Figura 88. Varios métodos de fragmentación y sus efectos en el texto de entrada. La superposición de fragmentos puede
ser importante para evitar la ausencia de contexto.
El método de fragmentación es mejor porque cubre todo el texto y porque los vectores
tienden a capturar conceptos individuales dentro del texto. Esto genera un índice de
búsqueda más expresivo. La Figura 89 muestra varios métodos posibles.
Figura 89. Varias opciones posibles para dividir un documento en fragmentos para su incrustación.
Cada párrafo es un fragmento. Esto es genial si el texto está formado por párrafos cortos.
De lo contrario, puede suceder que cada 3 a 8 oraciones sea un fragmento.
Algunos fragmentos obtienen gran parte de su significado del texto que los rodea, por lo
que podemos incorporar algo de contexto mediante:
Es de esperar que surjan más estrategias de fragmentación a medida que el campo se desarrolle,
algunas de las cuales pueden incluso usar LLM para dividir dinámicamente un texto en fragmentos
significativos.
Figura 810. Dividir el texto en segmentos superpuestos es una estrategia para retener más contexto
en torno a los diferentes segmentos.
Una vez que la consulta está incorporada, necesitamos encontrar los vectores más cercanos a ella en
nuestro archivo de texto, como podemos ver en la Figura 811. La forma más sencilla de encontrar los
vecinos más cercanos es calcular las distancias entre la consulta y el archivo. Esto se puede hacer
fácilmente con NumPy y es un enfoque razonable si tiene miles o decenas de miles de vectores en su
archivo.
Machine Translated by Google
Figura 811. Como vimos en el Capítulo 3, podemos comparar incrustaciones para encontrar rápidamente los documentos
más similares a una consulta.
A medida que se amplía la escala hasta los millones de vectores, un enfoque optimizado
para la recuperación es confiar en bibliotecas de búsqueda de vecinos más cercanos
aproximados como Annoy o FAISS. Estas le permiten recuperar resultados de índices
masivos en milisegundos y algunas de ellas pueden mejorar su rendimiento mediante
el uso de GPU y la escalabilidad a grupos de máquinas para brindar servicios a
índices muy grandes.
Otra clase de sistemas de recuperación de vectores son las bases de datos vectoriales como
Weaviate o Pinecone. Una base de datos vectorial permite agregar o eliminar vectores sin
tener que reconstruir el índice. También proporcionan formas de filtrar la búsqueda o
personalizarla de maneras que van más allá de las distancias vectoriales.
El proceso de ajuste fino tiene como objetivo hacer que las incrustaciones de estas consultas sean
cercanas a la incrustación de la oración resultante. También necesita ver ejemplos negativos de
consultas que no son relevantes para la oración, por ejemplo:
Con estos ejemplos, ahora tenemos tres pares: dos pares positivos y un par negativo. Supongamos,
como podemos ver en la Figura 812, que antes del ajuste, las tres consultas tienen la misma
distancia del documento de resultados.
Eso no es descabellado porque todos hablan de Interstellar.
Figura 812. Antes de realizar el ajuste, las incrustaciones de consultas relevantes e irrelevantes pueden estar cerca
de un documento en particular.
Machine Translated by Google
El paso de ajuste fino sirve para acercar las consultas relevantes al documento y, al mismo
tiempo, alejar las consultas irrelevantes. Podemos ver este efecto en la Figura 813.
Figura 813. Después del proceso de ajuste, el modelo de incorporación de texto mejora en esta tarea de búsqueda al
incorporar la forma en que definimos la relevancia en nuestro conjunto de datos utilizando los ejemplos que
proporcionamos de documentos relevantes e irrelevantes.
Reclasificación
Muchas organizaciones ya han creado sistemas de búsqueda. Para ellas, una forma
más sencilla de incorporar modelos de lenguaje es como paso final dentro de su flujo de
búsqueda. Este paso tiene la tarea de cambiar el orden de los resultados de búsqueda en función
de la relevancia de la consulta de búsqueda. Este paso puede mejorar enormemente los
resultados de búsqueda y, de hecho, es lo que Microsoft Bing agregó para lograr las mejoras en los
resultados de búsqueda utilizando modelos similares a BERT.
La figura 814 muestra la estructura de un sistema de búsqueda de reranking que sirve como
segunda etapa en un sistema de búsqueda de dos etapas.
Machine Translated by Google
Figura 814. Los rerankers LLM funcionan como parte de un proceso de búsqueda con el objetivo de reordenar una
serie de resultados de búsqueda preseleccionados por relevancia.
toma la consulta de búsqueda y una cantidad de resultados de búsqueda, y devuelve el orden óptimo de estos
documentos para que los más relevantes para la consulta tengan un lugar más alto en la clasificación. Punto final
Rerank de Cohere es una forma sencilla de empezar a utilizar un primer reranker. Simplemente le pasamos la
Producción:
(y 773 millones de dólares con relanzamientos posteriores), lo que la convierte en la décima película
más taquillera de 2014 2 0,0043994132 Físico teórico de
Caltech y premio Nobel de Física de 2017[4] Kip Thorne fue productor ejecutivo, actuó como consultor
científico y escribió un libro complementario, The Science of Interstellar
Esto demuestra que el reranker tiene mucha más confianza en el primer resultado y le asigna una
puntuación de relevancia de 0,16, mientras que los demás resultados reciben una puntuación de
relevancia mucho menor.
seleccionar, digamos, cien o mil resultados y luego presentárselos al rerankeador. Este paso de selección
El recuperador de primera etapa puede ser una búsqueda por palabras clave, una recuperación densa o, mejor
aún, una búsqueda híbrida que utilice ambas. Podemos volver a nuestro ejemplo anterior para ver
cómo agregar un reranker después de un sistema de búsqueda por palabras clave mejora su
rendimiento.
Modifiquemos nuestra función de búsqueda de palabras clave para que recupere una lista de los 10 resultados
principales mediante la búsqueda de palabras clave y luego usemos rerank para elegir los 3 resultados
principales de esos 10:
idx en top_n]
bm25_hits = ordenado(bm25_hits, clave=lambda x: x['puntaje'], reverso=Verdadero)
#Agregar documentos de
reclasificación = [textos[hit['corpus_id']] para el hit en bm25_hits]
Ahora podemos enviar nuestra consulta y verificar los resultados de la búsqueda de palabras clave y luego
el resultado de la búsqueda de palabras clave preseleccionando sus 10 resultados principales, para luego
pasarlos al reranker:
Resultados:
0.004 Físico teórico de Caltech y premio Nobel de Física 2017[4] Kip Thorne fue productor ejecutivo, actuó
como consultor científico y escribió un libro complementario, The Science of Interstellar 0.004
Ambientada en un futuro distópico donde la humanidad lucha por sobrevivir, la película sigue a un grupo
de astronautas que
viajan a través de un agujero de gusano cerca de Saturno en busca de un nuevo hogar para la humanidad
0.003 Los hermanos Christopher y Jonathan Nolan escribieron el guion, que tuvo su origen en un
guion que Jonathan desarrolló en 2007
Vemos que la búsqueda de palabras clave asigna puntuaciones solo a dos resultados que comparten
algunas de las palabras clave. En el segundo conjunto de resultados, el reranker eleva el segundo
resultado de manera apropiada como el resultado más relevante para la consulta. Este es un ejemplo de
juguete que nos da una idea del efecto, pero en la práctica, una canalización de este tipo mejora
significativamente la calidad de la búsqueda. En un punto de referencia multilingüe como MIRACL, un
reranker puede aumentar rendimiento de 36,5 a 62,8, medido como nDCG@10 (más sobre la
evaluación más adelante en este capítulo).
Una forma popular de crear rerankers de búsqueda LLM es presentar la consulta y cada resultado a un
LLM que funciona como un codificador cruzado. Esto significa que una consulta y un posible resultado
se presentan al modelo al mismo tiempo, lo que permite que el modelo vea ambos textos antes
de asignar una puntuación de relevancia, como podemos ver en la Figura 815. Todos los documentos
se procesan simultáneamente como un lote, pero cada documento se evalúa en relación con la
consulta de forma independiente. Las puntuaciones determinan entonces el nuevo orden de los resultados.
Esto
Machine Translated by Google
Figura 815. Un reranker asigna una puntuación de relevancia a cada documento observando el documento
y la consulta al mismo tiempo.
Para aprender más sobre el desarrollo del uso de LLM para búsqueda, " Transformadores
preentrenados para el tanking de texto: BERT y más allá" es una mirada muy recomendable
a los desarrollos de estos modelos hasta aproximadamente 2021.
Figura 816. Para evaluar los sistemas de búsqueda, necesitamos un conjunto de pruebas que incluya consultas y
juicios de relevancia que indiquen qué documentos de nuestro archivo son relevantes para cada consulta.
Utilizando este conjunto de pruebas, podemos proceder a explorar la evaluación de los sistemas de búsqueda.
Comencemos con un ejemplo sencillo. Supongamos que pasamos la consulta 1 a dos sistemas de
búsqueda diferentes y obtenemos dos conjuntos de resultados. Digamos que limitamos la cantidad de
Figura 817. Para comparar dos sistemas de búsqueda, pasamos la misma consulta de nuestro conjunto de pruebas a ambos
sistemas y observamos sus resultados principales.
Para determinar cuál es el mejor sistema, recurrimos a los juicios de relevancia que
tenemos para la consulta. La Figura 818 muestra cuáles de los resultados obtenidos
son relevantes.
Machine Translated by Google
Figura 818. Si observamos los juicios de relevancia de nuestro conjunto de pruebas, podemos ver que el sistema 1 hizo un
mejor trabajo que el sistema 2.
Esto nos muestra un caso claro donde el sistema 1 es mejor que el sistema 2.
Intuitivamente, podemos contar cuántos resultados relevantes obtuvo cada
sistema. El sistema 1 obtuvo dos de tres resultados correctos y el sistema 2 solo uno
de tres. Pero ¿qué sucede en un caso como el de la Figura 819 , en el que ambos
sistemas solo obtienen un resultado relevante de tres, pero están en posiciones
diferentes?
Machine Translated by Google
Figura 819. Necesitamos un sistema de puntuación que recompense al sistema 1 por asignar una posición alta a un
resultado relevante, aun cuando ambos sistemas hayan obtenido solo un resultado relevante entre sus tres resultados principales.
En este caso, podemos intuir que el sistema 1 ha hecho un mejor trabajo que el sistema
2 porque el resultado en la primera posición (la más importante) es correcto. Pero, ¿cómo
podemos asignar un número o puntuación a cuánto mejor es ese resultado? La precisión media
promedio es una medida que permite cuantificar esta distinción.
Para puntuar un sistema de búsqueda en esta consulta, podemos centrarnos en puntuar los
documentos relevantes. Empecemos por analizar una consulta que solo tiene un
documento relevante en el conjunto de pruebas.
Machine Translated by Google
El primero es fácil: el sistema de búsqueda coloca el resultado relevante (el único disponible
para esta consulta) en la parte superior. Esto le otorga al sistema la puntuación perfecta
de 1. La Figura 820 muestra este cálculo: si observamos la primera posición, tenemos un
resultado relevante que conduce a una precisión en la posición 1 de 1,0 (calculada
como la cantidad de resultados relevantes en la posición 1, dividida por la posición que
estamos observando en ese momento).
Figura 820. Para calcular la precisión media promedio, comenzamos calculando la precisión en cada posición,
comenzando con la posición 1.
Dado que solo estamos puntuando los documentos relevantes, podemos ignorar las
puntuaciones de los documentos no relevantes y detener nuestro cálculo aquí. Sin embargo,
¿qué sucedería si el sistema colocara el único resultado relevante en la tercera posición?
¿Cómo afectaría eso a la puntuación? La Figura 821 muestra cómo esto da como resultado una penalización.
Machine Translated by Google
Figura 821. Si el sistema coloca documentos no relevantes antes de un documento relevante, su puntuación de
precisión se ve penalizada.
Figura 822. La precisión promedio de un documento con múltiples documentos relevantes considera la
precisión en k resultados de todos los documentos relevantes.
La Figura 823 muestra cómo calcular esta métrica tomando la media de las
precisiones promedio de cada consulta.
Figura 823. La precisión media promedio tiene en cuenta la puntuación de precisión promedio de un sistema
para cada consulta en el conjunto de pruebas. Al promediarlas, se obtiene una única métrica que podemos
utilizar para comparar un sistema de búsqueda con otro.
Ahora tenemos una única métrica que podemos usar para comparar diferentes sistemas.
Si desea obtener más información sobre las métricas de evaluación, consulte el capítulo
“Evaluación en recuperación de información” de Introducción a la recuperación de
información (Cambridge University Press) de Christopher D. Manning, Prabhakar
Raghavan y Hinrich Schütze.
Además de la precisión promedio, otra métrica comúnmente utilizada para los sistemas
de búsqueda es la ganancia acumulada descontada normalizada (nDCG), que es más
matizada en el sentido de que la relevancia de los documentos no es binaria
(relevante versus no relevante) y un documento puede etiquetarse como más relevante
que otro en el conjunto de pruebas y el mecanismo de puntuación.
Machine Translated by Google
Figura 824. Una secuencia básica de RAG se compone de un paso de búsqueda seguido de un paso de
generación fundamentada donde se le formula al LLM la pregunta y se recupera la información del paso de búsqueda.
Esto también se aplica a los sistemas de búsqueda. Cada vez más motores de búsqueda
incorporan un LLM para resumir los resultados o responder a las preguntas enviadas al
motor de búsqueda. Algunos ejemplos son Perplexity, Microsoft Bing AI y Google
Gemini.
De la búsqueda a RAG
Dado el contexto proporcionado por los resultados de la búsqueda, podemos ver un ejemplo
en la Figura 825.
Figura 825. La búsqueda generativa formula respuestas y resúmenes al final de un proceso de búsqueda
mientras cita sus fuentes (devueltas por los pasos anteriores en el sistema de búsqueda).
Machine Translated by Google
Figura 826. Encuentre la información más relevante para una solicitud de entrada comparando las similitudes
entre las incrustaciones. La información más relevante se agrega a la solicitud antes de entregársela al usuario.
Máster.
# 1 Recuperación #
Usaremos la búsqueda integrada. Pero lo ideal sería que hiciéramos resultados híbridos =
búsqueda(consulta)
imprimir(respuesta.texto)
Machine Translated by Google
Resultado:
Resaltamos parte del texto porque el modelo indicó que la fuente de estos fragmentos de
texto fue el primer documento que pasamos:
!wget https://huggingface.co/microsoft/Phi3mini4kinstructgguf/resolve/main/
Phi3mini4kinstructfp16.gguf
# ¡Asegúrese de que la ruta del modelo sea correcta para su sistema! llm =
LlamaCpp( model_path="Phi3
mini4kinstructfp16.gguf", n_gpu_layers=1, max_tokens=500, n_ctx=2048,
seed=42,
verbose=Falso
)
Ahora podemos usar el modelo de incrustación para configurar nuestra base de datos vectorial:
El mensaje RAG
Una plantilla de solicitud cumple una función vital en el proceso de RAG. Es el lugar
central donde comunicamos los documentos relevantes al LLM. Para ello, crearemos una
variable de entrada adicional denominada contexto que pueda proporcionar al LLM
los documentos recuperados:
Machine Translated by Google
PromptTemplate( template=template,
input_variables=["context",
"question"]
)
retriever=db.as_retriever(),
chain_type_kwargs={ "prompt": mensaje
},
verbose=Verdadero
)
rag.invoke('Ingresos generados')
Resultado:
Los ingresos generados por la película en 2014 fueron de más de 677 millones de dólares en todo el
mundo, lo que la convirtió en la décima película más taquillera de ese año. Sin embargo, cabe señalar que
esta cifra incluye tanto las ventas iniciales de entradas como los relanzamientos posteriores.
Como siempre, podemos ajustar el mensaje para controlar la generación del modelo (por ejemplo, la
longitud y el tono de la respuesta).
Reescritura de consultas
Pregunta del usuario: “Tenemos que entregar un ensayo mañana. Tenemos que escribir sobre
algún animal. Me encantan los pingüinos. Podría escribir sobre ellos. Pero también podría escribir
sobre los delfines. ¿Son animales? Tal vez. Hablemos de los delfines. ¿Dónde viven, por ejemplo?”
Esta conducta de reescritura se puede realizar a través de un mensaje de solicitud (o mediante una
llamada a la API). La API de Cohere, por ejemplo, tiene un modo de reescritura de consultas dedicado
para co.chat.
Machine Translated by Google
La siguiente mejora que podemos introducir es ampliar la reescritura de consultas para poder buscar varias
consultas si se necesita más de una para responder a una pregunta específica. Tomemos como ejemplo:
Pregunta de usuario: “Compara los resultados financieros de Nvidia en 2020 con los
de 2023”
Es posible que encontremos un documento que contenga los resultados de ambos años, pero lo más
probable es que sea mejor realizar dos consultas de búsqueda:
Luego presentamos los resultados principales de ambas consultas al modelo para su generación
fundamentada. Una pequeña mejora adicional aquí es darle también al reescritor de consultas la opción de
determinar si no se requiere ninguna búsqueda y si puede generar directamente una respuesta segura sin
buscar.
Una pregunta más avanzada puede requerir una serie de consultas secuenciales. Tomemos como ejemplo
una pregunta como:
Pregunta de un usuario: “¿Quiénes son los mayores fabricantes de automóviles en 2023? ¿Todos
ellos fabricarán vehículos eléctricos o no?”
Enrutamiento de consultas
RAG agente
Ahora puede ver que la lista de mejoras anteriores delega lentamente cada vez más
responsabilidad al LLM para resolver problemas cada vez más complejos. Esto depende
de la capacidad del LLM para medir las necesidades de información requeridas,
así como de su capacidad para utilizar múltiples fuentes de datos. Esta nueva
naturaleza del LLM comienza a acercarse cada vez más a un agente que actúa sobre
el mundo. Las fuentes de datos también se pueden abstraer en herramientas. Vimos, por
ejemplo, que podemos buscar en Notion, pero, por la misma razón, también deberíamos
poder publicar en Notion.
No todos los LLM tendrán las capacidades RAG mencionadas aquí. Al momento de escribir
esto, es probable que solo los modelos administrados más grandes puedan intentar este
comportamiento. Afortunadamente, Command R+ de Cohere Se destaca en estas tareas y
está disponible como modelo de pesos abiertos. también.
Evaluación RAG
Todavía hay avances en curso sobre cómo evaluar los modelos RAG. Un buen artículo
para leer sobre este tema es “Evaluating verificability in generative search engine” (2023),
que realiza evaluaciones humanas en diferentes sistemas de búsqueda generativa.2
Fluidez
Utilidad percibida
Recordatorio de citación
Precisión de citación
declaraciones.
Fidelidad
Relevancia de la respuesta
El sitio de documentación de Ragas Proporciona más detalles sobre las fórmulas para calcular
realmente estas métricas.
Resumen
En este capítulo, analizamos diferentes formas de utilizar modelos de lenguaje para mejorar los
sistemas de búsqueda existentes e incluso ser el núcleo de nuevos sistemas más avanzados.
Machine Translated by Google
RAG, donde los sistemas de búsqueda tienen un LLM generativo al final del proceso para
formular una respuesta basada en los documentos recuperados mientras se citan las fuentes.
También analizamos uno de los posibles métodos para evaluar los sistemas de búsqueda.
La precisión media promedio nos permite puntuar los sistemas de búsqueda para poder compararlos
entre un conjunto de consultas de prueba y su relevancia conocida para las consultas de prueba. Sin
embargo, la evaluación de los sistemas RAG requiere múltiples ejes, como la fidelidad, la fluidez y otros
que pueden ser evaluados por humanos o por LLM como juez.
En el próximo capítulo, exploraremos cómo los modelos de lenguaje pueden hacerse multimodales y
1
Patrick Lewis et al. “Generación aumentada por recuperación para tareas de PNL con uso intensivo de conocimiento”.
Avances en sistemas de procesamiento de información neuronal 33 (2020): 9459–9474.
2
Nelson F. Liu, Tianyi Zhang y Percy Liang. “Evaluación de la verificabilidad en motores de búsqueda
generativos”. Preimpresión de arXiv arXiv:2304.09848 (2023).
OceanofPDF.com
Machine Translated by Google
Cuando piensas en modelos lingüísticos grandes (LLM), la multimodalidad puede no ser lo primero que te
viene a la cabeza. Después de todo, ¡son modelos lingüísticos ! Pero podemos ver rápidamente
que los modelos pueden ser mucho más útiles si pueden manejar tipos de datos distintos del texto.
Es muy útil, por ejemplo, si un modelo lingüístico puede mirar una imagen y responder preguntas
sobre ella. Un modelo que puede manejar texto e imágenes (cada uno de los cuales se denomina
modalidad) se dice que es multimodal, como podemos ver en la Figura 91.
Figura 91. Los modelos que pueden manejar distintos tipos (o modalidades) de datos, como imágenes,
audio, video o sensores, se denominan multimodales. Es posible que un modelo acepte una modalidad
como entrada pero no pueda generar datos en esa modalidad.
Hemos visto todo tipo de comportamientos emergentes que surgen de los LLM, desde capacidades de
generalización y razonamiento hasta aritmética y lingüística. A medida que los modelos se hacen más
La capacidad de recibir y razonar con información multimodal podría aumentar aún más y ayudar
a que surjan capacidades que antes estaban bloqueadas.
Machine Translated by Google
En este capítulo, exploraremos una serie de LLM diferentes que tienen capacidades
multimodales y lo que eso significa para los casos de uso prácticos. Comenzaremos
explorando cómo se convierten las imágenes en representaciones numéricas utilizando
una adaptación de la técnica Transformer original. Luego, mostraremos cómo se pueden
ampliar los LLM para incluir tareas de visión utilizando este Transformer.
El método que idearon se llama Vision Transformer (ViT), que ha demostrado tener
un rendimiento tremendamente bueno en tareas de reconocimiento de imágenes en
comparación con las redes neuronales convolucionales (CNN) predeterminadas
anteriormente.2 Al igual que el Transformer original, ViT se utiliza para transformar datos
no estructurados, una imagen, en representaciones que se pueden usar para una
variedad de tareas, como la clasificación, como se ilustra en la Figura 92.
Figura 92. Tanto el Transformer original como el Vision Transformer toman datos no estructurados, los convierten
en representaciones numéricas y finalmente los utilizan para tareas como la clasificación.
Figura 93. El texto se pasa a uno o varios codificadores mediante su tokenización mediante un tokenizador.
Como una imagen no está formada por palabras, este proceso de tokenización no se
puede utilizar para datos visuales. En su lugar, los autores de ViT idearon un método
para tokenizar imágenes en “palabras”, lo que les permitió utilizar la estructura del
codificador original.
Imagina que tienes una imagen de un gato. Esta imagen está representada por un
número de píxeles, digamos 512 × 512 píxeles. Cada píxel individual no tiene
Machine Translated by Google
ViT utiliza un principio muy similar a ese. En lugar de dividir el texto en fragmentos, convierte la
imagen original en fragmentos de imágenes. En otras palabras, corta la imagen en varias partes
de forma horizontal y vertical, como se ilustra en la Figura 94.
Figura 94. Proceso de “tokenización” de la entrada de imágenes. Convierte una imagen en parches de
subimágenes.
De la misma manera que convertimos texto en fragmentos de texto, convertimos una imagen
en fragmentos de imágenes. La entrada aplanada de fragmentos de imagen puede considerarse
como los fragmentos de un fragmento de texto. Sin embargo, a diferencia de los fragmentos,
no podemos simplemente asignar a cada fragmento un ID, ya que estos fragmentos rara vez se
encontrarán en otras imágenes, a diferencia del vocabulario de un texto.
Debido a estas similitudes, el ViT se utiliza a menudo para hacer que todo tipo de
modelos de lenguaje sean multimodales. Una de las formas más sencillas de utilizar
Machine Translated by Google
Figura 95. El algoritmo principal detrás de ViT. Después de aplicar parches a las imágenes y proyectarlas
linealmente, las incrustaciones de parches se pasan al codificador y se tratan como si fueran tokens textuales.
Como hemos visto muchas veces antes, las incrustaciones suelen ser un factor importante
detrás de las aplicaciones LLM. Son un método eficiente para capturar
Machine Translated by Google
Dicho esto, hasta ahora hemos analizado modelos de incrustación de solo texto, que se
centran en generar incrustaciones para representaciones textuales. Aunque existen
modelos de incrustación solo para incrustar imágenes, analizaremos modelos de
incrustación que puedan capturar representaciones tanto textuales como visuales.
Lo ilustramos en la Figura 96.
Figura 96. Los modelos de incrustación multimodal pueden crear incrustaciones para múltiples modalidades en el
mismo espacio vectorial.
Una ventaja es que esto permite comparar representaciones multimodales ya que las
incrustaciones resultantes se encuentran en el mismo espacio vectorial (Figura 97).
Por ejemplo, si utilizamos un modelo de incrustación multimodal, podemos encontrar
imágenes a partir del texto de entrada. ¿Qué imágenes encontraríamos si buscáramos
imágenes similares a “fotos de un cachorro”? También sería posible que ocurriera lo contrario.
¿Qué documentos están mejor relacionados con esta pregunta?
Machine Translated by Google
Figura 97. A pesar de provenir de diferentes modalidades, las incrustaciones con significado similar estarán
próximas entre sí en el espacio vectorial.
Hay varios modelos de incrustación multimodal, pero el modelo más conocido y más utilizado
actualmente es el preentrenamiento de lenguajeimagen contrastivo (CLIP).
incrustaciones de texto.3 Esta capacidad de comparación hace que CLIP y otros modelos similares
sean útiles para tareas como:
Agrupamiento
Machine Translated by Google
Agrupe imágenes y una colección de palabras clave para encontrar qué palabras clave
Buscar
Entre miles de millones de textos o imágenes, podemos encontrar rápidamente lo que se relaciona
Generación
Utilice incrustaciones multimodales para impulsar la generación de imágenes (por ejemplo, difusión
estable4 ).
Figura 98. Tipo de datos necesarios para entrenar un modelo de incrustación multimodal.
Este conjunto de datos se puede utilizar para crear dos representaciones para cada par, la imagen y
su título. Para ello, CLIP utiliza un codificador de texto para incrustar texto y un codificador de imágenes para
incrustar imágenes. Como se muestra en la Figura 99, el resultado es una incrustación tanto de la imagen
Figura 99. En el primer paso del entrenamiento de CLIP, se incorporan imágenes y texto utilizando un codificador de
imágenes y texto, respectivamente.
Figura 910. En el segundo paso del entrenamiento de CLIP, la similitud entre la oración y la imagen incorporada
se calcula utilizando la similitud del coseno.
Figura 911. En el tercer paso del entrenamiento de CLIP, los codificadores de texto e imagen se actualizan para
que coincidan con la similitud deseada. Esto actualiza las incrustaciones de modo que estén más cerca en el
espacio vectorial si las entradas son similares.
Al final, esperamos que la incorporación de una imagen de un gato sea similar a la incorporación de la
frase “una imagen de un gato”. Como veremos en
Machine Translated by Google
Capítulo 10: Para asegurarse de que las representaciones sean lo más precisas
posibles, también se deben incluir en el proceso de entrenamiento ejemplos negativos
de imágenes y leyendas que no estén relacionadas. Modelar la similitud no consiste solo
en saber qué hace que las cosas sean similares entre sí, sino también qué las
hace diferentes y disímiles.
Abrir CLIP
Para nuestro próximo ejemplo, utilizaremos modelos de la variante de código
abierto de CLIP, concretamente OpenCLIP. El uso de OpenCLIP, o cualquier modelo
CLIP, se reduce a dos cosas: procesar las entradas de texto e imágenes antes de
pasarlas al modelo principal.
Como tenemos un título para esta imagen, podemos usar OpenCLIP para generar
incrustaciones para ambas.
modelo_id = "openai/clipvitbasepatch32"
Machine Translated by Google
# Tokenizar nuestras
entradas inputs = clip_tokenizer(caption, return_tensors="pt") inputs
{'input_ids': tensor([[49406, 320, 6829, 1629, 530, 518, 2583, 49407]]), 'attention_mask':
tensor([[1, 1, 1, 1, 1, 1, 1, 1]])}
Para ver qué representan esos ID, podemos convertirlos en tokens usando la función
convert_ids_to_tokens:
['<|startoftext|>', 'un</w>',
'cachorro</
w>', 'jugando</
w>', 'en</w>', 'el</
w>',
Machine Translated by Google
'nieve</w>', '<|
fin del texto|>']
Como ya hemos visto antes, el texto se divide en tokens. Además, ahora también vemos que
se indica el inicio y el final del texto para separarlo de una posible incrustación de imagen.
También puede notar que falta el token [CLS]. En CLIP, el token [CLS] se usa en realidad
para representar la incrustación de imagen.
Esto da como resultado una incrustación que tiene 512 valores para esta única cadena:
antorcha.Tamaño([1, 512])
Antes de que podamos crear nuestra incrustación de imagen, al igual que la incrustación
de texto, necesitaremos preprocesarla ya que el modelo espera que la imagen de
entrada tenga ciertas características, como su tamaño y forma.
# Preprocesar imagen
processing_image = clip_processor(
texto=Ninguno, imágenes=imagen, return_tensors="pt" )
["pixel_values"]
La imagen original tenía 512 × 512 píxeles. Observe que el preprocesamiento de esta imagen
redujo su tamaño a 224 × 224 píxeles, ya que ese es el tamaño esperado:
importar
antorcha importar numpy
como np importar matplotlib.pyplot como plt
antorcha.Tamaño([1, 512])
matriz([[0.33149648]], dtype=float32)
Puntuación. En lugar de ello, ampliemos el ejemplo con más imágenes y subtítulos, como
se ilustra en la Figura 914.
Parece que una puntuación de 0,33 es realmente alta teniendo en cuenta que las similitudes
con otras imágenes son bastante menores.
Machine Translated by Google
En el caso de los modelos de generación de texto, nos gustaría que razonara sobre
ciertas imágenes de entrada. Por ejemplo, podríamos darle una imagen de una pizza y
preguntarle qué ingredientes contiene. Podríamos mostrarle una imagen de la Torre Eiffel.
Machine Translated by Google
Torre y preguntar cuándo se construyó o dónde está ubicada. Esta capacidad de conversación se
Figura 915. Un ejemplo de un modelo de generación de texto multimodal (BLIP2) que puede razonar sobre imágenes
de entrada.
Para salvar la brecha entre estos dos dominios, se han hecho intentos de introducir una forma de
multimodalidad en los modelos existentes. Uno de estos métodos se denomina BLIP2:
Bootstrapping LanguageImage Pretraining for Unified VisionLanguage Understanding and
Generation 2. BLIP2 es una técnica modular y fácil de usar que permite introducir capacidades
de visión en los modelos de lenguaje existentes.
En lugar de construir la arquitectura desde cero, BLIP2 cierra la brecha entre la visión y el lenguaje
construyendo un puente, llamado Transformador de consultas (QFormer), que conecta un codificador
Al aprovechar los modelos entrenados previamente, BLIP2 solo necesita entrenar el puente sin
necesidad de entrenar el codificador de imágenes y LLM desde cero. ¡Hace un gran uso de la tecnología y
los modelos que ya existen! Este puente se ilustra en la Figura 916.
Figura 916. El transformador de consultas es el puente entre la visión (ViT) y el texto (LLM), que es el
único componente entrenable del pipeline.
Para conectar los dos modelos entrenados previamente, QFormer imita sus arquitecturas.
Tiene dos módulos que comparten sus capas de atención:
El QFormer se entrena en dos etapas, una para cada modalidad, como se ilustra en la Figura 917.
En el paso 1, se utilizan pares de imágenes y documentos para entrenar al QFormer para que represente
tanto imágenes como texto. Estos pares son generalmente títulos de imágenes, como hemos visto antes
al entrenar a CLIP.
Las imágenes se introducen en el ViT congelado para extraer las incrustaciones de visión. Estas
incrustaciones se utilizan como entrada del ViT de QFormer. Los subtítulos se utilizan como entrada del
Text Transformer de QFormer.
Machine Translated by Google
Figura 917. En el paso 1, se aplica el aprendizaje de representaciones para aprender representaciones de la visión y
el lenguaje simultáneamente. En el paso 2, estas representaciones se convierten en indicaciones visuales suaves para
alimentar el LLM.
Esta tarea intenta alinear pares de incrustaciones de imágenes y texto de manera que
entrada.
Figura 918. En el paso 1, la salida del ViT congelado se utiliza junto con su título y se entrena en tres tareas
de tipo contrastivo para aprender representaciones de texto visual.
También hay una capa lineal completamente conectada entre ellos para garantizar que
las incrustaciones que se pueden aprender tengan la misma forma que espera el LLM.
Este segundo paso de conversión de la visión en lenguaje se representa en la
Figura 919.
Figura 919. En el paso 2, las incrustaciones aprendidas del QFormer se pasan al LLM a través de una capa
de proyección. Las incrustaciones proyectadas sirven como un aviso visual suave.
Machine Translated by Google
Desde BLIP2, se han lanzado muchos otros LLM visuales que tienen
procesos similares, como LLaVA, un marco para hacer que los LLM textuales
sean multimodales6 o Idefics 2, un LLM visual eficiente basado en Mistral 7B
7 Máster. Ambos LLM visuales, aunque tienen arquitecturas diferentes, conectan
codificadores visuales preentrenados de tipo CLIP con LLM textuales. El objetivo de
estas arquitecturas es proyectar características visuales de las imágenes de entrada
a incrustaciones de lenguaje de modo que puedan usarse como entrada para un
LLM. De manera similar al QFormer, intentan cerrar la brecha entre imágenes y texto.
Machine Translated by Google
Blip2ForConditionalGeneration.from_pretrained(
"Salesforce/blip2opt2.7b",
tipo_d_torch=torch.float16
)
CONSEJO
Preprocesamiento de imágenes
imagen
La imagen tiene 520 × 492 píxeles, lo que en general es un formato poco habitual.
Veamos qué hace nuestro procesador con ella:
# Preprocesar la imagen
entradas = blip_processor(image, return_tensors="pt").to(device, Torch.float16)
entradas["pixel_values"].shape
Machine Translated by Google
El resultado es una imagen de 224 × 224 píxeles. ¡Bastante más pequeña que la que teníamos
inicialmente! Esto también significa que todas las formas originales de la imagen se procesarán
en cuadrados. Por lo tanto, tenga cuidado al introducir imágenes muy anchas o altas, ya que
podrían distorsionarse.
Preprocesamiento de texto
Continuemos esta exploración del procesador con texto. Primero, podemos acceder al
tokenizador que se utiliza para convertir en token el texto de entrada:
Procesador blip.tokenizador
GPT2TokenizerFast(nombre_o_ruta='Salesforce/blip2opt2.7b',
tamaño_vocab=50265,
longitud_máxima_modelo=1000000000000000019884624838656, es_rápido=Verdadero,
lado_de_relleno='derecha', lado_de_truncamiento='derecha', tokens_especiales=
{'bos_token': '</s>', 'eos_token': '</s>', 'unk_token': '</s>', 'pad_token': '<pad>'},
limpieza_de_espacios_de_tokenización=Verdadero),
decodificador_de_tokens_agregados={ 1: AddedToken("<pad>",
rstrip=Falso, lstrip=Falso, palabra_única=Falso, normalizado=Verdadero,
especial=Verdadero), 2: AddedToken("</s>", rstrip=Falso,
lstrip=Falso, palabra_única=Falso, normalizado=Verdadero,
especial=Verdadero), }
Para explorar cómo funciona GPT2Tokenizer, podemos probarlo con una pequeña oración.
Comenzamos convirtiendo la oración en identificadores de token antes
Machine Translated by Google
) texto_generado = texto_generado[0].strip()
texto_generado
Machine Translated by Google
Los subtítulos de imágenes son una excelente manera de aprender este modelo antes de
pasar a casos de uso más complejos. Pruébelo usted mismo con algunas imágenes y vea
dónde funciona bien y dónde funciona mal. Las imágenes específicas de un dominio,
como imágenes de personajes de dibujos animados específicos o creaciones imaginarias,
pueden fallar ya que el modelo se entrenó con datos en gran parte públicos.
Terminemos este caso de uso con un ejemplo divertido, concretamente una imagen
del test de Rorschach, que se ilustra en la Figura 921. Es parte de un antiguo
experimento psicológico que pone a prueba la percepción que tiene el individuo de las
manchas de tinta.8 Lo que alguien ve en una mancha de tinta de este tipo
supuestamente le dice algo sobre las características de personalidad de una persona. Es
una prueba bastante subjetiva, ¡pero eso la hace más divertida!
Machine Translated by Google
Image.open(urlopen(url)).convert("RGB")
Definitivamente puedo entender por qué la modelo usaría esa descripción para describir
esta imagen. Dado que se trata de una prueba de Rorschach, ¿qué crees que dice sobre
la modelo?
Para realizar nuestra respuesta visual a la pregunta, necesitamos darle a BLIP2 algo
más que la imagen, es decir, el mensaje. Sin él, el modelo generaría un título
como lo hizo antes. Le pediremos al modelo que describa la imagen que acabamos de
procesar:
# Generar texto
generated_ids = model.generate(**inputs, max_new_tokens=30) generated_text =
blip_processor.batch_decode( generated_ids, skip_special_tokens=True
Para ello, podemos darle al modelo nuestra conversación anterior, incluida su respuesta a
nuestra pregunta. A continuación, le formulamos una pregunta de seguimiento:
$1,000,000
Por último, podemos hacer este proceso un poco más sencillo creando un chatbot interactivo
usando ipywidgets, una extensión para Jupyter notebooks que nos permite crear botones
interactivos, introducir texto, etc:
# Crear mensaje si no es
memoria: mensaje =
de lo contrario: " Pregunta: " + pregunta + " Respuesta:"
)
Machine Translated by Google
texto_generado = texto_generado[0].strip().split("Pregunta")
[0]
# Actualizar la
memoria memory.append((pregunta, texto_generado))
# Asignar a salida
output.append_display_data(HTML("<b>USUARIO:</b> " + pregunta))
output.append_display_data(HTML("<b>BLIP2:</b> " +
texto_generado))
output.append_display_data(HTML("<br>"))
# Preparar widgets
in_text = widgets.Text()
in_text.continuous_update = False
in_text.observe(text_eventhandler, "value") salida =
widgets.Output() memoria = []
# Mostrar el cuadro de
chat
Resumen
En este capítulo, exploramos varios métodos para hacer que los LLM sean multimodales
al cerrar la brecha entre las representaciones textuales y visuales. Comenzamos
analizando los transformadores para la visión, que son modelos que convierten
imágenes en representaciones numéricas. Esto se logró mediante el uso de codificadores
de imágenes e incrustaciones de parches, que permiten que el modelo procese imágenes
a varias escalas.
Finalmente, exploramos cómo los modelos de generación de texto podrían hacerse multimodales.
y se sumergió en el modelo BLIP2. La idea central de estos textos multimodales
Los modelos de generación implican la proyección de características visuales de imágenes de entrada a
Incorporaciones de texto que pueden ser utilizadas por los LLM. Vimos cómo este modelo podría
se puede utilizar para subtítulos de imágenes y mensajes basados en chat multimodal, donde
Ambas modalidades se combinan para generar respuestas. En general, este capítulo
destacó el poder de la multimodalidad en los LLM y demostró su
aplicaciones en diversas áreas, como subtítulos de imágenes, búsqueda e indicaciones basadas
en chat.
1
Jason Wei et al. “Capacidades emergentes de modelos lingüísticos de gran tamaño”. Preimpresión de arXiv
arXiv:2206.07682 (2022).
2
Alexey Dosovitskiy et al. “Una imagen vale más que 16x16 palabras: Transformadores para la imagen”
reconocimiento a escala”. preimpresión arXiv arXiv:2010.11929 (2020).
3
Alec Radford et al. “Aprendizaje de modelos visuales transferibles a partir de la supervisión del lenguaje natural”.
Conferencia internacional sobre aprendizaje automático. PMLR, 2021.
4
Robin Rombach et al. “Síntesis de imágenes de alta resolución con modelos de difusión latente”.
Actas de la Conferencia IEEE/CVF sobre visión artificial y reconocimiento de patrones, 2022.
5
Junnan Li et al. “BLIP2: Arranque del preentrenamiento de imágenes de lenguaje con imágenes congeladas
codificadores y grandes modelos de lenguaje”. Conferencia Internacional sobre Aprendizaje Automático. PMLR,
2023.
6
Haotian Liu et al. “Ajuste de instrucciones visuales”. Avances en el procesamiento de información neuronal
Sistemas 36 (2024).
7
Hugo Laurençon et al. “¿Qué es importante a la hora de construir modelos de visión y lenguaje?”, preimpresión de arXiv
arXiv:2405.02246 (2024).
Machine Translated by Google
8
Roy Schafer. Interpretación psicoanalítica en el test de Rorschach: teoría y aplicación
(1954).
OceanofPDF.com
Machine Translated by Google
OceanofPDF.com
Machine Translated by Google
Comencemos por descubrir qué son los modelos de inserción y cómo funcionan
generalmente.
Incorporación de modelos
Las incrustaciones y los modelos de incrustación ya se han analizado en varios capítulos
(capítulos 4, 5 y 8), lo que demuestra su utilidad. Antes de comenzar a entrenar un
modelo de este tipo, repasemos lo que hemos aprendido sobre los modelos de
incrustación.
Los datos textuales no estructurados suelen ser difíciles de procesar por sí solos. No
son valores que podamos procesar, visualizar y crear resultados procesables
directamente. Primero tenemos que convertir estos datos textuales en algo que
podamos procesar fácilmente: representaciones numéricas. Este proceso se conoce a menudo como
Machine Translated by Google
Figura 101. Utilizamos un modelo de incrustación para convertir la entrada textual, como documentos, oraciones
y frases, en representaciones numéricas, llamadas incrustaciones.
Figura 102. La idea de la similitud semántica es que esperamos que los datos textuales con significados
similares estén más cerca entre sí en un espacio ndimensional (aquí se ilustran dos dimensiones).
Figura 103. Además de la similitud semántica, un modelo de incrustación se puede entrenar para que se centre en
la similitud de sentimientos. En esta figura, las reseñas negativas (en rojo) están cerca unas de otras y son diferentes a
las reseñas positivas (en verde).
Hay muchas maneras en las que podemos entrenar, ajustar y guiar modelos
de incrustación, pero una de las técnicas más sólidas y más utilizadas se
denomina aprendizaje contrastivo.
Figura 104. El aprendizaje contrastivo tiene como objetivo enseñar a un modelo de integración si los documentos
son similares o diferentes. Para ello, presenta grupos de documentos a un modelo que son similares o diferentes
en un cierto grado.
que definen el concepto, pero también las características que no están relacionadas.
Obtenemos más información cuando formulamos una pregunta como un contraste.
Ilustramos más este concepto de explicación contrastiva en la Figura 105.
Figura 105. Cuando introducimos distintos contrastes (grados de similitud) en un modelo de incrustación, este
comienza a aprender qué hace que las cosas sean diferentes entre sí y, por lo tanto, las características distintivas
de los conceptos.
NOTA
Uno de los primeros y más populares ejemplos de aprendizaje contrastivo en PNL es word2vec, como
analizamos en los capítulos 1 y 2. El modelo aprende representaciones de palabras mediante el
entrenamiento con palabras individuales en una oración. Una palabra cercana a una palabra
objetivo en una oración se construirá como un par positivo, mientras que las palabras
muestreadas aleatoriamente constituyen pares diferentes. En otras palabras, los ejemplos positivos
de palabras vecinas se contrastan con palabras seleccionadas aleatoriamente que no son vecinas.
Aunque no es muy conocido, es uno de los primeros avances importantes en PNL que aprovecha
el aprendizaje contrastivo con redes neuronales.
Hay muchas formas en las que podemos aplicar el aprendizaje contrastivo para
crear modelos de incrustación de texto, pero la técnica y el marco más conocidos son
los transformadores de oraciones.
SBERTO
Aunque existen muchas formas de aprendizaje contrastivo, un marco que ha popularizado
la técnica dentro de la comunidad de procesamiento del lenguaje natural son los
transformadores de oraciones. 3 Su enfoque soluciona un problema importante
Machine Translated by Google
Figura 106. Arquitectura de un codificador cruzado. Ambas oraciones se concatenan, se separan con un
token <SEP> y se envían al modelo simultáneamente.
Machine Translated by Google
Figura 107. Arquitectura del modelo original de transformadores de oraciones , que aprovecha una
red siamesa, también llamada bicodificador.
junto con la diferencia entre las incrustaciones. Luego, esta incrustación resultante se optimiza mediante un
clasificador softmax.
La arquitectura resultante también se conoce como bicodificador o SBERT (por el término inglés sentence
BERT). Si bien un bicodificador es bastante rápido y crea representaciones precisas de oraciones, los
no generan incrustaciones.
la (des)similitud entre pares de oraciones, el modelo eventualmente aprenderá las cosas que hacen que
Para realizar el aprendizaje contrastivo, necesitamos dos cosas. En primer lugar, necesitamos datos que
constituyan pares similares/diferentes. En segundo lugar, tendremos que definir cómo el modelo define y
optimiza la similitud.
muchos modelos de incrustación, ya que el proceso les permite aprender representaciones semánticas
de manera eficiente.
Sin embargo, este no es un proceso gratuito. Necesitaremos entender cómo generar ejemplos
datos de inferencia de lenguaje natural (NLI). NLI se refiere a la tarea de investigar si, para una premisa dada,
Por ejemplo, cuando la premisa es “Está en el cine viendo Coco” y la hipótesis “Está viendo Frozen en casa”,
entonces estas afirmaciones son contradictorias. Por el contrario, cuando la premisa es “Está en el cine
viendo Coco” y la hipótesis “Está en casa viendo Frozen”, entonces estas afirmaciones son contradictorias .
Machine Translated by Google
Si se considera que el sujeto está viendo la película Coco de Disney y la hipótesis “En el cine
está viendo la película Coco de Disney”, entonces estas afirmaciones se consideran
implicación. Este principio se ilustra en la Figura 108.
Figura 108. Podemos aprovechar la estructura de los conjuntos de datos NLI para generar ejemplos
negativos (contradicciones) y ejemplos positivos (consecuencias) para el aprendizaje contrastivo.
Los datos que vamos a utilizar durante la creación y el ajuste de los modelos de incrustación
se derivan del parámetro de evaluación de comprensión del lenguaje general (GLUE).
Este parámetro de GLUE consta de nueve tareas de comprensión del lenguaje para
evaluar y analizar el rendimiento del modelo.
Una de estas tareas es el corpus de inferencia de lenguaje natural multigénero (MNLI), que
es una colección de 392.702 pares de oraciones anotadas con implicación
(contradicción, neutralidad, implicación). Utilizaremos un subconjunto de los datos, 50.000
pares de oraciones anotadas, para crear un ejemplo mínimo que no necesite ser entrenado
durante horas y horas. Sin embargo, tenga en cuenta que cuanto más pequeño sea el
conjunto de datos, más inestable será el entrenamiento o el ajuste fino de un modelo de
incrustación. Si es posible, se prefieren conjuntos de datos más grandes suponiendo que
siguen siendo datos de calidad:
).select(range(50_000))
conjunto_de_datos_de_tren = conjunto_de_datos_de_tren.remove_columns("idx")
conjunto de datos[2]
{'premise': 'Uno de los nuestros llevará a cabo sus instrucciones minuciosamente.', 'hypothesis': 'Un miembro
de mi equipo
ejecutará sus órdenes
con inmensa precisión.', 'label': 0}
Modelo de tren
Ahora que tenemos nuestro conjunto de datos con ejemplos de entrenamiento,
necesitaremos crear nuestro modelo de incrustación. Normalmente, elegimos un modelo
de transformadores de oraciones existente y lo ajustamos, pero en este ejemplo, vamos
a entrenar una incrustación desde cero.
Esto significa que tendremos que definir dos cosas. Primero, un modelo Transformer
preentrenado que sirva para incorporar palabras individuales. Usaremos el modelo base
BERT (sin mayúsculas ni minúsculas). ya que es un gran modelo de introducción.
Sin embargo, existen muchos otros que también se han evaluado utilizando
transformadores de oraciones. En particular, microsoft/mpnetbase suele dar buenos
resultados cuando se utiliza como modelo de incrustación de palabras.
NOTA
De forma predeterminada, todas las capas de un LLM en transformadores de oraciones son entrenables.
Con fines ilustrativos, lo usaremos por ahora, pero analizaremos pérdidas de mayor rendimiento
más adelante:
dimensión_de_incrustación_de_oración=modelo_de_incrustación.obtener_dimensión_de_incrustación_de_oración
(), num_etiquetas=3
Antes de entrenar nuestro modelo, definimos un evaluador para evaluar el rendimiento del
modelo durante el entrenamiento, que también determina el mejor modelo para guardar.
Utilizamos este conjunto de datos para explorar el rendimiento de nuestro modelo en esta tarea
de similitud semántica. Además, procesamos los datos de STSB para asegurarnos de que todos
los valores estén entre 0 y 1:
de sentence_transformers.evaluation importar
EmbeddingSimilarityEvaluator
Machine Translated by Google
de sentence_transformers.training_args importar
ArgumentosDeEntrenamientoDeSentenciaTransformer
num_train_epochs
GPU o CPU) durante la evaluación. Los valores más altos generalmente significan mayor velocidad.
capacitación.
Machine Translated by Google
que se procesarán simultáneamente en cada dispositivo (por ejemplo, GPU o CPU) durante la
evaluación. Los valores más altos generalmente significan una evaluación más rápida.
evaluación.
pasos de calentamiento
Tenga en cuenta que no especificamos una tasa de aprendizaje personalizada para este
proceso de entrenamiento.
FP16
donde los cálculos se realizan utilizando números de punto flotante de 16 bits (FP16) en lugar
de los 32 bits predeterminados (FP32). Esto reduce el uso de memoria y potencialmente aumenta
la velocidad de entrenamiento.
Ahora que hemos definido nuestros datos, el modelo de incrustación, la pérdida y el evaluador,
podemos comenzar a entrenar nuestro modelo. Podemos hacerlo
usando SentenceTransformerTrainer:
) entrenador.train()
Machine Translated by Google
{'coseno_de_pearson': 0,5982288436666162,
'coseno_de_spearman': 0,6026682018489217,
'manhattan_de_pearson': 0,6100690915500567,
'manhattan_de_spearman': 0,617732600131989,
'euclidiano_de_pearson': 0,6079280934202278,
'euclidiano_de_spearman': 0,6158926913905742, 'punto_de_pearson':
0,38364924527804595, 'punto_de_spearman':
0,37008497926991796, 'pearson_max': 0,6100690915500567,
'spearman_max': 0,617732600131989}
CONSEJO
Los tamaños de lote más grandes tienden a funcionar mejor con pérdida de clasificaciones negativas
múltiples (MNR), ya que un lote más grande dificulta la tarea. La razón de esto es que el modelo necesita
encontrar la oración que mejor coincida de un conjunto más grande de pares de oraciones potenciales.
Puede adaptar el código para probar diferentes tamaños de lote y tener una idea de sus efectos.
Evaluación en profundidad
Se desarrolló el modelo de referencia (MTEB).5 El MTEB abarca ocho tareas de integración que cubren
58 conjuntos de datos y 112 idiomas.
Para comparar públicamente los modelos de incrustación de última generación, se creó una tabla de
clasificación Se creó con las puntuaciones de cada modelo de incrustación en todas las tareas:
Esto nos proporciona varias métricas de evaluación para esta tarea específica que podemos usar
para explorar su desempeño.
Lo bueno de este modelo de evaluación no es solo la diversidad de tareas e idiomas, sino que también
se ahorra tiempo de evaluación. Aunque existen muchos modelos de incrustación, normalmente queremos
aquellos que sean precisos y tengan baja latencia. Las tareas para las que se utilizan modelos
de incrustación, como la búsqueda semántica, suelen beneficiarse de una inferencia rápida y la
requieren.
Dado que probar su modelo en todo el MTEB puede llevar un par de horas dependiendo de su GPU,
utilizaremos el benchmark STSB a lo largo de este capítulo con fines ilustrativos.
Machine Translated by Google
CONSEJO
Cuando haya terminado de entrenar y evaluar su modelo, es importante reiniciar el notebook. Esto
limpiará su VRAM para los próximos ejemplos de entrenamiento a lo largo de este capítulo. Al
reiniciar el notebook, podemos estar seguros de que toda la VRAM se haya limpiado.
Funciones de pérdida
Entrenamos nuestro modelo utilizando la pérdida softmax para ilustrar cómo se entrenó uno
de los primeros modelos de transformadores de oraciones. Sin embargo, no solo hay una
gran variedad de funciones de pérdida para elegir, sino que la pérdida softmax generalmente
no se recomienda ya que existen pérdidas de mayor rendimiento.
En lugar de analizar cada una de las funciones de pérdida que existen, hay dos funciones de pérdida
que se utilizan habitualmente y que parecen funcionar generalmente bien, a saber:
Semejanza de coseno
NOTA
Hay muchas más funciones de pérdida para elegir que las que se analizan aquí. Por ejemplo, una
pérdida como MarginMSE funciona muy bien para entrenar o ajustar un codificador cruzado.
Hay una serie de funciones de pérdida interesantes implementadas en el marco de los
transformadores de oraciones.
Semejanza de coseno
La pérdida de similitud de coseno es una pérdida intuitiva y fácil de usar que funciona en muchos
casos de uso y conjuntos de datos diferentes. Se suele utilizar en tareas de similitud textual semántica.
En estas tareas, se asigna una puntuación de similitud a los pares de textos sobre los que
optimizamos el modelo.
En lugar de tener pares de oraciones estrictamente positivas o negativas, asumimos pares de oraciones
que son similares o diferentes hasta cierto grado.
Machine Translated by Google
Figura 109. La pérdida de similitud de coseno tiene como objetivo minimizar la distancia del coseno entre
oraciones semánticamente similares y maximizar la distancia entre oraciones semánticamente diferentes.
La implicación representa una alta similitud entre las oraciones, por lo que le damos una
puntuación de similitud de 1. Por el contrario, dado que tanto la neutralidad como la
contradicción representan disimilitud, les damos a estas etiquetas una puntuación de similitud de 0:
"pegamento", "mnli",
dividir="tren" ).seleccionar(rango(50_000))
conjunto_de_datos_del_tren = conjunto_de_datos_del_tren.eliminar_columnas("idx")
Luego, seguimos los mismos pasos que antes pero seleccionamos una pérdida diferente:
SentenceTransformerTrainer de
sentence_transformers.training_args importa SentenceTransformerTrainingArguments
# Definir modelo
embedding_model = SentenceTransformer("bertbaseuncased")
# Función de pérdida
train_loss = pérdidas.CosineSimilarityLoss(modelo=embedding_model)
# Entrenar modelo
trainer = SentenceTransformerTrainer( modelo=modelo_incrustado,
args=args,
) entrenador.train()
{'coseno_de_pearson': 0,7222322163831805,
'coseno_de_spearman': 0,7250508271229599,
'manhattan_de_pearson': 0,7338163436711481,
'manhattan_de_spearman': 0,7323479193408869,
'euclidiano_de_pearson': 0,7332716434966307,
'euclidiano_de_spearman': 0,7316999722750905, 'punto_de_pearson':
0,660366792336156, 'punto_de_spearman':
0,6624167554844425,
Machine Translated by Google
'pearson_max': 0,7338163436711481,
'spearman_max': 0,7323479193408869}
Una puntuación de coseno de Pearson de 0,72 es una gran mejora en comparación con el
ejemplo de pérdida de softmax, que obtuvo una puntuación de 0,59. Esto demuestra el impacto que
puede tener la función de pérdida en el rendimiento.
Asegúrese de reiniciar su computadora portátil para que podamos explorar una pérdida más común y de
mayor rendimiento, es decir, la pérdida de clasificación de múltiples negativos.
NTXentLoss,8 es una pérdida que utiliza pares de oraciones positivas o tripletes que contienen un par de
oraciones positivas y una oración adicional no relacionada. Esta oración no relacionada se
denomina negativa y representa la disimilitud entre las oraciones positivas.
Por ejemplo, puede tener pares de pregunta/respuesta, imagen/título de imagen, título del
artículo/resumen del artículo, etc. Lo bueno de estos pares es que podemos estar seguros de que son
pares positivos sólidos. En la pérdida de MNR (Figura 1010), los pares negativos se
construyen mezclando un par positivo con otro par positivo. En el ejemplo de un título y resumen
de un artículo, generaría un par negativo combinando el título de un artículo con un resumen
completamente diferente. Estos negativos se denominan negativos en lote y también se pueden
utilizar para generar los tripletes.
Machine Translated by Google
Figura 1010. La pérdida de clasificación por múltiples negativos tiene como objetivo minimizar la distancia entre pares de
texto relacionados, como preguntas y respuestas, y maximizar la distancia entre pares de texto no relacionados, como
preguntas y respuestas no relacionadas.
Después de haber generado estos pares positivos y negativos, calculamos sus incrustaciones
y aplicamos la similitud de coseno. Estos puntajes de similitud se utilizan luego para
responder la pregunta: ¿estos pares son negativos o positivos? En otras palabras, se trata
como una tarea de clasificación y podemos usar la pérdida de entropía cruzada para optimizar el
modelo.
Para crear estos tripletes, comenzamos con una oración de referencia (es decir, etiquetada
como “premisa”), que se utiliza para comparar otras oraciones. Luego, utilizando el
conjunto de datos MNLI, solo seleccionamos pares de oraciones que sean positivas (es decir,
etiquetadas como “consecuencia”). Para agregar oraciones negativas, tomamos muestras
aleatorias de oraciones como “hipótesis”.
Machine Translated by Google
importar aleatorio
desde tqdm importar tqdm desde
conjuntos de datos importar conjunto de datos, cargar_conjunto de datos
conjunto_de_datos_de_tren["ancla"].append(fila["premisa"])
conjunto_de_datos_de_tren["positivo"].append(fila["hipótesis"])
conjunto_de_datos_de_tren["negativo"].append(negativo_suave)
conjunto_de_datos_de_tren = Conjunto_de_datos.from_dict(conjunto_de_datos_de_tren)
de sentence_transformers.training_args importar
ArgumentosDeEntrenamientoDeSentenciaTransformer
# Definir modelo
embedding_model = SentenceTransformer('bertbaseuncased')
# Función de pérdida
train_loss =
pérdidas.MultipleNegativesRankingLoss(model=embedding_model)
# Entrenar modelo
trainer = SentenceTransformerTrainer( modelo=modelo_incrustado,
args=args,
) entrenador.train()
Veamos cómo se comparan este conjunto de datos y la función de pérdida con nuestros
ejemplos anteriores:
{'coseno_de_pearson': 0,8093892326162132,
'coseno_de_spearman': 0,8121064796503025,
'manhattan_de_pearson': 0,8215001523827565,
'manhattan_de_spearman': 0,8172161486524246,
'euclidiana_de_pearson': 0,8210391407846718,
'euclidiana_de_spearman': 0,8166537141010816, 'punto_de_pearson':
0,7473360302629125,
Machine Translated by Google
En comparación con nuestro modelo entrenado previamente con pérdida softmax (0,72),
¡nuestro modelo con pérdida MNR (0,80) parece ser mucho más preciso!
CONSEJO
Los tamaños de lote más grandes tienden a ser mejores con la pérdida de MNR, ya que un lote más
grande hace que la tarea sea más difícil. La razón de esto es que el modelo necesita encontrar la
oración que mejor coincida de un conjunto más grande de pares de oraciones potenciales. Puede adaptar el
código para probar diferentes tamaños de lote y tener una idea de los efectos.
Hay una desventaja en la forma en que usamos esta función de pérdida. Dado que los
negativos se toman de otros pares de preguntas/respuestas, estos negativos en
lote o "fáciles" que usamos podrían potencialmente no estar relacionados en absoluto
con la pregunta. Como resultado, la tarea del modelo de incrustación de encontrar la
respuesta correcta a una pregunta se vuelve bastante fácil. En cambio, nos gustaría
tener negativos que estén muy relacionados con la pregunta pero que no sean la respuesta correcta.
Estos negativos se denominan negativos duros. Dado que esto dificultaría la tarea del
modelo de incrustación, ya que debe aprender representaciones más matizadas, el
rendimiento del modelo de incrustación generalmente mejora bastante.
Figura 1011. Una negativa fácil generalmente no está relacionada con la pregunta ni con la respuesta. Una negativa
semidura tiene algunas similitudes con el tema de la pregunta y la respuesta, pero no está relacionada en absoluto.
Una negativa dura es muy similar a la pregunta, pero generalmente es la respuesta incorrecta.
Negativos fáciles
Negativos semiduros
todas las incrustaciones de oraciones para encontrar aquellas que están altamente relacionadas. Generalmente,
Esto no conduce a negaciones duras ya que este método simplemente encuentra oraciones
Negativos duros
semiduras) o puede usar un modelo generativo para juzgar o generar pares de oraciones.
Machine Translated by Google
Asegúrese de reiniciar su computadora portátil para que podamos explorar los diferentes métodos
para ajustar los modelos de incrustación.
En cambio, el marco de trabajo de los transformadores de oraciones permite que casi todos los
modelos de incrustación se utilicen como base para realizar ajustes. Podemos elegir un modelo de
incrustación que ya se haya entrenado con una gran cantidad de datos y ajustarlo para nuestros
datos o propósitos específicos.
Supervisado
La forma más sencilla de ajustar un modelo de incrustación es repetir el proceso de entrenamiento de
nuestro modelo como lo hicimos antes, pero reemplazando el modelo 'bertbaseuncased' con un
modelo de transformadores de oraciones previamente entrenado. Hay muchos para elegir,
pero en general, el modelo allMiniLML6 v2 funciona bien en muchos casos de uso. y debido a su
pequeño tamaño es bastante rápido.
Usamos los mismos datos que usamos para entrenar nuestro modelo en el ejemplo de
"pegamento", "mnli",
Los pasos de entrenamiento son similares a nuestros ejemplos anteriores, pero en lugar
de usar 'bertbaseuncased', podemos usar un modelo de incrustación entrenado
previamente:
# Definir modelo
embedding_model = SentenceTransformer('sentencetransformers/all
MiniLML6v2')
# Función de pérdida
train_loss =
pérdidas.MultipleNegativesRankingLoss(model=embedding_model)
pasos_de_registro=100,
)
# Entrenar modelo
trainer = SentenceTransformerTrainer( modelo=modelo_incrustado,
args=args,
) entrenador.train()
{'coseno_de_pearson': 0,8509553350510896,
'coseno_de_spearman': 0,8484676559567688,
'manhattan_de_pearson': 0,8503896832470704,
'manhattan_de_spearman': 0,8475760325664419,
'euclidiana_de_pearson': 0,8513115442079158,
'euclidiana_de_spearman': 0,8484676559567688, 'punto_de_pearson':
0,8489553386816947, 'punto_de_spearman':
0,8484676559567688, 'pearson_max': 0,8513115442079158,
'spearman_max': 0,8484676559567688}
Aunque la puntuación de 0,85 es la más alta que hemos visto hasta ahora, el modelo entrenado
previamente que utilizamos para el ajuste fino ya se había entrenado en el conjunto de datos
MNLI completo, mientras que nosotros solo utilizamos 50 000 ejemplos. Puede parecer
redundante, pero este ejemplo demuestra cómo ajustar un modelo de incrustación entrenado
previamente en sus propios datos.
Machine Translated by Google
CONSEJO
Tenga en cuenta que la principal dificultad de entrenar o ajustar su modelo es encontrar los datos
correctos. Con estos modelos, no solo queremos tener conjuntos de datos muy grandes,
sino que los datos en sí deben ser de alta calidad. Desarrollar pares positivos
generalmente es sencillo, pero agregar pares negativos estrictos aumenta significativamente
la dificultad de crear datos de calidad.
Como siempre, reinicie su computadora portátil para liberar VRAM para los siguientes
ejemplos.
SBERT aumentada
Una desventaja de entrenar o ajustar estos modelos de incrustación es que a menudo
requieren una cantidad sustancial de datos de entrenamiento. Muchos de estos modelos
se entrenan con más de mil millones de pares de oraciones. Por lo general, no es posible
extraer una cantidad tan alta de pares de oraciones para su caso de uso, ya que en muchos
casos solo hay un par de miles de puntos de datos etiquetados disponibles.
Afortunadamente, existe una forma de aumentar sus datos de modo que se pueda ajustar un
modelo de incorporación cuando solo hay unos pocos datos etiquetados disponibles.
9
Este procedimiento se denomina SBERT aumentado.
Como se muestra en la Figura 1012, SBERT Aumentado implica los siguientes pasos:
1. Ajuste un codificador cruzado (BERT) utilizando un conjunto de datos pequeño y anotado (conjunto
de datos de oro).
3. Etiquete los nuevos pares de oraciones con el codificador cruzado afinado (plata)
conjunto de datos).
conjunto de datos).
En este caso, un conjunto de datos de oro es un conjunto de datos pequeño pero completamente anotado
que contiene la verdad fundamental. Un conjunto de datos de plata también está completamente anotado,
Figura 1012. La SBERT aumentada funciona mediante el entrenamiento de un codificador cruzado en un pequeño conjunto de datos de oro y
luego lo utiliza para etiquetar un conjunto de datos sin etiquetar para generar un conjunto de datos de plata más grande. Finalmente, tanto
los conjuntos de datos de oro como de plata se utilizan para entrenar el bicodificador.
Antes de pasar a los pasos anteriores, preparemos primero los datos. En lugar de los 50 000 documentos
originales, tomamos un subconjunto de 10 000 documentos para simular un entorno en el que tenemos datos
anotados limitados. Como hicimos en nuestro ejemplo con pérdida de similitud de coseno, le damos a la
implicación una puntuación de 1, mientras que a la neutralidad y la contradicción les damos una puntuación
de 0:
# Cargador de datos
gold_examples = [
InputExample(textos=[fila["premisa"], fila["hipótesis"]],
etiqueta=mapping[fila["etiqueta"]]) para la fila
en tqdm(conjunto de datos)
Este es el conjunto de datos de oro, ya que está etiquetado y representa nuestra verdad fundamental.
Usando este conjunto de datos de oro, entrenamos nuestro codificador cruzado (paso 1):
show_progress_bar=True,
warmup_steps=100,
use_amp=False
)
Machine Translated by Google
Después de entrenar nuestro codificador cruzado, utilizamos los 400.000 pares de oraciones restantes
(de nuestro conjunto de datos original de 50.000 pares de oraciones) como nuestro conjunto de
datos de plata (paso 2):
# Prepare el conjunto de datos de plata prediciendo etiquetas con el codificador cruzado silver = load_dataset( "glue",
"mnli",
split="train"
CONSEJO
Si no tiene pares de oraciones adicionales sin etiquetar, puede tomar una muestra aleatoria de ellos
de su conjunto de datos original. Para ilustrarlo, puede crear un nuevo par de oraciones tomando la
premisa de una fila y la hipótesis de otra. Esto le permite generar fácilmente 10 veces más pares de
oraciones que se pueden etiquetar con el codificador cruzado.
Esta estrategia, sin embargo, probablemente genere pares significativamente más diferentes que similares.
En cambio, podemos utilizar un modelo de incrustación entrenado previamente para incrustar todos los pares de
oraciones candidatas y recuperar las k oraciones principales para cada oración de entrada mediante una
búsqueda semántica. Este proceso de reordenamiento aproximado nos permite centrarnos en los pares de
oraciones que probablemente sean más similares. Aunque las oraciones se siguen eligiendo en función de una
aproximación, ya que el modelo de incrustación entrenado previamente no se entrenó con nuestros datos, es mucho
mejor que el muestreo aleatorio.
Tenga en cuenta que asumimos que estos pares de oraciones no están etiquetados en este ejemplo.
Utilizaremos nuestro codificador cruzado perfeccionado para etiquetar estos pares de oraciones (paso 3):
# Etiquete los pares de oraciones usando nuestro codificador cruzado ajustado output =
cross_encoder.predict( pairs, apply_softmax=True,
show_progress_bar=True ) silver =
pd.DataFrame(
Machine Translated by Google
{
"oración1": plata["premisa"], "oración2":
plata["hipótesis"], "etiqueta": np.argmax(salida, eje=1)
}
)
Ahora que tenemos un conjunto de datos de plata y oro, simplemente los combinamos y
entrenamos nuestro modelo de incorporación como lo hicimos antes:
Entrenamos el modelo igual que antes excepto que ahora usamos el conjunto de datos aumentado:
# Definir modelo
Machine Translated by Google
modelo_de_incrustación = Transformador_de_sentencia("bertbasesincasilla")
# Función de pérdida
train_loss = pérdidas.CosineSimilarityLoss(modelo=embedding_model)
# Entrenar modelo
trainer = SentenceTransformerTrainer( modelo=modelo_incrustado,
args=args,
) entrenador.train()
evaluador(modelo_incrustado)
{'coseno_de_pearson': 0,7101597020018693,
'coseno_de_spearman': 0,7210536464320728,
'manhattan_de_pearson': 0,7296749443525249,
'manhattan_de_spearman': 0,7284184255293913,
'euclidiana_de_pearson': 0,7293097297208753,
'euclidiana_de_spearman': 0,7282830906742256, 'punto_de_pearson':
0,6746605824703588, 'punto_de_spearman':
0,6754486790570754, 'pearson_max': 0,7296749443525249,
'spearman_max': 0,7284184255293913}
Machine Translated by Google
El ejemplo original de pérdida de similitud de coseno tenía una puntuación de 0,72 con el conjunto
de datos completo. ¡Usando solo el 20 % de esos datos, logramos obtener una puntuación de 0,71!
Este método nos permite aumentar el tamaño de los conjuntos de datos que ya tiene disponibles sin
necesidad de etiquetar manualmente cientos de miles de pares de oraciones. Puede probar
la calidad de sus datos de plata entrenando también su modelo de incrustación solo en el conjunto
de datos de oro. La diferencia en el rendimiento indica cuánto puede agregar
potencialmente su conjunto de datos de plata a la calidad del modelo.
Puedes reiniciar tu notebook una última vez para el último ejemplo, es decir, el aprendizaje no
supervisado.
Aprendizaje no supervisado
Para crear un modelo de incrustación, normalmente necesitamos datos etiquetados. Sin embargo, no
todos los conjuntos de datos del mundo real vienen con un buen conjunto de etiquetas que podamos usar.
En esta sección, nos centraremos en TSDAE, ya que ha demostrado un gran rendimiento en tareas
no supervisadas así como en adaptación de dominio.
TSDAE es un enfoque muy elegante para crear un modelo de incrustación con aprendizaje no
supervisado. El método supone que no tenemos datos etiquetados y no requiere que creemos
etiquetas de forma artificial.
La idea subyacente de TSDAE es que agregamos ruido a la oración de entrada eliminando un cierto
porcentaje de palabras de ella. Esta oración "dañada" se pasa a través de un codificador, con una
capa de agrupamiento encima, para asignarla a una incrustación de oración. A partir de esta
incrustación de oración, un decodificador intenta
Machine Translated by Google
Reconstruir la oración original a partir de la oración “dañada”, pero sin el ruido artificial.
El concepto principal aquí es que cuanto más precisa sea la inserción de la oración,
más precisa será la oración reconstruida.
Figura 1013. TSDAE elimina aleatoriamente palabras de una oración de entrada que se pasa a través de un
codificador para generar una incrustación de oración. A partir de esta incrustación de oración, se reconstruye la
oración original.
Machine Translated by Google
Dado que solo necesitamos un conjunto de oraciones sin etiquetas, entrenar este modelo es
sencillo. Comenzamos descargando un tokenizador externo, que se utiliza para el procedimiento
de eliminación de ruido:
Luego, creamos oraciones planas a partir de nuestros datos y eliminamos cualquier etiqueta que
tengamos para imitar una configuración no supervisada:
conjunto_de_datos_de_tren["oración_dañada"].append(datos.textos[0])
conjunto_de_datos_de_tren["oración_original"].append(datos.textos[1])
conjunto_de_datos_de_tren = Conjunto_de_datos.from_dict(conjunto_de_datos_de_tren)
Esto crea un conjunto de datos de 50.000 oraciones. Cuando examinamos los datos, observamos
que la primera oración es la oración dañada y la segunda la original:
conjunto_de_datos_del_tren[0]
La primera oración muestra los datos “ruidosos”, mientras que la segunda muestra la
oración de entrada original. Después de crear nuestros datos, definimos nuestro evaluador
como antes:
de sentence_transformers.evaluation importar
EmbeddingSimilarityEvaluator
A continuación, ejecutamos el entrenamiento como antes, pero con el token [CLS] como
estrategia de agrupación en lugar de la agrupación media de las incrustaciones de
tokens. En el artículo de TSDAE, se demostró que esto era más eficaz, ya que la
agrupación media pierde la información de posición, lo que no sucede cuando se utiliza el
token [CLS]:
embedding_model = SentenceTransformer(modules=
[word_embedding_model, pooling_model])
Representar con precisión los datos. Es similar al enmascaramiento, pero sin saber dónde están las
máscaras reales.
Además, vinculamos los parámetros de ambos modelos. En lugar de tener pesos separados para la capa
de incrustación del codificador y la capa de salida del decodificador, comparten los mismos pesos. Esto
significa que cualquier actualización de los pesos en una capa se reflejará también en la otra capa:
) pérdida_de_tren.decodificador = pérdida_de_tren.decodificador.to("cuda")
Finalmente, el entrenamiento de nuestro modelo funciona de la misma manera que hemos visto varias
veces antes, pero reducimos el tamaño del lote a medida que aumenta la memoria con esta
función de pérdida:
# Entrenar modelo
trainer = SentenceTransformerTrainer( modelo=embedding_model,
args=args,
Machine Translated by Google
conjunto_de_datos_de_tren=conjunto_de_datos_de_tren,
pérdida=pérdida_de_tren,
evaluador=evaluador
) entrenador.train()
Después del entrenamiento, evaluamos nuestro modelo para explorar qué tan bien funciona
esta técnica no supervisada:
{'coseno_de_pearson': 0,6991809700971775,
'coseno_de_spearman': 0,713693213167873,
'manhattan_de_pearson': 0,7152343356643568,
'manhattan_de_spearman': 0,7201441944880915,
'euclidiana_de_pearson': 0,7151142243297436,
'euclidiana_de_spearman': 0,7202291660769805, 'punto_de_pearson':
0,5198066451871277, 'punto_de_spearman':
0,5104025515225046, 'pearson_max': 0,7152343356643568,
'spearman_max': 0,7202291660769805}
Después de ajustar nuestro modelo, obtuvimos una puntuación de 0,70, lo cual es bastante
impresionante considerando que hicimos todo este entrenamiento con datos sin etiquetar.
Aquí es donde entra en juego la adaptación de dominios . Su objetivo es actualizar los modelos de
incrustación existentes a un dominio textual específico que contiene diferentes temas del dominio
de origen. La Figura 1014 demuestra cómo los dominios pueden diferir en contenido. El dominio de
destino, o dominio externo, generalmente contiene palabras y temas que no se encontraron en el dominio
de origen o en el dominio interno.
Machine Translated by Google
Figura 1015. La adaptación del dominio se puede realizar con preentrenamiento adaptativo y ajuste fino
adaptativo.
Con todo lo que aprendió en este capítulo, debería poder reproducir esta secuencia de
comandos. Primero, puede comenzar con TSDAE para entrenar un modelo de
incrustación en su dominio de destino y luego ajustarlo con entrenamiento supervisado
general o SBERT aumentado.
Resumen
En este capítulo, analizamos la creación y el ajuste de modelos de incrustación
mediante diversas tareas. Analizamos el concepto de incrustaciones y su función en la
representación de datos textuales en un formato numérico. Luego, exploramos la técnica
fundamental de muchos modelos de incrustación, a saber, el aprendizaje contrastivo,
que aprende principalmente de pares de documentos (diferentes).
Se discutieron métodos como SBERT aumentado y TSDAE para la adaptación del dominio.
En comparación con la creación de un modelo de incrustación, el ajuste fino generalmente requiere menos
datos y es una excelente manera de adaptar los modelos de integración existentes a su dominio.
1
Alan Garfinkel. Formas de explicación: replanteando las cuestiones en la teoría social. Universidad de Yale
Prensa Universitaria (1982).
2
Tim Miller. “Explicación contrastiva: un enfoque de modelo estructural”. The Knowledge
Revista de Ingeniería 36 (2021): e14.
3
Nils Reimers e Iryna Gurevych. “SentenceBERT: incrustaciones de oraciones utilizando siameses
Redes BERT”. Preimpresión arXiv arXiv:1908.10084 (2019).
4
Jeffrey Pennington, Richard Socher y Christopher D. Manning. “GloVe: Vectores globales para
Representación de palabras”. Actas de la Conferencia de 2014 sobre métodos empíricos en ciencias naturales
Procesamiento del lenguaje (EMNLP). 2014.
5
Niklas Muennighoff et al. “MTEB: Punto de referencia de incrustación de texto masivo”. Preimpresión de arXiv
arXiv:2210.07316 (2022).
6
Matthew Henderson et al. “Sugerencia de respuesta en lenguaje natural eficiente para una respuesta inteligente”.
Preimpresión de arXiv arXiv:1705.00652 (2017).
7
Aaron van den Oord, Yazhe Li y Oriol Vinyals. “Aprendizaje de representación con contraste
codificación predictiva”. preimpresión arXiv arXiv:1807.03748 (2018).
8
Ting Chen et al. “Un marco simple para el aprendizaje contrastivo de representaciones visuales”.
Conferencia internacional sobre aprendizaje automático. PMLR, 2020.
9
Nandan Thakur et al. “SBERT aumentada: método de aumento de datos para mejorar los bicodificadores
para tareas de puntuación de oraciones por pares”. Preimpresión de arXiv arXiv:2010.08240 (2020).
10
Tianyu Gao, Xingcheng Yao y Danqi Chen. “SimCSE: aprendizaje contrastivo simple de
incrustaciones de oraciones”. preimpresión arXiv arXiv:2104.08821 (2021).
11
Fredrik Carlsson et al. “Reajuste semántico con tensión contrastiva”. Internacional
Conferencia sobre Representaciones del Aprendizaje, 2021. 2021.
12
Kexin Wang, Nils Reimers e Iryna Gurevych. “TSDAE: uso de transformadores basados en
Codificador automático de eliminación de ruido secuencial para el aprendizaje de incrustación de oraciones no supervisadas”. arXiv
preimpresión arXiv:2104.06979 (2021).
Machine Translated by Google
13
Kexin Wang et al. “GPL: etiquetado pseudogenerativo para la adaptación de dominios no supervisados de
recuperación densa”. preimpresión arXiv arXiv:2112.07577 (2021).
OceanofPDF.com
Machine Translated by Google
Si tenemos suficientes datos, el ajuste fino tiende a dar lugar a algunos de los modelos
con mejor rendimiento posible. En este capítulo, repasaremos varios métodos y
aplicaciones para ajustar los modelos BERT. En “Clasificación supervisada” se muestra
el proceso general de ajuste fino de un modelo de clasificación. Luego, en
“Clasificación de pocos intentos”, analizamos SetFit, que es un método para ajustar de manera
eficiente un modelo de alto rendimiento utilizando una pequeña cantidad de ejemplos de
entrenamiento. En “Preentrenamiento continuo con modelado de lenguaje enmascarado”,
exploraremos cómo continuar entrenando un modelo preentrenado. Por último, en
“Reconocimiento de entidades con nombre”, se explora la clasificación a nivel de token.
Clasificación supervisada
En el Capítulo 4, exploramos tareas de clasificación supervisada aprovechando modelos
de representación previamente entrenados que fueron entrenados para predecir
sentimientos (modelo específico de la tarea) o para generar incrustaciones (modelo de
incrustación), como se muestra en la Figura 111.
Machine Translated by Google
Figura 111. En el Capítulo 4, utilizamos modelos entrenados previamente para realizar la clasificación sin actualizar su
ponderación. Estos modelos se mantuvieron “congelados”.
Ambos modelos se mantuvieron congelados (no se pueden entrenar) para mostrar el potencial de
aprovechar los modelos entrenados previamente para las tareas de clasificación. El modelo de integración
utiliza un cabezal de clasificación (clasificador) que se puede entrenar por separado para predecir
el sentimiento de las críticas cinematográficas.
En esta sección, adoptaremos un enfoque similar, pero permitiremos que tanto el modelo como el
cabezal de clasificación se actualicen durante el entrenamiento. Como se muestra en la Figura
112, en lugar de utilizar un modelo de incrustación, ajustaremos un modelo BERT previamente
entrenado para crear un modelo específico de la tarea similar al que utilizamos en el Capítulo 2. En
comparación con el enfoque del modelo de incrustación, ajustaremos tanto el modelo de representación
como el cabezal de clasificación como una única arquitectura.
Machine Translated by Google
Figura 112. En comparación con la arquitectura “congelada”, en su lugar, entrenamos tanto el modelo BERT
preentrenado como el cabezal de clasificación. Un paso hacia atrás comenzará en el cabezal de clasificación y pasará
por BERT.
Figura 113. Arquitectura de un modelo específico para una tarea. Contiene un modelo de representación entrenado
previamente (por ejemplo, BERT) con un cabezal de clasificación adicional para la tarea específica.
Machine Translated by Google
decir, el conjunto de datos de Rotten Tomatoes, que contiene 5331 críticas de películas positivas y 5331
El primer paso en nuestra tarea de clasificación es seleccionar el modelo subyacente que queremos utilizar.
Utilizamos "bertbasecased", que fue entrenado previamente en la Wikipedia en inglés, así como en un gran
Definimos de antemano la cantidad de etiquetas que queremos predecir. Esto es necesario para crear la red
neuronal de propagación hacia adelante que se aplica sobre nuestro modelo entrenado previamente:
) tokenizador = AutoTokenizer.from_pretrained(id_modelo)
def preprocess_function(ejemplos):
"""Tokenizar datos de entrada""" return
tokenizer(examples["text"], truncation=True)
test_data.map(preprocess_function, batched=True)
load_f1 = load_metric("f1") f1 =
load_f1.compute(predicciones=predicciones,
referencias=etiquetas)["f1"] devolver
{"f1": f1}
TrainingArguments( "model",
learning_rate=2e5,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
num_train_epochs=1, weight_decay=0.01, save_strategy="epoch", report_to="none"
)
La clase TrainingArguments define los hiperparámetros que queremos ajustar, como la tasa de
aprendizaje y la cantidad de épocas (rondas) que queremos entrenar. El Trainer se utiliza para ejecutar
el proceso de entrenamiento.
entrenador.evaluar()
Obtenemos una puntuación F1 de 0,85, que es bastante más alta que la del modelo específico de la tarea
que utilizamos en el Capítulo 4, que arrojó una puntuación F1 de 0,80. Esto demuestra que ajustar un
modelo por uno mismo puede ser más ventajoso que utilizar un modelo previamente entrenado. Solo
nos lleva un par de minutos entrenarlo.
Capas de congelación
Para demostrar aún más la importancia de entrenar toda la red, el siguiente ejemplo demostrará cómo
puedes usar Hugging Face Transformers para congelar ciertas capas de tu red.
Congelaremos el modelo BERT principal y permitiremos que solo las actualizaciones pasen por
el cabezal de clasificación. Esta será una gran comparación, ya que mantendremos todo igual, excepto
por el congelamiento de capas específicas.
Para comenzar, reinicialicemos nuestro modelo para que podamos comenzar desde cero:
) tokenizador = AutoTokenizer.from_pretrained(id_modelo)
Nuestro modelo BERT preentrenado contiene muchas capas que podemos congelar. Inspeccionar estas
capas nos permite conocer la estructura de la red y lo que podríamos querer congelar:
bert.incrustaciones.incrustaciones_de_palabra.peso
bert.incrustaciones.incrustaciones_de_posición.peso
bert.incrustaciones.incrustaciones_de_tipo_de_token.peso
bert.incrustaciones.LayerNorm.peso
Machine Translated by Google
bert.embeddings.LayerNorm.bias
bert.encoder.layer.0.attention.self.query.weight
bert.encoder.layer.0.attention.self.query.bias
...
bert.encoder.layer.11.output.LayerNorm.weight
bert.encoder.layer.11.output.LayerNorm.bias bert.pooler.dense.weight
bert.pooler.dense.bias clasificador.weight
clasificador.bias
Podríamos optar por congelar solo ciertas capas para acelerar el cálculo, pero aún así
permitir que el modelo principal aprenda de la tarea de clasificación. En general,
queremos que las capas congeladas sean seguidas por capas entrenables.
param.requires_grad = Falso
Figura 115. Congelamos por completo todos los bloques codificadores y las capas de incrustación de modo que el modelo
BERT no aprenda nuevas representaciones durante el ajuste fino.
Ahora que hemos congelado con éxito todo excepto el cabezal de clasificación,
podemos pasar a entrenar nuestro modelo:
) entrenador.train()
Es posible que notes que el entrenamiento se ha vuelto mucho más rápido. Esto se debe a
que solo estamos entrenando el cabezal de clasificación, que nos proporciona una
Machine Translated by Google
entrenador.evaluar()
Figura 116. Congelamos los primeros 10 bloques codificadores de nuestro modelo BERT. Todo lo demás se puede entrenar
y se ajustará con precisión.
# Cargar modelo
model_id = "bertbasecased" model =
AutoModelForSequenceClassification.from_pretrained( model_id, num_labels=2
) tokenizador = AutoTokenizer.from_pretrained(id_modelo)
param.requires_grad = Falso
eval_dataset=prueba_tokenizada,
tokenizador=tokenizador,
recopilador_de_datos=recopilador_de_datos,
métricas_de_cómputo=métricas_de_cómputo,
) entrenador.train()
entrenador.evaluate()
{'eval_loss': 0,40812647342681885, 'eval_f1':
0,8, 'eval_runtime':
3,7125, 'eval_samples_per_second':
287,137, 'eval_steps_per_second': 18,047,
'epoch': 1,0}
Obtuvimos una puntuación F1 de 0,8, que es mucho más alta que nuestra puntuación anterior de 0,63 al
congelar todas las capas. Esto demuestra que, si bien generalmente queremos entrenar tantas capas
como sea posible, se puede lograr un entrenamiento menor si no se cuenta con la potencia informática
necesaria.
Para ilustrar mejor este efecto, probamos el efecto de congelar iterativamente los bloques del
codificador y ajustarlos como lo hicimos hasta ahora. Como se muestra en la Figura 117,
entrenar solo los primeros cinco bloques del codificador (línea vertical roja) es suficiente para alcanzar
casi el rendimiento de entrenar todos los bloques del codificador.
Machine Translated by Google
Figura 117. Efecto de congelar ciertos bloques del codificador en el rendimiento del modelo. Entrenar
más bloques mejora el rendimiento, pero se estabiliza al principio.
NOTA
Cuando entrenas para varias épocas, la diferencia (en tiempo de entrenamiento
y recursos) entre congelar y no congelar suele ser mayor. Por lo tanto, se
recomienda jugar con un equilibrio que funcione para ti.
Figura 118. En la clasificación de pocos disparos, solo utilizamos unos pocos puntos de datos etiquetados para aprender.
Transformadores para generar representaciones textuales de alta calidad que se actualizan durante el
entrenamiento. Solo se necesitan unos pocos ejemplos etiquetados para que este marco sea
competitivo con el ajuste fino de un modelo tipo BERT en un conjunto de datos etiquetado grande,
como exploramos en el ejemplo anterior.
3. Entrenamiento de un clasificador
Cree un cabezal de clasificación sobre el modelo de incrustación y entrénelo utilizando los datos de
entrenamiento generados previamente
Machine Translated by Google
Digamos, por ejemplo, que tenemos el conjunto de datos de entrenamiento de la Figura 119
que clasifica el texto en dos categorías: texto sobre lenguajes de programación y texto sobre
mascotas.
Figura 119. Datos en dos clases: texto sobre lenguajes de programación y texto sobre mascotas.
En el paso 1, SetFit maneja este problema generando los datos necesarios en función de
la selección dentro y fuera de la clase, como ilustramos en la Figura 1110.
Por ejemplo, si tenemos 16 oraciones sobre deportes, podemos crear 16 * (16 – 1) / 2 = 120
pares que etiquetamos como pares positivos . Podemos utilizar este proceso para
generar pares negativos recopilando pares de diferentes clases.
Figura 1110. Paso 1: muestreo de datos de entrenamiento. Suponemos que las oraciones dentro de una clase son similares y
crean pares positivos, mientras que las oraciones en clases diferentes se convierten en pares negativos.
Machine Translated by Google
Dado que generamos estos pares en el paso anterior, podemos usarlos para ajustar
un modelo de SentenceTransformers. Aunque ya hemos analizado el aprendizaje
contrastivo anteriormente, ilustramos nuevamente el método en la Figura 1111 a
modo de repaso.
Figura 1111. Paso 2: Ajuste fino de un modelo de SentenceTransformers . Mediante el aprendizaje contrastivo,
se aprenden las incrustaciones de pares de oraciones positivas y negativas.
Machine Translated by Google
En el paso 3, generamos incrustaciones para todas las oraciones y las usamos como
entrada de un clasificador. Podemos usar el modelo
SentenceTransformers perfeccionado para convertir nuestras oraciones en
Figura 1112. Paso 3: Entrenamiento de un clasificador. El clasificador puede ser cualquier modelo de scikitlearn o un
cabezal de clasificación.
Machine Translated by Google
Cuando juntamos todos los pasos, obtenemos un flujo de trabajo eficiente y elegante para realizar la clasificación
cuando solo hay unas pocas etiquetas por clase. Hace uso inteligente de la idea de que hemos etiquetado los
datos, aunque no de la forma que nos gustaría. Los tres pasos juntos se ilustran en la Figura 1113 para brindar
En primer lugar, se generan pares de oraciones según la selección dentro y fuera de la clase.
SentenceTransformer previamente entrenado. En tercer lugar, las oraciones se integran con el modelo ajustado en
Sin embargo, dado que se trata de una configuración de pocas tomas, solo tomaremos muestras de 16 ejemplos
por clase. Con dos clases, solo tendremos 32 documentos con los que entrenar, en comparación con las
datos_de_tren_muestreados = conjunto_de_datos_de_muestra(tomates["tren"],
num_muestras=16)
De manera similar a lo que hicimos con Hugging Face Transformers, podemos usar el
entrenador para definir y jugar con los parámetros relevantes. Por ejemplo, establecemos
num_epochs en 3 para que se realice el aprendizaje contrastivo para tres épocas:
desde setfit importa TrainingArguments como SetFitTrainingArguments desde setfit importa Trainer como
SetFitTrainer
) args.eval_strategy = args.estrategia_de_evaluacion
# Crear entrenador
entrenador = SetFitTrainer(
Machine Translated by Google
modelo=modelo,
argumentos=argumentos,
Solo necesitamos llamar a train para iniciar el ciclo de entrenamiento. Cuando lo hagamos,
deberíamos obtener el siguiente resultado:
# Bucle de entrenamiento
trainer.train()
Tenga en cuenta que el resultado menciona que se generaron 1280 pares de oraciones para
ajustar el modelo SentenceTransformer. De manera predeterminada, se generan 20
combinaciones de pares de oraciones para cada muestra de nuestros datos, lo que sería
20 * 32 = 680 muestras. Tendremos que multiplicar este valor por 2 para cada par positivo y
negativo generado, 680 * 2 = 1280 pares de oraciones. ¡Generar 1280 pares de oraciones es
bastante impresionante considerando que solo teníamos 32 oraciones etiquetadas para
comenzar!
Machine Translated by Google
CONSEJO
# Crear entrenador
entrenador = SetFitTrainer( modelo=modelo,
...
)
{'f1': 0,8363988383349468}
CONSEJO
SetFit no solo puede realizar tareas de clasificación de pocos disparos, sino que también tiene soporte
para cuando no hay etiquetas en absoluto, también llamada clasificación de cero disparos. SetFit
genera ejemplos sintéticos a partir de los nombres de las etiquetas para que se asemejen a la tarea de
clasificación y luego entrena un modelo de SetFit con ellos. Por ejemplo, si las etiquetas de destino son
"feliz" y "triste", entonces los datos sintéticos podrían ser "El ejemplo es feliz" y "Este ejemplo es triste".
Figura 1114. Para ajustar el modelo a una tarea específica (por ejemplo, la clasificación), comenzamos con el
entrenamiento previo de un modelo BERT o usamos uno previamente entrenado.
Machine Translated by Google
Este enfoque de dos pasos se utiliza normalmente en muchas aplicaciones. Tiene sus
limitaciones cuando se trabaja con datos específicos del dominio. El modelo preentrenado
suele entrenarse con datos muy generales, como páginas de Wikipedia, y es posible
que no esté adaptado a las palabras específicas del dominio.
En lugar de adoptar este enfoque de dos pasos, podemos intercalar otro paso entre
ellos, es decir, continuar con el preentrenamiento de un modelo BERT ya preentrenado.
En otras palabras, podemos simplemente continuar con el entrenamiento del modelo
BERT utilizando el modelado de lenguaje enmascarado (MLM), pero en su lugar utilizar
datos de nuestro dominio. Es como pasar de un modelo BERT general a un modelo
BioBERT especializado para el dominio médico, y luego a un modelo BioBERT
perfeccionado para clasificar medicamentos.
Esto actualizará las representaciones de subpalabras para que estén más ajustadas
a las palabras que no habría visto antes. Este proceso se ilustra en la Figura
1115 y demuestra cómo este paso adicional actualiza una tarea de modelado de lenguaje
enmascarado. Se ha demostrado que continuar con el preentrenamiento en un modelo
BERT preentrenado mejora el rendimiento de los modelos en tareas de
clasificación y es una adición valiosa al proceso de ajuste fino.3
Figura 1115. En lugar de un enfoque de dos pasos, podemos agregar otro paso que continúe con el preentrenamiento
del modelo preentrenado antes de ajustarlo para la tarea objetivo. Observe cómo las máscaras se llenaron con
conceptos abstractos en 1, mientras que se llenaron con conceptos específicos de la película en 2.
Machine Translated by Google
En lugar de tener que entrenar previamente un modelo completo desde cero, podemos simplemente
continuar con el entrenamiento previo antes de ajustarlo para la clasificación. Esto también ayuda al
modelo a adaptarse a un dominio determinado o incluso a la jerga de una organización
específica. La genealogía de los modelos que una empresa podría querer adoptar se ilustra con más
detalle en la Figura 1116.
Figura 1116. El enfoque de tres pasos ilustrado para casos de uso específicos.
Comenzamos cargando el modelo "bertbasecased" que hemos utilizado hasta ahora y lo preparamos
para MLM:
Necesitamos convertir en tokens las oraciones sin procesar. También eliminaremos las etiquetas, ya
def preprocess_function(ejemplos):
Machine Translated by Google
# Tokenizar datos
tokenized_train = train_data.map(preprocess_function, batched=True) tokenized_train =
En su lugar, tendremos un DataCollator que realizará el enmascaramiento de tokens por nosotros. Hay
dos métodos que se utilizan generalmente para esto: enmascaramiento de tokens y de palabras completas.
Con el enmascaramiento de tokens, enmascaramos aleatoriamente el 15 % de los tokens en una oración.
Puede suceder que se enmascare parte de una palabra.
Para permitir el enmascaramiento de toda la palabra, podríamos aplicar el enmascaramiento de palabra
completa, como se ilustra en la Figura 1117.
En general, predecir palabras completas tiende a ser más complicado que predecir tokens, lo que
hace que el modelo funcione mejor, ya que necesita aprender representaciones más precisas y
exactas durante el entrenamiento. Sin embargo, tiende a llevar un poco más de tiempo converger. En
este ejemplo, utilizaremos el enmascaramiento de tokens utilizando DataCollatorForLanguageModeling
para lograr una convergencia más rápida.
Machine Translated by Google
# Tokens de
enmascaramiento data_collator = DataCollatorForLanguageModeling( tokenizer=tokenizer,
mlm=True, mlm_probability=0.15
tasa_de_aprendizaje=2e5,
tamaño_de_lote_de_entrenamiento_por_dispositivo=16,
tamaño_de_lote_de_evaluación_por_dispositivo=16,
num_train_epochs=10,
weight_decay=0.01,
save_strategy="época",
report_to="none"
)
argumentos=argumentos_entrenamiento,
conjunto_de_datos_entrenamiento=tokenized_train,
Vale la pena tener en cuenta varios parámetros. Entrenamos durante 20 épocas y mantenemos la tarea breve.
Puedes experimentar con la tasa de aprendizaje y la disminución del peso para determinar si ayudan a ajustar el
modelo.
Antes de comenzar nuestro ciclo de entrenamiento, primero guardaremos nuestro tokenizador previamente entrenado.
El tokenizador no se actualiza durante el entrenamiento, por lo que no es necesario guardarlo después del
entrenamiento. Sin embargo, guardaremos nuestro modelo después de continuar con el preentrenamiento:
# Modelo de tren
trainer.train()
Esto nos proporciona un modelo actualizado en la carpeta mlm . Para evaluar su rendimiento,
Sin embargo, para nuestros propósitos, podemos ejecutar algunas tareas de enmascaramiento para ver si ha
Lo haremos cargando nuestro modelo entrenado previamente antes de continuar con el preentrenamiento.
Al usar la oración "¡Qué horrible [MÁSCARA]!", el modelo predecirá qué palabra estaría en lugar de "[MÁSCARA]":
# Imprimir resultados
El resultado muestra conceptos como “idea”, “sueño” y “día”, que definitivamente tienen sentido. A
continuación, veamos qué predice nuestro modelo actualizado:
# Imprimir resultados
Una película horrible, un filme, un desastre, etc. nos muestra claramente que el modelo está más
sesgado hacia los datos que le suministramos en comparación con el modelo entrenado previamente.
El siguiente paso sería ajustar este modelo en la tarea de clasificación que realizamos al principio de
este capítulo. Simplemente cargue el modelo de la siguiente manera y estará listo:
AutoTokenizer.from_pretrained("mlm")
Machine Translated by Google
Figura 1118. El ajuste de un modelo BERT para NER permite la detección de entidades con nombre, como
personas o ubicaciones.
El ajuste fino del modelo BERT preentrenado sigue una arquitectura similar a la que
observamos con la clasificación de documentos. Sin embargo, hay un cambio
fundamental en el enfoque de clasificación. En lugar de depender de la agregación o
agrupación de incrustaciones de tokens, el modelo ahora hace predicciones
para tokens individuales en una secuencia. Es fundamental enfatizar que nuestra tarea
de clasificación a nivel de palabra no implica clasificar palabras enteras, sino más
bien los tokens que constituyen colectivamente esas palabras.
Machine Translated by Google
Figura 1119. Durante el proceso de ajuste fino de un modelo BERT, se clasifican tokens individuales en
lugar de palabras o documentos completos.
CONSEJO
Mientras investigábamos los conjuntos de datos que se utilizarían en este ejemplo, había
algunos más que queríamos compartir. wnut_17 es una tarea que se centra en entidades
emergentes y raras, aquellas que son más difíciles de detectar. Además, los conjuntos de
datos tner/mit_movie_trivia y tner/mit_restaurant son bastante
divertidos de usar. tner/mit_movie_trivia sirve para detectar entidades como actor, trama y
banda sonora, mientras que tner/mit_restaurant tiene como objetivo detectar entidades como
servicio, plato y cocina.5
'Rangers',
'.'],
'pos_tags': [22, 22, 38, 29, 16, 21, 15, 12, 23, 7], 'chunk_tags': [11, 12,
21, 11, 12, 12, 13, 11, 12, 0], 'ner_tags': [1, 2, 0, 0, 0, 0, 0, 0, 3, 0]}
Este conjunto de datos nos proporciona etiquetas para cada palabra dada en una oración.
Estas etiquetas se pueden encontrar en la clave ner_tags, que hace referencia a las
siguientes entidades posibles:
etiqueta2id = {
"O": 0, "BPER": 1, "IPER": 2, "BORG": 3, "IORG": 4,
"BLOC": 5, "ILOC": 6, "BMISC": 7, "IMISC": 8
}
Machine Translated by Google
{'O': 0,
'BPER': 1,
'YoPER': 2,
'ORGB': 3,
'YoORG': 4,
'Localización B': 5,
'Localización I': 6,
'BMISC': 7,
'IMISC': 8}
Este proceso se ilustra con más detalle en la Figura 1120. En la figura, dado que
“Dean” es el comienzo de la frase y “Palmer” es el final, sabemos que “Dean Palmer” es
una persona y que “Dean” y “Palmer” no son personas individuales.
Figura 1120. Al indicar el inicio y el final de la frase con la misma entidad, podemos reconocer
entidades de frases enteras.
Nuestros datos están preprocesados y divididos en palabras, pero aún no en tokens. Para
ello, los tokenizaremos aún más con el tokenizador del modelo preentrenado que usamos a lo
largo de este capítulo, es decir, bertbasecased:
Machine Translated by Google
# Cargar tokenizador
tokenizer = AutoTokenizer.from_pretrained("bertbasecased")
# Cargar modelo
model = AutoModelForTokenClassification.from_pretrained(
"bertbasecase",
num_labels=len(id2label), id2label=id2label,
label2id=label2id
tokenizer.convert_ids_to_tokens(token_ids) sub_tokens
['[CLS]',
'Dean',
'Palmer', 'hit',
'suyo',
'30th',
'home',
'##r',
'para',
'los',
'Rangers',
'.', '[SEP]']
El tokenizador agregó los tokens [CLS] y [SEP] como aprendimos en los Capítulos
2 y 3. Tenga en cuenta que la palabra "homer" se dividió en los tokens "home" y "##r".
Esto crea un pequeño problema para nosotros ya que hemos etiquetado los datos a nivel
de palabra pero no a nivel de token. Esto se puede
Machine Translated by Google
Consideremos la palabra "Maarten", que tiene la etiqueta BPER para indicar que se
trata de una persona. Si pasamos esa palabra a través del tokenizador, se divide en los
tokens "Ma", "##arte" y "##n". No podemos usar la entidad BPER para todos los tokens,
ya que eso indicaría que los tres tokens son personas independientes. Siempre que una
entidad se divide en tokens, el primer token debe tener B (por inicio) y los siguientes
deben tener I (por interior).
Por lo tanto, 'Ma' obtendrá el BPER para señalar el comienzo de una frase, y
'##arte' y '##n' obtendrán el IPER para señalar que pertenecen a una frase.
Este proceso de alineación se ilustra en la Figura 1121.
Creamos una función, align_labels, que tokenizará la entrada y alineará estos tokens
con sus etiquetas actualizadas durante la tokenización:
se_divide_en_palabras=Verdadero
)
Machine Translated by Google
etiquetas = ejemplos["ner_tags"]
si palabra_idx != palabra_anterior_idx:
etiquetas_actualizadas.append(identificadores_de_etiqueta)
Original: [1, 2, 0, 0, 0, 0, 0, 0, 3, 0]
Actualizado: [100, 1, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 100]
Ahora que hemos tokenizado y alineado las etiquetas, podemos empezar a pensar en
definir nuestras métricas de evaluación. Esto también es diferente de lo que hemos
visto antes. En lugar de una única predicción por documento, ahora tenemos múltiples
predicciones por documento, es decir, por token.
Importar evaluar
predicciones_verdaderas = []
etiquetas_verdaderas = []
resultados =
seqeval.compute( predicciones=predicciones_verdaderas, referencias=etiquetas_verdaderas
Machine Translated by Google
)
devuelve {"f1": resultados["overall_f1"]}
DataCollatorForTokenClassification(tokenizador=tokenizador)
Ahora que hemos cargado nuestro modelo, el resto de los pasos son similares a los
procedimientos de entrenamiento anteriores de este capítulo. Definimos un
entrenador con argumentos específicos que podemos ajustar y crear un entrenador:
learning_rate=2e5,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
num_train_epochs=1,
weight_decay=0.01,
save_strategy="epoch",
report_to="none"
)
argumentos=argumentos_entrenamiento,
conjunto_de_datos_entrenamiento=tokenized["entrenar"],
conjunto_de_datos_eval=tokenized["prueba"],
tokenizador=tokenizador, recopilador_de_datos=collator_de_datos, métricas_de_cómputo=métricas_de_cómputo,
Machine Translated by Google
) entrenador.train()
[{'entidad': 'BPER',
'puntuación': 0,99534035, 'índice':
4, 'palabra': 'Ma',
'inicio': 11, 'fin': 13},
{'entidad': 'IPER',
'puntuación':
0,9928328, 'índice': 5, 'palabra':
'##arte', 'inicio': 13, 'fin': 17},
{'entidad': 'IPER',
'puntuación': 0,9954301,
'índice': 6, 'palabra':
'##n', 'inicio': 17,
'fin': 18}]
Machine Translated by Google
En la oración "Mi nombre es Maarten", ¡la palabra "Maarten" y sus subtokens fueron identificados
correctamente como una persona!
Resumen
En este capítulo, exploramos varias tareas para ajustar con precisión los modelos de
representación entrenados previamente en tareas de clasificación específicas.
Comenzamos demostrando cómo ajustar con precisión un modelo BERT entrenado previamente
y ampliamos los ejemplos congelando ciertas capas de sus arquitecturas.
Experimentamos con una técnica de clasificación de pocos disparos llamada SetFit, que
implica ajustar con precisión un modelo de incrustación previamente entrenado junto con un
cabezal de clasificación utilizando datos etiquetados limitados. Utilizando solo unos pocos puntos
de datos etiquetados, este modelo generó un rendimiento similar a los modelos que exploramos
en capítulos anteriores.
En el próximo capítulo, continuamos con el campo del ajuste fino de los modelos
lingüísticos, pero nos centraremos en los modelos generativos. Mediante un proceso de dos
pasos, exploraremos cómo ajustar un modelo generativo para que siga las instrucciones
correctamente y luego lo ajustaremos para que se ajuste a las preferencias humanas.
1
Jacob Devlin et al. “BERT: preentrenamiento de transformadores bidireccionales profundos para la
comprensión del lenguaje”. Preimpresión arXiv arXiv:1810.04805 (2018).
Machine Translated by Google
2
Lewis Tunstall et al. “Aprendizaje eficiente de pocos intentos sin indicaciones”. Preimpresión de arXiv
arXiv:2209.11055 (2022).
3
Chi Sun et al. “¿Cómo ajustar GERT para la clasificación de texto?”, Chinese Computational
Lingüística: 18.ª Conferencia Nacional de China, CCL 2019, Kunming, China, del 18 al 20 de octubre
2019, actas 18. Springer International Publishing, 2019.
4
Erik F. Sang y Fien De Meulder. “Introducción a la tarea compartida CoNLL2003: reconocimiento de
entidades nombradas independientes del lenguaje”. Preimpresión arXiv cs/0306050 (2003).
5
Jingjing Liu et al. “Asgard: una arquitectura portátil para sistemas de diálogo multilingües”. 2013
Conferencia internacional IEEE sobre acústica, habla y procesamiento de señales. IEEE, 2013.
OceanofPDF.com
Machine Translated by Google
A lo largo de este capítulo, le guiaremos entre los dos métodos más comunes para ajustar los
modelos de generación de texto: el ajuste supervisado y el ajuste de preferencias. Exploraremos el
potencial transformador del ajuste de los modelos de generación de texto entrenados
previamente para convertirlos en herramientas más eficaces para su aplicación.
Hay tres pasos comunes que conducen a la creación de un LLM de alta calidad:
El primer paso para crear un LLM de alta calidad es entrenarlo previamente con uno o más
conjuntos de datos de texto masivos (Figura 121). Durante el entrenamiento, intenta predecir
el siguiente token para aprender con precisión las representaciones lingüísticas y
semánticas que se encuentran en el texto. Como vimos antes en los Capítulos 3 y 11, esto
se denomina modelado del lenguaje y es un método autosupervisado.
Esto produce un modelo base , también conocido comúnmente como modelo preentrenado o
modelo de base . Los modelos base son un elemento clave del entrenamiento.
Machine Translated by Google
proceso, pero son más difíciles de manejar para el usuario final. Por eso es importante el
siguiente paso.
Figura 121. Durante el modelado del lenguaje, el LLM tiene como objetivo predecir el siguiente token en función de un
Los modelos LLM son más útiles si responden bien a las instrucciones y tratan de
seguirlas. Cuando los humanos le piden al modelo que escriba un artículo,
esperan que el modelo genere el artículo y no que enumere otras instrucciones, por
ejemplo (que es lo que podría hacer un modelo base).
Con el ajuste fino supervisado (SFT), podemos adaptar el modelo base para que
siga instrucciones. Durante este proceso de ajuste fino, los parámetros del modelo
base se actualizan para que estén más en línea con nuestra tarea objetivo, como seguir
instrucciones. Al igual que un modelo preentrenado, se entrena utilizando la predicción
del siguiente token, pero en lugar de predecir únicamente el siguiente token, lo hace en
función de una entrada del usuario (Figura 122).
Figura 122. Durante el ajuste fino supervisado, el LLM tiene como objetivo predecir el próximo token en función de un
Entrada que tiene etiquetas adicionales. En cierto sentido, la etiqueta es la entrada del usuario.
Machine Translated by Google
SFT también se puede utilizar para otras tareas, como la clasificación, pero a
menudo se utiliza para pasar de un modelo generativo base a un modelo
generativo de instrucciones (o chat).
El paso final mejora aún más la calidad del modelo y lo hace más acorde con el
comportamiento esperado de la seguridad de la IA o las preferencias humanas.
Esto se llama ajuste de preferencias. El ajuste de preferencias es una forma de
ajuste fino y, como su nombre lo indica, alinea el resultado del modelo con nuestras
preferencias, que están definidas por los datos que le proporcionamos.
Al igual que SFT, puede mejorar el modelo original, pero tiene el beneficio adicional
de destilar la preferencia de salida en su proceso de entrenamiento. Estos tres pasos
se ilustran en la Figura 123 y demuestran el proceso de comenzar con una arquitectura
no entrenada y terminar con un LLM ajustado a las preferencias.
Figura 123. Los tres pasos para crear un LLM de alta calidad.
En este capítulo, utilizamos un modelo base que ya se entrenó con conjuntos de datos
masivos y exploramos cómo podemos ajustarlo con ambas estrategias de ajuste.
Para cada método, comenzamos con los fundamentos teóricos antes de usarlos en la
práctica.
Figura 124. Se entrenó un LLM base o preentrenado para predecir la(s) siguiente(s) palabra(s).
Este ejemplo también ilustra que el modelo no fue entrenado para seguir instrucciones y en su
lugar intentará completar una pregunta en lugar de responderla (Figura 125).
Figura 125. Un LLM básico no seguirá instrucciones, sino que intentará predecir cada palabra siguiente.
Incluso podría generar nuevas preguntas.
Podemos utilizar este modelo base y adaptarlo a determinados casos de uso, como seguir
instrucciones, ajustándolo.
Figura 126. En comparación con el modelado del lenguaje (preentrenamiento), el ajuste fino completo utiliza un conjunto de datos más
pequeño pero etiquetado.
Puede utilizar cualquier dato etiquetado para realizar un ajuste fino completo, lo que lo convierte
también en una excelente técnica para aprender representaciones específicas del dominio. Para que
nuestro LLM siga instrucciones, necesitaremos datos de preguntas y respuestas. Estos datos,
como se muestra en la Figura 127, son consultas del usuario con las respuestas correspondientes.
Machine Translated by Google
Figura 127. Datos de instrucciones con instrucciones del usuario y sus respuestas correspondientes. Las
instrucciones pueden contener muchas tareas diferentes.
Durante el ajuste fino completo, el modelo toma la entrada (instrucciones) y aplica la predicción
del siguiente token en la salida (respuesta). A su vez, en lugar de generar nuevas
preguntas, seguirá las instrucciones.
Adaptadores
Figura 128. Los adaptadores agregan una pequeña cantidad de pesos en ciertos lugares de la red que se pueden ajustar de
manera eficiente, mientras que la mayoría de los pesos del modelo permanecen inalterados.
Sin embargo, no basta con alterar sólo un bloque Transformador, sino que estos
componentes son parte de cada bloque del modelo, como muestra la Figura 129 .
Machine Translated by Google
Figura 129. Los componentes del adaptador abarcan los distintos bloques del transformador en el modelo.
Al ver todos los componentes del adaptador en el modelo de esta manera, podemos ver los
adaptadores individuales como se muestra en la Figura 1210, que es una colección de estos
componentes que abarcan todos los bloques del modelo. El adaptador 1 puede ser un
especialista en, por ejemplo, la clasificación de textos médicos, mientras que el adaptador 2 puede especializarse
Machine Translated by Google
Figura 1210. Los adaptadores que se especializan en tareas específicas se pueden intercambiar en la misma
arquitectura (si comparten la misma arquitectura y pesos del modelo original).
PEFT. LoRA es una técnica que (al igual que los adaptadores) solo requiere actualizar
un pequeño conjunto de parámetros. Como se ilustra en la Figura 1211, crea un
pequeño subconjunto del modelo base para realizar ajustes en lugar de agregar capas al modelo.4
Figura 1211. LoRA solo requiere ajustar un pequeño conjunto de parámetros que pueden mantenerse
separados del LLM base.
Al igual que los adaptadores, este subconjunto permite un ajuste fino mucho más
rápido, ya que solo necesitamos actualizar una pequeña parte del modelo base. Creamos
este subconjunto de parámetros aproximando matrices grandes que acompañan al LLM
original con matrices más pequeñas. Luego podemos usar esas matrices más pequeñas
como reemplazo y ajustarlas en lugar de las matrices grandes originales. Tomemos como
ejemplo la matriz 10 × 10 que vemos en la Figura 1212.
Machine Translated by Google
Figura 1212. Un importante obstáculo de los LLM son sus enormes matrices de peso. Solo una de ellas puede tener
150 millones de parámetros y cada bloque Transformer tendría su versión de estos.
Figura 1213. La descomposición de una matriz de peso grande en dos matrices más pequeñas produce una versión
comprimida y de bajo rango de la matriz que se puede ajustar con mayor eficiencia.
Machine Translated by Google
Durante el entrenamiento, solo necesitamos actualizar estas matrices más pequeñas en lugar
de los cambios de peso completos. Las matrices de cambio actualizadas (matrices más pequeñas)
se combinan luego con los pesos completos (congelados), como se ilustra en la Figura 1214.
Figura 1214. En comparación con el ajuste fino completo, LoRA tiene como objetivo actualizar una pequeña representación de
los pesos originales durante el entrenamiento.
Pero es posible que sospeche que el rendimiento disminuiría, y estaría en lo cierto. Pero
¿dónde tiene sentido esta compensación?
Artículos como “La dimensionalidad intrínseca explica la efectividad del ajuste fino del modelo
de lenguaje” demuestran que los modelos de lenguaje “tienen una dimensión intrínseca
muy baja”. 5 Esto significa que podemos encontrar rangos pequeños que se aproximan
incluso a las matrices masivas de un LLM. Un modelo 175B como GPT3, por ejemplo,
tendría una matriz de peso de 12,288 × 12,288 dentro de cada uno de sus 96 bloques
Transformer. Eso es 150 millones de parámetros. Si podemos adaptar con éxito esa matriz al
rango 8, eso solo requeriría dos matrices de 12,288 × 2 que resultan en 197K parámetros
por bloque. Estos son ahorros importantes en velocidad, almacenamiento y computación
como se explica más adelante en el artículo de LoRA mencionado anteriormente.
Esta representación más pequeña es bastante flexible, ya que permite seleccionar qué
partes del modelo base se van a ajustar. Por ejemplo, solo podemos ajustar las matrices de
ponderación de consulta y valor en cada capa del transformador.
Machine Translated by Google
Podemos hacer que LoRA sea aún más eficiente reduciendo los requisitos de
memoria de los pesos originales del modelo antes de proyectarlos en matrices más
pequeñas. Los pesos de un LLM son valores numéricos con una precisión dada, que se
pueden expresar mediante la cantidad de bits, como float64 o float32. Como se ilustra
en la Figura 1215, si reducimos la cantidad de bits para representar un valor, obtenemos
un resultado menos preciso. Sin embargo, si reducimos la cantidad de bits, también
reducimos los requisitos de memoria de ese modelo.
Figura 1215. Intentando representar pi con representaciones de coma flotante de 32 bits y coma flotante de 16 bits. Observe la
precisión reducida cuando reducimos a la mitad el número de bits.
Con la cuantificación, buscamos reducir la cantidad de bits y, al mismo tiempo, representar con
precisión los valores de peso originales. Sin embargo, como se muestra en la Figura 1216,
al asignar directamente valores de precisión más altos a valores de precisión más
bajos, es posible que varios valores de precisión más altos terminen siendo representados por
los mismos valores de precisión más bajos.
Machine Translated by Google
Figura 1216. La cuantificación de pesos que están cerca unos de otros da como resultado los mismos pesos
reconstruidos, eliminando así cualquier factor diferenciador.
En cambio, los autores de QLoRA, una versión cuantificada de LoRA, encontraron una
forma de pasar de un mayor número de bits a un valor menor y viceversa sin diferenciarse
demasiado de los pesos originales.6
Utilizaron la cuantificación por bloques para asignar ciertos bloques de valores de mayor
precisión a valores de menor precisión. En lugar de asignar directamente valores
de mayor precisión a valores de menor precisión, se crean bloques adicionales que
permiten cuantificar pesos similares. Como se muestra en la Figura 1217, esto da
como resultado valores que se pueden representar con precisión con menor precisión.
Figura 1217. La cuantificación por bloques puede representar pesos con precisión menor a través de bloques
de cuantificación.
Machine Translated by Google
Una propiedad interesante de las redes neuronales es que sus valores generalmente
se distribuyen normalmente entre 1 y 1. Esta propiedad nos permite agrupar los pesos
originales en bits más bajos en función de su densidad relativa, como se ilustra en la Figura
1218. El mapeo entre pesos es más eficiente ya que tiene en cuenta la frecuencia relativa
de los pesos. Esto también reduce los problemas con los valores atípicos.
Figura 1218. Al utilizar bloques que tienen en cuenta la distribución, podemos evitar que valores cercanos entre
sí se representen con el mismo valor cuantificado.
Existen métodos más elegantes para optimizar esto aún más, como la cuantificación
doble y los optimizadores paginados, sobre los que puede leer más en
Machine Translated by Google
Artículo sobre QLoRA analizado anteriormente. Para obtener una guía completa y muy visual sobre
cuantificación, consulte esta publicación del blog.
Para que el LLM siga las instrucciones, necesitaremos preparar datos de instrucciones que sigan una
plantilla de chat. Esta plantilla de chat, como se ilustra en la Figura 1219, diferencia entre lo que
ha generado el LLM y lo que ha generado el usuario.
Elegimos esta plantilla de chat para usar en todos los ejemplos, ya que la versión de chat de TinyLlama
utiliza el mismo formato. Los datos que estamos utilizando son un
7 pequeño subconjunto del conjunto de datos UltraChat. Este conjunto de datos es una versión filtrada
del conjunto de datos UltraChat original que contiene casi 200 000 conversaciones entre un usuario
y un LLM.
Machine Translated by Google
def format_prompt(ejemplo):
"""Formatee el mensaje para utilizar la plantilla <|usuario|> que utiliza TinyLLama"""
# Cargue y formatee los datos usando la plantilla que TinyLLama está usando dataset = (
cargar_conjunto_de_datos("HuggingFaceH4/ultrachat_200k",
dividir="prueba_sft")
.shuffle(semilla=42) .select(rango(3_000))
<|usuario|>
Dado el texto: Toc, toc. ¿Quién está ahí? Camina.
¿Puedes continuar el chiste basándote en el material de texto proporcionado?
Machine Translated by Google
Cuantificación de modelos
Ahora que tenemos nuestros datos, podemos empezar a cargar nuestro modelo. Aquí
es donde aplicamos la Q en QLoRA, es decir, la cuantificación.
Usamos el paquete bitsandbytes para comprimir el modelo preentrenado a una
representación de 4 bits.
importar antorcha
desde transformers importar AutoModelForCausalLM, AutoTokenizer,
Configuración de bits y bytes
nombre_modelo = "TinyLlama/TinyLlama1.1Bpasointermedio1431k3T"
mapa_dispositivo="auto",
) modelo.config.use_cache = Falso
modelo.config.pretraining_tp = 1
Este procedimiento de cuantificación nos permite reducir el tamaño del modelo original y, al
mismo tiempo, conservar la mayor parte de la precisión de los pesos originales. Ahora, cargar el
modelo solo utiliza aproximadamente 1 GB de VRAM en comparación con los aproximadamente
4 GB de VRAM que necesitaría sin cuantificación. Tenga en cuenta que, durante el ajuste
fino, será necesaria más VRAM para no alcanzar el límite de aproximadamente 1 GB de
VRAM necesario para cargar el modelo.
Configuración de LoRA
A continuación, necesitaremos definir nuestra configuración LoRA utilizando la biblioteca
peft , que representa hiperparámetros del proceso de ajuste fino:
task_type="CAUSAL_LM",
target_modules= # Capas a las que apuntar
["k_proj", "gate_proj", "v_proj", "up_proj", "q_proj", "o_proj", "down_proj"]
Machine Translated by Google
13) Aumentar este valor también aumentará los tamaños de las matrices
comprimidas, lo que dará lugar a una menor compresión y, por lo tanto, a una mejora.
lora_alpha Controla
Nueva tarea. Una regla general es elegir un valor que sea el doble del tamaño de r.
target_modules Controla
las capas a las que se apuntará. El procedimiento LoRA puede optar por ignorar
Jugar con los parámetros es un experimento que vale la pena para obtener una comprensión
intuitiva de los valores que funcionan y los que no. Puede encontrar un recurso increíble con
consejos adicionales sobre el ajuste fino de LoRA en el boletín Ahead of AI de Sebastian
Raschka.
Machine Translated by Google
NOTA
Este ejemplo demuestra una forma eficiente de ajustar el modelo. Si, en cambio, desea
realizar un ajuste completo, puede eliminar el parámetro quantization_config al
cargar el modelo y omitir la creación de peft_config. Al eliminarlos, pasaríamos
de “Ajuste de instrucciones con QLoRA” a “Ajuste completo de instrucciones”.
Configuración de entrenamiento
Capítulo 11:
directorio_de_salida = "./resultados"
# Argumentos de entrenamiento
training_arguments = TrainingArguments( output_dir=output_dir,
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
optim="paged_adamw_32bit",
learning_rate=2e4,
lr_scheduler_type="cosine",
num_train_epochs=1, logging_steps=10,
fp16=True,
gradient_checkpointing=True
num_train_epochs
Número total de rondas de entrenamiento. Los valores más altos tienden a degradar el
tasa de aprendizaje
Machine Translated by Google
Determina el tamaño del paso en cada iteración de las actualizaciones de peso. Los autores de
QLoRA descubrieron que las tasas de aprendizaje más altas funcionan mejor para modelos más grandes
(>33B parámetros).
tipo de programador lr
Aumentará linealmente la tasa de aprendizaje, comenzando desde cero, hasta que alcance el valor
optim Los
Optimizar estos parámetros es una tarea difícil y no existen pautas establecidas para
hacerlo. Es necesario experimentar para determinar qué funciona mejor para conjuntos de datos
específicos, tamaños de modelos y tareas objetivo.
NOTA
Aunque esta sección describe el ajuste de instrucciones, también podríamos usar QLoRA para
ajustar un modelo de instrucciones. Por ejemplo, podríamos ajustar un modelo de chat para generar
un código SQL específico o para crear una salida JSON que se ajuste a un formato específico. Siempre
que tenga los datos disponibles (con los elementos de consultarespuesta adecuados), QLoRA es una
excelente técnica para hacer que un modelo de chat existente sea más apropiado para su caso de uso.
Capacitación
Ahora que hemos preparado todos nuestros modelos y parámetros, podemos comenzar a ajustar
nuestro modelo. Cargamos SFTTrainer y simplemente ejecutamos trainer.train():
# Modelo de tren
trainer.train()
Fusionar pesos
Después de haber entrenado nuestros pesos QLoRA, todavía necesitamos combinarlos
con los pesos originales para usarlos. Recargamos el modelo en 16 bits, en lugar
de los 4 bits cuantificados, para fusionar los pesos. Aunque el tokenizador no se actualizó
durante el entrenamiento, lo guardamos en la misma carpeta que el modelo para facilitar
el acceso:
modelo = AutoPeftModelForCausalLM.from_pretrained(
"TinyLlama1.1Bqlora",
uso_bajo_de_memoria_de_CPU=Verdadero,
mapa_de_dispositivo="automático",
)
Machine Translated by Google
Después de fusionar el adaptador con el modelo base, podemos usarlo con la plantilla
de solicitud que definimos anteriormente:
"""
Los modelos de lenguaje de gran tamaño (LLM) son modelos de inteligencia artificial (IA) que aprenden
el lenguaje y comprenden lo que significa decir cosas en un idioma en particular. Se entrenan con grandes
cantidades de texto…
Cabe destacar la perplejidad, que mide la capacidad de un modelo de lenguaje para predecir un
texto. Dado un texto de entrada, el modelo predice la probabilidad de que aparezca el siguiente
token. Con la perplejidad, asumimos que un modelo funciona mejor si le da al siguiente token
una alta probabilidad. En otras palabras, los modelos no deberían quedar “perplejos”
cuando se les presenta un documento bien escrito.
Como se ilustra en la Figura 1220, cuando se presenta la entrada “Cuando una medida
se convierte en a”, se le pregunta al modelo qué probabilidad hay de que la palabra “objetivo”
sea la siguiente palabra.
Figura 1220. La predicción de la siguiente palabra es una característica central de muchos LLM.
Aunque la perplejidad y otras métricas a nivel de palabras son métricas útiles para
comprender la confianza del modelo, no son una medida perfecta.
No tienen en cuenta la consistencia, la fluidez, la creatividad o incluso la corrección del texto
generado.
Puntos de referencia
HellaSwag.16 Estos puntos de referencia nos brindan información sobre la comprensión básica
del lenguaje, pero también respuestas analíticas complejas, como problemas de matemáticas.
PEGAMENTO
El punto de referencia de https://oreil.ly/LV_fb
evaluación de la comprensión
del lenguaje general (GLUE) consiste
en tareas de comprensión del
lenguaje que cubren un amplio
grado de dificultad.
pregunta.
problemas de programación.
Los benchmarks son una excelente manera de obtener una idea básica sobre el rendimiento de un
modelo en una amplia variedad de tareas. Una desventaja de los benchmarks públicos es
que los modelos pueden sobreajustarse a estos benchmarks para generar las mejores
respuestas. Además, estos siguen siendo benchmarks amplios y podrían no cubrir casos de uso muy
específicos. Por último, otra desventaja es que algunos benchmarks requieren GPU potentes con un
tiempo de ejecución prolongado (más de horas) para realizar los cálculos, lo que dificulta la iteración.
Tablas de clasificación
Con tantos puntos de referencia diferentes, es difícil elegir el que mejor se adapta a tu modelo. Siempre
que se lanza un modelo, a menudo lo verás evaluado en varios puntos de referencia para mostrar su
rendimiento en general.
Por ello, se desarrollaron tablas de clasificación que contenían múltiples puntos de referencia. Una tabla
de clasificación común es la tabla de clasificación Open LLM. que, al momento de escribir este artículo,
incluye seis puntos de referencia, entre ellos HellaSwag, MMLU, TruthfulQA y GSM8k. Los
modelos que encabezan la clasificación, suponiendo que no se hayan sobreajustado a los datos,
generalmente se consideran los "mejores".
Sin embargo, dado que estas tablas de clasificación a menudo contienen puntos de referencia
disponibles públicamente, existe el riesgo de sobreajuste en la tabla de clasificación.
Machine Translated by Google
Evaluación automatizada
Parte de la evaluación de un resultado generativo es la calidad de su texto. Por ejemplo, incluso si dos modelos
dieran la misma respuesta correcta a una pregunta, la forma en que derivaron esa respuesta podría ser
diferente. A menudo, no se trata solo de la respuesta final, sino también de su construcción. De manera
similar, aunque dos resúmenes pueden ser similares, uno puede ser significativamente más corto que
Para evaluar la calidad del texto generado por encima de la exactitud de la respuesta final, se introdujo el
método LLM como juez.18 En esencia, se le pide a un LLM independiente que juzgue la calidad del LLM
que se va a evaluar. Una variante interesante de este método es la comparación por pares. Dos
LLM diferentes generarán una respuesta a una pregunta y un tercer LLM será el juez que declare cuál es
mejor.
Como resultado, esta metodología permite la evaluación automatizada de preguntas abiertas. Una
ventaja importante es que, a medida que los LLM mejoran, también lo hacen sus capacidades para evaluar
la calidad de los resultados. En otras palabras, esta metodología de evaluación crece con el campo.
Evaluación humana
Si bien los parámetros de referencia son importantes, generalmente se considera que el criterio de
excelencia para la evaluación es la evaluación humana. Incluso si un LLM obtiene una buena puntuación en
parámetros de referencia generales, es posible que no obtenga una buena puntuación en tareas específicas del dominio.
Además, los puntos de referencia no reflejan plenamente las preferencias humanas y todos los métodos
LLM con los que puedes interactuar. Cualquier pregunta o sugerencia que hagas se enviará a ambos modelos y
recibirás su resultado. Luego, puedes decidir qué resultado prefieres. Este proceso permite que la comunidad
vote sobre qué modelos prefieren sin saber cuáles se presentan. Solo después de votar, verás qué modelo
Al momento de escribir este artículo, este método ha generado más de 800.000 votos
humanos que se utilizaron para calcular una tabla de clasificación. Estos votos se utilizan
para calcular el nivel de habilidad relativo de los LLM en función de sus tasas de victorias.
Por ejemplo, si un LLM de bajo rango vence a un LLM de alto rango, su clasificación
cambia significativamente. En ajedrez, esto se conoce como el sistema de clasificación Elo.
Por lo tanto, esta metodología utiliza votaciones colaborativas, lo que nos ayuda a
comprender la calidad del LLM. Sin embargo, sigue siendo la opinión agregada de una
amplia variedad de usuarios, que puede no estar relacionada con su caso de uso.
Como resultado, no existe un método perfecto para evaluar los LLM. Todas las
metodologías y los puntos de referencia mencionados brindan una perspectiva de evaluación
importante, aunque limitada. Nuestro consejo es que evalúe su LLM en función del caso de uso
previsto. Para la codificación, HumanEval sería más lógico que GSM8k.
Pero lo más importante es que creemos que usted es el mejor evaluador. La evaluación
humana sigue siendo el estándar de oro porque depende de usted decidir si el LLM
funciona para el caso de uso que desea. Al igual que con los ejemplos de este capítulo, le
recomendamos encarecidamente que también pruebe estos modelos y tal vez desarrolle algunas
preguntas usted mismo. Por ejemplo, los autores de este libro son árabes (Jay Alammar) y
holandeses (Maarten Grootendorst), y a menudo hacemos preguntas en nuestra lengua materna
cuando nos contactan con nuevos modelos.
Una nota final sobre este tema es una cita que apreciamos mucho:
Cuando una medida se convierte en un objetivo, deja de ser una buena medida.
—Ley de Goodhart20
Para empezar, recuerde que un LLM toma un mensaje y genera una generación como se ilustra
en la Figura 1221.
Figura 1221. Un LLM toma una solicitud de entrada y genera una generación.
Figura 1222. Utilice un evaluador de preferencias (humano o de otro tipo) para evaluar la calidad de
la generación.
Machine Translated by Google
La figura 1223 muestra un paso de ajuste de preferencias que actualiza el modelo en función de
esa puntuación:
Figura 1223. Los métodos de ajuste de preferencias actualizan el LLM en función de la puntuación de la evaluación.
Para automatizar la evaluación de preferencias, necesitamos un paso antes del paso de ajuste de
preferencias, es decir, entrenar un modelo de recompensa, como se muestra en la Figura 1224.
Machine Translated by Google
La figura 1225 muestra que para crear un modelo de recompensa, tomamos una copia del
modelo ajustado a las instrucciones y lo modificamos ligeramente para que, en lugar de generar
texto, ahora genere una única puntuación.
Figura 1225. El LLM se convierte en un modelo de recompensa al reemplazar su cabezal de modelado de lenguaje por un
cabezal de clasificación de calidad.
Figura 1226. Utilice un modelo de recompensa entrenado en la preferencia humana para generar la calidad de finalización
puntaje.
No podemos utilizar directamente el modelo de recompensas. Primero hay que entrenarlo para que
puntúe correctamente las generaciones. Por lo tanto, obtengamos un conjunto de datos de preferencias del
que el modelo pueda aprender.
Machine Translated by Google
Una forma común para los conjuntos de datos de preferencias es que un ejemplo de entrenamiento
tenga un mensaje, con una generación aceptada y una generación rechazada.
(Matiz: no siempre se trata de una generación buena versus una mala; puede ser que las dos
generaciones sean buenas, pero que una sea mejor que la otra). La figura 1227 muestra un
ejemplo de conjunto de entrenamiento de preferencias con dos ejemplos de entrenamiento.
Figura 1227. Los conjuntos de datos de ajuste de preferencias a menudo se componen de indicaciones con generaciones
aceptadas y rechazadas.
Una forma de generar datos de preferencias es presentar una solicitud al LLM y pedirle que genere
dos generaciones diferentes. Como se muestra en la Figura 1228, podemos preguntar a los
etiquetadores humanos cuál de las dos prefieren.
Machine Translated by Google
Figura 1228. Imprima dos generaciones y pregúntele a un etiquetador humano cuál prefiere.
Ahora que tenemos el conjunto de datos de entrenamiento de preferencias, podemos proceder a entrenar
el modelo de recompensa.
La figura 1229 muestra el objetivo del entrenamiento: garantizar que la generación aceptada tenga
Figura 1229. El modelo de recompensa tiene como objetivo evaluar los puntajes de calidad de las generaciones en respuesta a una
indicación.
Cuando combinamos todo junto como se muestra en la Figura 1230, obtenemos las tres etapas para el ajuste de
preferencias:
Figura 1230. Las tres etapas del ajuste de preferencias: recopilación de datos de preferencias, entrenamiento de un modelo
de recompensa y, por último, ajuste fino del LLM.
Los modelos de recompensa son una idea excelente que se puede ampliar y desarrollar.
Llama 2, por ejemplo, entrena dos modelos de recompensa: uno que puntúa la utilidad y otro
que puntúa la seguridad (Figura 1231).
Figura 1231. Podemos utilizar múltiples modelos de recompensa para realizar la puntuación.
Una desventaja de PPO es que es un método complejo que necesita entrenar al menos
dos modelos, el modelo de recompensa y el LLM, lo que puede resultar más costoso de
lo necesario.
Figura 1232. Utilice el propio LLM como modelo de recompensa comparando el resultado de un modelo congelado
con el modelo entrenable.
Para calcular este cambio y sus puntuaciones relacionadas, se extraen las probabilidades
logarítmicas de las generaciones rechazadas y aceptadas de ambos modelos. Como se
ilustra en la Figura 1233, este proceso se realiza a nivel de token, donde las probabilidades se
combinan para calcular el cambio entre los modelos de referencia y los modelos entrenables.
Figura 1233. Las puntuaciones se calculan tomando las probabilidades de generación a nivel de token.
Se optimiza el cambio de probabilidades entre el modelo de referencia y el modelo entrenable. La generación
aceptada sigue el mismo procedimiento.
Con estas puntuaciones, podemos optimizar los parámetros del modelo entrenable para tener
más confianza en la generación de las generaciones aceptadas y menos confianza en
la generación de las generaciones rechazadas. En comparación con PPO, los autores
descubrieron que DPO era más estable durante el entrenamiento y más preciso.
Debido a su estabilidad, lo usaremos como nuestro modelo principal para ajustar las preferencias
de nuestro modelo previamente ajustado por instrucciones.
Machine Translated by Google
vimos antes, con algunas pequeñas diferencias. Seguiremos usando TinyLlama, pero esta vez una versión
ajustada por instrucciones. que primero se entrenó utilizando un ajuste fino completo y luego se alineó aún
En comparación con nuestro modelo inicial ajustado a las instrucciones, este LLM se entrenó en conjuntos
En esta sección, demostraremos cómo puede alinear aún más este modelo utilizando DPO con conjuntos
rechazada. Este conjunto de datos Fue generado en parte por ChatGPT con puntuaciones sobre qué
def format_prompt(ejemplo):
"""Formatee el mensaje para utilizar la plantilla <|usuario|> que utiliza TinyLLama"""
# Formatear respuestas
return
{ "prompt": sistema + mensaje,
"chosen": elegido,
"rejected": rechazado,
}
dpo_dataset = cargar_conjuntodedatos(
Machine Translated by Google
"argilla/distilabelintelorcadpopairs", dividir="entrenar"
) dpo_dataset = dpo_dataset.filter(
lambda r:
r["status"] != "tie" y
r["chosen_score"] >= 8 y no
r["in_gsm8k_train"]
) dpo_dataset = dpo_dataset.map(
formato_de_aviso, eliminar_columnas=conjunto_de_datos_dpo.nombres_de_columnas
Tenga en cuenta que aplicamos un filtrado adicional para reducir aún más el tamaño de los
datos a aproximadamente 6.000 ejemplos de los 13.000 ejemplos originales.
Cuantificación de modelos
Cargamos nuestro modelo base y lo cargamos con el LoRA que creamos anteriormente.
Como antes, cuantificamos el modelo para reducir la VRAM necesaria para el
entrenamiento:
) modelo_combinado = modelo.combinar_y_descargar()
Machine Translated by Google
AutoTokenizer.from_pretrained(nombre_modelo, código_remoto_confiable=True)
tokenizador.pad_token = "<PAD>"
tokenizador.padding_side = "izquierda"
A continuación, utilizamos la misma configuración de LoRA que antes para realizar el entrenamiento
de DPO:
task_type="CAUSAL_LM",
target_modules= # Capas a las que apuntar
["k_proj", "gate_proj", "v_proj", "up_proj", "q_proj", "o_proj", "down_proj"] )
Configuración de entrenamiento
Para simplificar, utilizaremos los mismos argumentos de entrenamiento que utilizamos antes con
una diferencia. En lugar de ejecutar durante una sola época (que puede llevar hasta dos horas),
ejecutamos durante 200 pasos con fines ilustrativos. Además, agregamos el parámetro
warmup_ratio, que aumenta la tasa de aprendizaje de 0 al valor learning_rate que configuramos
para el primer 10 % de los pasos. Al mantener una tasa de aprendizaje pequeña al comienzo (es decir,
Machine Translated by Google
directorio_de_salida = "./resultados"
# Argumentos de entrenamiento
argumentos_de_entrenamiento =
DPOConfig( directorio_salida=directorio_salida,
tamaño_lote_entrenamiento_por_dispositivo=2,
pasos_acumulación_de_gradiente=4,
optim="paged_adamw_32bit",
tasa_de_aprendizaje=1e5,
tipo_programador_lr="coseno",
pasos_máximos=200, pasos_de_registro=10,
fp16=Verdadero, puntos_de_control_de_gradiente=Verdadero, índice_de_calentamiento=0.1
)
Capacitación
Ahora que hemos preparado todos nuestros modelos y parámetros, podemos comenzar
a ajustar nuestro modelo:
args=argumentos_de_entrenamiento,
dpo_trainer.entrenar()
# Guardar adaptador
dpo_trainer.model.save_pretrained("TinyLlama1.1Bdpoqlora")
Hemos creado un segundo adaptador. Para fusionar ambos adaptadores, los fusionamos
iterativamente con el modelo base:
) sft_model = modelo.fusionar_y_descargar()
"TinyLlama1.1Bdpoqlora",
device_map="auto",
) dpo_model = dpo_model.fusionar_y_descargar()
Desde el lanzamiento de DPO, se han desarrollado nuevos métodos para alinear las
preferencias. Cabe destacar la Optimización de preferencias por razón de
probabilidades (ORPO), un proceso que combina SFT y DPO en un único proceso
de entrenamiento.23 Elimina la necesidad de realizar dos ciclos de
entrenamiento separados, lo que simplifica aún más el proceso de entrenamiento y permite el uso de QLoR
Machine Translated by Google
Resumen
En este capítulo, exploramos diferentes pasos para ajustar los LLM preentrenados.
Realizamos un ajuste fino mediante el uso de un ajuste fino eficiente en función de los parámetros
(PEFT) a través de la técnica de adaptación de bajo rango (LoRA). Explicamos cómo se puede
extender LoRA a través de la cuantificación, una técnica para reducir las restricciones de memoria al
representar los parámetros del modelo y los adaptadores.
El proceso de ajuste fino que exploramos consta de dos pasos. En el primer paso, realizamos un
ajuste fino supervisado utilizando datos de instrucciones en un LLM entrenado previamente, a
menudo denominado ajuste de instrucciones. Esto dio como resultado un modelo que tiene un
comportamiento similar al de un chat y que puede seguir las instrucciones de cerca.
En el segundo paso, mejoramos aún más el modelo ajustándolo con datos de alineación, datos
que representan qué tipo de respuestas se prefieren en comparación con otras. Este proceso, conocido
como ajuste de preferencias, destila la preferencia humana en el modelo ajustado previamente
con instrucciones.
En general, este capítulo ha mostrado los dos pasos principales para ajustar un LLM
previamente entrenado y cómo eso podría conducir a resultados más precisos e informativos.
1
Neil Houlsby et al. “Transferencia de aprendizaje eficiente en parámetros para NLP”. Conferencia internacional
sobre aprendizaje automático. PMLR, 2019.
2
Jonas Pfeiffer et al. “AdapterHub: un marco para adaptar transformadores”. Preimpresión de arXiv
arXiv:2007.07779 (2020).
3
Renrui Zhang et al. “Llamaadapter: ajuste fino eficiente de modelos de lenguaje con atención de inicio
cero”. Preimpresión de arXiv arXiv:2303.16199 (2023).
4
Edward J. Hu et al. “LoR: Adaptación de bajo rango de modelos de lenguaje grandes”. Preimpresión de
arXiv arXiv:2106.09685 (2021).
5
Armen Aghajanyan, Luke Zettlemoyer y Sonal Gupta. “La dimensionalidad intrínseca explica la eficacia
del ajuste fino del modelo lingüístico”. Preimpresión de arXiv arXiv:2012.13255 (2020).
6
Tim Dettmers et al. “QLoRA: ajuste fino eficiente de LLM cuantificados”. Preimpresión de arXiv
arXiv:2305.14314 (2023).
Machine Translated by Google
7
Ning Ding et al. “Mejorar los modelos de lenguaje de chat mediante la ampliación de la enseñanza de alta calidad”
conversaciones.” preimpresión arXiv arXiv:2305.14233 (2023).
8
Fred Jelinek et al. “Perplejidad: una medida de la dificultad de las tareas de reconocimiento de voz”.
Revista de la Sociedad Acústica de América 62.S1 (1977): S63.
9
ChinYew Lin. “ROUGE: Un paquete para la evaluación automática de resúmenes”. Texto
El resumen se ramifica, 74–81. 2004.
10
Kishore Papineni, et al. “Bleu: un método para la evaluación automática de la traducción automática”.
Actas de la 40ª Reunión Anual de la Asociación de Lingüística Computacional.
2002.
11
Tianyi Zhang et al. “BERTscore: evaluación de la generación de texto con BERT”. Preimpresión de arXiv
arXiv:1904.09675 (2019).
12
Dan Hendrycks et al. “Medición de la comprensión masiva del lenguaje en múltiples tareas”. Preimpresión de arXiv
arXiv:2009.03300 (2020).
13
Alex Wang et al. “GLUE: una plataforma de análisis y evaluación comparativa multitarea para lenguaje natural
comprensión.” preimpresión arXiv arXiv:1804.07461 (2018).
14
Stephanie Lin, Jacob Hilton y Owain Evans. “TruthfulQA: medición de cómo los modelos imitan
falsedades humanas”. preimpresión arXiv arXiv:2109.07958 (2021).
15
Karl Cobbe et al. “Entrenamiento de verificadores para resolver problemas matemáticos con palabras”. Preimpresión de arXiv
arXiv:2110.14168 (2021).
16
Roman Zellers et al. “HellaSwag: ¿Puede una máquina realmente terminar tu frase?”, preimpresión de arXiv
arXiv:1905.07830 (2019).
17
Mark Chen et al. “Evaluación de modelos de lenguaje de gran tamaño entrenados en código”. Preimpresión de arXiv
arXiv:2107.03374 (2021).
18
Lianmin Zheng et al. “Juzgar un LLM como juez con MTBench y Chatbot Arena”.
Avances en sistemas de procesamiento de información neuronal 36 (2024).
19
WeiLin Chiang et al. “Chatbot Arena: una plataforma abierta para evaluar LLM por parte de humanos”
preferencia.” preimpresión arXiv arXiv:2403.04132 (2024).
20
Mafilyn Strathern. “'Mejorando las calificaciones': auditoría en el sistema universitario británico” .
Revista 5.3 (1997): 305–321.
21
John Schulman et al. “Algoritmos de optimización de políticas proximales”. Preimpresión de arXiv
arXiv:1707.06347 (2017).
22
Rafael Rafailov, et al. “Optimización de preferencias directas: su modelo de lenguaje es secretamente un
modelo de recompensa”. preimpresión arXiv arXiv:2305.18290 (2023).
Machine Translated by Google
23
Jiwoo Hong, Noah Lee y James Thorne, “ORPO: optimización de preferencias monolíticas
sin modelo de referencia”. preimpresión arXiv arXiv:2403.07691 (2024).
OceanofPDF.com
Machine Translated by Google
Epílogo
Gracias a todos los que nos acompañaron en este fascinante viaje a través del
mundo de los grandes modelos lingüísticos. Agradecemos su dedicación para
aprender sobre estos poderosos modelos que han revolucionado el procesamiento
del lenguaje.
A lo largo de este libro, hemos visto cómo funcionan los LLM y cómo se pueden
utilizar para crear una amplia gama de aplicaciones, desde simples chatbots hasta
sistemas más complejos como los motores de búsqueda. También hemos
explorado varios métodos para ajustar los LLM previamente entrenados en
tareas específicas, incluidas la clasificación, la generación y la representación del
lenguaje. Al dominar estas técnicas, los lectores podrán descubrir el potencial de los
LLM y crear soluciones innovadoras que puedan beneficiarse de sus capacidades.
Este conocimiento les permitirá mantenerse a la vanguardia y adaptarse
a los nuevos avances en el campo.
A medida que nos acercamos al final de este libro, queremos enfatizar que
nuestra exploración de los LLM es solo el comienzo. Hay muchos más
desarrollos interesantes en el horizonte y lo alentamos a continuar siguiendo los
avances en el campo. Para ayudar con este proceso, esté atento al repositorio de
este libro a medida que continuamos agregando recursos.
Esperamos que al leer este libro usted obtenga una comprensión más profunda de
cómo se pueden utilizar los LLM en diversas aplicaciones y cómo tienen el
potencial de transformar industrias.
Con este libro como guía, creemos que usted estará bien equipado para navegar
por el apasionante panorama de los LLM y hacer contribuciones
significativas a este campo en rápido avance.
OceanofPDF.com
Machine Translated by Google
Índice
exactitud
razonamiento paso a paso, El poder impulsor detrás de los agentes: razonamiento paso a
paso: El poder impulsor detrás de los agentes: razonamiento paso a paso
Razonamiento
IA (inteligencia artificial)
Molestar, búsqueda del vecino más cercano versus bases de datos vectoriales
Machine Translated by Google
consulta
Resumen
Modelado de temas, desde la agrupación de texto hasta el modelado de temas (BER) Tema: A
Marco de modelado de temas modulares: agregar un bloque Lego especial
En comparación con otros tokenizadores entrenados, modelo base BERT (sin carcasa)
(2018)
Brecha de modalidad
do
pensamiento: Piensaantesderesponder
Machine Translated by Google
Solicitud basada en chat, caso de uso 2: Solicitud basada en chat multimodal: uso
ChatGPT, E/S de modelos: carga de modelos cuantificados con LangChain, creación de modelos
informes de clasificación, Uso de un modelo específico de tarea Uso de un modelo específico de tarea
Modelo
CLIP, CLIP: Conexión de texto e imágenes: ¿Cómo puede CLIP generar incrustaciones
multimodales?
OpenCLIP, OpenCLIPOpenCLIP
[CLS] token, Modelos de representación: modelos solo de codificador, modelo base BERT (sin mayúsculas y
Codificador automático de eliminación de ruido: preparación de datos para el reconocimiento de entidades con nombre
Incrustaciones
Conjunto de datos CoNLL2003, Preparación de datos para el reconocimiento de entidades con nombre
Machine Translated by Google
contexto
aprendizaje contrastivo
similitud de coseno, ¿Qué pasa si no tenemos datos etiquetados?, similitud de coseno similitud
de coseno
Incrustaciones
Ajuste fino de modelos de incrustación para, Ajuste fino de modelos de incrustación para
recuperación densa
Búsqueda del vecino más cercano versus bases de datos vectoriales, Búsqueda del vecino
más cercano versus bases de datos vectoriales
Incrustaciones
Capacitación
mi
incrustaciones multimodales?
OpenCLIP, OpenCLIPOpenCLIP
ModelosIncorporación de modelos
Incrustaciones (RoPE)
SBERT, SBERTSBERT
FAISS, búsqueda del vecino más próximo frente a bases de datos vectoriales
Redes neuronales de avance, La atención es todo lo que necesitas, La red neuronal de avance de un
Clasificación de pocos disparos, Clasificación de pocos disparos: ajuste fino para la clasificación de pocos disparos
Clasificación
Ajuste fino para la clasificación, Ajuste fino para la clasificación de pocos disparos
Ajuste fino para la clasificación de pocos disparos
Machine Translated by Google
sintonia FINA
supervisado, SupervisadoSupervisado
GRAMO
Galáctica, Galáctica
árbol del pensamiento, Árbol del pensamiento: Explorando los pasos intermedios
Árbol del pensamiento: exploración de los pasos intermedios
T5, Uso del transformador de transferencia de texto a texto: Uso del transformador
de transferencia de texto a texto
Guante, SBERT
GPU
yo
alucinación
Incitación basada en
Filosofía de la intuición como primera opción, Una filosofía de la intuición como primera opción
Yo
Marco de modelado
caché kv (claves y valores), aceleración de la generación mediante el almacenamiento en caché de claves y valores
yo
Carga de modelos cuantificados con, E/S de modelo: Carga de modelos cuantificados con
Cadena Lang
Inteligencia artificial del lenguaje (IA del lenguaje), una introducción a las grandes
Cabeza de modelado del lenguaje (cabeza LM), Los componentes del paso hacia adelante
Llama 2, claves API, recursos limitados son todo lo que necesitas, Phi3 (y
Modelo de generación, haciendo que los modelos de generación de texto sean multimodales
LLM (modelos de lenguaje grande), una introducción a los modelos de lenguaje grande
ModelosResumen
Documentos)
Machine Translated by Google
Resumen
Fusionar pesos
Ajuste de preferencias
Modelos de representación de ajuste fino, Modelos de representación de ajuste fino para clasificación
Resumen
Vista de alto nivel, Cómo los tokenizadores preparan las entradas al lenguaje
Modelo
Filosofía de la intuición como primera opción, Una filosofía de la intuición como primera opción
con modelos locales, Ejemplo: RAG con modelos locales, El mensaje RAG
contrastivo?
múltiples negativos
SBERT, SBERTSBERT
Resumen
Cadenas, Cadenas: Ampliación de las capacidades de los LLM: una cadena con
Múltiples indicaciones
Cadena Lang
TokenizadoresPhi3 (y Llama 2)
Modelo de lenguaje
Machine Translated by Google
Resumen
probabilidad (Muestreo/Decodificación)
Componentes del pase hacia adelante, Los componentes del pase hacia adelante
Combinando información
Utilidad de las aplicaciones de modelos de lenguaje de gran tamaño: ¿qué las hace
tan útiles?
Cabeza LM (cabeza de modelado del lenguaje), Los componentes del paso hacia adelante
Los componentes del pase hacia adelante
pérdida de clasificación por múltiples negativos, pérdida de clasificación por múltiples negativos
METRO
Modelado
Resumen
Reclasificación
Modelado
CLIP, CLIP: Conexión de texto e imágenes: ¿Cómo puede CLIP generar incrustaciones
multimodales?
OpenCLIP, OpenCLIPOpenCLIP
modelos de generación de texto, Hacer que los modelos de generación de texto sean multimodales
Subtítulos de imágenes
norte
procesamiento del lenguaje natural (PLN), ¿Qué es la IA del lenguaje?, ¿Qué es el aprendizaje
contrastivo?
Incrustaciones
Bases de datos vectoriales versus, Búsqueda del vecino más cercano versus bases de
datos vectoriales
NER (reconocimiento de entidades con nombre), Reconocimiento de entidades con nombre : ajuste fino para el
PNL (procesamiento del lenguaje natural), ¿Qué es la IA del lenguaje?, ¿Qué es el aprendizaje
contrastivo?
Capacitación
NumPy, búsqueda del vecino más cercano versus bases de datos vectoriales
Oh
Tabla de clasificación de Open LLM, E/S de modelos: carga de modelos cuantificados con
LangChain, Tablas de clasificación
OpenCLIP, OpenCLIPOpenCLIP
Muestreo restringido
PAG
Incrustaciones
adaptadores, AdaptadoresAdaptadores
Fi3
Cadena Lang
Pinecone, búsqueda del vecino más cercano versus bases de datos vectoriales
Incrustaciones (RoPE)
Ajuste de preferencias, ChatGPT para clasificación, Los tres cursos de formación LLM
Incrustaciones
IngenieríaResumen
Incitación basada en
Muestreo
componentes del mensaje, Los ingredientes básicos de un mensaje: los componentes básicos
Ingredientes de un Prompt
Fusionar pesos
con modelos locales, Ejemplo: RAG con modelos locales: el mensaje RAG
Reaccionar
razonamiento paso a paso, El poder impulsor detrás de los agentes: razonamiento paso a paso
razonamiento
árbol del pensamiento, Árbol del pensamiento: Explorando los pasos intermedios
Razonamiento
reranking, descripción general de la búsqueda semántica y RAG, reranking: cómo funcionan los
modelos de reranking
Puntuación de múltiples consultas con precisión media promedio, Puntuación en múltiples consultas
Puntuación de consultas individuales con precisión media, Puntuación de una consulta individual con
precisión media
RoBERTa, tokens de palabra versus subpalabra versus carácter versus tokens de bytes,
Selección de modelo
Conjunto de datos de Rotten Tomatoes, el sentimiento de las críticas cinematográficas, cómo ajustar una
Modelo BERT preentrenado
Búsqueda del vecino más cercano versus bases de datos vectoriales, Búsqueda del vecino
más cercano versus bases de datos vectoriales
reranking, descripción general de la búsqueda semántica y RAG, reranking: cómo funcionan los
modelos de reranking
[SEP] token, modelo base BERT (sin carcasa) (2018), Creación de contexto
Reconocimiento de entidades
Ajuste fino eficiente con pocos ejemplos de entrenamiento: SetFit: ajuste fino eficiente
SFT (ajuste fino supervisado), Los tres pasos de la formación LLM: preentrenamiento,
adaptadores, AdaptadoresAdaptadores
(LoRA)
Aprendizaje no supervisado
razonamiento paso a paso, El poder impulsor detrás de los agentes: paso a paso
Capas de congelación
yo
T5 (Transformador de transferencia de texto a texto), uso del transformador de transferencia de texto a texto
Salidas
Pruebas divididas, El sentimiento de las críticas cinematográficas, Utilizando un modelo específico de tareas
Fragmentación de texto, obtención del archivo de texto y fragmentación del mismo, fragmentación de
T5, Uso del transformador de transferencia de texto a texto: Uso del transformador de
transferencia de texto a texto
modelos específicos de tareas, Uso de un modelo específico de tareas Uso de un modelo específico de tareas
Modelo específico
supervisado, SupervisadoSupervisado
SBERT, SBERTSBERT
razonamiento paso a paso, El poder impulsor detrás de los agentes: razonamiento paso
a pasoEl poder impulsor detrás de los agentes: razonamiento paso a paso
Machine Translated by Google
Cadenas, Cadenas: Ampliación de las capacidades de los LLM: una cadena con
Múltiples indicaciones
Resumen
Subtítulos de imágenes
Bloque Lego
Modelo de texto dentro de texto fuera, las entradas y salidas de un transformador entrenado
Máster en Derecho
Transformador de transferencia de texto a texto (T5), uso del transformador de transferencia de texto a texto
Fichas de bytes
modelo de bolsa de palabras, Representación del lenguaje como una bolsa de palabras
Phi3 (y Llama 2)
Modelo base BERT (en caja), modelo base BERT (en caja) (2018)
Modelo base BERT (sin carcasa), modelo base BERT (sin carcasa) (2018)
Galáctica, Galáctica
Machine Translated by Google
Pase hacia adelante, Los componentes del pase hacia adelanteLos componentes del
pase hacia adelante
Modelos centrados en texto versus modelos centrados en código, El dominio de los datos
Fichas de bytes
Fichas de bytes
Modelado de temas, agrupamiento de texto y modelado de temas, del agrupamiento de texto al modelado
Arquitectura del transformador, la atención es todo lo que necesitas: la atención es todo lo que necesitas
Componentes del pase hacia adelante, Los componentes del pase hacia adelanteEl
caché de claves y valores, aceleración de la generación mediante el almacenamiento en caché de claves y valores
agrupada
Incrustaciones (RoPE)
Combinando información
que necesitas
Redes neuronales de propagación hacia adelante, La red neuronal de propagación hacia adelante
de un vistazo
árbol del pensamiento, Árbol del pensamiento: Explorando los pasos intermediosÁrbol del pensamiento
para la adaptación del dominio, utilizando TSDAE para la adaptación del dominio
tú
Búsqueda del vecino más cercano versus, Búsqueda del vecino más cercano versus bases de
datos vectoriales
visualización
Machine Translated by Google
Yo
Weaviate, búsqueda del vecino más cercano versus bases de datos vectoriales
Capacitación
tokens de palabras, tokens de palabras, tokens de subpalabras, tokens de caracteres y tokens de bytes
Machine Translated by Google
Modelo base BERT sin carcasa, modelo base BERT (sin carcasa) (2018)
OceanofPDF.com
Machine Translated by Google
OceanofPDF.com
Machine Translated by Google
Colofón
Los canguros rojos reciben su nombre por el color de su pelaje. Si bien el nombre tiene
sentido para los machos (tienen un pelaje corto de color marrón rojizo), las hembras suelen
tener un color más gris azulado con un matiz marrón en toda su extensión. El color rojo de
su pelaje proviene de un aceite rojo que segregan las glándulas de su piel.
Debido a su color, los australianos llaman a los canguros rojos machos “grandes rojos”.
Sin embargo, como las hembras son más rápidas que los machos, a menudo se las llama
“voladores azules”.
Los canguros rojos prefieren áreas abiertas y secas con algunos árboles para dar sombra y
se encuentran en todo el territorio continental de Australia, excepto en las regiones
del norte superior, suroeste inferior y costa este del país. Las condiciones
ambientales circundantes pueden afectar la reproducción. Debido a esto, las hembras
pueden pausar o posponer el embarazo o el parto hasta que las condiciones mejoren. A
menudo usan esta capacidad para retrasar el nacimiento de una nueva cría (joey) hasta
que la anterior haya salido de su bolsa.
OceanofPDF.com