PEFT documentation
Polytropon
Polytropon
Polytropon es un modelo multitarea con una serie de diferentes adaptadores LoRA en su “inventario”. El modelo aprende la combinación correcta de adaptadores del inventario mediante una función de enrutamiento para elegir el mejor subconjunto de módulos para una tarea específica. PEFT también admite Multi-Head Adapter Routing (MHR) para Polytropon, que se basa en la función de enrutamiento y la mejora al combinar las cabezas de adaptador de manera más granular. Las cabezas de adaptador se separan en bloques disjuntos y se aprende una función de enrutamiento diferente para cada uno, lo que permite mayor expresividad.
El resumen del artículo es:
Un diseño modular fomenta que los modelos neuronales desvinculen y recombinen diferentes facetas del conocimiento para generalizar de manera más sistemática a nuevas tareas. En este trabajo, asumimos que cada tarea está asociada con un subconjunto de habilidades discretas latentes de un inventario (posiblemente pequeño). A su vez, las habilidades corresponden a parametrizaciones de modelo eficientes en parámetros (esparzas / de bajo rango). Al aprender conjuntamente estas y una matriz de asignación de tareas a habilidades, la red para cada tarea se instancia como el promedio de los parámetros de las habilidades activas. Para favorecer particiones suaves no triviales de habilidades entre tareas, experimentamos con una serie de sesgos inductivos, como un prior de Indian Buffet Process y una tasa de aprendizaje de doble velocidad. Evaluamos nuestro modelo de habilidades latentes en dos escenarios principales: 1) aprendizaje por refuerzo multitarea para el seguimiento de instrucciones fundamentadas en 8 niveles de la plataforma BabyAI; y 2) adaptación few-shot de modelos generativos de texto a texto preentrenados en CrossFit, un benchmark que comprende 160 tareas de NLP. Encontramos que el diseño modular de una red aumenta significativamente la eficiencia de muestreo en el aprendizaje por refuerzo y la generalización few-shot en el aprendizaje supervisado, en comparación con las líneas base con parámetros totalmente compartidos, específicos de la tarea o generados condicionalmente, donde el conocimiento está entrelazado entre tareas. Además, mostramos cómo las habilidades discretas ayudan a la interpretabilidad, ya que generan una jerarquía explícita de tareas.
El resumen del artículo es:
El ajuste fino eficiente en parámetros (PEFT) para la generalización entre tareas consiste en preentrenar adaptadores en un conjunto de entrenamiento multitarea antes de la adaptación few-shot a las tareas de prueba. Polytropon [Ponti et al., 2023] (Poly) aprende conjuntamente un inventario de adaptadores y una función de enrutamiento que selecciona un subconjunto (de tamaño variable) de adaptadores para cada tarea durante tanto el preentrenamiento como la adaptación few-shot. En este artículo, investigamos el papel que desempeña el enrutamiento de adaptadores en su éxito y diseñamos nuevas variantes basadas en nuestros hallazgos. En primer lugar, partimos de la intuición de que un enrutamiento más granular proporciona mayor expresividad. Por lo tanto, proponemos MHR (Multi-Head Routing), que combina subconjuntos de parámetros de adaptadores y supera a Poly con un presupuesto de parámetros comparable; al ajustar solo la función de enrutamiento y no los adaptadores (MHR-z), logramos un rendimiento competitivo con una eficiencia extrema de parámetros. En segundo lugar, descubrimos que el rendimiento de Poly/MHR es el resultado de una mejor optimización multitarea, en lugar de sesgos inductivos modulares que facilitan la recombinación de adaptadores y la adaptación local, como se había hipotetizado previamente. De hecho, encontramos que MHR presenta una mayor alineación de gradientes entre tareas que cualquier otro método. Dado que esto implica que el enrutamiento solo es crucial durante el preentrenamiento multitarea, proponemos MHR-mu, que descarta el enrutamiento y ajusta la media de los adaptadores preentrenados durante la adaptación few-shot. Esto establece MHR-mu como un método efectivo para el ajuste fino de un solo adaptador..
Si quieres probar el enrutamiento sin entrenar primero, puedes consultar la variante Arrow LoRA.
API
PolyConfig
clase peft.PolyConfig
< 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 = 8target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[list[str]] = Noneinit_weights: bool = Truepoly_type: Literal['poly'] = 'poly'n_tasks: int = 1n_skills: int = 4n_splits: int = 1 )
Parámetros
- r (
int) — Dimensión de atención de cada Lora en Poly. - target_modules (
Union[List[str],str]) — Los nombres de los módulos a los que se aplicará Poly. - 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. - modules_to_save (
List[str]) — Lista de módulos, aparte de las capas Poly, que se configurarán como entrenables y se guardarán en el punto de control final. - init_weights (bool) — Si se debe realizar la inicialización de los pesos de Poly.
- poly_type (
Literal["poly"]) — La variante del módulo Poly a utilizar. Actualmente, solo se admite “poly”. - n_tasks (
int) — El número de tareas en un escenario de multitarea. - n_skills (
int) — El número de habilidades (LoRA) en cada capa Poly. - n_splits (
int) — El número de divisiones dentro de cada LoRA de una capa Poly. Un valor mayor que 1 indica el uso de Multi-Head Routing (MHR).
Esta es la clase de configuración para almacenar la configuración de un PolyModel.
PolyModel
clase peft.PolyModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None )