PEFT documentation

Puente entre la adaptación de bajo rango y la adaptación ortogonal mediante la adaptación por reflexión de Householder (HRA)

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Puente entre la adaptación de bajo rango y la adaptación ortogonal mediante la adaptación por reflexión de Householder (HRA)

Bridging The Gap between Low-rank and Orthogonal Adaptation via Householder Reflection Adaptation

HRA ofrece una nueva perspectiva que conecta LoRA con OFT, lo que le permite aprovechar las ventajas de ambas estrategias al utilizar Householder reflections para reducir los parámetros y los costos de cómputo, mientras penaliza la pérdida de conocimiento de la preentrenación. Logra de manera consistente un mejor rendimiento con menos parámetros entrenables y supera a los adaptadores de última generación en diferentes modelos, incluidos los modelos de lenguaje grandes (LLM) y los generadores de imágenes condicionales.

HRA construye una cadena de r reflejos de Householder entrenables (HR). Dado que la matriz de reflexión de Householder es una matriz ortogonal y el producto de matrices ortogonales también es una matriz ortogonal, HRA cumple con la garantía teórica de Orthogonal Finetuning (OFT). Al mismo tiempo, HRA también puede verse como un adaptador de ajuste fino de bajo rango. A mayor r, más parámetros entrenables, lo que resulta en una mayor capacidad del modelo y un mejor rendimiento. Además, debido a la estructura de cadena, la ortogonalidad de los planos HR afecta la capacidad y la regularidad de HRA. Para lograr un equilibrio entre la capacidad del modelo y la regularidad, se añade un regularizador de ortogonalidad de los planos HR a la función de pérdida. El pesoλ\lambda puede controlar la fuerza del regularizador.

El resumen del artículo es:

Aunque siguen rutas técnicas diferentes, tanto las técnicas de adaptación de bajo rango como las de adaptación ortogonal pueden adaptar de manera eficiente modelos de preentrenamiento a gran escala para tareas o dominios específicos, basándose en una pequeña cantidad de parámetros entrenables. En este estudio, cerramos la brecha entre estas dos técnicas y proponemos un método de adaptación simple pero efectivo basado en reflexiones de Householder. Dado un modelo preentrenado, nuestro método realiza el ajuste fino de sus capas multiplicando cada matriz de pesos congelada por una matriz ortogonal construida mediante una cadena de reflexiones de Householder (HR) entrenables. Este ajuste fino ortogonal basado en HR es equivalente a una adaptación de bajo rango adaptativa. Además, demostramos que la ortogonalidad de los planos de reflexión correspondientes a las HR impacta en la capacidad y la regularidad del modelo. Este análisis nos motiva a regularizar la ortogonalidad de las HR, lo que conduce a diferentes implementaciones del método de adaptación por reflexión de Householder (HRA) propuesto. En comparación con los métodos más avanzados, HRA logra un rendimiento superior con menos parámetros entrenables al adaptar modelos de lenguaje a gran escala y generadores de imágenes condicionales. El código está disponible en peft y HRA.

API

HRAConfig

clase peft.HRAConfig

< >

( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falser: int = 8apply_GS: bool = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = None )

Parámetros

  • r (int) — El rango de HRA entre las diferentes capas. Es mejor establecer ‘r’ en un número par; de lo contrario, el método de inicialización predeterminado no funcionará.
  • apply_GS (bool) — Si se aplica la ortogonalización de Gram-Schmidt.
  • target_modules (Optional[Union[List[str], str]]) — Los nombres de los módulos a los que se aplicará el adaptador. Si se especifica, solo se reemplazarán los módulos con los nombres indicados. Al pasar una cadena de caracteres, se realizará una coincidencia mediante expresión regular. Al pasar una lista de cadenas de caracteres, se realizará una coincidencia exacta o se verificará si el nombre del módulo termina con alguna de las cadenas pasadas. Si se especifica como ‘all-linear’, se seleccionarán todos los módulos lineales, excluyendo la capa de salida. Si no se especifica, los módulos se elegirán según la arquitectura del modelo. Si la arquitectura no es conocida, se generará un error; en este caso, debe especificar los módulos objetivo manualmente.
  • exclude_modules (Optional[Union[List[str], str]]) — Los nombres de los módulos a los que no se aplicará el adaptador. Al pasar una cadena de caracteres, se realizará una coincidencia mediante expresión regular. Al pasar una lista de cadenas de caracteres, se realizará una coincidencia exacta o se comprobará si el nombre del módulo termina con alguna de las cadenas de caracteres pasadas.
  • init_weights (bool) — Si se debe realizar la inicialización de los pesos de HRA.
  • layers_to_transform (Union[List[int], int]) — Los índices de las capas a transformar. Si se pasa una lista de enteros, se aplicará el adaptador a los índices de capa especificados en esta lista. Si se pasa un solo entero, se aplicarán las transformaciones a la capa en este índice.
  • layers_pattern (Optional[Union[List[str], str]]) — El nombre del patrón de capas, utilizado solo si layers_to_transform es diferente de None. Esto debe apuntar al nn.ModuleList del modelo, que a menudo se llama 'layers' o 'h'.
  • bias (str) — Tipo de sesgo para HRA. Puede ser 'none', 'all' o 'hra_only'.
  • modules_to_save (List[str]) — Lista de módulos, aparte de las capas de adaptador, que se configurarán como entrenables y se guardarán en el punto de control final.

Esta es la clase de configuración para almacenar la configuración de un HRAModel.

HRAModel

clase peft.HRAModel

< >

( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module

Parámetros

  • model (torch.nn.Module) — El modelo al que se adjuntarán las capas del afinador de adaptadores.
  • config (HRAConfig) — La configuración del modelo HRA.
  • adapter_name (str) — El nombre del adaptador, por defecto es "default".
  • low_cpu_mem_usage (bool, optional, defaults to False) — Crea pesos de adaptador vacíos en el dispositivo meta. Útil para acelerar el proceso de carga.

Devuelve

torch.nn.Module

El modelo HRA.

Crea un modelo de adaptación de reflexión de Householder (HRA) a partir de un modelo preentrenado. El método se describe en https://huggingface.co/papers/2405.17484

Ejemplo:

>>> from diffusers import StableDiffusionPipeline
>>> from peft import HRAConfig, get_peft_model

>>> config_te = HRAConfig(
...     r=8,
...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
...     init_weights=True,
... )
>>> config_unet = HRAConfig(
...     r=8,
...     target_modules=[
...         "proj_in",
...         "proj_out",
...         "to_k",
...         "to_q",
...         "to_v",
...         "to_out.0",
...         "ff.net.0.proj",
...         "ff.net.2",
...     ],
...     init_weights=True,
... )

>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = get_peft_model(model.text_encoder, config_te)
>>> model.unet = get_peft_model(model.unet, config_unet)

Atributos:

  • model (~torch.nn.Module) — El modelo que se va a adaptar.
  • peft_config (HRAConfig): La configuración del modelo HRA.
Update on GitHub