PEFT documentation
PEANuT: Adaptação Eficiente de Parâmetros com Ajustadores Neurais Conscientes de Pesos
PEANuT: Adaptação Eficiente de Parâmetros com Ajustadores Neurais Conscientes de Pesos
PEANuT é uma técnica de ajuste fino eficiente em parâmetros que introduz tweakers neurais conscientes de pesos para gerar atualizações de adaptadores a partir dos próprios pesos pré-treinados congelados. Em vez de aprender uma atualização linear de baixo posto puramente, como no LoRA, o PEANuT condiciona a transformação do adaptador no peso base, o que torna a regra de atualização mais expressiva, mantendo o número de parâmetros treináveis pequeno.
PEANuT usa uma projeção de entrada A, uma projeção de saída B e pares opcionais de codificador/decodificador residual intermediários com ativações não lineares. Isso permite modelar padrões de atualização mais complexos do que adaptadores lineares agnósticos de peso, mantendo-se ainda assim dentro do contexto PEFT.
O PEANuT atualmente apresenta as seguintes limitações:
Vantagens:
- Expressividade teórica superior em comparação com atualizações de baixo posto lineares.
- Desempenho melhor que o do LoRA em uma variedade de tarefas sob orçamentos semelhantes.
- Funciona bem em regimes de parâmetros muito baixos, por exemplo, em torno de
0.2Mparâmetros treináveis.
Desvantagens:
- Uso de memória maior que o do LoRA, pois
ΔWé explicitamente construído antes de ser aplicado. - Treinamento e inferência mais lentos do que com LoRA, e camadas intermediárias mais profundas aumentam ainda mais a sobrecarga.
- A não linearidade pode exigir um ajuste mais cuidadoso dos hiperparâmetros, especialmente a taxa de aprendizado e as configurações de otimização relacionadas.
Se esses compromissos não se adequarem ao seu caso de uso, considere outros métodos de PEFT, como LoRA.
O resumo do artigo é:
O ajuste fino de grandes modelos de fundação pré-treinados frequentemente resulta em excelente desempenho em tarefas downstream, mas é proibitivamente caro ao atualizar todos os parâmetros. Métodos de ajuste fino eficiente em parâmetros (PEFT), como LoRA, mitigam isso ao introduzir módulos de atualização leves, mas geralmente dependem de aproximações lineares agnósticas a pesos, limitando sua expressividade. Neste trabalho, propomos o PEANuT, um novo framework de PEFT que introduz tweakers neurais conscientes de pesos, módulos neurais compactos que geram atualizações adaptadas à tarefa condicionadas aos pesos pré-treinados congelados. O PEANuT oferece uma maneira flexível e eficiente de capturar padrões de atualização complexos sem o ajuste completo do modelo. Mostramos teoricamente que o PEANuT alcança expressividade equivalente ou superior à de métodos lineares de PEFT existentes, com parâmetros comparáveis ou menores. Experimentos extensivos em quatro benchmarks com mais de vinte conjuntos de dados demonstram que o PEANuT supera consistentemente baselines fortes em tarefas de NLP e visão, mantendo baixo sobrecarga computacional.
Visão geral do benchmark
API
PeanutConfig
classe 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) — Rank do PEANuT. Esta é a dimensão oculta usada pelos adaptadores. Assim como o rank do LoRA, umrmaior aumenta a capacidade dos adaptadores e o número de parâmetros treináveis. - depth (
int) — Número de camadas ocultas de adaptador por lado do codificador/decodificador no PEANuT. A projeção de entradaAe a projeção de saídaBestão sempre presentes, além dessas camadas ocultas. Portanto,depthdeve ser um inteiro não negativo.depth=0:A,B.depth=1:A, um codificador, um decodificador,B.depth=2:A, dois codificadores, dois decodificadores,B.depth=3:A, três codificadores, três decodificadores,B, etc.
- act_fn (
str) — Função de ativação não linear aplicada na rede PEANuT. Isso corresponde anon_linearna implementação vanilla do PyTorch. O padrão é"relu". Qualquer chave de ativação disponível emtransformers.activations.ACT2FNé suportada e pode ter um desempenho melhor em diferentes tarefas. - scaling (
float) — Um multiplicador escalar aplicado à saída do PEANuT antes de adicioná-la à saída da camada base congelada. A contribuição final do adaptador éscaling * (x @ delta_w). - target_modules (
Union[List[str], str], opcional) — Os nomes dos módulos aos quais aplicar o PEANuT. Pode ser uma lista de strings com os nomes dos módulos (por exemplo,['q_proj', 'v_proj']) ou um padrão de expressão regular. - modules_to_save (
List[str], opcional) — Lista de módulos, além das camadas PEANuT, que devem ser configurados como treináveis e salvos no checkpoint final. - exclude_modules (
Union[List[str], str], opcional) — Os nomes dos módulos aos 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. - layers_to_transform (
Union[list[int], int], opcional) — Os índices das camadas a serem transformadas. Se este argumento for especificado, o PEFT transformará apenas os índices das camadas especificados nesta lista. Se um único inteiro for passado, o PEFT transformará apenas a camada neste índice. - layers_pattern (
Optional[Union[List[str], str]], opcional) — O nome do padrão de camadas, usado apenas selayers_to_transformnão for None e se o padrão de camadas não estiver no padrão de camadas comum. - init_weights (
bool) — Se as pesos do adaptador PEANuT devem ser inicializados usando o esquema de inicialização padrão:- Se
True: todos os pesos, excetoB, são inicializados com Kaiming uniform, eBé inicializado com zero. - Se
False: todos os pesos (incluindoB) são inicializados com Kaiming uniform.
Inicializar
Bcom zero faz o adaptador começar como uma operação sem efeito exata. - Se
Esta é a classe de configuração para armazenar a configuração de um PeanutModel.
Observações:
O PEANuT utiliza um caminho consciente de pesos, no qual o peso delta é condicionado ao peso base. O adaptador A
é aplicado sobre a dimensão de saída do peso base, de modo que A tem a forma (out_dim -> r) em vez da forma usual (in_dim -> r) usada por métodos semelhantes ao LoRA.
PeanutModel
classe 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) — O modelo a ser adaptado. - config (PeanutConfig) — A configuração do modelo PEANuT.
- adapter_name (
str) — O nome do adaptador, padrão é"default".
Retorna
torch.nn.Module
O modelo PEFT PEANuT.
Cria um modelo PEANuT a partir de um modelo transformers pré-treinado.
O método é descrito em detalhes em https://arxiv.org/abs/2410.01870.
Atributos:
- model (PreTrainedModel) — O modelo a ser adaptado.
- peft_config (PeanutConfig): A configuração do modelo PEANuT.