惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Palo Alto Networks Blog
Martin Fowler
Martin Fowler
T
Threatpost
D
Docker
S
Schneier on Security
M
MIT News - Artificial intelligence
G
Google Developers Blog
L
LINUX DO - 热门话题
J
Java Code Geeks
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
IT之家
IT之家
博客园 - Franky
C
Cyber Attacks, Cyber Crime and Cyber Security
K
Kaspersky official blog
Google DeepMind News
Google DeepMind News
N
News and Events Feed by Topic
V
Vulnerabilities – Threatpost
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
人人都是产品经理
人人都是产品经理
Spread Privacy
Spread Privacy
T
Tailwind CSS Blog
爱范儿
爱范儿
阮一峰的网络日志
阮一峰的网络日志
U
Unit 42
C
CERT Recently Published Vulnerability Notes
The GitHub Blog
The GitHub Blog
Simon Willison's Weblog
Simon Willison's Weblog
NISL@THU
NISL@THU
MongoDB | Blog
MongoDB | Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
H
Heimdal Security Blog
Recorded Future
Recorded Future
云风的 BLOG
云风的 BLOG
SecWiki News
SecWiki News
P
Privacy International News Feed
P
Proofpoint News Feed
O
OpenAI News
B
Blog
腾讯CDC
F
Full Disclosure
Apple Machine Learning Research
Apple Machine Learning Research
T
Tor Project blog
H
Hacker News: Front Page
Project Zero
Project Zero
Hugging Face - Blog
Hugging Face - Blog
C
Cisco Blogs
S
Security Affairs

StudyingLover's Blog

Diffusion Policy笔记 rwkv笔记 act笔记 nanovllm-block_manager opencode多智能体 nanobot-pre-train nanobot-rl nanobot-sft nanobot-checkpoint_manager nanobot-gpt nanobot-mid-train Vision Mamba (Vim)笔记 BPE演示 最后一遍学习Transformer YOLOv5 目标检测笔记 下载根服务器解析记录 Dynaseal A Backend-Controlled LLM API Key Distribution Scheme with Constrained Invocation Parameters 判断链表有环 王道25数据结构勘误 关于perplexity的open-sourcing-r1-1776 AI为什么不像人类一样进行多轮对话 新博客改造日记和功能测试 linuxqq只显示登陆背景图 数字设计和计算机体系结构(机械工业出版社)勘误(自制) Dynaseal:面向未来端侧llm agent的llm api key分发机制 A Definitive Guide to Markdown Style This post is using MDX, Where you can embed JSX and Astro components RT-Patch学习 pydantic实现的LLM ReAct fastapi 和 uvicorn 设置监听 ipv6 pydantic+openai+json 控制大模型输出的最佳范式 解决 Matplotlib Scatter 不支持 Marker 列表的问题:mscatter 实现 roofline model zhipuAI接口兼容openai 在docker部署fastapi宝塔里使用nginx反代套上cloudflare获取请求的真实ip clion搭建libbpf-bootstrap开发环境 coze+coze-discord-proxy+ChatNextWebUI实现AI自由 安卓内核时间使用的是UTC时间 colab运行google最新开源模型Gemma Sora技术报告 视频生成模型作为世界模拟器 笔记 archlinux flutter开发踩坑 fastapi集成google auth登录 linux下NTFS磁盘报错输入输出错误 Venn-Abers 预测器 基于Venn-Abers预测器的系统日志异常检测方法_顾兆军 手机平板远程访问kvm虚拟机的windows phi-2弱智吧测评 poe的gemini pro或是百度开发 google gemini api使用 google gemini api申请 构建用于复杂数据处理的高效UDP服务器和客户端 matplotlib中文字体渲染 TruFor笔记和代码复现 深入分析:GitHub Trending 项目 "multipleWindow3dScene" pua大模型 ggml教程|mnist手写体识别量化推理 xgboost2.0最佳实践 xgboost使用GPU最佳实践 马踏棋盘 cloudlflare推理llama2 docker搭建elasticsearch并使用python连接 FreeU-文字生成图片的免费午餐笔记 使用xgboost的c接口推理模型 Archlinux使用CMake调用xgboost的c接口 m2cgen生成机器学习c语言推理代码 xgboost模型序列化存储并推理 speculative-sampling笔记 prompt2model笔记 RoboTAP笔记 自建obsidian同步服务 MediaPipe即将推出图像生成服务 Dual-Stream Diffusion Net for Text-to-Video Generation笔记 ViT在DDPM取代UNet(DiT) arch4edu搞崩了我的flutter LISA(推理分割)笔记 在终端绘制GPU显存使用曲线 GPTBot介绍 arch蓝牙无法连接 GPU部署llama-cpp-python(llama.cpp通用) 花式求GCD 使用llama构建一个蜜罐(前端) 使用llama构建一个蜜罐(后端) llama-cpp-python快速上手 快速上手llama2.c(更新版) Paper Gestalt笔记 DINO-v2笔记 快速上手llama2.c AnyDoor笔记 Archlinux安装scrcpy加载共享库出错 error while loading shared libraries:libusb-1.0.so.0:wrong ELF class:ELFCLASS32 npc_gzip笔记 python调用c++函数 Filesystem type ntfs3,ntfs not configured in kernel open_clip编码图像和文本 PicGo配置CloudflareR2图片储存 ArchlinuxGnome快捷键打开终端 clip-interrogator代码解析 GroundingDINO安装报错解决 2023华为鲲鹏畅想日暨西安高新国际会议中心零食午饭测评 RoboMaster开源仓库汇总(长期更新) 没有手都可以在腾讯云创建镜像
ControlNet笔记
About the Author StudyingLover · 2023-03-20 · via StudyingLover's Blog

