0.1. LoRA como aproximación de baja-rango.

Imaginemos el modelo más simple, entra un vector x y sale un vector y, la regla es: , donde la información de entrada estpa en x, y la forma en que el modelo procesa toda la información está en la matriz W (pesos del modelo).

En cualquier aprendizaje hay siempre la misma idea, mides que tamn bien hace las cosas el modelo, pérdida o reward, cambias un poco los números de W para que la próxima vez lo haga mejor.

Entrenar es ajustar la tabla de números W muchas veces. En un LLM un solo W puede tener millones de entradas es muy caro cambiar todas.

El truco es en lugar de cambiar W directamente, dejamos fijo (los pesos originales pre-entrenados) y sólo se aprnederá una correción .

En el forward:

Comenzando con LoRA, esto nos dice que se impondrá una correción tenga una forma muy simple: , donde A,B son matrices mucho más pequeñas.

Supongamos que

LoRA escribe , donde es un número pequeño.

Supongamos que tenemos una capa de un LLM con , lo que serían 4096*4096 = 16,777,216 números, si hicieramos fine-tuning normal entrenaríamos muchos millones de parámetros por capa, con LoRA eliges por ejemplo:

Total: parámetros. Note que es más de 100 veces menor, y puedes seguir haciendo cambios útiles, pero de una forma muy “controlada”.

Con esto tenemos una breve introducción sobre la idea de qué es LoRA.

0.2. Bajo rango:

Cualquier matriz que se escriba como con no puede ser totalmente “arbitraria”, está limitada.

Esto se mide con el concepto de rango: básicamente cuánta “complejidad lineal” tiene la matriz. Cuando usas pequeño, obligas a que la correción tenga poca complejidad lineal: por eso se llama actualización de rango bajo.

la correción no puede ser cualquier cosa: solo matrices que se puedan escribir como con r pequeño. Esto reduce el número de parámetros y “simplifica” la clase de funciones que puedes aprender.

En RL tienes una política , pero dentro es un modelo con muchas matrices , cuando haces PPO, GRPO, etc, el algoritmo te dice cómo cambiar los parámetros para mejorar el reward.

Con LoRA lo único que cambia es que en lugar de cambiar directamente, dices “mi política tiene matrices , en algunas capas”, y el RL solo aprende A y B, osea LoRa es una forma específica de parametrizar la política para que entrenes pocos parámetros (los A, B) en lugar de todo W.

Ejemplo: sea tamaño 2 x 3.

Y los pesos efectivos:

Esta es la correción que LoRA lo agrega

, donde era lo que el modelo sabía, LoRA aprendió A, B, que generan , y la capa que realmente se usa en inferencia es

Tomemos un vector de entrada

La salida del modelo original sin LoRA , con LoRApodemos verlo:

  1. Usando directamente

  2. Separando modelo base + correción LoRA, usando la identidad: , donde , que es exactamente lo que se obtuvo en 1.

  3. La factorización real de LoRA, , recuerda que , que es exactamente

Entonces, primero se va de dimensión 3 a 1 con B (proyección), depsues de dimension 1 a 2 con A (re-expansión). Eso es lo que significa “bajo rango”, toda la corrección vive en un subespacio 1-dimensional en el medio.

La conexión con el RL, supongamos que tenemos un estado , los pasos para un embedding o algo y obtienes un vector , tambien una capa final con pesos , que produce logits: , de eso logits sacas una política sobre dos acciones con softmax:
, donde , son los árámetros LoRA y está fijo.

En RL el algoritmo (PPO, GRPO, …) te dice cómo actualizar para mejorar el retorno, pero la matemática no cambia, sigue haciendo , lo único que cambia es de donde viene el gradiente (de la pérdida de RL en vez de una pérdida supervizada.)

0.3. LoRA dentro de una política miníma

Supongamos que cada estado lol convertimos en un vector de características: , esto puede venir de un embedding, de una MLP, de un transformer, lo que sea, no importa cómo, solo asumimos que para cada estado tengo un vector .

Tomemos una capa lineal con pesos efectivos , donde |A| es el número de acciones, definimos las logits como la política estocástica es:

, donde es la coordenada de correspondiente a la acción a, son los parámetros que vamos a entrenar (ahorita van a ser A,B), hasta ahora esto e suna política softmax totalmente estándar de RL.

Ahora metemos LoRA en esa matriz de logits:


y los logits pasan a ser:

: es el comportamiento base del modelo (la política original).

: ajuste que estás aprendiendo con RL pero de bajo rango.

La política ya depende sólo de , porque está fijado:

Cuando uses PPO o GRPO, el algoritmo dirá: ajusta los parámetros para mejorar el retorno esos parámetros ahora son

En RL con gradiente dw política, el objeto central es algo como:

Cuando usas LoRA: depende de A,B solo a través de

Por la regla de la cadena, el gradiente se descompone :

Formalmente, pero sin demostrar:

EL gradiente de la política sigue igual, lo único que cambia es que la política está parametrizada con LoRA, es decir con