Optimización de LLM: Lora y Qlora | Hacia la ciencia de los datos

Con la aparición de ChatGPT, el mundo reconoció el potencial potencial de los modelos de idiomas grandes, que pueden comprender el lenguaje natural y responder a las solicitudes de los usuarios con alta precisión. En la abreviatura de LLMla primera carta L representa Grandereflejando el número masivo de parámetros que típicamente tienen estos modelos.

Los LLM modernos a menudo contienen más de mil millones de parámetros. Ahora, imagine una situación en la que queremos adaptar un LLM a una tarea aguas abajo. Un enfoque común consiste en sintonia FINAque implica ajustar los pesos existentes del modelo en un nuevo conjunto de datos. Sin embargo, este proceso es extremadamente lento y intensivo en recursos, especialmente cuando se ejecuta en una máquina local con hardware limitado.

Número de parámetros de algunos de los modelos de idiomas más grandes capacitados en los últimos años.

Durante el ajuste, algunas capas de redes neuronales se pueden congelar para reducir la complejidad del entrenamiento, este enfoque aún se queda corto a escala debido a los altos costos computacionales.

Para abordar este desafío, en este artículo exploraremos los principios centrales de Lora (Adaptación de bajo rango)una técnica popular para reducir la carga computacional durante el ajuste fino de modelos grandes. Como beneficio adicional, también echaremos un vistazo a Qlora, que se basa en Lora al incorporar la cuantización para mejorar aún más la eficiencia.

Representación de la red neuronal

Tomemos una red neuronal totalmente conectada. Cada una de sus capas consiste en norte neuronas completamente conectadas a metro neuronas de la siguiente capa. En total, hay norte metro conexiones que pueden representarse como una matriz con las dimensiones respectivas.

Un ejemplo que muestra una capa de red neuronal totalmente conectada cuyos pesos pueden representarse en la forma de matriz.

Cuando se pasa una nueva entrada a una capa, todo lo que tenemos que hacer es realizar la multiplicación de la matriz entre la matriz de peso y el vector de entrada. En la práctica, esta operación está altamente optimizada utilizando bibliotecas de álgebra lineal avanzada y a menudo se realiza en lotes completos de entradas simultáneamente para acelerar el cálculo.

Truco de multiplicación

La matriz de peso en una red neuronal puede tener dimensiones extremadamente grandes. En lugar de almacenar y actualizar la matriz completa, podemos factorizarla en el producto de dos matrices más pequeñas. Específicamente, si una matriz de peso tiene dimensiones n × mpodemos aproximarlo usando dos matrices de tamaños n × k y K × Mdónde k es una dimensión intrínseca mucho más pequeña (k << n, m).

Por ejemplo, suponga que la matriz de peso original es 8192 × 8192que corresponde a aproximadamente 67m parámetros. Si elegimos k = 8la versión factorizada consistirá en dos matrices: una de tamaño 8192 × 8 y el otro 8 × 8192. Juntos, contienen solo sobre 131k Parámetros: más de 500 veces menos que el original, reduciendo drásticamente la memoria y los requisitos de cálculo.

Una matriz grande puede representarse aproximadamente como una multiplicación de dos matrices más pequeñas.

La desventaja obvia del uso de matrices más pequeñas para aproximar una más grande es la pérdida potencial en precisión. Cuando multiplicamos las matrices más pequeñas para reconstruir el original, los valores resultantes no coincidirán exactamente con los elementos de matriz originales. Esta compensación es el precio que pagamos por reducir significativamente la memoria y las demandas computacionales.

Sin embargo, incluso con un valor pequeño como K = 8, a menudo es posible aproximar la matriz original con una pérdida mínima de precisión. De hecho, en la práctica, incluso los valores tan bajos como K = 2 o K = 4 a veces se pueden usar de manera efectiva.

Lora

La idea descrita en la sección anterior ilustra perfectamente el concepto central de Lora. Lora representa Adaptación de bajo rangodonde el término rango bajo se refiere a la técnica de aproximando una matriz de peso grande al factorizarla en el producto de dos matrices más pequeñas con un rango mucho más bajo k. Este enfoque reduce significativamente el número de parámetros entrenables al tiempo que preserva la mayor parte del poder del modelo.

Capacitación

Supongamos que tenemos un vector de entrada incógnita pasado a una capa totalmente conectada en una red neuronal, que antes del ajuste fino, está representada por una matriz de peso W. Para calcular el vector de salida Ysimplemente multiplicamos la matriz por la entrada: y = wx.

