PEFT documentation
Polytropon
Polytropon
Polytropon é um modelo multitarefa com uma série de diferentes adaptadores LoRA em seu “inventário”. O modelo aprende a combinação correta de adaptadores do inventário por meio de uma função de roteamento para escolher o melhor subconjunto de módulos para uma tarefa específica. O PEFT também oferece suporte a Multi-Head Adapter Routing (MHR) para o Polytropon, que se baseia e melhora a função de roteamento ao combinar os cabeçalhos dos adaptadores de forma mais granular. Os cabeçalhos dos adaptadores são separados em blocos disjuntos e uma função de roteamento diferente é aprendida para cada um, permitindo maior expressividade.
O resumo do artigo é:
Um design modular incentiva os modelos neurais a desvincular e recombinar diferentes facetas do conhecimento para generalizar de forma mais sistemática para novas tarefas. Neste trabalho, assumimos que cada tarefa está associada a um subconjunto de habilidades latentes discretas de um inventário (potencialmente pequeno). Por sua vez, as habilidades correspondem a parametrizações de modelo eficientes em termos de parâmetros (esparso / de baixo posto). Ao aprender conjuntamente essas parametrizações e uma matriz de alocação tarefa-habilidade, a rede para cada tarefa é instanciada como a média dos parâmetros das habilidades ativas. Para favorecer partições suaves não triviais de habilidades entre as tarefas, experimentamos com uma série de vieses indutivos, como um prior de Indian Buffet Process e uma taxa de aprendizado de duas velocidades. Avaliamos nosso modelo de habilidades latentes em dois cenários principais: 1) aprendizado por reforço multitarefa para seguir instruções fundamentadas em 8 níveis da plataforma BabyAI; e 2) adaptação few-shot de modelos generativos pré-treinados de texto-para-texto no CrossFit, um benchmark composto por 160 tarefas de NLP. Descobrimos que o design modular de uma rede aumenta significativamente a eficiência de amostragem no aprendizado por reforço e a generalização few-shot no aprendizado supervisionado, em comparação com baselines com parâmetros totalmente compartilhados, específicos da tarefa ou gerados condicionalmente, onde o conhecimento está entrelaçado entre as tarefas. Além disso, mostramos como as habilidades discretas auxiliam a interpretabilidade, pois geram uma hierarquia explícita de tarefas.
O resumo do artigo é:
O ajuste fino eficiente em parâmetros (PEFT) para generalização entre tarefas consiste em pré-treinar adaptadores em um conjunto de treinamento multitarefa antes da adaptação few-shot para as tarefas de teste. O Polytropon [Ponti et al., 2023] (Poly) aprende conjuntamente um inventário de adaptadores e uma função de roteamento que seleciona um subconjunto (de tamanho variável) de adaptadores para cada tarefa, tanto durante o pré-treinamento quanto durante a adaptação few-shot. Neste artigo, investigamos o papel que o roteamento de adaptadores desempenha em seu sucesso e projetamos novas variantes com base em nossas descobertas. Primeiro, partimos da intuição de que um roteamento mais granular fornece mais expressividade. Portanto, propomos o MHR (Multi-Head Routing), que combina subconjuntos de parâmetros de adaptadores e supera o Poly sob um orçamento de parâmetros comparável; ao ajustar apenas a função de roteamento e não os adaptadores (MHR-z), alcançamos desempenho competitivo com eficiência extrema de parâmetros. Segundo, descobrimos que o desempenho de Poly/MHR é resultado de uma melhor otimização multitarefa, em vez de vieses indutivos modulares que facilitam a recombinação de adaptadores e a adaptação local, conforme hipotetizado anteriormente. De fato, constatamos que o MHR exibe maior alinhamento de gradientes entre tarefas do que qualquer outro método. Como isso implica que o roteamento é crucial apenas durante o pré-treinamento multitarefa, propomos o MHR-mu, que descarta o roteamento e ajusta a média dos adaptadores pré-treinados durante a adaptação few-shot. Isso estabelece o MHR-mu como um método eficaz para ajuste fino de um único adaptador..
Caso queira testar o roteamento sem treinamento primeiro, você pode conferir a variante Arrow LoRA.
API
PolyConfig
classe 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) — Dimensão de atenção de cada Lora em Poly. - target_modules (
Union[List[str],str]) — Os nomes dos módulos aos quais aplicar o Poly. - exclude_modules (
Optional[Union[List[str], str]]) — Os nomes dos módulos para os quais o adaptador não deve ser aplicado. Ao passar uma string, será realizada uma correspondência por expressão regular. Ao passar uma lista de strings, será realizada uma correspondência exata ou será verificado se o nome do módulo termina com qualquer uma das strings passadas. - modules_to_save (
List[str]) — Lista de módulos, além das camadas Poly, que devem ser configurados como treináveis e salvos no checkpoint final. - init_weights (bool) — Se deve executar a inicialização dos pesos do Poly.
- poly_type (
Literal["poly"]) — A variante do módulo Poly a ser usada. Atualmente, apenas “poly” é suportado. - n_tasks (
int) — O número de tarefas em um cenário de multitarefa. - n_skills (
int) — O número de skills (LoRA) em cada camada Poly. - n_splits (
int) — O número de splits dentro de cada LoRA de uma camada Poly. Um valor maior que 1 indica o uso de Multi-Head Routing (MHR).
Esta é a classe de configuração para armazenar a configuração de um PolyModel.
PolyModel
classe 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 )