PEFT documentation
Ponte entre a adaptação de baixo posto e a adaptação ortogonal por meio da Adaptação por Reflexão de Householder (HRA)
Ponte entre a adaptação de baixo posto e a adaptação ortogonal por meio da Adaptação por Reflexão de Householder (HRA)

HRA oferece uma nova perspectiva que conecta LoRA a OFT, o que significa que ele pode aproveitar as vantagens de ambas as estratégias, ao utilizar Householder reflections para reduzir parâmetros e custos de computação, ao mesmo tempo em que penaliza a perda de conhecimento do pré-treinamento. Ele consistentemente alcança melhor desempenho com menos parâmetros treináveis e supera adaptadores state-of-the-art em diferentes modelos, incluindo modelos de linguagem grandes (LLMs) e geradores condicionais de imagens.
O HRA constrói uma cadeia de r reflexões de Householder treináveis (HRs). Como a matriz de reflexão de Householder é uma matriz ortogonal e o produto de matrizes ortogonais também é uma matriz ortogonal, o HRA satisfaz a garantia teórica do Orthogonal Finetuning (OFT). Além disso, o HRA também pode ser visto como um adaptador de fine-tuning de baixo rank. Quanto maior r, mais parâmetros treináveis, resultando em uma maior capacidade do modelo e melhor desempenho. Além disso, devido à estrutura em cadeia, a ortogonalidade dos planos de HR impacta a capacidade e a regularidade do HRA. Para alcançar um equilíbrio entre a capacidade do modelo e a regularidade, um regularizador de ortogonalidade dos planos de HR é adicionado à função de perda. O peso pode controlar a força do regularizador.
O resumo do artigo é:
Embora sigam rotas técnicas diferentes, as técnicas de adaptação de baixo posto e ortogonais podem adaptar eficientemente modelos de pré-treinamento em larga escala para tarefas ou domínios específicos com base em um pequeno conjunto de parâmetros treináveis. Neste estudo, preenchemos a lacuna entre essas duas técnicas, propondo um método de adaptação simples, porém eficaz, baseado em reflexões de Householder. Dado um modelo pré-treinado, nosso método faz o ajuste fino de suas camadas multiplicando cada matriz de pesos congelada por uma matriz ortogonal construída por uma cadeia de reflexões de Householder (HRs) treináveis. Esse ajuste fino ortogonal baseado em HRs é equivalente a uma adaptação de baixo posto adaptativa. Além disso, mostramos que a ortogonalidade dos planos de reflexão correspondentes às HRs impacta a capacidade e a regularidade do modelo. Essa análise nos motiva a regularizar a ortogonalidade das HRs, levando a diferentes implementações do método proposto de adaptação por reflexão de Householder (HRA). Em comparação com métodos de estado da arte, o HRA alcança desempenho superior com menos parâmetros treináveis ao adaptar modelos de linguagem de grande porte e geradores de imagem condicionais. O código está disponível em peft e HRA.
API
HRAConfig
classe peft.HRAConfig
< 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 = 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) — O rank do HRA entre as diferentes camadas. É melhor definir ‘r’ como um número par; caso contrário, o método de inicialização padrão não funcionará. - apply_GS (
bool) — Se deve aplicar a ortogonalização de Gram-Schmidt. - target_modules (
Optional[Union[List[str], str]]) — Os nomes dos módulos aos quais o adaptador será aplicado. Se especificado, apenas os módulos com os nomes especificados serão substituídos. Ao passar uma string, uma correspondência de regex será realizada. Ao passar uma lista de strings, uma correspondência exata será realizada ou será verificado se o nome do módulo termina com qualquer uma das strings passadas. Se especificado como ‘all-linear’, todos os módulos lineares serão escolhidos, excluindo a camada de saída. Se não especificado, os módulos serão escolhidos de acordo com a arquitetura do modelo. Se a arquitetura não for conhecida, um erro será lançado — nesse caso, você deve especificar os módulos alvo manualmente. - 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. - init_weights (
bool) — Se deve executar a inicialização dos pesos do HRA. - layers_to_transform (
Union[List[int], int]) — Os índices das camadas a serem transformadas. Se uma lista de inteiros for passada, o adaptador será aplicado aos índices das camadas especificados nessa lista. Se um único inteiro for passado, as transformações serão aplicadas à camada nesse índice. - layers_pattern (
Optional[Union[List[str], str]]) — O nome do padrão de camadas, usado apenas selayers_to_transformfor diferente deNone. Isso deve apontar para onn.ModuleListdo modelo, que frequentemente é chamado de'layers'ou'h'. - bias (
str) — Tipo de viés para HRA. Pode ser'none','all'ou'hra_only'. - modules_to_save (
List[str]) — Lista de módulos, além das camadas de adaptador, que devem ser configurados como treináveis e salvos no checkpoint final.
Esta é a classe de configuração para armazenar a configuração de um HRAModel.
HRAModel
classe peft.HRAModel
< 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 ao qual as camadas do adaptador tuner serão anexadas. - config (HRAConfig) — A configuração do modelo HRA.
- adapter_name (
str) — O nome do adaptador, padrão é"default". - low_cpu_mem_usage (
bool,optional, defaults toFalse) — Cria pesos de adaptador vazios no dispositivo meta. Útil para acelerar o processo de carregamento.
Retorna
torch.nn.Module
O modelo HRA.
Cria um modelo de adaptação por reflexão de Householder (HRA) a partir de um modelo pré-treinado. O método é descrito em https://huggingface.co/papers/2405.17484
Exemplo:
>>> from diffusers import StableDiffusionPipeline
>>> from peft import HRAModel, HRAConfig
>>> 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 = HRAModel(model.text_encoder, config_te, "default")
>>> model.unet = HRAModel(model.unet, config_unet, "default")Atributos:
- model (
~torch.nn.Module) — O modelo a ser adaptado. - peft_config (HRAConfig): A configuração do modelo HRA.