ControlNet笔记

作者的代码开源在GitHub

想要体验ControlNet看我的文章

介绍

作者在文章开头先对当前大型text-to-image model提出了疑问:这种基于提示的控制是否满足我们的需求?例如在图像处理中,考虑许多具有明确问题公式的长期任务,这些大型模型能否被应用于促进这些特定任务?我们应该建立什么样的框架来处理广泛的问题条件和用户控制?在特定任务中,大型模型能否保持从数十亿图像中获得的优势和能力?

does this prompt-based control satisfy our needs? For example in image processing, considering many long-standing tasks with clear problem formulations, can these large models be applied to facilitate these specific tasks? What kind of framework should we build to handle the wide range of problem conditions and user controls? In specific tasks, can large models preserve the advantages and capabilities obtained from billions of images?

接下来,作者提供了他们研究了大量模型后的发现

  1. 需要具有鲁棒性的神经网络训练方法来避免过度拟合,并在针对特定问题训练大型模型时保持泛化能力。
  2. 当图像处理任务使用数据驱动解决方案处理时,不可能总是使用大型计算集群,因此快速训练方法对于在可接受的时间和内存空间(例如在个人设备上)内将大型模型优化到特定任务很重要。这将进一步要求利用预训练的权重,以及微调策略或迁移学习。
  3. 各种图像处理问题有不同的问题定义、用户控制或图像注释形式。考虑到一些特定的任务,如深度到图像、姿势到人等,这些问题本质上需要将原始输入解释为对象级或场景级别的理解,使得手工制作的程序方法不太可行。为了在许多任务中实现学习到的解决方案,端到端学习是必不可少的。

ControlNet可以用多种数据类型作为训练数据,例如Canny edges, Hough lines, user scribbles, human key points, segmentation maps, shape normals, depths, etc.

ControlNet也可以在个人计算机上进行训练,实现在有大型显存和多个gpu的集群上训练一样的效果。

模型结构

ControlNet是一种端到端的网络,他将正常的网络参数变成了两份:“trainable copy” and “locked copy”。

  • “locked copy” 保留了从数十亿张图像中学习到的网络能力
  • “trainable copy” 在特定于任务的数据集上进行训练以学习条件控制。

“trainable copy” 和 “locked copy”用一种称为“zero convolution”的卷积层连接,其中卷积权重逐渐从零增长到以学习方式优化参数。“zero convolution”即1 * 1卷积

方法

网络架构

ControlNet 操纵神经网络块的输入条件,以进一步控制整个神经网络的整体行为。

以2D图像为例,给定一张图像(特征图)x∈Rh×w×c\boldsymbol{x}\in\mathbb{R}^{h\times w\times c} ,h,w,ch,w,c 分别代表高度,宽度,深度。一个将x转换为y的神经网络我们可以以将他记作F(⋅;Θ)\mathcal{F(\cdot;\Theta)}

y=F(x;Θ)\boldsymbol{y}=\mathcal{F}(\boldsymbol{x};\Theta) image.png

