StableDiffusionWebUI鉴权设计

StableDiffusionWebUI鉴权设计

[> [!summary]+

this article purpose is to build an authority page for stable diffusion webui using nginx & python/js. Which can publish my personal stable diffusion server. Wrote by GPT(try).

image.png

Introduction

In the digital age, the security and user-friendliness of web services are not just conveniences; they are necessities. Balancing robust security protocols with an engaging user experience is key to maintaining both the integrity and popularity of any online service. This blog post dives into the intricacies of securing web services using Nginx for authentication, coupled with designing an appealing frontend. Our journey begins with a practical scenario:

publishing a stable diffusion webUI service, accessible only to an authenticated audience.

Setting Up Nginx for Secure Authentication

Nginx excels in serving web pages and as a reverse proxy, providing enhanced security through authentication mechanisms. Let’s explore a typical Nginx configuration for secure authentication:

  • /verify_token: This block forwards authentication requests to a dedicated server. By excluding the request body and focusing on essential headers, it ensures that only valid, authenticated requests proceed.
1
2
3
4
5
6
7
8
location = /verify_token {
proxy_pass http://{your_auth_server}:2424;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Original-Remote-Addr $remote_addr;
proxy_set_header X-Original-Host $host;
}
  • /login: Catering to login requests, this configuration forwards the necessary details to the authentication server, preserving crucial information about the request’s origin.
1
2
3
4
5
6
7
location /login {
proxy_pass http://{your_auth_server}:2424;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
  • Error Handling (@error401): A clever redirect mechanism that guides unauthenticated users to the login page, keeping the original URL intact.
1
2
3
location @error401 {
return 302 {your_domain}/login;
}
  • Root Location (/): The gateway to your service, which rigorously checks each request for authentication, granting access only to verified users.
1
2
3
4
5
6
7
8
9
10
location / {
auth_request /verify_token;
error_page 401 = @error401;
proxy_pass http://{your_server}:2323/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}

This setup not only fortifies your service against unauthorized access but also maintains a seamless user experience, redirecting unauthenticated users without hassle.


AIGC05 Stable Diffusion Model Training

AIGC05 Stable Diffusion Model Training

该章节主要介绍 Stable-Diffusion 中模型的训练,考虑到硬件条件的限制,实际上这里介绍的训练,都是针对大模型的各种微调技术(Lora,Dreambooth,HyperNetwork, …),这里会以 LoRA 模型的训练为主。

参考文献:

Train LoRA

LoRA 的优势就是其模型更小,且更加模块化;也就是说其的训练成本和要求都更低,同时使用代价小,可以作为某种风格插件或者角色插件来使用。

image.png

其中蓝色的是预训练好的源网络,而橙色的是新加的网络,通过控制 R 的宽度(文章主要论证了大模型的参数可能存在较低维度的秩,因此可以使用较小的 R 来对大模型的参数造成有效的影响),可以有效的减少需要训练的网络的 Size。

事前准备

这里只介绍本地训练,训练也可以在 Colab Notebook 等在线训练集群中进行,这里就不进行介绍了

  1. WebUI + 想训练的基础 SD 模型
  2. .txt 带说明的文本文件
  3. Training Repo(sd-scriptlora-script
  4. 数据集准备(准备好训练图像)

训练包准备

这里我们使用 lora-script 来进行模型训练,lora-script 实际上是 sd-script 之外在包了一层,新增了一些可视化的功能和一些其他的脚本,让 sd-script 更加易用,它调用 sd 中的脚本来实现训练,但是封装了一些注释和整理,此外还支持的 tensorboard 可视化。

sd-script 本身包含了训练 lora、dreambooth、text-embedding、UNet、Text Encoder、图像生成、模型转换等多种功能。lora-script 还是主要专注于 LoRA 训练

查看 repo 也能知道 lora-script 中包含了 sd-script,所以我们部署的时候只需

1
git clone --recurse-submodules https://github.com/Akegarasu/lora-scripts

即可将需要的库安装下来,然后安装环境和相关以来只需要执行 .\install.ps1 即可(该脚本有 cn 版本,但是可能会出现问题),其会安装 sd-scripts 和 lora-scripts 需要的库。具体的可以参考相关 repo(sd-script 详细说明,lora-script 有简化版说明)。

安装的时候可能会出现虚拟环境未激活的问题,我们可以提前在改目录执行一次 python -m venv venv 一次即可。

Finish.


AIGC04 Stable Diffusion Write Prompt Better

AIGC04 Stable Diffusion Write Prompt Better

该章节主要包括 Promot 生成和部分工作流的分析,旨在了解如何写出更好的关键词,如何生成更好的图片,当我们不知道怎么描述的时候也可以将该工作交给 ChatGPT,让其为我们攥写一般基础的提示词

Prompt 编写范式

参考资料:【Stable Diffusion】Prompt

通常编写可以遵照以下的类别进行组织,主要有 <质量控制> + <前置> + <主体> + <场景词> 几类,其中分别包括以下的几类词:

  • 质量控制:画质、镜头效果、光照效果
  • 前置词:画风、艺术家、风格
  • 主体:人物&对象、姿势、服装、道具
  • 场景:环境、背景、细节
  • Additional Network:载入额外模型

分割符号: 各个关键词之间用 , 分割,且对应的权重从前到后依次递减,因此在编写关键词的时候也要注意先后顺序。

权重加权符号:各种括号代表各种不同的加权系数,这里建议用 (prompt: weight) 统一来编写提示词的权重规则,整体可读性会更好。

这里的 weight 指的是权重变成原本的 weight 倍,就可以调整加强或减弱。

各个括号的默认系数如下: () -> 1.1 ; {} -> 1.05 ; [] -> 0.952
可以通过(())进行叠加即 1.1*1.1


AIGC03 Stable Diffusion Control Net

AIGC03 Stable Diffusion Control Net


AIGC02 Stable Diffusion 基础功能介绍

AIGC02 Stable Diffusion 基础功能介绍

本篇章介绍关于 Stable DIffusion 的一些基础概念和 WebUI 的基本功能元素,同时介绍一些启动项和模型加载的东西。

启动项设置(局域网)

最常用的启动项是 --listen,通过该启动项允许局域网内的其他设备通过 ip 和端口访问部署好的 Stable Diffusion 服务。而设置启动项的方式有以下几种:

  1. 命令行执行启动脚本的时候携带
1
2
./webui.bat --listen
# ./webui.sh --listen
  1. 修改主入口脚本中的启动选项 vim launch.py
1
2
3
# 修改下面这一行的参数, 将" "中填入需要的参数
# commandline_args = os.environ.get('COMMANDLINE_ARGS', "")
commandline_args = os.environ.get('COMMANDLINE_ARGS', "--listen")
  1. 其他的启动项介绍可以参考:2.3. 命令列引數 | Stable Diffusion WebUI使用手冊(正體中文)|Ivon的部落格 (ivonblog.com)

AIGC01 Stable Diffusion and midjourney Setup

AIGC01 Stable Diffusion and midjourney Setup

This Chapter introduce how to set up stable diffusion and mid-journey, and record some problem I meet when I deploy it.

(Deprecated) midjourney

由于 midjourney 现需要付费使用,同时没有开源,因此我们讲一笔带过该部分内容,该部分内容大多转载于 超详细!AI 绘画神器 Midjourney 基础使用手册

midjourney 的安装步骤主要分成以下的几步:

  1. 点击 Join the Beta 注册账号,注册完会跳转到;
  2. Discord 首页,亲自创建自己的服务器,仅供我和我的朋友使用;
  3. 下载客户端,在默认对话界面讯在或开始新的对话,输入 Midjourney Bot,添加到服务器
  4. 付费开启体验。

(Deprecated) DreamStudio

说是可以本地部署,但是实际体验非常不好,应该只是部署了 Webui,然后调用官方提供的免费 API;所以有时候生成不出来,但是又不报错,不知道是不是使用姿势有问题,反正很屎。

  • https://github.com/Stability-AI/StableStudio
  • 装好 npm 和 yarn
  • 参考 quick start,git clone -> (cd) yarn 安装 -> yarn dev 部署在本地端口上。
  • 官网注册账号-> 获取 API -> 填入并在最上方转到 Generate 页面即可。

Stable Diffusion 部署专题

该部分作为 Intro,仅介绍 Stable Diffusion 的安装和部署,以及一些启用参数等,具体的使用在后面的文章进行进一步的讲解。

基于官方 REPOAUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI (github.com)

这里介绍基于 windows 的安装和 WSL2 的安装部署过程。整体的安装可能会分成以下的几个步骤进行:(推荐在安装和部署之前,参考 [[WindowsCudaCudnn]] 一文,首先配置 CUDA,也可以遇到问题再部署)

  • 基础依赖和环境安装(python、CUDA)
  • Stable DIffusion 的 UI 界面和部分插件安装
  • 模型下载和加载

Fine Tuning

Fine Tuning

@Langs: python, torch
@reference: d2l-pytorch,transfer_torch

This Note focus on the code part.
模型微调和模型预训练,在Pytorch中的使用方式对比汇总。

How to Design the Fine Tune

这一部分主要集中于我们对于微调任务的拆解,有几种不同的预训练和微调的方式,在不同的情景下,对应的参数应该怎么设置和调整是问题的重点。

WorkFlow

基于这种Transfer的策略,我们能够学习到一个更通用,泛化能力更强,有助于识别边缘,色彩,等等有助于下游任务的通用特征提取。

在Transfer任务中,有几种不同的调整方式:

  • 固定Bakcbone,只训练Classifier
  • 同步微调网络
  • 区分学习率,微调Backbone,训练Classifirer

为了实现这几种不同的Transfer方式,需要用到以下的几种方式:梯度截断,lr区分设置等。

Code Part

不同lr设置

微调Backbone,训练Classifier作为最经典的Transfer设定,在Code上也较为复杂,所以我们首先举个这种例子。


IL Collection

IL Collection

@AikenHong 2022

[[Draft/IL 总结]]: Thx 2 wyz to provide some clus for learnning Incremental Learning.

In this Doc, we may add some related knowledge distill works which is used to design our Incremental Structure.
在这个文档中,我们可能还会添加一些知识蒸馏的相关工作的文献,这些实际上对于我的增量学习架构有一个比较大的启发

  • DER
  • SPPR 没有 get 到方法到底是怎么做的

Introduction 👿

在很多视觉应用中,需要在保留旧知识的基础上学习新知识,==举个例子==,理想的情况是,我们可以保留之前学习的参数,而不发生==灾难性遗忘==,或者我们基于之前的数据进行协同训练,灾难性遗忘是 IL 中最核心的问题。

Incremental 的基本过程可以表示如下[4]
dsa

我们将模型可以划分为以下的两个部分[1]:backbone 和 classifier
split

从 LWF 中我们可以知道经典的 Paradigm,主要有下面的三种来对$\theta _S$ 和$\theta_o$来进行更新:

  • 仅重新训练分类器:仅更新$\theta_o$
  • 微调特征提取器,重新训练分类器
  • 联合训练

基于蒸馏架构的方法


WYZ-IL-Collection

WYZ-IL-Collection

: hammer: 王耀智

Regularization 系列方法

这类方法旨在添加一些正则化损失来解决 catastrophic forgetting 的问题。

Weight Regularization

这类方法一般是对网络中每个参数的重要性进行评估,根据每个参数的重要性和梯度信息更新参数。

典型的文章为 EWC .

PS: 这类文章我也没有读过。

Data Regularization

这类方法专注于记住特征表示,通常是结合 Hinton 的知识蒸馏损失函数使得模型记住旧类别的知识,解决 catastrophic forgetting。

推荐以下几篇文章:

  • LwF(Learning without forgetting),这篇文章在我看来是增量学习的开山之作,第一次给增量学习找到了一个比较好的方向,也是第一次将知识蒸馏应用到增量学习上;
  • PODNet CVPR2020 ,这篇文章最大的贡献在我看来是设计了一个全新的蒸馏损失函数,最终结果也是达到了当时的sota,甚至目前也是几个榜单的sota。

Rehearsal 系列方法

这类方法主要的想法是使用一些旧类别的数据,在新类别到来时使用新旧数据一起训练模型,根据旧类别数据的真假分为以下两种方法。


LT Collection

LT Collection

LT-Collections

@AikenHong 2021

Code of must of those methods
We will analysis those tricks on LT situation, and Analysis why it works.
在进行LT矫正的任务中,有几种常见的trick在各种模型中被使用,我们会对这几种不同的trick进行介绍和分析。

其实在数据量少这一方面LT和Few-Shot是有一定的OverLap的,可以参考以下那边的思路perhaps

Introduction

LT
通常情况下这种严重的类别不平衡问题会使得模型严重过拟合于头部,而在尾部欠拟合

首先介绍 bag of tricks 这篇论文中总结了一些常用的Trick,并组合出了最佳的一套trick

经过该文实验总结,Trick组合应该是[1]`

  • 在前几个epoch应用input mixup数据增强,然后后面fine-tuning;
  • (基于CAM的)重采样来重新训练分类器;

实际上就是MixUp + Two-Stage的策略,后续对Mix-up这个策略带来的作用要进行补充了解一下

Rebalance


Loss-NCE

Loss-NCE

@AikenHong 2021

Noise Contrastive Estimation Loss = NCE Loss 噪声对比估计损失,这里的Noise实际上就是Negative Samples.
该损失被广泛的用于对比学习的任务,而对比学习广泛的作为自监督学习的无监督子任务用来训练一个良好的特征提取器,于是对于对比学习的目标和效用的理解十分关键。

What’s NCE Loss

在介绍NCE之前我们可以将其和CE进行一个简单的对比,虽然名称上不是同一个CE,但是在数学表达上却有很相近的地方(softmax-kind of loss)

首先softmax,他保证所有的值加起来为一,结合onehot的ce,实际上j==gt的情况下外层+log也就是ceLoss,也就是 $logSoftmax$

然后看infoNCE,基础的对比学习损失可以写成:

其中 $f_x^T f_y^T$ 为 $sim(x,y)$ 时即转化为带$T$的NCE,即InforNCE.

分子是正例对的相似度,分母是正例对+所有负例对的相似度,最小化infoNCE loss,就是去最大化分子的同时最小化分母,也就是最大化正例对的相似度,最小化负例对的相似度。

从该形式上看,和soft的CE形式上是统一的,当我们把分母看作概率和自身以及和其他的相似性,这样和NCE在形式上和简化后的CE实现了统一。

但是我不认为这和label smooth 后的CE有相关性,而是和原始的CE经由One-hot简化后结构上有相似性。

How it Works

NCE的思想是拉近相似的样本,推开不相近的样本,从而学习到一个好的语义表示空间,这一点上实际上和度量学习的思想是一样的,只是对比学习通常作用在无监督或者自监督的语境中,度量学习这是有监督的。

考虑之前人脸匹配的研究,使用 “Alignment and Uniformity on the Hypersphere”中的Alignment and Uniformity,就是一个更好理解他的角度


Loss-Smooth(Sharpen)

Loss-Smooth(Sharpen)

@AikenHong 2021
@topic

  • smooth label (inception v2)
  • when does label smoothing help (nips 2019)
  • sharpen in semi-supervised in the future
  • offical code github

不是一个通用的方法,在很多的任务上反而会导致掉点的现象,可以简单分析一下,汲取一下思想和Sharpen做对比,在这篇文章中,我们可以结合之前的人脸对比损失来进行分析。

What’s the smooth label

首先介绍在图像分类任务中对logits和Hard label做ce得到我们的损失,可以表现为如下的形式:

由于我们的标签是一个hard label,实际上可以转化成一个one-hot,即

而soft label实际上做的是将 1的位置变为$1-\alpha$,其他位置设置为$\alpha/(K-1)$,然后再去求CE,

Hinton论文中给出该损失对特征分布的作用测试图:


Training Strategy

Training Strategy

@Aiken 2020,

主要针对神经网络的训练过程中的一些基础策略的调整,比如当训练的曲线出现一定的问题的时候,我们应该怎么去调整我们训练过程中的策略。

参数调整过程中最重要的就是优化器(优化或者说是下降算法)和学习率(优化算法的核心参数),此外像是数据增强策略还是Normalization策略,都能极大的影响一个模型的好坏。

优化器

Some Material
实际上虽然有很多的优化算法,但是到最后最常用的还是 SGD+Mon 和 Adam两种:

Adam主要的有事在于自适应学习率,他对我们设计的学习率实际上没有那么敏感,但是在具体实验中往往不会有调的好的SGD那么好,只是在SGD的参数调整中会比较费劲。

但是有了根据patient调整lr的scheduler后,我们基本上可以使用SGD做一个较为简单的调整,只要设计好初始的lr的实验以及用来调整学习率的参数值。

学习率

$\omega^{n} \leftarrow \omega^{n}-\eta \frac{\partial L}{\partial \omega^{n}}$ 其中的权重就是学习率lr,

==Basic==

学习率大 学习率小
学习速度
使用情景 刚开始训练时 一定的次数过后
副作用 1. Loss爆炸 2.振荡 1.过拟合 2.收敛速度慢

学习率的基本设置


Loss-WhyZero

Loss-WhyZero

Loss :Why Zero Loss?

@Comments: ICML2020 《Do We Need Zero Training Loss After Achieving Zero Training Error》

@Noteby:AikenHong2021

如何解决训练损失下降,但是验证损失上升的问题(过拟合like)的问题,该文章实际上可以作为我们损失设计中的一个trick,只需要简单的一行代码,来提升代码的泛化能力;

img

这张图体现了本文的灵魂(思路),主要体现在我们在算法趋于稳定后继续训练可能验证损失会反而上升;

所以本文提出了一种flooding方法,当我们training loss 大于阈值的时候我们使其正常下降,当低于阈值的时候,flooding的设计会反过来使得梯度上升,让训练损失保持在flooding附近,让模型持续进行random walk,希望模型最终能优化到一个平坦的损失区域,这样发现test loss进一步的进行下降。

理解:

当我们的训练损失低到一定的程度,然后随着lr的下降,模型会很难跳出当前的极小值,这种情况下我们的泛化能力也会被限制住,采用这种方法在牺牲测试精度的同时能提升算法的泛化能力。

损失公式表示如下

v2-084a8f00d7349a94540fc7ad3a9433b0_r

具体的代码表示只需要添加一层:

1
2
3
4
5
b = the flood num 
new_loss = (loss - b).abs() + b
optimizer.zero_grad()
new_loss.backward()
optimizer.step()

UniFramework 01
FSL前期调研
Survey for Few-Shot Learning

Survey for Few-Shot Learning

@aikenhong 2020
@h.aiken.970@gmail.com

另一个综述文章:https://zhuanlan.zhihu.com/p/61215293
对该文中一些内容有一些补充,可以看看

FSL简介:https://blog.csdn.net/xhw205/article/details/79491649

GCN用于FSL:https://blog.csdn.net/qq_36022260/article/details/93753532

Abstract

FSL的根本目的就是弥合人工智能和人类之间的鸿沟,从少量带有监督信息的示例中学习。像人类一样有很高的泛化能力。这也能解决在实际应用场景中,数据难以收集或者大型数据难以建立的情景。

FSL的核心问题是:经验风险最小化器不可靠;那么如何使用先验知识去解决这个问题?

三个主要的角度:

  1. 数据:使用先验知识增强数据的监督经验
  2. 模型:使用先验知识来降低假设空间
  3. 算法:使用先验知识来改变搜索最佳假设(来进行搜索?)

现阶段针对FSL提出的一些相关的机器学习方法:
meta-learning; embedding learning; generative modeling etc.

本文的主要工作:


IL-MgSvF

IL-MgSvF

@Author & Paper:Arxiv
@Note:Aikenhong 2021/11/12

Other’s Note 1

Intro

旧知识的缓慢忘记和新知识的快速适应的困境:主要探讨Incremental中的Old和New的相互牵制和适应的问题,

旧知识的缓慢遗忘会导致对新任务的欠拟合,而快速适应会导致灾难性的遗忘,如何对这两种策略之间进行权衡,是一个重要的问题。

image-20211112110043089

多尺度混合的解决这个问题:

  • Intra-space: 新类别的特征在同一个特征空间中
  • inter-saoce:新旧类别的特征在不同的特征空间中

本文提出的多粒度策略

  1. 提出了一种频率感知的正则化操作,加速空间内的增量学习能力
  2. 新的特征空间组合操作,提升空间间的学习性能

SSL-MoCov3

SSL-MoCov3

@Aiken 2021

恺明大神对自监督学习+transformer的实证研究,针对Transformer再自监督学习学习框架中的训练不稳定问题提出了Random Patch Projection的解决方案。

ArticlePaper

Motivation

ViT的方法在自监督学习的任务中,精度下降的主要原因是由于算法的不稳定性,容易陷入局部的最优值,本文主要聚焦于采用视觉领域的自监督框架进行Transformer的训练,CNN的训练方法已经是一个比较明确约定俗称的方法,而Transformer的训练架构实际上还没有被完全的构建。


Data Augmentation

Data Augmentation

intergrate with those augmentation method.

this doc will

  • Record those theory and the effect after transformation
  • Show the codes for ez use

And the complete .py will be intergrate in my classification pipeline

reference below:arrow_down_small:, if use them,start it for respect for his work.

Principle

Principle 1 of coding: Don’t reinvent the wheel unless it’s needed

  • 具体而言,仅在函数的拓展性较差,无法对其定制化,满足我们的日常需求的时候,我们会自行编写函数从而满足我们的需求,否则我们直接引用已知的库,提升我们的实现效率。

MLFlow

MLFlow

MLFlow 机器学习系统的使用

@Aiken 2020

基于Python开发的DAG数据工作流系统,面向机器学习,支持Spark并行环境和K8S容器集群;

MLFlow主要解决了三个问题,也就是三个我们可能会需要使用的功能:

  1. Tracking:跟踪实验训练结果,记录算法参数,模型结果和运行效果等等;
  2. Projects:对所有的算法项目有一套标准的projects概念,记录下代码版本,参数和运行环境这些东西,并且projects是可以拟合所有的算法框架的;
  3. Models:解决的是打包和部署模型的这样一个行为,提供json接口给后续的flsk框架等等进行使用

基本部署

INSTALL:

DEPLOY:

Tracking 实验版本跟踪

Tracking为本次描述的重点,来做一个训练过程中的版本管理,记录每一次训练的参数和变量信息等等,这样便于后续的恢复和实验信息的整理。便于统计和管理。使用的时候好像也是需要代码嵌入的部分,就是需要在代码中调用MLFlow的API。

但是在Tracking的时候有一个比较重要的点在于,这个方法和Tensorboard对原模型的参数的嵌入和Logging记录中会不会产生冲突,同时两个方法之间是不是有什么overlap;关键的问题:

  • 这两个API能不能进行混合使用
  • 怎么统一和区分两个方法的应用情景

Reference


Hard Task Sampling

Hard Task Sampling

Trick:Hard Task

思路来源于Meta-Tranfer-Learning,基本思路是在Meta-Learning的每一次Meta-Test的时候,会从预训练错误率比较高的Task中再次采样,增加那些task的训练次数。也就是难题多做的策略。

基本思路

对比Adaboost

这样的思路其实和AdaBoost的想法是有一定的异曲同工之妙的,或者说其实就是AdaBoost的思路:

Adaboost

参考笔记,从该笔记中我们可以看到,AdaBoost的基本思路如下:

Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器.

和Meta-Transfer-Learning对比一下,我们可以发现,这个方法实际上就是讲Transfer Learning的与训练网络当成弱学习器1,然后通过弱学习器1的训练样本权重,来增大Hard-Task的配比(也就是增加任务的权重)完全一致。

具体实现

实现上主要是,样本sample的过程,就是如何在进行参数选择后和原本的Dataloader,结合起来。在这里我们主要参考MTL中的方法,进行网络的构建处理。

第一部分:sampler构建,为了后续Dataloader中进行数据的采样,需要构建一个这样的sampler,关键在于index的对应关系,以及最后输出的是index的集合。


并行训练
MIM-V-simMIM

MIM-V-simMIM

@Author: MSRA Zhenda Xie
@Source:ArxivCode TBPBlog_CVer
@Read:AikenHong 2021.11.22

“What I cannot create, I do not understand.” — Richard Feynman

Intro & Simple Conclusion

Conclusion

继MAE和iBoT之后,MSRA也提出了一个图像掩码建模的新框架,SimMIM,该方法简化了最近这些提出的方法,不需要特殊设计,作者也验证了不需要那些特殊设计就已经能让模型展现出优秀的学习能力

  • 采用中等大小的掩码块(32),对输入图像进行随机掩码,能使其成为强大的代理任务(pretext task)
  • 直接回归预测原始像素的RGB值的效果并不比复杂设计的Patch分类方法差
  • Projector Head可以是轻量的Linear Layer,效果并不一定比MLP(多层)的差

Motivation

通过这种MIM方法可以实现在大量无标注的数据上得到一个表征能力up的通用特征模型,这种方式的backbone可以广泛的应用到图像上的各种子任务中(按照NLP)的经验来说,而为了类似的方式在图像上的大放异彩,我们首先需要分析Vision和Language的不同

  1. 图像有更强的局部关系:相互靠近的像素是高度相关和近似的,我们可以通过简单的copy padding复制一部分缺失
  2. 视觉信号是原始,低层次的,而文本分词是高级概念:对低层次信号的预测是否对高层次的视觉识别任务有用呢?
  3. 视觉信号是连续的,而文本的分词是离散的: 如何基于分类的掩码语言建模方法来处理连续的视觉信号

Theoretical Design

掩码选择:同样的掩码的策略还是基于Patch进行的,对于掩码的设计来说,太大的掩码快或者太密集的掩码快,可能会导致找不到附近的像素来预测,实验证明32是一个具有竞争力的size,和文本任务的信息冗余程度不同也带来了覆盖比的选择,NLP通常是0.15,而在V中,32size可以支持0.1-0.7的覆盖率。

任务选择:使用原始像素的回归任务,因为回归任务和具有有序性的视觉信号的连续性很好的吻合。

预测头选择:使用轻量的预测头如(linear),迁移性能与繁琐的预测头相似或者略好,同时训练上更加的块。虽然较大的头或更高的分辨率通常会导致更强的生成能力,但这种更强的能力不一定有利于下游的微调任务


Transformer

Transformer

@aikenhong 2021

References For Transformer:

  1. NLP The Transformer Family (lilianweng.github.io)
  2. VIT Transformer眼中世界 VS CNN眼中世界
  3. 李沐 NLP Transformer论文精读
  4. Suveys cver1cver2cver3

This blog will divided into several part : lil’s blog, the survey for ViT, we using those article to help us understand the transformer.

综述我们以最新的一篇为准进行阅读,其他的可能后续进行查缺补漏把,如无必要,勿增烦恼。

Intro导言

主要参考文章2来进行我们简单的导入

基本问题

Transformer原本是NLP中的重要模型, 作为LSTM的后继者, 用于处理Seq2Seq的数据类型和情景, 若是要将Transformer运用到Vision的领域中, 首要的问题就是如何:

将Image作为序列化的Token输入Transform中 , 而达成这个目的主要有三种典型的方法:

  • 像素点作为token,
  • 使用VAE离散化图片作为token再输入
  • ViT: 将图片切为一个个Patch在经过线性的projector之后组成一个embedding表示进行交互

图片

CNN的异同分析

差异分析和计算主要靠CKA向量相似度计算来计算模型和表征之间的差异,这里的理论分析暂且不赘述,后续有需求的话可参考论文Similarity of neural network representations revisited或当前文章.


MIM-V-iBOT

MIM-V-iBOT

@Read: AikenHong 2021

@Author: https://arxiv.org/abs/2111.07832

@解读:Machine Heart

基本思想

基于NLP中的MLM(Masked Language Model)的核心训练目标: 也就是遮住文本的一部分, 然后通过模型去预测和补全, 这一过程是模型学到泛化的特征, 使用这种方法来进行大规模的与训练范式.

在基本的思想上和MAE采用的是一样的设计, 但是本文中坐着认为visual tokenizer的设计才是其中的关键.

不同于 NLP 中 tokenization 通过离线的词频分析即可将语料编码为含高语义的分词,图像 patch 是连续分布的且存在大量冗余的底层细节信息。而作者认为一个能够提取图像 patch 中高层语义的 tokenizer 可帮助模型避免学习到冗余的这些细节信息。作者认为视觉的 tokenizer 应该具备两个属性:(a)具备完整表征连续图像内容的能力;(b) 像 NLP 中的 tokenizer 一样具备高层语义。

文中对tokenizer的设计为一个知识蒸馏的过程:

image-20211118151613545

文中使用这种在线tokenizer同时来监督这样的MIM过程, 也就是两部分协同学习, 能够较好的保证语义的同时并将图像内容转化为连续的特征分布, 具体的, tokenizer和目标网络狗狗想网络结构, 有移动平均来得到实际的tokenizer.

该形式近期在 DINO [3]中以自蒸馏被提出,并被用以针对同一张图片的两个不同视野在 [CLS] 标签上的优化:

在该损失函数的基础上, MIM同样也是用这种自蒸馏的方式去优化, 其中在线tokenizer的参数为目标网络历史参数的平均.

基于上述的这些训练目标,提出了一种自监督预训练框架iBOT, 同时优化两种损失函数。


MIM-V-MAE

MIM-V-MAE

@Author:Facebook AI Research-Kaiming He
Kaiming-MAE

Conclusion

总而言之这是一种大模型的训练方法, 通过在少量数据的基础上实现大模型的训练.

整体的架构上是参考了NLP中的AutoEncoder机制,将原图切分patch,用mask掩盖原图,通过少量可见的Patch进行Encoder后和Mask融合,再通过非对称的Decoder进行pixel的还原。

这种设计的有点在于mask的scala是可变的,同时这种mask能减少我们训练过程中对显存和计算复杂度的损耗,同时问题本身是一个比较复杂的问题,得以训练复杂的大模型,这种方式最终呈现的效果就是训练的效率高且效益好。

体现了自监督学习在这方面的优越性,同时这种方法得以实现也是由于ViT模型对于CNN模型的取代,才使得这种序列化切块的方式容易实现和验证。

这种方式在最终体现了自监督学习对于有监督与训练的优越性,使用这种方式能够更好的得到一个模型的通用表征。

在这里论文中也说明了和NLP的不同点以及这样的模型对于decoder的要求实际上是比NLP更高的

image-20211115113542074

experiment

Masking:对于输入的图像进行均匀的切分并均匀的随机采样

MAE encoder: 简单的ViT模型,对输入图像进行编码后和Mask进行混合得到一个完整的令牌集合,从而确保Decode能够得到对应的位置信息。

MAE decoder:轻量级的架构,可以独立于编码器进行设计,我们使用更窄更浅的网络,计算量比编码器10%更小,这样能够更快的进行训练。解码器的最后一层是先行投影,输出的数量==补丁中像素值的数量,最后会resize层原图的维度。


SS_OD_SoftTeacher

SS_OD_SoftTeacher

@ Article: ICML from Microsoft & Huazhong Keda
@ Code: Github
@ Noteby: Aikenhong
@ Time: 20210914

Abstrast and Intro

in the session we will using describe the main idea of this article.

这篇文章的重点在于Soft Teacher,也就是用pseudo label做为弱标注,逐步提高伪标签的可靠性。

不同于多阶段的方法,端到端的方法再训练中逐步的提升伪标签的质量从而再去benifit目标检测的质量。
这样E2E的框架主要依赖于两部分技术:

  • soft teacher: 每个未标记边界框的分类损失由教师网络产生的分类分数进行加权
  • box jitter 窗口抖动: 选择可靠的伪框来学习框回归

在目标检测上获得SOTA的效果;

Multi-Stage

在半监督的情况下,关注的主要是基于伪标签的方法,是目前的SOTA,以往的方法采用多阶段的方式。

  1. 使用标记数据训练初始检测器
  2. 未标记数据的伪标记,同时基于伪标签进行重新训练

局限:初始少量标注的局限,初始的检测器的伪标签质量

End to End

Soft Teacher基本思路:对未标记的图像进行标记,然后通过标记的几个伪标签训练检测器.


StyleGAN

StyleGAN

StyleGAN V1

@AikenHong 2020 10.8

《A Style-Based Generator Architecture for Generative Adversarial Networks》

继承的文献工作: ProGAN
参考解读:

Contribution(Problem):

  1. 解纠缠:Mapping Network
  2. Noise Generator
  3. AdaIN before all conv

Structure:

image-20210930135938114

image-20210930161258031

Part1:AdaIN