锁键一级编辑的实现。项目页面
本文的卖点是每个添加概念的额外参数极低,低至 100kb。
他们似乎成功地应用了 LLM 记忆编辑论文中的 Rank-1 编辑技术,并进行了一些改进。他们还发现键决定新概念的“位置”,而值决定“什么”,并提出将本地/全局键锁定到超类概念(同时学习值)。
对于那里的研究人员来说,如果这篇论文通过,这个存储库中的工具应该适用于任何其他使用交叉注意调节的文本到<insert modality>
网络。只是一个想法
StabilityAI 以及我的其他赞助商的慷慨赞助
Yoad Tewel 负责多次代码审查和澄清电子邮件
Brad Vidler 预先计算稳定扩散 1.5 中使用的 CLIP 的协方差矩阵!
OpenClip 的所有维护者,感谢他们的 SOTA 开源对比学习文本图像模型
$ pip install perfusion-pytorch
import torch
from torch import nn
from perfusion_pytorch import Rank1EditModule
to_keys = nn . Linear ( 768 , 320 , bias = False )
to_values = nn . Linear ( 768 , 320 , bias = False )
wrapped_to_keys = Rank1EditModule (
to_keys ,
is_key_proj = True
)
wrapped_to_values = Rank1EditModule (
to_values
)
text_enc = torch . randn ( 4 , 77 , 768 ) # regular input
text_enc_with_superclass = torch . randn ( 4 , 77 , 768 ) # init_input in algorithm 1, for key-locking
concept_indices = torch . randint ( 0 , 77 , ( 4 ,)) # index where the concept or superclass concept token is in the sequence
key_pad_mask = torch . ones ( 4 , 77 ). bool ()
keys = wrapped_to_keys (
text_enc ,
concept_indices = concept_indices ,
text_enc_with_superclass = text_enc_with_superclass ,
)
values = wrapped_to_values (
text_enc ,
concept_indices = concept_indices ,
text_enc_with_superclass = text_enc_with_superclass ,
)
# after much training ...
wrapped_to_keys . eval ()
wrapped_to_values . eval ()
keys = wrapped_to_keys ( text_enc )
values = wrapped_to_values ( text_enc )
该存储库还包含一个EmbeddingWrapper
,可以轻松训练新概念(以及最终对多个概念进行推理)
import torch
from torch import nn
from perfusion_pytorch import EmbeddingWrapper
embed = nn . Embedding ( 49408 , 512 ) # open clip embedding, somewhere in the module tree of stable diffusion
# wrap it, and will automatically create a new concept for learning, based on the superclass embed string
wrapped_embed = EmbeddingWrapper (
embed ,
superclass_string = 'dog'
)
# now just pass in your prompts with the superclass id
embeds_with_new_concept , embeds_with_superclass , embed_mask , concept_indices = wrapped_embed ([
'a portrait of dog' ,
'dog running through a green field' ,
'a man walking his dog'
]) # (3, 77, 512), (3, 77, 512), (3, 77), (3,)
# now pass both embeds through clip text transformer
# the embed_mask needs to be passed to the cross attention as key padding mask
如果您可以识别稳定扩散实例中的CLIP
实例,您还可以将其直接传递到OpenClipEmbedWrapper
以获得交叉注意层向前所需的一切
前任。
from perfusion_pytorch import OpenClipEmbedWrapper
texts = [
'a portrait of dog' ,
'dog running through a green field' ,
'a man walking his dog'
]
wrapped_clip_with_new_concept = OpenClipEmbedWrapper (
stable_diffusion . path . to . clip ,
superclass_string = 'dog'
)
text_enc , superclass_enc , mask , indices = wrapped_clip_with_new_concept ( texts )
# (3, 77, 512), (3, 77, 512), (3, 77), (3,)
连接 SD 1.5,从 xiao's dreambooth-sd 开始
在自述文件中显示示例以进行多个概念的推理
如果未为make_key_value_proj_rank1_edit_modules_
函数指定,则自动推断键和值投影的位置
嵌入包装器应注意用超类令牌 id 进行替换并返回超类嵌入
回顾多个概念 - 感谢 Yoad
提供连接交叉注意力的功能
在推理时在一个提示中处理多个概念 - sigmoid 项 + 输出的求和
提供一种将多个Rank1EditModule
中单独学习的概念组合成一个以进行推理的方法
Rank1EditModule
的功能添加论文中提出的概念的零样本掩蔽
处理接收数据集和文本编码器并预先计算 1 级更新所需的协方差矩阵的函数
不用让研究人员担心不同的学习率,而是提供其他论文中的分数梯度技巧(学习概念嵌入)
@article { Tewel2023KeyLockedRO ,
title = { Key-Locked Rank One Editing for Text-to-Image Personalization } ,
author = { Yoad Tewel and Rinon Gal and Gal Chechik and Yuval Atzmon } ,
journal = { ACM SIGGRAPH 2023 Conference Proceedings } ,
year = { 2023 } ,
url = { https://api.semanticscholar.org/CorpusID:258436985 }
}
@inproceedings { Meng2022LocatingAE ,
title = { Locating and Editing Factual Associations in GPT } ,
author = { Kevin Meng and David Bau and Alex Andonian and Yonatan Belinkov } ,
booktitle = { Neural Information Processing Systems } ,
year = { 2022 } ,
url = { https://api.semanticscholar.org/CorpusID:255825985 }
}