Durante el ajuste fino, el objetivo es ajustar el modelo para una tarea aguas abajo modificando los pesos. Esto se puede expresar como aprendizaje de una matriz adicional ΔWtal que: y = (w + ΔW) x = wx + ΔWX. Como vimos el truco de multiplicación anterior, ahora podemos reemplazar ΔW por multiplicación licenciado en Letrasasí que finalmente tenemos: y = wx + bax. Como resultado, congelamos la matriz Wy resolver el Mejoramiento Tarea para encontrar matrices A y B que contienen totalmente mucho menos parámetros que ΔW!

Sin embargo, el cálculo directo de la multiplicación (Ba) x Durante cada pase hacia adelante, es muy lento debido al hecho de que la multiplicación matriz licenciado en Letras es una operación pesada. Para evitar esto, podemos aprovechar la propiedad asociativa de la multiplicación de matriz y reescribir la operación como B (hacha). La multiplicación de A por incógnita resulta en un vector que se multiplicará por B que también produce un vector. Esta secuencia de operaciones es mucho más rápida.

Proceso de capacitación de Lora

En términos de backpropagation, Lora también ofrece varios beneficios. A pesar de que un gradiente para una sola neurona todavía toma casi la misma cantidad de operaciones, ahora tratamos con muchos menos parámetros en nuestra red, lo que significa:

  • Necesitamos calcular muchos menos gradientes para A y B que originalmente se hubiera requerido para W.
  • Ya no necesitamos almacenar una matriz gigante de gradientes para W.

Finalmente, para calcular Ysolo necesitamos agregar el ya calculado WX y Bax. Aquí no hay dificultades ya que la adición de matriz puede ser fácilmente paralelizada.

Como detalle técnico, antes de ajustar, matriz A se inicializa utilizando una distribución gaussiana y matriz B se inicializa con ceros. Usando una matriz cero para B al principio asegura que el modelo se comporte exactamente como antes, porque Bax = 0 · ax = 0entonces Y permanece equivalente a WX.

Esto hace que la fase inicial de ajuste fino sea más estable. Luego, durante la propagación de retroceso, el modelo adapta gradualmente sus pesos para A y B para aprender nuevos conocimientos.

Después de entrenar

Después del entrenamiento, hemos calculado las matrices óptimas A y B. Todo lo que tenemos que hacer es multiplicarlos para calcular ΔWque luego agregamos a la matriz previa W Para obtener los pesos finales.

Mientras que la multiplicación matriz licenciado en Letras Puede parecer una operación pesada, solo la realizamos una vez, ¡así que no debería preocuparnos demasiado! Además, después de la adición, ya no necesitamos almacenar A, Bo ΔW.

Sutileza

Si bien la idea de Lora parece inspiradora, puede surgir una pregunta: durante el entrenamiento normal de las redes neuronales, ¿por qué no podemos representar directamente como como? Bax en lugar de usar una matriz pesada W para calcular y = wx?

El problema con solo usar Bax es que la capacidad del modelo sería mucho más baja y probablemente insuficiente para que el modelo aprenda de manera efectiva. Durante el entrenamiento, un modelo necesita aprender cantidades masivas de información, por lo que naturalmente requiere una gran cantidad de parámetros.

En la optimización de Lora, tratamos WX como el conocimiento previo del modelo grande e interpretar ΔWx = Bax Como conocimiento específico de la tarea introducido durante el ajuste fino. Entonces, todavía no podemos negar la importancia de W en el rendimiento general del modelo.

Adaptador

Estudiando la teoría de LLM, es importante mencionar el término “adaptador“Eso aparece en muchos documentos de LLM.

En el contexto de Lora, un adaptador es una combinación de matrices A y B que se utilizan para resolver una tarea particular aguas abajo para una matriz dada W.

Por ejemplo, supongamos que hemos entrenado una matriz W tal que el modelo puede comprender el lenguaje natural. Luego podemos realizar varias optimizaciones de Lora independientes para ajustar el modelo en diferentes tareas. Como resultado, obtenemos varios pares de matrices:

  • (A₁, B₁)-Adaptador utilizado para realizar tareas de respuesta de pregunta.
  • (AB)– Adaptador utilizado para problemas de resumen de texto.
  • (AB)– Adaptador capacitado para el desarrollo de chatbot.
