A percepção central por trás do LoRA, publicado por Hu et al. em 2021, é que as atualizações de peso durante o fine-tuning tendem a ser de baixo rank — ou seja, as mudanças podem ser bem aproximadas pelo produto de duas matrizes muito menores. Em vez de atualizar uma matriz de pesos W (digamos, 4096 x 4096 = 16 milhões de parâmetros), o LoRA congela W inteiramente e adiciona duas matrizes pequenas A (4096 x r) e B (r x 4096) onde r (o rank) é tipicamente 8, 16 ou 64. A atualização efetiva é o produto BA, que tem a mesma forma que W mas é parametrizado por apenas 2 x 4096 x r valores. Com rank 16, isso dá cerca de 131.000 parâmetros treináveis em vez de 16 milhões — uma redução de 120x para essa única camada. Aplique isso em todas as camadas de atenção do modelo e seus parâmetros treináveis totais caem de bilhões para alguns milhões, e é por isso que um arquivo de adapter LoRA frequentemente tem apenas 10-50 MB em comparação com os vários gigabytes do modelo base.
Na prática, você escolhe em quais camadas aplicar o LoRA (tipicamente as matrizes de projeção de atenção: Q, K, V e a projeção de saída) e define o rank r e um fator de escala chamado alpha. A razão alpha/r controla quanta influência o adapter tem em relação aos pesos congelados do modelo base. Rank maior significa mais expressividade mas mais parâmetros e memória; na prática, rank 16 ou 32 cobre a maioria dos casos de uso. O QLoRA, introduzido por Dettmers et al. em 2023, levou a eficiência ainda mais longe ao combinar LoRA com quantização de 4 bits do modelo base: os pesos congelados são armazenados em NF4 (um formato de 4 bits otimizado para pesos normalmente distribuídos) enquanto os adapters LoRA treinam em bf16. Isso permite fazer fine-tuning de um modelo de 70B parâmetros em uma única GPU de 48GB — algo que de outra forma exigiria um setup multi-GPU com centenas de gigabytes de VRAM.
O ecossistema LoRA amadureceu rapidamente. A biblioteca PEFT da HuggingFace é a implementação padrão, e ferramentas como Axolotl, LLaMA-Factory e Unsloth a envolvem em interfaces de mais alto nível que cuidam da formatação de dados, defaults de hiperparâmetros e loops de treinamento. Uma das funcionalidades práticas mais poderosas é a composabilidade de adapters: como adapters LoRA são aditivos, você pode treinar adapters separados para diferentes tarefas e mesclá-los ou trocá-los em tempo de inferência sem recarregar o modelo base. Alguns frameworks de serving como LoRAX e vLLM exploram isso para servir centenas de adapters LoRA diferentes a partir de um único modelo base em memória, roteando cada requisição para o adapter apropriado. Isso torna viável oferecer modelos fine-tuned por cliente sem o custo de implantar instâncias de modelo separadas.
LoRA não é mágica, porém. A restrição de baixo rank significa que não consegue aprender mudanças de peso arbitrárias — se a tarefa exigir reestruturação significativa das representações internas do modelo, o fine-tuning completo superará o LoRA. Na prática, isso importa mais para tarefas muito diferentes daquilo em que o modelo base foi pré-treinado, ou quando se tenta ensinar ao modelo conhecimento factual substancialmente novo em vez de ajustar seu estilo ou formato. Também existe um erro comum de definir o rank muito baixo e se perguntar por que o adapter parece não aprender, ou defini-lo muito alto e acabar com um adapter que faz overfit em datasets pequenos. O rank é tanto um controle de regularização quanto um controle de capacidade, e ajustá-lo junto com a taxa de aprendizado e o número de passos de treinamento é essencial para bons resultados.