OFT
正交微调 (OFT) 是一种为图像文本到图像扩散模型改编的开发方法。它的工作原理是利用自身的正交矩阵对预训练权重矩阵重新参数化,以保留预训练模型中的信息。为减少参数数量,OFT 在正交矩阵中引入块对角结构。
论文摘要:
大型文本到图像扩散模型在从文本提示生成逼真图像方面有令人印象深刻的能力。如何有效指导或控制这些强大的模型执行不同的下游任务,成为了一个重要的开放性问题。为了解决这一挑战,我们引入了一种原则化的微调方法——正交微调 (OFT),用于将文本到图像扩散模型适应下游任务。与现有方法不同,OFT 可以按原理保留超球面能量,这种超球面能量表征了单位超球面上成对神经元的相互关系。我们发现此属性对于保留文本到图像扩散模型的语义生成能力至关重要。为了提高微调稳定性,我们进一步提出了约束正交微调 (COFT),它对超球面施加了额外的半径约束。具体来说,我们考虑了两个重要的文本到图像微调任务:主题驱动的生成,其目标是根据少数图像主题和文本提示生成主题特定的图像;以及可控生成,其目标是让模型能够接收其他控制信号。我们通过实验证明,我们的 OFT 框架在生成质量和收敛速度方面优于现有方法.
OFTConfig
类 peft.OFTConfig
< 源代码 >( peft_type: Union = None auto_mapping: Optional = None base_model_name_or_path: Optional = None revision: Optional = None task_type: Union = None inference_mode: bool = False rank_pattern: Optional[dict] = <factory> alpha_pattern: Optional[dict] = <factory> r: int = 8 module_dropout: float = 0.0 target_modules: Union = None init_weights: bool = True layers_to_transform: Union = None layers_pattern: Optional = None modules_to_save: Optional = None coft: bool = False eps: float = 6e-05 block_share: bool = False )
参数
- r (
int
) — OFT 等级。 - module_dropout (
int
) — OFT 模块在训练过程中失效时的 dropout 概率。 - target_modules (
Optional[Union[List[str], str]]
) — 需要使用该适配器的模块名称。如果指定此项,则仅会替换与指定名称匹配的模块。对于通过的字符串,将执行正则匹配。对于通过的字符串列表,将执行精确匹配或检查模块的名称是否以任何通过的字符串结尾。如果这被指定为‘all-linear’,则选择所有线性模块,不包括输出层。如果未指定此项,则将根据模型架构选择模块。如果架构未知,则会引发错误 - 在这种情况下,你应手动指定目标模块。 - init_weights (
bool
) — 决定是否执行 OFT 权重的初始化。 - layers_to_transform (
Union[List[int], int]
) ——将要转换的层索引。如果传递整数列表,则会将适配器应用到此列表中指定的层索引。如果传递单个整数,则会对该索引处的层应用转换。 - layers_pattern (
str
) ——仅当layers_to_tranform
与None
不同时使用的层模式名称。 - coft (
bool
) — 是否使用 OFT(constrained variant),默认为关闭。
这是用于存储 OFTModel 配置的配置类。
OFTModel
根据预训练模型创建正交微调模型。该方法在 https://arxiv.org/abs/2306.07280中进行了描述。
示例
>>> from diffusers import StableDiffusionPipeline
>>> from peft import OFTModel, OFTConfig
>>> config_te = OFTConfig(
... r=8,
... target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
... module_dropout=0.0,
... init_weights=True,
... )
>>> config_unet = OFTConfig(
... r=8,
... target_modules=[
... "proj_in",
... "proj_out",
... "to_k",
... "to_q",
... "to_v",
... "to_out.0",
... "ff.net.0.proj",
... "ff.net.2",
... ],
... module_dropout=0.0,
... init_weights=True,
... )
>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = OFTModel(model.text_encoder, config_te, "default")
>>> model.unet = OFTModel(model.unet, config_unet, "default")
属性:
- model (
~torch.nn.Module
) — 要改编的模型。 - peft_config (OFTConfig):OFT 模型的配置。