Desarrollar un adaptador separado para cada tarea aguas abajo es una forma eficiente y escalable de adaptar un modelo grande y único a diferentes problemas.

¡Dado eso, podemos almacenar una sola matriz y tener tantos adaptadores como queramos para diferentes tareas! Dado que las matrices A y B son pequeñas, son muy fáciles de almacenar.

Ajuste del adaptador en tiempo real

Lo mejor de los adaptadores es que podemos cambiarlos dinámicamente. Imagine un escenario en el que necesitamos desarrollar un sistema de chatbot que permita a los usuarios elegir cómo debe responder el bot en función de un personaje seleccionado, como Harry Potterun pájaro enojadoo Cristiano Ronaldo.

Sin embargo, las limitaciones del sistema pueden evitar que almacenemos o ajustemos tres modelos grandes separados debido a su gran tamaño. ¿Cuál es la solución?

¡Aquí es donde los adaptadores vienen al rescate! Todo lo que necesitamos es un solo modelo grande W y tres adaptadores separados, uno para cada personaje.

Una aplicación de chatbot en la que un usuario puede seleccionar el comportamiento del bot en función de su carácter. Para cada personaje, se usa un adaptador separado. Cuando un usuario quiere cambiar el personaje, se puede cambiar dinámicamente a través de la adición de matriz.

Mantenemos en la memoria solo matriz W y tres pares de matriz: (A₁, B₁), (A₂, B₂), (A₃, B₃). Cada vez que un usuario elige un nuevo carácter para el bot, solo tenemos que reemplazar dinámicamente la matriz del adaptador realizando la adición de la matriz entre Wy (Aᵢ, Bᵢ). ¡Como resultado, obtenemos un sistema que escala extremadamente bien si necesitamos agregar nuevos personajes en el futuro!

Qlora

Qlora es otro término popular cuya diferencia de Lora está solo en su primera letra, Qque significa “cuantificado“. El término “cuantificación“Se refiere al número reducido de bits que se utilizan para almacenar pesos de las neuronas.

Por ejemplo, podemos representar pesos de redes neuronales como carrozas que requieren 32 bits para cada peso individual. La idea de cuantización consiste en comprimir pesos de red neuronal a una precisión menor sin pérdida o impacto significativo en el rendimiento del modelo. Entonces, en lugar de usar 32 bits, podemos soltar varios bits para usar, por ejemplo, solo 16 bits.

Ejemplo de cuantificación simplificada. Los pesos de la red neuronal se redondean a un decimal. En realidad, el redondeo depende del número de bits cuantificados.

Hablando de Qlora, la cuantización se usa para la matriz previa a la aparición W para reducir su tamaño de peso.

*Bonificación: ajuste de prefijo

Ajuste de prefijo es una alternativa interesante a Lora. La idea también consiste en usar adaptadores para diferentes tareas aguas abajo, pero esta vez los adaptadores están integrados dentro de la capa de atención del transformador.

Más específicamente, durante el entrenamiento, todas las capas modelo se congelan, excepto las que se agregan como prefijos a algunos de los incrustaciones calculadas dentro de las capas de atención. En comparación con Lora, el ajuste del prefijo no cambia la representación del modelo, y en general, tiene muchos menos parámetros entrenables. Como anteriormente, para tener en cuenta el adaptador de prefijo, necesitamos realizar la adición, pero esta vez con menos elementos.

A menos que se les tenga restricciones computacionales y de memoria muy limitadas, los adaptadores Lora todavía se prefieren en muchos casos, en comparación con el ajuste de prefijo.

Conclusión

En este artículo, hemos analizado los conceptos de LLM avanzados para comprender cómo los modelos grandes pueden ajustarse de manera eficiente sin sobrecarga computacional. La elegancia de Lora para comprimir la matriz de peso a través de la descomposición de la matriz no solo permite que los modelos entrenen más rápido, sino que también requieren menos espacio de memoria. Además, Lora sirve como un excelente ejemplo para demostrar la idea de adaptadores que se pueden usar y cambiar de manera flexible para tareas aguas abajo.

Además de eso, podemos agregar un proceso de cuantización para reducir aún más el espacio de memoria mediante la disminución del número de bits necesarios para representar cada neurona.

Finalmente, exploramos otra alternativa llamada “Tuning de prefijo”, que juega el mismo papel que los adaptadores pero sin cambiar la representación del modelo.

Recursos

Todas las imágenes son del autor a menos que se indique lo contrario.