PEFT documentation
PEANuT: Adaptación eficiente de parámetros con Tweakers neuronales conscientes de los pesos
PEANuT: Adaptación eficiente de parámetros con Tweakers neuronales conscientes de los pesos
PEANuT es una técnica de ajuste fino eficiente en parámetros que introduce ajustadores neuronales conscientes de los pesos para generar actualizaciones de adaptadores a partir de los pesos preentrenados congelados. En lugar de aprender una actualización lineal de bajo rango pura, como en LoRA, PEANuT condiciona la transformación del adaptador en el peso base, lo que hace que la regla de actualización sea más expresiva mientras mantiene un número pequeño de parámetros entrenables.
PEANuT utiliza una proyección de entrada A, una proyección de salida B y pares opcionales de codificador/decodificador residual intermedio con activaciones no lineales. Esto permite modelar patrones de actualización más complejos que los adaptadores lineales agnósticos de pesos, manteniéndose dentro del marco de PEFT.
PEANuT presenta actualmente las siguientes limitaciones:
Ventajas:
- Mayor expresividad teórica que las actualizaciones de bajo rango lineales.
- Mejor rendimiento que LoRA en una variedad de tareas con presupuestos similares.
- Funciona bien en regímenes de muy pocos parámetros, por ejemplo, alrededor de
0.2Mparámetros entrenables.
Desventajas:
- Mayor uso de memoria que LoRA, porque
ΔWse construye explícitamente antes de ser aplicado. - El entrenamiento y la inferencia son más lentos que con LoRA, y las capas intermedias más profundas aumentan aún más la sobrecarga.
- La no linealidad puede requerir un ajuste más cuidadoso de los hiperparámetros, especialmente la tasa de aprendizaje y las configuraciones de optimización relacionadas.
Si estas compensaciones no se ajustan a su caso de uso, considere otros métodos de PEFT, como LoRA.
El resumen del artículo es:
El ajuste fino de grandes modelos de base preentrenados suele ofrecer un excelente rendimiento en tareas posteriores, pero resulta prohibitivamente costoso cuando se actualizan todos los parámetros. Los métodos de ajuste fino eficiente en parámetros (PEFT), como LoRA, mitigan este problema introduciendo módulos de actualización ligeros, aunque suelen depender de aproximaciones lineales agnósticas a los pesos, lo que limita su expresividad. En este trabajo, proponemos PEANuT, un nuevo marco PEFT que introduce ajustadores neuronales conscientes de los pesos, módulos neuronales compactos que generan actualizaciones adaptadas a la tarea condicionadas a los pesos preentrenados congelados. PEANuT ofrece una forma flexible y eficiente de capturar patrones de actualización complejos sin realizar el ajuste completo del modelo. Demostramos teóricamente que PEANuT logra una expresividad equivalente o superior a la de los métodos lineales PEFT existentes, con un número comparable o menor de parámetros. Experimentos extensos en cuatro benchmarks con más de veinte conjuntos de datos demuestran que PEANuT supera consistentemente a líneas base sólidas en tareas de NLP y visión, manteniendo al mismo tiempo una sobrecarga computacional baja.
Resumen de las pruebas de rendimiento
API
PeanutConfig
clase peft.PeanutConfig
< source >( 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 = 32depth: int = 0act_fn: str = 'relu'scaling: float = 1.0target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[list[str]] = Nonelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Noneinit_weights: bool = True )
Parámetros
- r (
int) — Rango de PEANuT. Esta es la dimensión oculta utilizada por los adaptadores. Al igual que el rango de LoRA, unrmayor aumenta la capacidad de los adaptadores y los parámetros entrenables. - depth (
int) — Número de capas ocultas de adaptador por lado del codificador/decodificador en PEANuT. La proyección de entradaAy la proyección de salidaBsiempre están presentes además de estas capas ocultas. Por lo tanto,depthdebe ser un entero no negativo.depth=0:A,B.depth=1:A, un codificador, un decodificador,B.depth=2:A, dos codificadores, dos decodificadores,B.depth=3:A, tres codificadores, tres decodificadores,B, etc.
- act_fn (
str) — Función de activación no lineal aplicada en la red PEANuT. Esto corresponde anon_linearen la implementación de PyTorch estándar. El valor predeterminado es"relu". Se admite cualquier clave de activación disponible entransformers.activations.ACT2FNy puede ofrecer un mejor rendimiento en diferentes tareas. - scaling (
float) — Un multiplicador escalar aplicado a la salida de PEANuT antes de sumarla a la salida de la capa base congelada. La contribución final del adaptador esscaling * (x @ delta_w). - target_modules (
Union[List[str], str], opcional) — Los nombres de los módulos a los que se aplicará PEANuT. Puede ser una lista de cadenas de nombres de módulos (p. ej.['q_proj', 'v_proj']) o un patrón de expresión regular. - modules_to_save (
List[str], opcional) — Lista de módulos, aparte de las capas PEANuT, que se configurarán como entrenables y se guardarán en el punto de control final. - exclude_modules (
Union[List[str], str], opcional) — Los nombres de los módulos a los que no se aplicará el adaptador. Al pasar una cadena de caracteres, se realizará una coincidencia con una 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. - layers_to_transform (
Union[list[int], int], opcional) — Los índices de las capas a transformar. Si se especifica este argumento, PEFT transformará solo los índices de capa especificados en esta lista. Si se pasa un solo entero, PEFT transformará solo la capa en este índice. - layers_pattern (
Optional[Union[List[str], str]], opcional) — El nombre del patrón de capas, utilizado solo silayers_to_transformno es None y si el patrón de capas no está en el patrón de capas común. - init_weights (
bool) — Si se deben inicializar los pesos del adaptador PEANuT usando el esquema de inicialización predeterminado:- Si
True: todos los pesos exceptoBse inicializan con Kaiming uniforme, yBse inicializa a cero. - Si
False: todos los pesos (incluidoB) se inicializan con Kaiming uniforme.
Inicializar
Ba cero hace que el adaptador comience como una operación sin efecto. - Si
Esta es la clase de configuración para almacenar la configuración de un PeanutModel.
Notas:
PEANuT utiliza una ruta consciente de los pesos, donde el peso delta se condiciona al peso base. El adaptador A
se aplica sobre la dimensión de salida del peso base, por lo que A tiene forma (out_dim -> r) en lugar de la forma habitual (in_dim -> r) utilizada por métodos similares a LoRA.
PeanutModel
clase peft.PeanutModel
< source >( 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 que se va a adaptar. - config (PeanutConfig) — La configuración del modelo PEANuT.
- adapter_name (
str) — El nombre del adaptador, por defecto es"default".
Devuelve
torch.nn.Module
El modelo PEFT de PEANuT.
Crea un modelo PEANuT a partir de un modelo de transformers preentrenado.
El método se describe en detalle en https://arxiv.org/abs/2410.01870.
Atributos:
- model (PreTrainedModel) — El modelo que se va a adaptar.
- peft_config (PeanutConfig): La configuración del modelo PEANuT.