我们把zero convolution记作Z(⋅;⋅)\mathcal{Z}(\cdot;\cdot) ,那么ControlNet就可以记作yc=F(x;Θ)+Z(F(x+Z(c;Θz1);Θz2)\begin{matrix}\boldsymbol{y_c}=\mathcal{F}(\boldsymbol{x};\Theta)+\mathcal{Z}(\boldsymbol{F}(\boldsymbol{x}+\mathcal{Z}(\boldsymbol{c};\Theta_{\text{z1}});\Theta_{\text{z2}})\end{matrix} image.png

由于zero convolution的权重初始为0,那么就有{Z(c;Θz1)=0F(x+Z(c;Θz1);Θc)=F(x;Θc)=F(x;Θc)Z(F(x+Z(c;Θz1);Θc);Θz2)=Z(F(x;Θc);Θz2)=0\begin{cases}\mathcal{Z}(c;\Theta_{\text{z1}})=\mathbf{0}\\ \mathcal{F}(\boldsymbol{x}+\mathcal{Z}(\boldsymbol{c};\Theta_{\text{z1}});\Theta_{\text{c}})=\mathcal{F}(\boldsymbol{x};\Theta_{\text{c}})=\mathcal{F}(\boldsymbol{x};\Theta_{\text{c}})\\ \mathcal{Z}(\mathcal{F}(\boldsymbol{x}+\mathcal{Z}(\boldsymbol{c};\Theta_{\text{z1}});\Theta_{\text{c}});\Theta_{\text{z2}})=\mathcal{Z}(\mathcal{F}(\boldsymbol{x};\Theta_{\text{c}});\Theta_{\text{z2}})=\mathbf{0}\end{cases} 可以得出yc=yy_c=y,即当ControlNet被应用到任何一个网络上时,不会对这个网络的效果产生任何影响。它完美保留了任何神经网络块的能力、功能和结果质量,任何进一步优化都将随着微调而变得快速

作者也推导了zero convolution的梯度。网络的前向过程可以写成Z(I;{W,B})p,i=Bi+∑jcIp,iWi,j\mathcal{Z}(\boldsymbol{I};\{\boldsymbol{W},\boldsymbol{B}\})_{p,i}=\boldsymbol{B}_{i}+\sum_{j}^{c}\boldsymbol{I}_{p,i}\boldsymbol{W}_{i,j} 在最开始,zero convolution 的参数WWBB 都是0,只要输入II不为0,那么就有 {∂Z(I;{W,B})p,i∂Bi=1∂Z(I;{W,B})p,i∂Ip,i=∑jcWi,j=0∂Z(I;{W,B})p,i∂Wi,j=Ip,i≠0\begin{cases}\dfrac{\partial\mathcal{Z}(\textbf{I};\{\textbf{W},\textbf{B}\})_{p,i}}{\partial\textbf{B}_i}=1\quad\\ \frac{\partial\mathcal{Z}(\mathbf{I};\{\mathbf{W},\mathbf{B}\})_{p,i}}{\partial\mathbf{I}_{p,i}}=\sum_{j}^{c}\mathbf{W}_{i,j}=0 \\ \frac{\partial\mathcal{Z}(\mathbf{I};\{W,\mathbf{B}\})_{p,i}}{\partial W_{i,j}}=\mathbf{I}_{p,i}\neq\mathbf{0} \end{cases} 我们可以看到,虽然zero convolution会导致II 上的梯度变为零,但权重和偏差的梯度不受影响。只要特征 II 非零,权重 WW 将在第一个梯度下降迭代中优化为非零矩阵.考虑经典的梯度下降W∗=W−βIf⋅∂L∂Z(I;{W,B})⊙∂Z(I;{W,B})∂W≠0W^*=W-\beta_{\mathbb{If}}\cdot\dfrac{\partial\mathcal{L}}{\partial\mathcal{Z}(\mathbf{I};\{W,B\})}\odot\dfrac{\partial\mathcal{Z}(\mathbf{I};\{W,B\})}{\partial W}\neq\mathbf{0} W∗W* 代表了第一次梯度下降之后的权重,⊙\odot 是Hadamard product,即对应的各个元素相乘(cij=aij×bijc_{ij}=a_{ij}×b_{ij}) 。

在这一步之后,我们可以得到∂Z(I;{W∗,B})p,i∂Ip,i=∑jcWi,j∗≠0\dfrac{\partial\mathcal{Z}(\mathbf{I};\{\mathbf{W}^*,\mathbf{B}\})_{p,i}}{\partial\mathbf{I}_{p,i}}=\sum\limits_j^c\mathbf{W}_{i,j}^*\neq\mathbf{0} 这里包含了非零的梯度并且神经网络开始学习。这样,零卷积就变成了一种独特的连接层,它以学习的方式从零逐步增长到优化的参数。

在stable diffusion上的ControlNet

咕咕咕(以后补上)

训练

图像扩散模型是学习逐步去噪图像以生成样本。去噪可能发生在像素空间或从训练数据中编码的Latent Space中。stable diffusion使用latent image作为训练域。在这种情况下,术语”image”, “pixel”和”denoising”都指的是“latent space”中的相应概念

给定图像 z0z_0,扩散算法逐渐向图像添加噪声并产生噪声图像 ztz_t,其中 t 是添加噪声的次数。当 tt 足够大时,图像近似于纯噪声。给定一组条件,包括时间步 tt、文本提示 ctc_t 以及特定于任务的条件 cfc_f,图像扩散算法学习网络 ϵθ\epsilon_{\theta} 以预测添加到噪声图像的噪声 ztz_t,对于L=Ez0,t,ct,ci,ϵN(0,1)[∥ϵ−ϵθ(zt,t,ct,cI))∥22]\mathcal{L}=\mathbb{E}_{\boldsymbol{z}_0,t,\boldsymbol{c}_t,\boldsymbol{c}_i,\boldsymbol{\epsilon}\mathcal{N}(0,1)}\bigg[\|\epsilon-\epsilon_\theta(z_t,t,\boldsymbol{c}_t,\boldsymbol{c}_\mathbb{I}))\|_2^2\bigg] 其中L\mathcal{L} 是整个扩散模型的整体学习目标。这种学习目标可以直接用于微调扩散模型。

在训练过程中,作者随机的将50%的prompt换成了空的prompt,作者认为这可以增强模型从文本内容识别语义信息的能力。这主要是因为当 stable diffusion 模型看不到提示时,decoder倾向于从输入控制图中学习更多的语义作为提示的替代品。

改进训练

作者在这一节讨论了两种极端情况,分别是计算设备及其有限时例如个人电脑,和计算设备机器充足时

Small-Scale Training

当计算设备有限时,作者发现部分打破ControlNet与stable diffusion之间的联系可以加速收敛。默认情况下是将ControlNet连接到“SD Middle Block”和“SD Decoder Block 1,2,3,4”。作者发现,只连接Middle Block而不连接Decoder Block 1,2,3,4可以将训练速度提高1.6倍(在RTX 3070TI笔记本电脑GPU上测试)。当模型在结果和条件之间表现出合理的关联时,这些断开连接的链接可以在持续训练中再次连接,以促进精确控制。

Large-Scale Training

在这里,大规模训练是指可以使用强大的计算集群(至少 8 个 Nvidia A100 80G 或等效)和大型数据集(至少 100 万个训练图像对)的情况。这通常适用于数据很容易获得的任务,例如,由canny检测到的边缘图。在这种情况下,由于过拟合的风险相对较低,可以训练 ControlNets 进行大量迭代(通常为 50k 多个步骤),然后解锁稳定扩散的所有权重并联合训练整个模型作为一个整体。这将导致更具体的问题模型(This would lead to a more problem-specific model.)。

实验

设置

作者的实验是在CFG−scale=9.0CFG-scale=9.0 进行的,采样器是DDPM。默认的步数是20步,在模型采取了三种 prompt

prompt

  1. No prompt:也就是""
  2. Default prompt:由于stable diffusion本质上是使用prompt进行训练的,因此空字符串可能是模型的意外输入,如果没有提供提示,SD 往往会生成随机纹理图。更好的设置是使用无意义的提示,“an image”, “a nice image”, “a professional image”,etc。在作者的设置中,我们使用”a professional, detailed, high-quality image”作为default prompt。
  3. Automatic prompt:为了测试fully automatic pipeline的SOTA,作者还尝试使用fully automatic pipeline(例如,BLIP)使用“default prompt”模式获得的结果生成prompts。作者会使用生成的提示再次扩散。
  4. User prompt:用户自定义的输入