├── LICENSE ├── README.md └── notes ├── 001_transformer.md ├── 002_bert.md ├── 003_vit.md ├── 004_mae.md ├── 005_moco.md ├── 006_contrast_learning.md ├── 007_swin_transformer.md ├── 008_clip.md ├── 009_two_stream.md ├── 010_i3d.md ├── 011_video_understanding.md ├── 012_detr.md ├── 013_dalle2.md ├── 014_vilt.md ├── 016_gpt.md ├── 018_llama.md ├── 019_chinese_llama.md ├── 020_lora.md ├── 021_llama2.md ├── 022_dreambooth.md ├── 023_controlnet.md ├── 024_easyphoto.md ├── 025_latent_diffusion_model.md ├── 026_ipadapter.md ├── 027_sdxl.md ├── 028_consistency_models.md ├── 029_latent_consistency_models.md ├── 030_stable_diffusion_2.x.md ├── 031_sdxl_turbo.md ├── 032_llava.md ├── 033_minigpt4.md ├── 034_qwenvl.md ├── 035_fuyu8b.md ├── 036_deepseekvl.md ├── 037_internvl.md ├── 038_blip2.md ├── 039_internvl1.5.md ├── 040_internvl2.md ├── 041_qwen2vl.md ├── 042_deepseekvl2.md ├── 043_megapairs.md ├── 044_vlm2vec.md └── 045_gme.md /README.md: -------------------------------------------------------------------------------- 1 | # paper-reading-note 2 | 3 | [李沐论文精读](https://github.com/mli/paper-reading)笔记 4 | 5 | - [x] [BERT](./notes/002_bert.md) 6 | - [x] [ViT](./notes/003_vit.md) 7 | - [x] [MAE](./notes/004_mae.md) 8 | - [x] [MOCO](./notes/005_moco.md) 9 | - [x] [对比学习串烧](./notes/006_contrast_learning.md) 10 | - [x] [Swin Transformer](./notes/007_swin_transformer.md) 11 | - [x] [CLIP](./notes/008_clip.md) 12 | - [x] [Two-Stream](./notes/009_two_stream.md) 13 | - [x] [I3D](./notes/010_i3d.md) 14 | - [x] [视频理解论文串讲](./notes/011_video_understanding.md) 15 | - [ ] [DETR](./notes/012_detr.md) 16 | - [x] [DALL·E 2](./notes/013_dalle2.md) 17 | - [x] [ViLT](./notes/014_vilt.md) 18 | - [ ] CLIP improve 19 | - [x] [LoRA](./notes/020_lora.md) 20 | 21 | ## AIGC 22 | - [x] [DreamBooth](./notes/022_dreambooth.md) 23 | - [x] [ControlNet](./notes/023_controlnet.md) 24 | - [x] [EasyPhoto](./notes/024_easyphoto.md) 25 | - [x] [LatentStableDiffusion](./notes/025_latent_diffusion_model.md) 26 | - [x] [Stable Diffusion 2.x](./notes/030_stable_diffusion_2.x.md) 27 | - [x] [IPAdapter](./notes/026_ipadapter.md) 28 | - [x] [SDXL](./notes/027_sdxl.md) 29 | - [x] [SDXL Turbo](./notes/031_sdxl_turbo.md) 30 | - [x] [Consistency Models](./notes/028_consistency_models.md) 31 | - [ ] Latent Consistency Models 32 | - [ ] DiT 33 | 34 | ## LLM 35 | - [x] [Transformer](./notes/001_transformer.md) 36 | - [x] [GPT](./notes/016_gpt.md) 37 | - [x] [LLaMA](./notes/018_llama.md) 38 | - [x] [Chinese-LLaMA-Alpaca](./notes/019_chinese_llama.md) 39 | - [x] [LLaMA2](./notes/021_llama2.md) 40 | 41 | ## VLM 42 | - [x] [BLIP-2](./notes/038_blip2.md) 43 | - [x] [LLaVA](./notes/032_llava.md) 44 | - [x] [Mini-GPT4](./notes/033_minigpt4.md) 45 | - [x] [Qwen-VL](./notes/034_qwenvl.md) 46 | - [x] [Fuyu-8B](./notes/035_fuyu8b.md) 47 | - [x] [DeepSeek-VL](./notes/036_deepseekvl.md) 48 | - [x] [InternVL](./notes/037_internvl.md) 49 | - [x] [InternVL-1.5](/notes/039_internvl1.5.md) 50 | - [x] [InternVL-2](./notes/040_internvl2.md) 51 | - [x] [Qwen2-VL](./notes/041_qwen2vl.md) 52 | - [x] [DeepSeek-VL2](./notes/042_deepseekvl2.md) 53 | - [ ] InternVL-2.5 54 | 55 | ## Universal Multimodel Retrieval 56 | - [x] [VLM2Vec](./notes/044_vlm2vec.md) 57 | - [x] [MegaPairs](./notes/043_megapairs.md) 58 | - [x] [GME](./notes/045_gme.md) 59 | -------------------------------------------------------------------------------- /notes/001_transformer.md: -------------------------------------------------------------------------------- 1 | # Attention Is All You Need 2 | 3 | [Paper](https://arxiv.org/pdf/1706.03762.pdf) | [Talk](https://www.bilibili.com/video/BV1pu411o7BE/) 4 | 5 | ## Part1. 标题&作者 6 | 7 | Transformer开创了继MLP、CNN和RNN之后的第四大类模型。 8 | 9 | xxx is all you need 10 | 11 | ## Part2. 摘要 12 | 13 | **sequence transduction models: 序列转录模型** 14 | 15 | - 序列转录模型是说给定一个序列,生成另外一个序列。以机器翻译为例,给定一句英文,生成一句中文。 16 | 17 | - 序列转录模型通常是基于RNN或CNN,包含encoder-decoder的架构,encoder与decoder之间通过attention连接。 18 | 19 | **Transformer**: 仅依赖attention机制,不包含RNN和CNN结构。 20 | 21 | ## Part3. 结论 22 | 23 | - Transformer是第一个仅使用attention来做序列转录任务的模型,同样基于encoder-decoder架构,但是将其中的RNN或CNN替换成了multi-head self-attention 24 | - 在机器翻译任务上,Transformer的训练速度相对于其它结构更快、效果更好 25 | - 纯attention模型可以用于其它领域,图片、音频、视频等 26 | 27 | ## Part4. 导言 28 | 29 | **基于RNN的序列模型的缺点** 30 | 31 | - 在RNN中,给定一个序列,必须从左往右的计算,即计算第t个词的输出`h_t`时,是由第t-1个词的输出`h_t-1`和当前词t共同计算的,导致很难并行 32 | - 由于时序信息是逐步向后传递,假如序列很长,容易导致早期的时序信息在后面被丢失,如果不想丢掉需要`h_t`比较大,内存开销就会变大 33 | 34 | **attention在RNN中的应用** 35 | 36 | - attention在RNN中的应用主要体现在它如何把encoder的信息有效的传递给decoder 37 | 38 | ## Part5. 相关工作 39 | 40 | **基于CNN的序列模型的缺点** 41 | 42 | - 卷积神经网络对比较长的序列难以建模,受限于局部窗口操作,想提升感受野必须增加卷积层数 43 | - Transformer中的自注意力机制可以使一层就可以看到整个序列的信息 44 | 45 | **multi-head self-attention的由来** 46 | 47 | - 卷积操作的一个优点是可以多通道输出,一个输出通道其实可以它可以去识别不一样的模式,为了模拟此效果,transformer引入了multi-head-attention概念,每一个head可以当作一个channel 48 | 49 | ## Part6. 模型 50 | 51 | ### 基于encoder-decoder结构的序列转录模型 52 | 53 | - 对于encoder而言,假设输入为`(x_1, ..., x_n)`, `x_n`为第n个输入的向量表示,编码器会将其映射为新的表示`(z_1, ..., z_n)`,序列长度仍然为n 54 | - 对于decoder而言,拿到encoder的输出`(z_1, ..., z_n)`,然后生成一个长度为m的序列`(y_1, ..., y_m)`,这里输出序列长度可能与输入序列长度可能不同, n->m 55 | - decoder与encoder最大的不同是,解码器里的词是一个一个生成的,此过程被称为**自回归auto-regressive**,比如说要得到`y_t`时,前面已经得到的`y_1`~`y_t-1`可作为当前的输入,这个过程就是自回归。 56 | 57 | ### Transformer结构 58 | 59 | Transformer也是基于encoder-decoder架构,encoder与decoder均是由self-attention、point-wise、fully-connected layers组成 60 | 61 | 62 | 63 | 图上,左侧部分为encoder,右侧部分为解码器。以中译英为例,encoder的输入inputs就是中文句子,在做预测的时候,decoder是没有外部输入的,实际上是之前encoder的输出来作为decoder的输入。 64 | 65 | ***1.嵌入层Input Embedding*** 66 | 67 | - input embedding: 模型输入inputs为一个一个的词,首先需要将其表示为一个向量 68 | - position encoding: 69 | 70 | ***2.Encoder*** 71 | 72 | - Multi-Head self-attention: 多头注意力机制 73 | - Add & Norm: 残差连接 + LayerNorm归一化 74 | - Feed Forward: 其实就是MLP 75 | 76 | 以上三个操作组成transformer的block,然后N个block堆叠组成encoder,encoder的输出作为decoder的输入使用 77 | 78 | 在encoder中,由于残差连接要求特征维度一致,简单起见,固定每一层的输出维度均为512 79 | 80 | > **LayerNorm与BatchNorm的对比** 81 | 82 | 83 | 84 | - BatchNorm:是在batch内在样本间做归一化,均值为0,方差为1;假如n本书,每本书的第一页拿出来,根据n本书的第一页的字数均值做Norm 85 | - LayerNorm:是对每一个样本内做归一化;假如n本书,针对某一本书,这本书的每一页拿出来,根据次数每页的字数均值,自己做Norm 86 | 87 | 一般的,如果模型的输入是变长的,不使用BatchNorm 88 | 89 | (建议这部分直接看视频,视频25:40处) 90 | 91 | ***3.Decoder*** 92 | 93 | - Masked Multi-Head Self-Attention:在multi-head self-attention上加了mask 94 | - Add & Norm 95 | - Encoder Block: 该部分和encoder相同 96 | 97 | 以上三种操作堆叠重复N次,组成decoder 98 | 99 | > **Decoder中masked multi-head self-attention的由来** 100 | 101 | - 因为decoder做的是自回归任务,也就是说当前输出的input是上面一些时刻的输出,意味着当你做预测的时候你不能看到之后那些时刻的输出,但是在自注意力机制里,每一次都能看到整个完整的输入,为了避免这种情况发生,在decoder训练时,在预测第t个时刻的输出时,不应该看到t时刻以后的那些输入,所以引入了mask 102 | 103 | ### Attention 104 | 105 | 106 | 107 | - attention模块的输入为query, key, value,其中key-value成对,三者均为向量 108 | - query与key计算相似度得到权重,然后value通过得到的权重加权得到新的输出output 109 | 110 | ***1.Scaled Dot-Product Attention*** 111 | 112 | 113 | 114 | 115 | 116 | 其中,query和key维度相同`d_k`,value维度为'd_v',query与key计算内积,作为相似度,然后除以`sqrt(d_k)`,然后再通过一个`softmax`得到权重 117 | 118 | > **为什么要做scaled(除以sqrt(d_k))?** 119 | 120 | - 当d_k不是很大时,其实做不做scaled影响不大;当d_k比较大时,所得到的点积结果可能会比较大,当值的范围比较大时,值与值之间的相对差距就会比较明显,经softmax处理之后,较大的值会趋向于1,较小的的值趋向于0,导致有点两极分化,进而会导致在计算梯度时梯度会比较小,收敛困难,paper中的d_k=512,算比较大 121 | 122 | > **attention中的mask如何做?** 123 | 124 | - mask主要是为了避免你在第t时间看到以后时间的信息。假设query与key等长都为n,对于第t时间的`q_t`,在做计算时,应该只能看到`k_1`~`k_t-1`,但是注意力机制的性质导致`q_t`会和所有的`k`做计算。解决方法:在query与key计算之后,将`q_t`与`k_t`~`k_n`的计算结果置为一个极小值(如-1e-11),这样在softmax之后这部分权重基本趋向于0,这样在和value计算加权时相当于只用了`v_1`~`v_t-1`的信息(这部分建议看视频,42:00处) 125 | 126 | ***2.Multi-Head Attention*** 127 | 128 | 129 | 130 | - multi-head attention:先通过线性层分别把q, k, v投影到低维,然后把低维空间的q、k、v分别送入h个attention模块计算得到h个输入,然后将H个输出concat起来,再投影回来得到最终输出 131 | - **意义**:基于dot-product的attention中其实是没有可学习参数的,但是为了识别不同的模式,希望有一些不一样的计算相似度的方法;每一次计算attention之前都先投影到低维空间,其中投影矩阵w是可学的,也就是说给你h次机会,希望可以学到不同的投影方法,使得在那个投影进去的度量空间能够去匹配不同的模式它需要的一些相似函数,类似于CNN中的channle 132 | 133 | > **注意**:由于残差连接的存在,multi-head attention的输入与输出维度需要是一致的。所以,h个低维向量concat起来需要和输入维度一致,一般都会将低维空间的维度设置为`d_in // h` 134 | 135 | ***3.multi-head attention在transformer中的应用*** 136 | 137 | Transformer中分别有三处用到了multi-head attention,其作用分别如下: 138 | 139 | - Encoder中的multi-head attention: 这里的q、k、v是相同的值copy三份,所以是self-attention 140 | - Decoder中的masked multi-head attention: 这里的输入同样q、k、v是相同的,也是self-attention,与encoder中不同的是用了mask 141 | - Decoder中的multi-head attention: 这里的key-value来自于encoder的输出,query来自于decoder的masked multi-head attention,可以理解为通过这里的query将encoder的输出中感兴趣的信息提取出来 142 | 143 | (建议看视频理解,48:00处) 144 | 145 | ### Position-wise Feed-Forward Networks 146 | 147 | 其实就是一个单隐层的MLP,维度从512->2048->512 148 | 149 | - point-wise: 指对输入的每一个词过一次MLP,或者说MLP只作用在最后一个维度 150 | 151 | ***1.Transformer与RNN传递时序信息方式的对比*** 152 | 153 | 154 | 155 | - transformer中的attention已经汇聚了序列信息,所以MLP只针对单点计算即可(每个词单独过MLP) 156 | - RNN中的序列信息是逐步由前向后传递,将上一时刻的信息作为下一个时刻的输入 157 | 158 | ### Embeddings and Softmax 159 | 160 | - embedding: 将输入的词token映射为向量表示,向量维度为`d_model`,paper中为512 161 | - 编码器、解码器、最后softmax之前的3个embedding共享权重,使得训练更简单 162 | 163 | ### Positional Encoding 164 | 165 | attention本身是不具备时序信息的,query和key计算相似度后与value加权所得到的结果和value在序列中的位置没有关系,也就是说给定一个序列,如果将序列的顺序打乱,所得到的结果是一致的,这显然是不合理的。一个句子把词的顺序打乱可能语义会发生变化,所以需要把时序信息加进来 166 | 167 | - RNN中,当前时刻的输入是上一时刻的输出,是按时刻逐步计算的,本身含有时序信息 168 | - Transformer的做法是在输入里加入时序信息,假设某个词所在序列中的位置是i,把i映射为向量加到输入里(position encoding) 169 | 170 | ### self-attention与rnn, cnn复杂度等的对比 171 | 172 | ***1.复杂度对比*** 173 | 174 | 175 | 176 | - Complexity per Layer: 模型计算复杂度,越小越好 177 | - Sequential Operations: 顺序的计算,或者说你下一步的计算需要等前面多少步计算完成,影响并行度 178 | - Maximum Path Length: 一个信息点走到另一个信息点要走多远(可以理解为时序信息的传递效率) 179 | 180 | 表中,n为序列长度,d为向量长度;当序列比较长时,self-attention计算复杂度就会变高 181 | 182 | ***2.归纳偏置*** 183 | 184 | - CNN中的inductive bias: locality和spatial invariance,即空间相近的像素有联系而远的没有,和空间不变性(kernel权重共享) 185 | - RNN中的inductive bias: sequentiality和time invariance,即序列顺序上的timesteps有联系,和时间变换的不变性(rnn权重共享) 186 | - attention缺少归纳偏置,对整个模型的先验假设更少,导致需要更多的数据和更大的模型才能训练出来和RNN、CNN同样的效果。所以,现在基于transformer的模型一般比较大,而且对数据量要求高 187 | 188 | ## Part7. 实验 189 | 190 | **WMT 2014数据集**:英语翻德语数据集,包含4.5w个句子对 191 | 192 | ## Part8. 评论 193 | 194 | 略。 195 | -------------------------------------------------------------------------------- /notes/002_bert.md: -------------------------------------------------------------------------------- 1 | # BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 2 | 3 | [Paper](https://arxiv.org/pdf/1810.04805.pdf) | [Talk](https://www.bilibili.com/video/BV1PL411M7eQ) 4 | 5 | ## Part1. 标题&作者 6 | Pre-training: 用来做预训练的 7 | 8 | Bidirectional Transformers: 双向的transformer 9 | 10 | Language Understanding: transformer主要用于机器翻译,bert将其扩展为语言理解任务,更加广泛 11 | 12 | **BERT**:它是一个深的双向的transformer,是用来做预训练的,面向的是一般的语言理解任务 13 | 14 | ## Part2. 摘要 15 | **BERT名字来由**:**B**idirectional **E**ncoder **R**epresentations from **T**ransformers 16 | > ELMo, BERT, ERNIE均是美国著名儿童教育节目《芝麻街》中的人物 17 | 18 | **BERT与GPT和ELMo的区别**: 19 | - BERT: 使用未标注数据,联合左右的上下文信息,训练得到深的双向的表示;得益于此设计,针对不用的下游语言(问答、推理等)任务,只需要对预训练好的BERT模型另加一个额外的输出层即可 20 | - GPT: 是一个单向过程,使用左边的上下文信息去预测未来,而BERT同时使用左侧和右侧信息(Bidirectional双向的由来) 21 | - ELMo: 基于RNN架构,BERT是基于transformer;ELMo在用到一些下游任务上时通常需要对架构做一些调整,而BERT只需要改最上层即可 22 | 23 | ## Part3. 导言 24 | **NLP任务可分为两类**: 25 | - sentence-level tasks: 句子层面的任务,主要用来建模句子之间的关系,比如句子情绪识别、两个句子之间的关系等 26 | - token-level tasks: 词元层面的任务,比如实体命名识别(NER)等 27 | 28 | **在使用预训练模型做特征表示时,一般用两类策略**: 29 | - feature-based:对每一个下游任务,构造一个与该任务相关的神经网络(比如RNN结构),而预训练好的表示(可理解为预训练模型的输出)作为额外的特征和已有输入一起送给模型,代表作ELMo 30 | - fine-tuning:在预训练模型用于下游任务时,只需要针对任务修改头部结构即可,模型预训练好的参数会在下游任务的数据上再进行微调一下(即所有的权重都会进行微调,对比feature-based来看由于输入的是特征相当于预训练模型的参数是固定的),代表作GPT 31 | 32 | **当前预训练模型技术的局限性**: 33 | 34 | - 标准的语言模型是一个单向的任务,导致选架构时有一些局限性,比如GPT使用的是一个从左到右的架构;但一些任务无论从左到右或者从右到左结构应该是一样的,比如句子情绪识别 35 | 36 | **BERT是如何突破以上局限性的?** 37 | - “masked language model”(MLM):带掩码的语言模型,对句子随机掩盖部分词汇,然后预测这些词(完形填空),允许同时看左右的信息(与从左到右不同) 38 | - “next sentence prediction”: 给定两个句子,判断这两个句子在原文中是否相邻,希望可以学习到句子层面的一些信息 39 | > 我理解以上两种方式分别想针对token-level与sentence-level任务 40 | 41 | ## Part4. 结论 42 | - BERT将之前基于单向结构的预训练模型拓展到双向结构,使得同样的一个预训练模型能够处理不同的NLP任务 43 | - BERT是ELMo使用双向信息(但基于比较旧的RNN架构)与GPT使用新架构transformer(但只能处理单项信息)两者的结合 44 | 45 | ## Part5. 相关工作 46 | - Unsupervised Feature-based Approaches: 代表作ELMo 47 | - Unsupervised Fine-tuning Approaches: 代表作GPT 48 | - Transfer Learning from Supervised Data: 在有标注的数据上,针对下游任务进行迁移学习 49 | 50 | ## Part6. BERT模型 51 | **BERT中的两个步骤**:pre-training和fine-tuning 52 | 53 | 54 | 55 | - 首先pre-training阶段使用无标注数据进行训练得到预训练模型,然后fine-tuning阶段使用标注数据对模型进行微调 56 | - fine-tuning时每一个下游任务都会有一个自己特定的bert模型,由预训练好的模型进行参数初始化(输出层除外),然后在自己任务的标注数据上进行微调,期间所有参数都会参与训练 57 | 58 | ### 模型架构 59 | BERT模型是一个多层的双向的transformer的编码器 60 | 61 | **模型的三个可调整参数**: 62 | - L:transformer block的个数 63 | - H:隐藏层大小 64 | - A:self-attention head的个数 65 | 66 | > BERT_base(L=12, H=768, A=12, Total Parameters=110M),BERT_large(L=24, H=1024, A=16, Total Parameters=340M) 67 | 68 | **可学习参数量的计算** 69 | 70 | BERT模型里的可学习参数主要来自两部分:嵌入层与Transformer Block 71 | 72 | 73 | 74 | ***嵌入层***:实际是一个矩阵,输入为字典的大小30k,输出为隐层单元的个数H; 75 | > 参数量=30k(字典大小)* H(hidden size) 76 | 77 | ***Transformer块***:包括multi head self-attention与MLP两部分中的参数,self-attention本身不包含参数,但是multi head self-attention中会把所有进入的Q、K、V分别做一次投影,每次投影的维度为64(`A * 64=H`);MLP包含两个全连接层(第一个全连接层输入是`H`,输出是`4 * H`,参数量`H^2 * 4`;第二个全连接层输入是`4 * H`,输出是`H`,参数量`H^2 * 4`) 78 | > Multi head self-attention参数量=`H^2 * 4`,MLP参数量=`H^2 * 4 + H^2 * 4 = H^2 * 8`,整个transformer block的参数量为`H^2 * 4 + H^2 * 8 = H^2 * 12`,L 个 blocks的参数量=`L * H^2 * 12` 79 | 80 | BERT总参数量=`30k * H`(嵌入层)+ `L * H^2 * 12`(L个transformer块),以BERT_base为例`H=768`,`L=12`,总参数量=1.1亿(即`110M`) 81 | 82 | (该部分建议看视频更直观,视频于23:22处) 83 | 84 | **BERT的输入和输出** 85 | 86 | 为了处理不同的下游任务,BERT的输入即可以是一个句子(一段连续的文字,不一定是真正的语义上的一段句子),也可以是一个句子对;无论是一个句子还是句子对,它们最终都是构成一个序列(sequence)作为输入; 87 | > BERT输入与Transformer输入的区别:transformer的输入是一个序列对,编码器和解码器分别会输入一个序列;而BERT只有一个编码器,为了使BERT能处理两个句子的情况,需要把两个句子并成一个序列。 88 | 89 | **BERT输入的序列是如何构成的** 90 | 91 | ***切词*** 92 | 93 | 假设按照空格切词,每个词作为一个token,如果数据量比较大,会导致切出的词典特别大,可能是百万级别,由之前计算模型参数的方法可知,若是百万级别就会导致模型的整个可学习参数都在嵌入层上。 94 | 95 | WordPiece,如果一个词出现的频率比较低,则应该把它切开,然后只保留一个词频率较高的子序列。这样的话,可以把一个相对来说比较长的文本,切成很多片段,而且这些片段是经常出现的,进而可以用一个相对来说比较小的词典(30k)就可以表示一个比较大的文本了。 96 | 97 | ***序列构成*** 98 | 99 | BERT的输入序列,第一个词永远是[CLS](classification),其输出代表整个序列的信息 100 | 101 | > [CLS]:BERT希望它代表的是整个序列的信息,因为transformer中的self-attention机制使得输入的每一个token都会去看其它所有的token信息,就算[CLS]放在序列的第一个位置,它也是有办法看到之后所有的词 102 | 103 | 将两个句子合成一个序列之后,为了区分开两个句子,所采用了两种方式: 104 | - 在每一个句子后面放一个特殊词[SEP](separate); 105 | - 添加一个可学习的嵌入层,来表示当前句子到底是第一个句子还是第二个句子。 106 | 107 | > [SEP]:用于区分两个句子的连接符 108 | 109 | 最终所构成的序列:`[CLS][Token1]...[TokenN][SEP][Token1']...[TokenN']` 110 | 111 | ***输入-输出向量化表示*** 112 | 113 | 114 | 115 | 在将句子切词、序列化之后,送入transformer之前,是需要对输入序列(每个token)进行向量化表示的(上图中黄色部分);每个token被embedding之后送入transformer,然后输出该token新的embedding表示(上图中绿色部分)。所以,BERT是一个序列到序列的模型。针对下游任务,添加额外的输出层,将由bert得到的token embedding映射为想要的结果。 116 | 117 | 118 | 119 | 120 | 对于每个词元token进入BERT的向量表示(token embedding),是由token、segment以及position embedding三者相加获得。 121 | - token embedding: token本身的embedding 122 | - segment embedding: 该token是属于第一个句子还是第二个句子的embedding 123 | - position embedding: 该token在句子中位置的embedding 124 | 125 | ### BERT Pre-training部分 126 | 127 | 预训练阶段两个关键部分:目标任务和预训练的数据 128 | 129 | **目标任务1: Masked LM** 130 | 131 | Masked LM实际是一个**完形填空**任务。对于一个输入BERT的词元序列,如果一个token是有WordPiece生成的,那么它有15%的的概率被替换成一个掩码,但是对于特殊的token不做替换([ CLS ]和[SEP])。假如输入序列是1000个token,那么该任务需要预测其中的150个被mask掉的词。 132 | 133 | Masked LM存在的问题:在做掩码时,会将词元替换成特殊符号[MASK],所以在pre-training阶段会看到输入中有15%的[MASK],但是在fine-tuning阶段是没有[MASK]这个东西的(因为微调时不用Masked LM这个目标任务) 134 | > 解决方法:对于被选中的15%去做掩码的token,有80%的概率真的将其替换成[MASK],10%的概率将其替换成一个随机的token,还有10%的概率该token保持不变,但是让它用于预测使用。 135 | 136 | **目标任务2: Next Sentence Prediction(NSP)** 137 | 138 | 一个给定的序列包含两个句子a和b,其中有50%的概率在原文之中句子b确实是在句子a之后,还有50%的概率句子b是从另外一个地方随机选取出来的一个句子(其实就是50%的样本为正例,50%的样本为负例),该任务就是预测句子b是否为句子a的下一句。 139 | 140 | 该预训练任务对QA、推理等下游任务有明显的增益。 141 | 142 | **Pre-training data** 143 | 144 | - BooksCorpus:具有8亿个词 145 | - Englishi Wikipedia:25亿个词 146 | 147 | 预训练时应该使用文本级别(document-level)的预料,即送进去的时一篇一篇的文章,而不是一些随机打乱的句子。因为Transformer本身可以处理比较长的序列,输入整体的文本效果会更好一些。 148 | 149 | ### BERT Fine-tuning部分 150 | 151 | **BERT与一些基于encoder-decoder架构的模型(如transformer)的区别?** 152 | 153 | - BERT预训练时的输入是整个文章或者一些句子对,由于self-attention机制导致可以在两端之间相互看到,但是基于encoder-decoder的结构里,一般encoder是看不到decoder的东西的,这里BERT会更好一些(不太理解),所付出的代价是BERT不能像Transformer那样来做机器翻译任务了。 154 | 155 | **下游任务** 156 | 157 | 针对下游任务,只需要设计输入和输出,模型架构不需要变。即只需考虑你的输入如何改造成BERT所需要的句子对: 158 | 159 | - 如果你的下游任务也有两个句子作为输入,那就是句子A和B 160 | - 如果你的下游任务也有一个句子作为输入(比如句子分类),那么相当于句子B是省略的 161 | 162 | ## Part7. 实验 163 | 164 | **任务1:GLUE (General Language Understanding Evaluation)** 165 | 166 | 这是一个句子层面的分类任务,[CLS]的BERT输出加一个输出映射就可以得到最终的输出。 167 | 168 | **任务2:SQuAD (Stanford Question Answering Dataset)** 169 | 170 | 这是斯坦福的一个QA数据集,QA任务就是给定一段话,然后问你一个问题,需要你把答案找出来。答案已经在给定的那段话中,只需要把答案对应的那个片段找出来就可以(片段的开始和结尾),实际操作时就是对每一个token,来判断一下它是不是答案的开头或者结尾,具体的就是对每个token学习得到两个向量S和E,分别代表其作为答案的开始和结尾的概率。 171 | 172 | **任务3: SQuAD 2.0** 173 | 174 | 同上 175 | 176 | **任务4:SWAG** 177 | 178 | 这是一个用来判断两个句子之间关系的任务。 179 | 180 | ## Part8. 评论 181 | 182 | 略。 183 | -------------------------------------------------------------------------------- /notes/003_vit.md: -------------------------------------------------------------------------------- 1 | # AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 2 | 3 | [Paper](https://arxiv.org/pdf/2010.11929.pdf) | [Talk](https://www.bilibili.com/video/BV15P4y137jb?spm_id_from=333.999.0.0) 4 | 5 | ## Part1. 标题 6 | 7 | - An image is worth 16x16 words: 一张图片等价于很多16x16大小的单词 8 | - Transformers for image recognition at scale: Transformer去做大规模图像识别 9 | 10 | ## Part2. 摘要 11 | 12 | - 当前CV中attention通常是和CNN一起使用,或者用attention替换CNN中部分操作,整体架构还是基于CNN 13 | - 本文提出一个纯的transformer用于cv任务,不含CNN操作,效果媲美基于CNN的方法,尤其有大规模数据做预训练时 14 | 15 | ## Part3. 引言 16 | 17 | - Transformer目前基本时NLP领域的必选模型,基本上是先用一个大的数据集做预训练,再用一个特定领域的小数据集做微调 18 | - 一个transformer用于CV的做法基本都致力于降低序列长度,比如将CNN得到的特征(如14x14大小的特征图,序列为196)送给transformer 19 | - 另一个transformer用于CV的做法是降低attention的计算复杂度,但是这些特定的attention操作在硬件上加速 20 | - ViT的做法:通过把图像切分成patch,每个patch看作一个token,大大降低了序列长度,然后经过一个FC做embedding后送入transformer,transformer结构与NLP中的基本一致 21 | 22 | **Transformer用于CV领域的一些难点** 23 | 24 | - 如果将图片像素级拉伸为一个序列,作为transformer的输入,其中attention的复杂度为O(n^2),其中n为序列长度(对224x224大小的图像来说=50176),计算复杂度过高 25 | 26 | **ViT的预训练使用的是有监督训练,而NLP领域的BERT预训练时使用的是无监督(MLM和next sentence predict)** 27 | 28 | **ViT相对于CNN的优劣** 29 | 30 | - ViT在中型大小的数据集上(如imagenet),如果不加比较强的约束(regularization),和同等大小的CNN模型相比会低几个点:因为transformer相对CNN来说缺少一些归纳偏置(先验知识) 31 | 32 | > CNN中两个常说的归纳偏置:locality(局部相似性,假设是相邻的区域会有相似的特征)和translation equivariance(平移不变性,`f(g(x))=g(f(x))`,这里f可以看作卷积,g看作平移,无论是先做卷积还是先做平移,结果都是一样的) 33 | > CNN有以上的两个归纳偏置,意味着它拥有很多的先验信息,所以它需要相对少的数据就可以学习得到比较好的模型 34 | 35 | - ViT如果先在大的数据集上(如ImageNet-21K和JFT)进行预训练,然后在小数据集上进行微调,就会得到和同等CNN差不多或更好的结果 36 | 37 | ## Part4. 结论 38 | 39 | - 直接用NLP领域中标准的Transformer做CV领域的问题 40 | - ViT除了刚开始切图像patch和引入position encoding时用了一些图像特有的归纳偏置之外,再没有使用其它的归纳偏置 41 | - 展望:分割、检测任务;DETR、ViT-FRCNN、SETR、Swin-Transformer等模型;自监督做预训练,MAE等;多模态通过Transformer大一统 42 | 43 | ## Part5. 相关工作 44 | 45 | - Transformer在NLP领域的应用:先在大规模数据集上预训练,然后在特定数据集上做微调;BERT, GPT等 46 | - Transformer在CV领域的应用:由于O(n^2)复杂度,在像素层面使用transformer不现实,必须做一些近似操作,比如只用图像的局部做attention、稀疏attention、轴attention等 47 | 48 | ## Part6. ViT模型 49 | 50 | ViT在模型设计上是尽可能的按照原始的transformer来做,好处是可以把NLP领域比较成功的transformer架构直接拿来用 51 | 52 | 53 | 54 | **ViT整体流程**:图像切分Patch -> Patch序列化 -> Patch + Position Embedding -> Transformer Encoder -> MLP Head -> Class 55 | 56 | ***1.图像切分patch*** 57 | 58 | 给定一幅尺寸为(224, 224, 3)大小的RGB图像,patch_size=16: 59 | 60 | - patch数量:N = 224^2 / 16^2 = 196 61 | - patch尺寸:224 / 16 = 14,即(14, 14, 3) 62 | - patch flat后维度:14 * 14 * 3 = 768 63 | - Linear Embedding矩阵维度:D=(768, 768) 64 | 65 | 所以,图像经patch后成为一个(196, 768)大小的矩阵,然后通过Linear Embedding后得到的patch embedding维度大小是(196, 768)。至此,已经将一个vision问题转换成了NLP问题,输入为一系列的1D的token。 66 | 67 | ***2.[CLS]Token*** 68 | 69 | ViT中同样借鉴了BERT中的[CLS]特殊字符,其位置信息永远为0,根据attention机制,所有的token之间都会有信息交互,所以认为[CLS]字符的embedding有能力从其它token的embedding获取到全局的信息,从而只需要根据[CLS]的输出做最终判断即可。 70 | 71 | 所以,再加入[CLS] token之后,实际最终送入到transformer的序列长度为(197, 768) 72 | 73 | > ViT对于[CLS] token代表全图特征还是global average pooling(GAP)后代表全局特征做了消融实验。实验显示两者的最终效果相当,但是为了和原始的transformer尽可能的保持一致,选择了添加[CLS] token来作为全图信息的代表 74 | 75 | ***3.Position Embedding如何做*** 76 | 77 | 每一个patch本身有一个序号,比如1~196,然后通过一个映射表将每个序号映射为768维的向量,得到position embedding,然后将position embedding与patch embedding直接做sum操作,得到了最终送入transformer encoder的向量,维度仍然是(197, 768)。 78 | 79 | 至此,对图像的预处理操作已经处理完毕 80 | 81 | > ViT对位置编码的方式同样做了对比实验,分别选取了1-D positional embedding、2-D positional embedding和relative positional embedding。实验结果显示,选择哪种位置编码方式都可以。解释:ViT对原图的处理是patch-level而不是pixel-level,其实对于196个patch数量不算太多,学习得到位置信息不是很难 82 | 83 | ***4.Transformer Encoder*** 84 | 85 | 通过以上的数据预处理,得到了patch embedding,维度大小为(197, 768) 86 | 87 | 88 | 89 | - Transformer Encoder中用的也是Multi-Head Self-Attention,其中q、k、v同样是输入的patch embedding复制三份,由于是multi-head,首先需要对输入的(197, 768)降维,假设head数量H=12,则降维至(197, 768//12)=(197, 64),然后将经过multi-head attention得到的H个(197, 64) concat起来,恢复至(197, 768) 90 | - Attention的输出送入MLP,通常MLP中会做一次升维和降维:(197, 768) -> (197, 3072) -> (197, 768) 91 | 92 | 至此,完成了一个transformer block,其原始输入大小为(197, 768),最终输出大小也是(197, 768)。由于输入、输出维度一致,可以有任意个block堆叠组成最终的transformer encoder 93 | 94 | ***5.归纳偏置*** 95 | 96 | 相对于CNN而言,ViT缺少很多图像特有的归纳偏置,比如locality和translation equivariance。ViT中只有MLP层具有locality和translation equivariance性质的,attention肯定是全局的,添加的position embeding也是随机初始化的,没有携带2D信息,需要从头学,所以需要比较多的训练数据 97 | 98 | ***6.Hybrid Architecture*** 99 | 100 | 混合网络:前面是CNN,后面是Transformer,直接拿特征图去过transformer。比如一张图经resnet50提取后,在stage4的输出大小为(14, 14),拉直之后也是196的长度,后面过transformer的过程和之前一样 101 | 102 | ***7.不同尺寸图像上的fine-tuning*** 103 | 104 | 微调时,如果使用比预训练时更大尺寸的图像,效果会更好 105 | 106 | 假如,预训练时使用的图片尺寸为224x224,微调时的图片尺寸为320x320,这时如果保持patch size不变(假设为16),那么得到的序列长度也会改变,由196变为了400。这时位置编码就会从1~196变为了1~400,这就会导致本来预训练好的位置编码失效。 107 | > 解决方法:对原始的位置编码做二次插值直接得到新的位置编码,但是如果新序列太长可能导致掉点,这是ViT在微调时的一个局限性 108 | 109 | ## Part7. 实验 110 | 111 | ***1.ViT的三个变体*** 112 | 113 | 114 | 115 | ***2.ViT对数据集规模的依赖*** 116 | 117 | 118 | 119 | - ViT:训练快+效果好 120 | - 小规模数据集(ImageNet-1k)上做预训练,ViT全面不如ResNet,由于缺少归纳偏置的原因;中等规模数据集(ImageNet-21k)上做预训练,ViT与ResNet持平;大规模数据集(JFT-300M)做预训练,ViT超越ResNet 121 | - 如果数据规模小,就用CNN,如果数据规模大,就用ViT 122 | 123 | ***3.ViT、CNN、Hybrid对比*** 124 | 125 | ***4.可视化分析*** 126 | 127 | ***5.位置编码可视化*** 128 | 129 | - 学到了距离的信息 130 | - 学到了行和列的距离规则 131 | 132 | ***6.ViT中的self-attention是否真的起作用 133 | 134 | 135 | 136 | - self-attention在最底层刚开始就注意到全局的信息; 137 | - CNN刚开始第一层的感受野很小,只能看到附近的信息 138 | 139 | ***7.自监督预训练*** 140 | 141 | ## Part8. 评论 142 | 143 | 略 144 | -------------------------------------------------------------------------------- /notes/004_mae.md: -------------------------------------------------------------------------------- 1 | # Masked Autoencoders Are Scalable Vision Learners 2 | 3 | [Paper](https://arxiv.org/pdf/2111.06377.pdf) | [Talk](https://www.bilibili.com/video/BV1sq4y1q77t?spm_id_from=333.999.0.0) 4 | 5 | ## MAE与Transformer、BERT、ViT的关系 6 | 7 | 8 | 9 | - Transformer: 一个纯基于attention的编码器和解码器,用于机器翻译任务 10 | - NERT: 使用一个Transformer的编码器,拓展到更一般的NLP任务,使用了完型填空的自监督的预训练机制 11 | - ViT: Transformer在CV领域的应用,预训练阶段是有监督的方式 12 | - MAE: 可看作CV领域的BERT,将预训练过程扩展到无监督方式,同样通过完形填空的方式,与BERT相同 13 | 14 | ## Part1. 标题&作者 15 | 16 | 带掩码的自编码器是一个可扩展的视觉学习器 17 | 18 | - scalable: 可扩展的,如果你的算法比较快就用efficient,如果比较大就用scalable 19 | - autoencoder: auto并不是自动的意思,而是 自 的意思;这种说法的特点是因为你的样本和标签是同一个东西 20 | 21 | ## Part2. 摘要 22 | 23 | - MAE是一个针对计算机视觉问题的可扩展的自监督学习方法 24 | - 随机遮挡部分图像patch,然后恢复这些被遮挡的块 25 | - 非对称的encoder-decoder架构 26 | - encoder只作用在可见的patch上,被mask掉的patch不做计算,可节约计算 27 | - decoder用于重构被mask掉的像素 28 | - mask掉大量的patch(如75%)才有可能使自监督任务work,否则通过简单的插值就可以了,无法学习到有效的信息 29 | - MAE只是用小规模数据集,并且使用自监督方法就可以达到很好的效果 30 | 31 | ## Part3. 关键图 32 | 33 | ***1.框架图*** 34 | 35 | 36 | 37 | - 对输入图像切分patch,然后对部分patch进行mask操作,把未被mask掉的部分取出来组成输入序列 38 | - 把序列送入encoder中(ViT),得到每一个patch的向量表示 39 | - 把encoder输出的序列拉长,因为需要把mask掉的patch放回原位置;没被mask掉的patch就是填上ViT后输出的特征,被mask掉的patch就只有位置信息 40 | - 然后将新的序列送入到decoder中,然后decoder把里面的像素信息全部重构回来;target就是原始未被mask的图片 41 | - 图中encoder比decoder画的面积大,表示主要计算量在encoder部分 42 | - 接下游任务时只需要用到encoder,并且图片也不需要做mask,直接切patch,送入encoder得到每个patch的向量表示 43 | 44 | ***2.结果图*** 45 | 46 | 47 | 48 | - 有些图片mask后人都分辨不出来,MAE恢复的很好,作者可能是挑选了一些重构比较好的例子放在了论文中。 49 | 50 | ***3.mask比例对比图*** 51 | 52 | 53 | 54 | - mask 95%时看起来也很玄学 55 | 56 | 57 | ## Part4. 结论 58 | 59 | - MAE在小规模数据集ImageNet-1k上,通过自监督学习的方法得到了可以媲美有监督方法的结果 60 | - 在NLP中,一个token是一个语义单元,包含较多的语义信息;而MAE中的图像patch并不是一个语义的segment(一个patch并不一定包含一个物体或者patch是一个物体的一块);即使如此,MAE也可以学的比较好的隐藏的语义表达 61 | - broader impacts(如果该工作出圈可能带来的影响):只用了图像本身的信息去学习,如果数据集中有一些bias,可能会趋向于学习数据中不好的部分;MAE是生成式模型,和GAN一样可能得到误导大家的结果; 62 | 63 | ## Part5. 导言 64 | 65 | - CV领域的任务仍然需要百万级甚至更多的有标签数据来训练 66 | - NLP领域的GPT、BERT等都是在无标签数据上通过自监督方式学习得到不错的效果 67 | - CV里已有的maksed autoencoder带掩码的自编码器,如denoising autoencoder(一张图片里加入很多噪音,通过去噪来学习对这张图片的理解) 68 | - 最近有将BERT迁移至CV领域任务的工作,但是结果均不如在NLP领域的效果好 69 | 70 | ***What makes masked autoencoding different between vision and language?*** 71 | 72 | - 在CNN中,卷积窗口使得不好将mask放进去:在transformer中,mask是一个特定的词[MASK],它始终是和其它词区分开的,并且一直保留到最后;而CNN中如果对图像块做mask,卷积窗口进行滑动时是无法区分这个mask个边界的(从而无法和其它未被mask的部分区分开),导致掩码部分的信息最后很难还原 73 | - 语言和图像的信息密度不同:在NLP中,一个词就是一个语义的实体,所以对于一句话假如去掉几个词再回复会比较难;在图像中,如果简单去掉一些像素,可以很容易通过邻域的像素进行插值还原 74 | > 所以,MAE的做法是非常高比例(75%)的随机mask掉一些块,极大降低图片的冗余性,提高任务难度,使得学习得到的模型有看到全局信息的能力,而不是只关注局部信息 75 | - NLP中,decoder的作用是还原出被mask掉的词,词是一个高语义的东西(所以只需一个MLP即可,预测出词的标签);而CV中,decoder的任务是还原出被mask掉的像素,它是比较低层次的表示,一个MLP是不够的 76 | 77 | ***MAE的做法*** 78 | 79 | - 随机mask掉大量的块,然后去重构被mask掉的像素信息,使用一个非对称的encoder-decoder架构 80 | - encoder只计算未被mask掉的块,decoder计算encoder的输出以及被mask掉的信息 81 | 82 | ## Part6. 相关工作 83 | 84 | ***1.AutoEncoder在CV中的应用*** 85 | 86 | - MAE其实也是一种denoising encoder的一种形式,把一些块mask可以看作是加了很多噪声 87 | 88 | ***2.Masked image encoding*** 89 | 90 | - iGPT、BEiT 91 | 92 | ***3.自监督学习*** 93 | 94 | - contrastive learning: 主要使用的是数据增强 95 | 96 | ## Part7. MAE模型 97 | 98 | MAE是一个简单的自编码器,输入的是未被mask的部分图像,然后重构完整的图像区域 99 | 100 | ***1.Masking*** 101 | 102 | mask操作与ViT的方式相同,先对图像切patch,然后随机均匀的采样出来一些patch,剩余的用掩码mask掉。其中关键点是mask率要高(75%),减少冗余 103 | 104 | ***2.Encoder*** 105 | 106 | MAE的encoder其实就是一个ViT,但是它只作用在未被mask掉的patch上。patch embedding + position embedding -> Transformer 107 | 108 | ***3.Decoder*** 109 | 110 | Decoder会接收两部分的信息: 111 | 112 | - 未被mask的patch,经encoder编码之后的输出 113 | - 被mask的patch 114 | 115 | Decoder只在预训练阶段使用,在微调下游任务时并不需要 116 | 117 | MAE中decoder的计算量不到encoder的1/10 118 | 119 | ***4.Reconstruction Target*** 120 | 121 | MAE的目标是重构被mask掉的图像像素 122 | 123 | - decoder的最后一层是MLP,输出是每一个patch的向量表示;假如patch大小为(16, 16),那么向量的维度就是256,然后再将其reshape至(16, 16)作为最终还原的像素 124 | - 损失函数为MSE,只在被mask掉的部分使用 125 | - 对mask掉的部分的预测输出做normalization(每个patch) 126 | 127 | ***5.Simple implementation*** 128 | 129 | - 首先把切好的patch构成一个序列,然后做patch embedding + position embedding 130 | - 随机出25%:把序列random shuffle,只保留前25%,送入encoder 131 | - 解码时,需要把之前mask掉的的patch加进来,此时序列长度和原始相同,然后再unshuffle操作恢复原始序列的顺序 132 | 133 | ## Part8. 实验 134 | 135 | ***1.ImageNet-1k实验*** 136 | 137 | - MAE通过自监督的方式可以从ImageNet上学习到额外的信息 138 | 139 | ***2.消融实验*** 140 | 141 | - 微调时参数全部参与训练比只调最后一层效果更好 142 | - 送入encoder的块不包含mask部分会更好 143 | - 预测时,如果对patch内的像素值做归一化,效果会更好 144 | - MAE对数据增强不敏感,只做resize和随机裁剪就可以 145 | - mask操作随机采样的方式效果更好 146 | 147 | ***3.mask ratio的影响*** 148 | 149 | 150 | 151 | mask ratio=75%最好 152 | 153 | ***4.decoder的选择*** 154 | 155 | 156 | 157 | decoder depth=1时和=8时效果相当,但是速度提升明显 158 | 159 | ***5.采样策略的区别*** 160 | 161 | 162 | 163 | 随机采样的效果好且简单 164 | 165 | ***6.微调时层数影响*** 166 | 167 | 168 | 169 | ## Part9. 评论 170 | 171 | 略 172 | -------------------------------------------------------------------------------- /notes/005_moco.md: -------------------------------------------------------------------------------- 1 | # Momentum Contrast for Unsupervised Visual Representation Learning 2 | 3 | [Paper](https://arxiv.org/pdf/1911.05722.pdf) | [Talk](https://www.bilibili.com/video/BV1C3411s7t9/) 4 | 5 | ## Contrast Learning基本概念 6 | 7 | - Pretext task: 代理任务,可以是人为设定的一些规则,这些规则定义了哪些样本是相似的哪些样本是不相似的,从而可以提供一个监督信号去训练模型,也就是所谓的自监督训练 8 | - Instance discrimination: 一种pretext task,假设从数据集中随机选取一张图片`X_i`,然后做两次数据增强得到`X_i1`、`X_i2`,因为两者来自同一张图片,语义信息不应该发生变化,就可以被当作正样本,而数据集中其它图片都可以被当作负样本。从这个例子可以看出instance discrimination的含义,个体判别,因为在这个代理任务中,每个图片自身就是一个类别 9 | - NCE loss: 对比学习中一种常用的损失函数 10 | 11 | ## Part1. 标题&作者 12 | 13 | 使用动量的对比学习方法去做无监督的视觉表征学习 14 | 15 | - Momentum Contrast: 动量对比学习的方法;动量在数学上可以理解为一种加权移动平均,`y_t = m * y_t-1 + (1 - m) * x_t`,可以理解为*不想让当前时刻的输出完全依赖于当前时刻的输入*,所以也上之前的输出参与其中 16 | > 其中,m为动量的超参数,y_t-1是上一个时刻的输出,y_t是当前时刻想要改变的输出,x_t是当前时刻的输入 17 | 18 | ## Part2. 摘要 19 | 20 | - 本文提出MoCo方法去做无监督的视觉表征学习 21 | - 本文将对比学习看作是一个字典查询(dictionary look-up)的任务,具体来说是做了一个动态的字典,字典由一个队列queue和移动平均编码器moving-averaged encoder 22 | - 队列里的样本不需要做梯度回传,可以放很多负样本;移动平均编码器是想让字典里的特征尽可能的保持一致 23 | - MoCo自监督预训练可以获得比同模型有监督预训练更好的结果 24 | 25 | ## Part3. 引言 26 | 27 | - GPT和BERT已经证明了无监督学习在NLP领域已经获得了成功,在CV领域有监督预训练还是占主导地位 28 | > 两者的差异可能是它们所输入的信号空间不同,NLP中是离散的信号空间(比如词、词根词缀),从而可以建立一个字典空间将每个词映射成对应的特征,容易建模;CV中的输入是连续的、高维空间的信号,不像单词一样有很强的语义信息 29 | - 目前基于对比学习的无监督方法基本都可以归纳为一种方法:动态字典dynamic dictionaries(关于动态字典的解释建议直接看视频,13:40处) 30 | - 动态字典的方式做对比学习需要做到两点:字典尽可能大(字典越大,样本越多,含有的视觉信息越多,越能学到可区分的特征);一致性(字典中的特征都应该用相同或相似的编码器获得,这样才能保证它们和query对比时尽可能的保持一致,否则如果特征是通过不同编码器得到的,query很有可能找到的是和它是同一个编码器得到key,而不是包含相同语义信息的key) 31 | - MoCo与一般对比学习的框架的异同,队列queue和momentum encoder(建议直接看视频,19:15处) 32 | - MoCo只是针对对比学习建议了一种动态字典的训练机制,可以任意选pretext task(代理任务),本文选的是instance discrimination 33 | 34 | ## Part4. 结论 35 | 36 | - MoCo将数据集由ImageNet-1k换成Instgram-1B时,提升比较小,大规模的数据集并没有很好的被利用起来,可能需要更换代理任务解决 37 | - MoCo是否可以采用masked auto-encoding的代理任务(MAE,大佬两年前就已经开始挖坑了) 38 | 39 | ## Part5. 相关工作 40 | 41 | 无监督/自监督学习一般有两个方向可以做:1.代理任务(pretext task);2.损失函数 42 | 43 | ***1.Loss Function*** 44 | 45 | - 生成式目标函数:衡量模型的输出和target之间的差距(新建图与原图之间的差异),比如L1、L2 loss 46 | - 判别式目标函数:假如将图像分为九宫格,给定中间位置信息和任意一块信息,预测这两个块的方位(转换成了分类问题),这就是一种判别式网络的做法 47 | - Contrastive losses: 在一个特征空间里,衡量各个样本之间的相似性,相似特征的目标尽量近,否则尽量远 48 | > 与生成式和判别式网络的目标函数的区别:生成式和判别式的目标都是固定的,而对比学习的目标函数是在训练过程中不断改变的(在训练过程中,目标是由一个编码器提取出来的特征而决定的) 49 | - Adversarial losses: 主要衡量的是两个概率分布之间的差异,主要用来做无监督的数据生成的任务 50 | 51 | ***2.Pretext Tasks*** 52 | 53 | - denoising auto-encoders: 重建整张图 54 | - context autoencoders: 重建某个patch 55 | - colorization: 给图片上色做监督信号 56 | - form pseudo-labels: 给数据伪标签 57 | 58 | 不同的代理任务是可以和某些Contrastive losses配对使用的,比如MoCo使用的instance discrimination和NCE 59 | 60 | ## Part6. MoCo方法 61 | 62 | ***1.Contrastive Learning as Dictionary Look-up*** 63 | 64 | 目前的对比学习都可以看作是训练一个编码器,从而去做一个字典查找的任务 65 | 66 | 假设,给定一个编码后的query特征`q`,和一系列编码好的样本`{k_0, k_1, k_2, ...}`,这些可以看作是一个字典里的key,而且在这个字典里只有一个key和query是配对的(互为正样本对),记为`k_+` 67 | 68 | - 对比损失应该所具有的性质:当`q`和唯一正样本`k_+`相似时,loss值应该比较低,当`q`与其它不相似的样本距离比较远时,loss值也应该比较低 69 | - InfoNCE loss: noise contrastive estimation,把多分类问题简化成一系列二分类问题,其中一个是数据类别data sample,另一个是噪声类别noise sample,每次去拿数据样本和噪声样本做对比(**建议反复看视频,33:58~41:23**) 70 | > 在对比学习任务中,每个图片自成一类,对ImageNet来说就不再是1000分类,而是128w个类别,如果使用交叉熵函数作为监督信号,其中的K值为128w,而softmax操作在K很大时是无法工作的,同时还有exp操作,当向量的维度是几百万时,计算复杂度是相当高的,所以这里采用的是InfoNCE作为监督函数 71 | 72 | 73 | 74 | > 式中,K为队列中负样本的数量;τ为温度超参数,用来控制分布的形状,τ值大会使得分布更平滑,否则分布会更集中,如果τ值设置的比较大,对比损失会对所有的负样本一视同仁,导致模型的学习没有轻重,但如果τ值过小,又会让模型只关注那些特别困难的样本负样本,而这些负样本很有可能是潜在的正样本,会导致模型很难收敛,或者学好的特征很难去泛化 75 | 76 | - query编码器与key编码器可以是相同的网络(参数也可以共享或部分共享),也可以是不同的网络 77 | 78 | ***2.Momentum Contrast*** 79 | 80 | 如果想学习一个好的特征,MoCo中的字典必须具有两个特征:large(大)和consistent(一致性),因为字典大会包含很多语义丰富的负样本,有助于学到更有判别性的特征,一致性主要是为了避免模型学到一些捷径解 81 | 82 | - Dictionary as a queue 如何把字典看作队列:MoCo方法的核心就是把字典用队列的方式表现出来,队列中的元素为key的表示,训练过程中,每一个mini-batch会送进来一批新的key,同时有一批老的key移出去。字典中的元素一直是整个数据集的子集,维护字典的开销也非常小 83 | - Momentum update 动量更新:队列的方式使得字典可以非常大,但字典非常大时导致没办法对队列里所有的元素进行梯度回传,就是说key的编码器没办法通过反向传播更新参数了。假如把query编码器的参数拿过来直接给key的编码器(参数共享)以此来更新的话,结果会不好,因为query编码器的每个iteration都是更新的,如果key编码器每个iteration也更新会导致队列里的元素不具备一致性。所以提出了动量更新的方式: 84 | 85 | 86 | 87 | > 其中,`θ_k`为key编码器的参数,`θ_q`为query编码器的参数,除了第一次更新时`θ_k`用`θ_q`来做初始化,之后都主要根据自己的参数来更新,因为`m`只是一个比较大的值(0.999),只有0.001的权重依赖于`θ_q`,所以`θ_k`更新的非常缓慢。这样就导致队列中的key虽然不同,但是由于各自的编码器参数区别比较小,所以产生的这些key的一致性还是比较强。 88 | 89 | ***3.伪代码*** 90 | 91 | 92 | 93 | ***4.shuffling BN*** 94 | 95 | 用过BN之后,很有可能造成batch内样本之间的信息会泄漏,因为BN要算这些样本的running mean和running vairance,而模型会通过这些泄漏的信息很容易找到那个正样本,导致最后学得的并不是一个真正好的模型。 96 | > BN操作大部分时候都是在当前的GPU上计算的,在进行多卡训练之前,先把样本顺序打乱,再送到所有的GPU上,计算完特征之后,再把顺序恢复,然后去计算最后的loss。最终对loss的计算没有影响,但在每个GPU上的BN计算变了,就不会存在信息泄露的问题(?不太理解) 97 | 98 | ## Part7. 实验 99 | 100 | ***1.数据集*** 101 | 102 | 预训练数据集ImageNet-1M、Instagram-1B 103 | 104 | ***2.Linear Classification Protocol*** 105 | 106 | 冻结backbone的网络参数,只微调最后用于分类的fc层 107 | 108 | 109 | 110 | ***3.动量参数的消融实验*** 111 | 112 | 113 | 114 | ***4.特征迁移效果*** 115 | 116 | 无监督学习最主要的功能就是去学习一个可以迁移的特征 117 | 118 | 119 | 120 | 121 | ## Part8. 总结 122 | 123 | 略 124 | -------------------------------------------------------------------------------- /notes/007_swin_transformer.md: -------------------------------------------------------------------------------- 1 | # Swin Transformer 2 | 3 | [Paper](https://arxiv.org/pdf/2103.14030.pdf) | [Talk](https://www.bilibili.com/video/BV13L4y1475U?spm_id_from=333.999.0.0) 4 | 5 | ## Part1.标题&作者 6 | 7 | Swin Transformer是一个用了移动窗口(shifted windows)的层级式(hierarchical)的vision transformer。 8 | 9 | Swin Transformer想让vision transformer像卷积神经网络一样,也能够分成几个block,也能够做层级式的特征提取,使得提取到的特征具有多尺度的概念 10 | 11 | ## Part2.摘要 12 | 13 | Swin Transformer可以被用来作为CV领域的一个通用的骨干网络,而ViT当时只做了分类任务,虽然当时可以看到Transformer在视觉领域的潜力,但是并不确定是不是在所有的视觉任务上都可以做好,而Swin Transformer证明了是可以的。 14 | 15 | 直接将Transformer从NLP迁移至CV领域主要面临两个挑战: 16 | 17 | - 尺度问题:假如一张街景图片,其中代表同样语义词的物体尺寸大小不一,比如汽车,而NLP中不存在此问题; 18 | - 图像分辨率太大:如果以像素点作为基本单位,序列长度将会很长; 19 | 20 | 基于以上两个问题,本文提出一个hierarchical Transformer,它的特征是通过一种滑动窗口(Shifted windows)的方式计算所得。移动窗口操作不仅提高了自注意力的计算效率,而且通过shifting操作能够令相邻的两个窗口之间有了交互,从而变相的达到了一种全局建模的能力。 21 | 22 | 层级式结构的好处: 23 | 24 | - 可以提供各个尺度的特征信息; 25 | - 自注意力在小的窗口内计算,它的复杂度是随着图像大小线性增长的,而不是平方级增长。 26 | 27 | ## Part3.引言 28 | 29 | 本文的研究动机就是想要证明Transoformer是可以作为通用的骨干网络,在所有的视觉任务上都可以取得很好的效果。 30 | 31 | 32 | 33 | **ViT的缺点:** 34 | 35 | - ViT是把一张图分成patch,因为是patch大小为16 * 16,也就是下采样率为16x,而每一个patch自始至终所包含的信息都是16 * 16大小,每一层的transformer block所看到的都是16x的下采样率,虽然可以通过全局的自注意力操作达到全局建模的能力,但是对多尺度特征的把握就会弱一些,不适合处理密集预测性任务(检测、分割)。在一些下游任务中,多尺度特征是至关重要的,比如检测中的FPN,分割种的skip-connection都是为了结合不同尺度的特征,来提升效果。 36 | - ViT中的自注意力始终都是在整图上进行的,是一个全局建模,其复杂度是跟图像的尺寸进行平方倍的增长,检测、分割领域一般常用的尺寸都很大。 37 | 38 | **Swin Transformer的优点:** 39 | 40 | - Swin采取了在小窗口之内进行自注意力的计算,而不是在整图上计算,这样一来只要是窗口大小是固定的,那么自注意力的计算复杂度就是固定的,整张图的计算复杂度就会跟这张图片的大小形成线性增长的关系,类似于卷及神经网络中的locality局部相关性的先验知识。就是说语义相近的物体大概率会出现在相邻的区域,所以即使是在一个小范围的窗口里去计算自注意力也是够用的,全局的计算自注意力对于视觉任务有点浪费资源。 41 | - 多尺度特征:卷积神经网络中通过池化操作,增大卷积核的感受野,从而使得每次池化后得到的特征可以抓住物体的不同尺寸;类似的,Swin Transformer中也提出了一个类似于池化的操作patch merging,就是把相邻的小patch合成一个大patch,这样一来,合成得到的大patch就可以看到之前4个小patch看到的内容,它的感受野就增大了,同时它也能抓住多尺度的特征。一旦有了多尺度信息,4x、8x、16x的特征图,很自然的就可以把这些多尺寸的特征图输给一个FPN,就可以做检测了。 42 | 43 | **移动窗口操作:** 44 | 45 | 46 | 47 | 假设,在Transformer第L层,将输入或特征图分成4个小窗口,就会有效的降低序列长度,从而减少计算复杂度。图中,灰色的小patch为最基本的单元(4x4像素大小的patch),每一个红色的框是一个中型的计算单元(窗口),在Swin Transformer中,一个窗口中默认有7x7=49个小patch。shift操作就是将整个特征图(示意图中的4个窗口)往右下角整体移动两个patch,变成了右图中的格式。然后在新的特征图中,再次把它分成4个窗口,最终得到了9个窗口。 48 | 49 | shift的好处是窗口与窗口之间可以进行互动了。如果没有shift操作,各个窗口之间都是不重叠的,如果每次自注意力操作都在窗口内进行,那一个窗口里的patch永远无法注意到其它窗口中patch的信息,这就无法达到使用transformer的初衷了(更好的理解上下文)。如果这些窗口都不重叠,那么自注意力就变成了孤立自注意力了,就没有了全局建模的能力。shift之后,一个窗口的中patch可能会跑到另外一个窗口中,与新的patch进行交互,而这些新窗口中的patch可能是上一层来自其它窗口的patch,最终就达到了cross-window connection,窗口与窗口之间可以交互了,再配合上后面的patch merging,合并到transformer最后几层时,每一个patch本身的感受野已经很大了。再加上shift window操作,所谓的窗口内的局部自注意力也就变相的等于是一个全局自注意力操作了,即省内存效果也好。 50 | 51 | ## Part4.结论 52 | 53 | Swin Transformer是一个层级式的Transformer,而且它的计算复杂度是跟输入图像的大小呈线性增长。 54 | 55 | Shifted Window操作,它对很多视觉的任务,尤其是对下游密集预测型的任务是非常有帮助的。 56 | 57 | ## Part5.模型整体架构 58 | 59 | 60 | 61 | 62 | **前向过程** 63 | 64 | 第一阶段:patch projection + transformer block * 2 65 | 66 | 给定一张224x224x3大小的图片,首先将图片分成patch,swin transformer中patch大小为4x4(ViT中为16x16),分块之后大小为56x56x48,然后经过linear embedding,将输入向量化得到张量大小为56x56x96。 67 | 68 | > 在transformer计算中,前面的56x56会拉直变成3136(序列长度),输入特征则变成3136x96(ViT中,patch为16x16,序列长度为196),而3136长的序列对Transformer还是太长,所以因为了窗口计算,每个窗口里只有7x7=49个patch,相当于序列长度只有49,解决了计算复杂度问题。 69 | 70 | Transformer本身不改变输入尺寸,在经过两层transformer block之后,输出大小还是56x56x96。 71 | 72 | 第二阶段:Patch merging 73 | 74 | 75 | 76 | 给定一个张量,大小为HxWxC,Patch Merging把相邻的小patch合并成一个大patch,这样就可以起到下采样特征图的效果。假如下采样两倍,选点时就是每隔一个点选一个,图中标号为1的点为选的点,标号为2/3/4的点是要和1合并的点,合并完之后得到4个尺寸均为H/2 * W/2的张量,尺寸缩小了一倍,然后把4个张量在C维度拼接起来,特征尺寸则变成H/2 * W/2 * 4C,相当于用空间的维度换了通道数,为了和CNN中池化操作保持一致(池化后通道数变为2倍),用1x1的卷积对C维度进行降维(4C -> 2C),最终patch merging操作将原始HxWxC大小的张量变成了H/2 * W/2 * 2C的张量,空间大小减半,通道数翻倍。 77 | 78 | 对于第一阶段的结果,大小为56x56x96,经Patch Merging之后尺寸变为28x28x192,然后经过两个transformer block,尺寸仍为28x28x192。 79 | 80 | 第三阶段和第四阶段同理,最终尺寸为7x7x768。为了和CNN保持一致,Swin Transformer并没有用ViT中所使用的CLS token,而是直接通过一个global avg pooling将7x7x768拉直成一个768维的向量,然后做下游任务。 81 | 82 | ## Part6.窗口自注意力 83 | 84 | **动机** 85 | 86 | 全局的自注意力会导致平方倍的复杂度,尤其对视觉领域中密集型预测任务或者对大尺寸输入的图像,全局计算自注意力的复杂度会非常高。 87 | 88 | **窗口如何划分** 89 | 90 | 91 | 92 | 以第一阶段后的输出为例。首先,对于尺寸为56x56x96的输入会被平均的分为一些没有重叠的窗口,每一个窗口中含有m * m个patch,Swin Transformer中m默认为7,然后所有的自注意力计算都在这些小窗口中完成(序列长度永远是7x7=49),而输入特征图会被分为8x8=64个窗口(56/7=8)。 93 | 94 | **计算复杂度对比** 95 | 96 | 97 | 98 | 99 | 其中,h、w代表一个输入有h * w个patch,C为patch的特征维度,M为窗口中每行的patch数量。 100 | 101 | 公式的具体推倒建议看视频:31:00处。 102 | 103 | ## Part7.移动窗口自注意力 104 | 105 | **动机** 106 | 107 | 窗口自注意力虽然很好的解决了内存和计算量的问题,但是窗口与窗口之间没有通信,就无法达不到全局建模,会限制模型的能力。 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 在Swin中,transformer block中每次都是先做一次基于窗口的多头自注意力计算,然后再做一次基于移动窗口的多头自注意力,根据Part3中的解释,这样就可以起到窗口与窗口之间交互的作用。 117 | 118 | **基于mask计算的移动窗口自注意力** 119 | 120 | 121 | 122 | 基础版本的移动窗口会由原来的4个窗口变为9个窗口,而且每个窗口里的patch数量大小不一,如果想做快速运算,把所有窗口压成一个batch就无法做到了。一种解决方式是在小窗口周围padding 0操作可以是长度一致,但是之前是指用算4个窗口,现在要算9个窗口,计算复杂度还是变高的。 123 | 124 | 125 | 126 | Swin给出的解法是,对于移动后得到的9个窗口,做一次循环移位,然后再把移位后的窗口重新划分为4个窗口。这样最终得到的窗口还是4个,窗口数固定,计算复杂度也就固定了。但是循环移位的窗口中的patch有一些原本并不是相邻的,理论上不应该进行自注意力计算,Swin中通过一些masked多头自注意力使得即使同一窗口中的一些patch也互不干扰,整体计算完自注意力之后再通过循环回去将窗口位置还原回去。 127 | 128 | 129 | 130 | 掩码的解释详细看视频:39:10 131 | 132 | issue: https://github.com/microsoft/Swin-Transformer/issues/38 133 | 134 | **Swin Transformer的几个变体** 135 | 136 | 137 | 138 | 其中Swin-Tiny的计算复杂度与resnet50差不多,Swin-Small与resnet101差不多。 139 | 140 | ## Part8.实验 141 | 142 | **分类** 143 | 144 | 分别在Imagenet-1k和ImageNet-22k上做预训练,在ImageNet-1k上做测试。 145 | 146 | **检测** 147 | 148 | **分割** 149 | 150 | **消融实验** 151 | 152 | 移动窗口、相对编码的影响 153 | -------------------------------------------------------------------------------- /notes/008_clip.md: -------------------------------------------------------------------------------- 1 | # CLIP 2 | 3 | [Paper](https://arxiv.org/pdf/2103.00020.pdf) | [Talk](https://www.bilibili.com/video/BV1SL4y1s7LQ) 4 | 5 | CLIP自提出以来就引起很大关注,其方法简单但又效果很好。CLIP的迁移学习能力非常强,预训练好的模型能够在任意一个视觉分类的数据集上取得不错的效果,而且是zero-shot的,即它完全没有在这些训练集上做过训练,就能得到很好的效果。文章在30多个数据集上做了测试,包括了OCR,视频动作检测,坐标定位以及一些细分类任务,涵盖面非常广,尤其是在ImageNet上的结果,CLIP在不使用ImageNet训练集的情况下,就可以取得和之前ResNet50在有监督情况下的结果。 6 | 7 | ## Part1.标题&作者 8 | 9 | Learning Transferable Visual Models From Natural Language Supervision:利用自然语言处理来的一些监督信号,去学习一个可以迁移效果很好的视觉模型。 10 | 11 | Transferable: 迁移性能好 12 | 13 | ## Part2.摘要 14 | 15 | - 目前的视觉模型训练通常是使用提前定义好的一些物体类别的集合,然后模型通过去预测这些定义好的类别,从而完成模型的训练。提前定义好的类别集合:比如ImageNet 1000类,cifar10 10类,coco 80个类,cityscapes 19个类,kinetics 400个类等。这种提前定义好的样本集合可以大大简化模型学习的难度,但是也限制了模型的泛化性 16 | - 直接从自然语言里获取一些监督信号,只要是语言描述过的物体,就有可能让视觉模型去识别到这个物体,而不仅仅是提前定义好的那些固定的类别。 17 | - 本文证实了用一个简单的预训练任务,就可以高效的、可扩展的去学习到最好的图像表征。具体的,给定一些图片和一些文本,模型去判断图片和哪些文本是配对的。既然要做的是配对的任务,那么所需要的训练数据就应该是配对的,本文爬取了一个4亿大小的图片、文本对,然后用自监督的方式去预训练模型。 18 | - CLIP是利用多模态的对比学习去完成模型预训练,然后利用自然语言去引导视觉模型去做物体分类。分类也不再局限于已经学到的视觉概念,还能扩展到新的类别,也就是这个预训练模型可以直接在新的下游任务上做zero-shot推理的。 19 | 20 | ## Part3.引言 21 | 22 | - 直接从文本数据里去预训练一个模型已经在NLP里取得了革命性的成功,比如BERT、GPT等,不论是使用自回归预测的方式还是使用掩码完形填空的方式,都是一种自监督的训练方式。所以,它的目标函数是和下游任务无关的,只是想通过预训练得到一个泛化能力好的特征,这套框架基本都是"text-to-text",即文字进文字出,其模型架构也是跟下游任务无关的,所以在处理下游任务时,无需再针对下游任务去设计head或者其它特殊处理。比如GPT3,可以做分类、翻译、生成等。 23 | - VirTex、ICMLM、ConVIRT均是基于transformer的工作,不同的是VirTex是用自回归预测的方式做预训练,ICMLM是利用完形填空的方式,ConvVIRT与CLIP非常相似,但是只在医疗图像上做的实验。三者在模型或数据上都没有取得很大的规模。 24 | - 之前的一些引入自然语言信号的弱监督预训练方法效果不好,基本都是因为训练数据量级小,而CLIP收集了400M(4亿)对图像/文本对作为训练样本。模型上从ResNet50、EfficientNet到Vit-L,在大数据大模型的加持下,CLIP在多个数据集上取得很好的效果。 25 | - 迁移学习的效果基本是和模型的大小呈正相关的,模型逐步增大,迁移学习的效果也在逐步增高,是一个比较平滑的过程。 26 | - 作者为了进一步验证CLIP模型学到的特征的有效性,做了类似对比学习中的linear-probe验证,效果也比之前在ImageNet上有监督的结果好,而且泛化性能更好。 27 | 28 | ## Part4.模型方法 29 | 30 | **4.1 利用自然语言信号训练视觉模型的优点** 31 | 32 | - 不需要再去标注数据,直接抓去图片/文本对即可,很容易把数据规模做大 33 | - 监督信号是一个文本,不再是N选1的标签,模型的输入输出的自由度就会大很多 34 | - 训练时,将图片与文本绑定在一起,学得的特征不再是单单的视觉特征,而是一个多模态特征,很容易去做zero-shot迁移学习 35 | 36 | **4.2 常见的一些图片/文本数据集** 37 | 38 | - MS-COCO 39 | - Visual Genome 40 | - YFCC100M 41 | 42 | 前两者数据标注质量高,但是规模小,约10w数据;YFCC100M虽有1亿数据,但是标注质量差,清洗后的规模只有1500w。 43 | 44 | CLIP收集了一个4亿规模的数据集--WebImageText。 45 | 46 | **4.3 预训练方法的选择** 47 | 48 | ***将预测性任务改为对比型任务*** 49 | 50 | 视觉模型的训练代价一般都比较高,模型大,计算量高。如果引入自然语言信号,而且数据集更大,任务更难,代价将会更大。 51 | 52 | CLIP首先尝试类似VirTex的方式,对于图像使用一个CNN,对于文本使用一个Transformer,均是从头开始训练,任务是给定一张图片,然后预测图片所对应的文本,此为预测性任务。 53 | 54 | > 预测性任务的缺点:对于给定图片,去预测其文本描述,需要逐字逐句的去预测该文本,这个任务相对来说就太难了。因为,对于一张图片可以有很多不同的描述,而且文本描述之间可能差距很大,如果用预测性任务去预训练模型,就会有太多的可能性,导致模型的训练非常困难。 55 | > 56 | > 对比学习的优点:对比学习任务只需要判断图片和文本是否配对,任务简单的很多,就不需要逐字逐句的预测文本了,约束放宽了很多,该监督信号也更加的合理。 57 | 58 | 59 | 60 | CLIP将预测性任务替换为对比型的任务,训练效率提高了4倍。 61 | 62 | ***伪代码*** 63 | 64 | 65 | 66 | - 给定一个mini-match的图片输入I与文本输入T,分别通过一个编码器得到对应的特征I_f与T_f; 67 | - 对于两个特征分别通过一个投射层,然后再做L2归一化,得到特征I_e与T_e; 68 | - 对两个特征计算余弦相似度,最终计算loss。 69 | 70 | ***一些细节*** 71 | 72 | - CLIP由于使用的数据集特别大,所以在训练时不存在over-fitting的问题,图片编码器与文本编码器都不需要提前进行预训练; 73 | - 最后对特征进行投射时,并没有使用非线性投射层,使用的而是线形投射层,两者对效果的影响不大。猜测非线性投射层只对纯图片的单模态任务比较重要; 74 | - CLIP使用的数据增强只有随机裁剪; 75 | - 由于模型、数据规模很大,调参成本太大,CLIP在训练时将对比学习中的temperature参数设置成可学习的标量,该参数在训练过程中直接被优化了。 76 | 77 | **4.4 训练** 78 | 79 | - 对于视觉侧共训练了8个模型,包括5个ResNet与3个Vision Transformer,所有这些模型使用Adam训练32个epoch; 80 | - 调参时,只使用ResNet50训练1个epoch进行对比; 81 | - 训练时,batch size为32768,非常大; 82 | 83 | ## Part5.Zero-Shot与Prompt Engineering 84 | 85 | **5.1 Zero-Shot Transfer** 86 | 87 | 之前自监督或无监督的方法,它们主要是研究的是特征学习能力,目标是学得一种泛化能力比较好的特征,比如MoCo,SimCLR等。但即便有了好的特征,当应用到下游任务时,还是需要有标签的数据进行finetune,这时又会面临一些问题,比如下游任务的数据不好收集,或者数据分布有偏移等。 88 | 89 | Zero-Shot Transfer是说,我们致力于训练好一个模型,接下来就不用再去训练或finetune了。 90 | 91 | ***Zero-Shot Transfer具体是如何做的*** 92 | 93 | 94 | 95 | 当CLIP预训练完之后会有两个编码器,即Image Encoder和Text Encoder。 96 | 97 | - 给定一张图像,通过Image Encoder得到图像特征I1; 98 | - 文本侧的输入则是一些感兴趣的标签,比如我们有plane、car、dog、bird四个标签,首先这些标签会通过prompt engineering生成四个句子,比如A photo of a {object},然后将这四个句子分别通过Text Encoder得到四个文本特征T1,...,T4; 99 | - 然后计算四个文本特征T1~T4与图像特征I1之间的余弦相似性cosine similarity,最后得到的相似度通过softmax层得到概率分布,这时概率最大(相似度最高)的句子大概率就是在描述你的输入图像,也就是说句子中所包含的物体就是你输入图像里应该有的物体。 100 | 101 | e.g.以ImageNet为例,如果对ImageNet中所有图片进行推理:对每个类生成一个句子,则会生成1000个句子,然后对于每张图片与这1000个句子计算相似性。 102 | 103 | **5.2 Prompt Engineering And Ensembling** 104 | 105 | ***Prompt Engineering*** 106 | 107 | Prompt: 可理解为“提示”的意思,prompt engineering主要起到提示的作用或者说文本引导作用。 108 | 109 | ***为什么要做Prompt Engineering?*** 110 | 111 | - Polysemy:多义性,也就是一个单词同时可能拥有很多的含义。如果在做文本/图像匹配时,每次只用一个单词做文本特征提取,就有可能面临这种问题。比如在ImageNet中同时存在着两个类construction cranes与cranes,前者指起重机,后者是鹤,如果不加任何语境只用cranes提取特征,那么特征很可能是有歧义的。 112 | - 预训练时,文本侧一般也都是一个句子,如果在做推理时每次输入的只是一个单词,就会存在distribution gap问题,提出的特征可能就不是很好。 113 | 114 | 基于以上两个原因,本文提出了prompt template的方式,也就是给定一个提示模板,把标签放入模板中形成一个句子。从单词到句子首先解决了distribution gap问题,而且模板一般是“A photo of a {label}.",在此语境中label一般是名词,同时缓解了歧义问题。 115 | 116 | ***Prompt Ensembling*** 117 | 118 | Prompt Ensembling就是多用一些提示模板,做多次推理,然后把结果综合起来,ensemble一般都可以得到更好的结果。 119 | 120 | ## Part6.实验 121 | 122 | **6.1 CLIP vs ResNet50** 123 | 124 | 125 | 126 | 其中,CLIP是预训练后直接做zero-shot transfer,ResNet50是只用resnet50提取特征,然后接线型分类头预测。结果显示,在27个数据上其中16个CLIP结果更好,一般对于给物体进行分类的数据集来说,CLIP结果一般会更好。 127 | 128 | 对于一些更难的数据集,比如文本分类,用CLIP zero-shot transfer做不是很合理,应该用few-shot方式。 129 | 130 | **6.2 Zero-Shot CLIP vs Few-Shot CLIP vs other Few-Shot** 131 | 132 | 133 | 134 | Few-Shot:相比于Zero-Shot直接做预测,Linear Probe方式是将backbone冻住提取特征,然后用有标签数据训练得到分类头,由于也算是见到了样本,可以认为是Few-Shot。 135 | 136 | - Zero-Shot CLIP比之前专做Few-Shot迁移的BiT-M方法结果好; 137 | - 对CLIP来说,当样本比较少时(1~4)用了训练样本的Few-Shot反而不如Zero-Show效果好; 138 | - 随着训练样本的增多,Few-Shot CLIP的效果是最好的; 139 | 140 | **6.3 Zero-Shot vs Few-Shot vs 全部数据做linear probe** 141 | 142 | linear probe: 将预训练好的模型冻住,只拿全部数据训练一个分类头做预测。 143 | 144 | fine-tune: 不把backbone冻住,用全部数据微调所有参数。由于CLIP所使用的数据很大,fine-tune效果应该很好,而且CLIP的目标主要是做一个好的预训练模型,所以不用fine-tune做对比了。 145 | 146 | 147 | 148 | 从右图结果可看,即便用所有数据训练,CLIP效果也是更好。 149 | 150 | **6.3 CLIP vs ImageNet上最好模型--EfficientNet L2 NS 151 | 152 | 153 | 154 | 结果显示,在27个数据集上,其中有21个CLIP的结果优于EfficientNet L2 noisy student。 155 | 156 | **6.4 CLIP预训练模型的鲁棒性** 157 | 158 | 159 | 160 | 当下游任务的数据与预训练数据分布有偏移时,CLIP的效果退化相对也不是很多。 161 | 162 | ## Part7.CLIP的局限性 163 | 164 | - CLIP与基线的ResNet50相比确实是有些优势,ImageNet上准确都是76.2+,但是现在一些SOAT方法比如MAE等都到了90+,这十几个点的差距靠扩大数据等方法还是有些吃力的; 165 | - CLIP zero-shot在某些数据集上效果其实不如ResNet50,比如细分类数据集或者比较抽象的数据,或者更难的下游任务上; 166 | - CLIP在做迁移时,如果下游任务的数据与预训练任务的数据分布差异特别大,泛化效果也不是很好,比如MNIST就不行; 167 | - CLIP虽然可以zero-shot预测结果,但还是从给定的固定类里去做选择,目前对生成式的任务没有好的方法; 168 | - 对数据的利用还不是很高效,需要大量的数据投喂,如果能减少数据用量也很好; 169 | - 实验过程中一直是在使用ImageNet和其它27个数据集做对比,无形之中引入了偏见; 170 | x 171 | 172 | -------------------------------------------------------------------------------- /notes/009_two_stream.md: -------------------------------------------------------------------------------- 1 | # Two-Stream Convolutional Networks for Action Recognition in Videos 2 | 3 | [Paper](https://arxiv.org/pdf/1406.2199.pdf) | [Talk](https://www.bilibili.com/video/BV1mq4y1x7RU?spm_id_from=333.999.0.0) 4 | 5 | 视频本身是一个很好的数据来源,比2D的单个图像能够包含更多的信息,比如物体之间移动的信息、长期的时序信息、音频信号,非常适合做多模态学习。 6 | 7 | 双流网络是视频理解的一篇开山之作,它是第一个在视频领域能够让卷积神经网络可以和最好的手工特征打成平手。 8 | 9 | ## Part1.标题&作者 10 | 11 | 双流卷积神经网络用来做视频中的动作识别。 12 | 13 | Two-Stream: 顾名思义,就是使用了两个卷积神经网络。 14 | 15 | 16 | 17 | 对于视频理解任务,一些早期的工作是把视频抽一些关键帧,分别经过一个CNN,最后将结果合并。或者将这些帧叠起来一起送给CNN,然后在网络中做一些early fusion,late fusion等,达到一种时空学习的效果。但是这些工作的效果都差强人意,甚至比不上手工设计的特征。 18 | 19 | 作者认为,之所以用一个CNN无法处理好视频问题,是因为CNN它比较擅于学习局部特征,不擅长去学习视频之中物体的移动规律。既然如此,那就事先把移动信息Motion-information提取好,也就是光流optical flow,然后让CNN直接从光流到动作学得一个映射。所以,加入一支关注Motion-information的分支(Temporal stream ConvNet),这也就是two-stream的来源。 20 | 21 | 空间流的输入就是一张单帧图片,输出是一个分类的概率,时间流输入是一系列的光流图片,输出也是一个分类的概率,最后将两个分类概率加权平均,得到最终的预测,这就是双流网络。 22 | 23 | **Optical Flow:** 光流是描述视频中各种物体是如何运动的。它是一个可以有效描述物体运动的特征,可以过滤背景、人物性别、穿着等等不必要的噪声,最后提取的特征完全专注于动作本身。 24 | 25 | 作者团队来自牛津大学的VGG组。 26 | 27 | ## Part2.摘要 28 | 29 | 这篇论文研究了如何使用深度卷积神经网络去做视频里的动作识别,主要的难点就是如何同时学习两种信息,一种是从静止的图像上获得appearance信息,包括形状、大小、颜色等;另一种就是物体之间的移动信息,也可以看作是视频中的时序信息。 30 | 31 | 该论文的贡献有三点: 32 | 33 | - 提出一个双流网络:由空间流与时间流两个神经网络组成; 34 | - 证实了即使是在少量的训练数据下,一个直接在光流数据上训练的神经网络也能取得很好的效果; 35 | - 为了弥补训练数据上的不足,使用multi-task的学习方法,在两个数据集上去同时训练一个网络; 36 | 37 | ## Part3.引言 38 | 39 | - 与2D图像分类任务相比,视频中的时序信息可以为识别工作提供另外一个重要线索; 40 | - 使用视频数据的好处:视频可以提供很好的一种数据增强,因为在一个视频中,同一个物体会经历各种各样的形变、遮挡、光照改变等,这种改变多样又自然,比那些生硬的数据增强要更好; 41 | 42 | ## Part4.相关工作 43 | 44 | - 很大程度上,视频领域的进展都是被图像领域的进展推动着走的,一般都是先有图像上的突破,然后再将方法移植到视频任务上; 45 | - 最好的手工特征方法是用了视频前后帧点和点之间的轨道信息(dense point trajectories); 46 | - 之前基于神经网络的工作往往是把一系列视频帧送给网络,让模型自己去学习时空信息,使最后学得跟运动信息相关的特征,但是该方式比较难; 47 | - DeepVideo提供的Sports-1M数据集包含100w个视频(视频帧数量超过10亿),而Kinetic和someting-someting数据集也都只有20w个视频; 48 | - DeepVideo作者发现,如果将视频帧一张张的送给2D网络和把一系列视频帧送给3D网络或具有时空学习能力的2D网络效果是一样的,说明这种方式的时空学习并没有真的抓住物体之间的运动信息; 49 | 50 | ## Part5.双流模型 51 | 52 | 视频可以很自然的被拆分为空间部分与时间部分。空间部分就是所说的appearance信息,主要用来描述视频中的场景和物体的;时间部分主要用来描述视频中的物体是如何运动的。根据该现象,本文提出了一个双流网络框架,空间流去学习空间特征,时间流去学习运动特征,最后结果通过late fusion合并得到最终的预测。 53 | 54 | 55 | 56 | ### 5.1 Spatial stream ConvNet 57 | 58 | - 空间流网络的输入是一张一张的视频帧,用静止图像做动作识别,其实就是图像分类任务; 59 | - 图像中的appearace信息本身就是一个很有用的信息,因为很多动作往往都是和对应的物体联系在一起的,比如弹钢琴、打篮球等; 60 | - 空间流网络用单帧图像作为输入的方式,就可以拿ImageNet来做预训练; 61 | - 空间流网络基本是一个AlexNet,5层卷积+2层全连接层; 62 | 63 | ### 5.2 Temporal stream ConvNet 64 | 65 | ***Optical flow 光流是什么?*** 66 | 67 | 68 | 69 | 70 | 上图中(a)和(b)分别为前后两帧图像,(c)为光流的可视化,也就是人的动作是朝着箭头方向走的。一般的,数学上表示光流时会将其拆成两个方向,即水平方向上的位移和竖直方向上的位移,可视化结果分别为图(d)和(e)。 71 | 72 | ***光流如何表示?*** 73 | 74 | 具体地,假如原始输入的图像维度为(240, 340, 3),然后经过光流预测算法(无论什么光流预测算法都可以),这两张图像就会得到一张光流图像,而光流图的维度为(240, 340, 2),维度2其实就代表水平和竖直上的两个维度结果,对应于图中(d)和(e),图中(d)(e)两张图的维度其实就是(240, 340, 1)。以下两点需要说明: 75 | 76 | - 图像的输入和最后预测得到的光流大小是一样的,因为每个像素点其实都有可能运动,如果不运动那它的运动幅度就是0,总之,每个像素点都会有对应的光流值,这也就是dense optical flow(密集光流)的来源; 77 | - 光流计算时,每两张图会计算得到一张光流,如果视频长度为L帧,最后算得的光流就是L-1帧; 78 | 79 | ***如何使用光流?*** 80 | 81 | 时间流网络的输入是由多个光流图像叠加在一起的,叠加的方式有以下两种: 82 | 83 | 84 | 85 | **Optical flow stacking:** 直接把多帧光流图像叠加在一起,如上图左侧。该方式简单,不用做预处理、后处理,直接将光流图stack即可,但缺点是没有充分的利用光流的信息; 86 | 87 | **Trajectory stacking:** 根据光流的轨迹,在轨迹上进行光流数值的叠加。如上图右侧,当你知道上一张图中的p1点,在下一张图时已经移到了p2时,那么我们在下一张光流图里就从p2点开始去找它在它下一帧里所对应的位置,这种方式更加合理,很好的利用了光流信息,可惜的是,实验显示左边直接叠加的方式效果更好。 88 | 89 | ***Bi-directional optical flow双向光流*** 90 | 91 | Bi-directional是一个非常常见的技巧,不仅是在光流里,在视觉其它领域甚至NLP领域都有使用。具体的,上述两种光流连接方式都是单向的,而反过来算应该也是合理的,比如一个篮球从a点到b点和从b点到a点都是可以的。 92 | 93 | 为了公平对比,对于L+1帧图像,前半段用前向光流,后半段用反向光流,最终得到L帧光流图像,大小为(h, w, 2L),以此来作为时间流网络的输入。 94 | 95 | - 时间流网络结构和空间流网络结果基本一致,只是第一层卷积层的输入维度不同,空间流为3,而时间流为2L; 96 | - 光流图像叠加时,具体的是先进行水平方向的叠加,再进行竖直方向的叠加,即(x1, ..., xl, y1, ..., yl); 97 | 98 | ### 5.3 实现细节 99 | 100 | ***如何做测试?*** 101 | 102 | 测试时,无论视频有多长,就从视频里等间距的去抽取25帧,帧数是固定的。因为论文中所用的数据集是UCF101和HMDB51,视频长度都是在5~7秒之间,假如帧率为30,总共就150~210帧左右,如果取25帧也就是每隔78帧左右取一帧,也就是每1/3秒取一帧,帧间变化其实不是很大,然后对每一帧取四个角和中间区域作crop,再翻转同样操作,这样一张图就变成了10张图,那么对于一个视频25帧图像来说,最终就变成了250个crop,然后每张图都会通过2D的空间流网络得到一个结果,最后这250帧的结果取加权平均得到最终预测结果。光流结果也是相同的操作。 103 | 104 | ***如何预处理光流以及如何计算光流?*** 105 | 106 | 光流提取耗时:目前OpenCV中成熟的抽取光流的方法,对于一对图像在GPU上的计算耗时是0.06s。对于UCF101数据集,则需要10000x10x30x0.06s,要一百多个小时。对于100w规模的数据集,耗时将会更长,假如用8卡GPU,光抽取光流都要一个月时间。 107 | 108 | 光流存储成本:每一点都是有光流值的,也就是密集的表示,如果将结果存下来需要很大的空间。以UCF101数据集来说,存下所有的光流需要1.5T的空间,即使有空间也会受限于io速度。 109 | 110 | 基于以上问题,论文中将光流值rescale到1~255,然后存成图片,每个光流图也就十几kb,存储空间由1.5T降到了27G。 111 | 112 | ## Part6.实验 113 | 114 | 115 | 116 | 左图说明了空间流网络使用预训练模型的必要性。右图说明时间流中光流叠加方式的区别,以及双向光流的效果。 117 | 118 | 119 | 120 | two-stream与其它方式的比较。 121 | 122 | ## Part7.结论 123 | 124 | - 本文提出了two-stream方法,一个空间流一个时间流,实验证明只用时间流分支效果也很好; 125 | - 虽然用了光流,但模型也不复杂,没用3D网络,也没用LSTM; 126 | - 未来工作:时间流网络利用预训练模型;为什么基于轨迹的光流叠加方式效果差;camera motion对光流计算的影响。 127 | -------------------------------------------------------------------------------- /notes/010_i3d.md: -------------------------------------------------------------------------------- 1 | # Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset 2 | 3 | [Paper](https://arxiv.org/pdf/1705.07750.pdf) | [Talk](https://www.bilibili.com/video/BV1tY4y1p7hq?spm_id_from=444.41.list.card_archive.click) 4 | 5 | 两个重要贡献:提出一个新的模型I3D和Kinetics数据集。 6 | 7 | ## Part1.标题&作者 8 | 9 | Inflated:扩大、膨胀,也就是说如何把一个2D网络扩张到3D模型,而无需专门的去设计一个视频理解网络,可以使用2D里已经设计好的网络,比如VGG、ResNet等,直接将其扩张到3D即可。 10 | 11 | Quo Vadis:一部电影名。 12 | 13 | ## Part2.摘要 14 | 15 | 当前的视频数据集都太小,比如UCF-101(101类,13000个视频)和HMDB-51(51类,7000多个视频),不利于CNN的发挥,无法有效体现出各个方法的优劣。所以本文新提出了一个Kinetics数据集,其中有400个类,每一类都有超过400个视频段落,每个段落为10s时长,均是把人体的动作从视频中精准的抠出来的,是一个标注非常好的数据集。 16 | 17 | 同时,本文提出一个双流的Inflated 3D网络,其来自于2D网络的扩张:拿一个已经调好的网络,比如ResNet,把其中所有的3x3的卷积核或者pooling操作,全部变成3x3x3,以此作为视频理解模型。其好处是,不用专门去设计一个针对视频理解的网络了。这种inflation的方式一直到现在都有在用,比如Timesformer就是把Vision Transformer给inflate。 18 | 19 | 在Kinetics数据集上预训练之后,I3D网络在HMDB-51和UCF-101数据集上分别能达到80.9%和98.0%的效果。 20 | 21 | ## Part3.引言 22 | 23 | 在图像任务中,ImageNet的出现提供了一种用大规模数据集预训练然后迁移到小规模数据集上finetune的范式。然而在视频领域还没有这样的大规模的用于预训练的数据集,所以本文提出了Kinetics数据集,其有400个类别,每个类别有超过400个样本,并且每一个样本都来自于一个独一无德youtube视频,其多样性是非常好的。而UCF-101数据集,其中很多小的clip都是从同一个长视频中抽取出来的,多样性较差。 24 | 25 | 然后本文对比了三种主流的视频理解模型在该数据集上的表现: 26 | 27 | - CNN + LSTM 28 | - 3D CNN 29 | - 双流神经网络 30 | 31 | 以上三种方式主要区别就是如何利用视频中的时序信息的。所以说LSTM,3D网络,双流中的光流,分别代表了三种使用时序信息的流派。 32 | 33 | 通过在大规模数据集上预训练,然后在小规模数据集上微调的方式,发现以上三种方式的网络表现参差不齐,提升也都不是很显著。所以本文结合各种方式的优点,提出了Two-Stream I3D,其中I3D本身就是把2D网络中的2D kernel扩展为3D,包括卷积和Pooling层。用双流是因为即使使用了3D网络,针对于局部的运动信息学的还是不够好,所以还需加入光流信息才能达到比之前方法好的效果。 34 | 35 | ## Part4.相关工作和I3D模型 36 | 37 | 在图像领域,已经有了一些列的主导模型,比如VGG,ResNet等,然而在视频领域的模型一直也没有一个定论,其实直到现在也没有一个定论是到底用2D还是3D甚至是Transformer来作为视频理解模型。 38 | 39 | 当时来看,利用时序信息的方式主要有三种:1)LSTM;2)3D模型;3)光流。本文提出了一种TwoStream Inflated 3D ConvNets。 40 | 41 | ### 为什么使用Inflated 42 | 43 | > 因为之前的3D网络的参数量过于巨大,但是又没有合适的、足够的视频数据去预训练,就导致3D网络不能太深,比如ICCV15的工作C3D,其深度只有8层,并且效果也没有超过当时的双流网络。而本文的方法在使用了inflate操作之后,就可以直接使用一些比较深的比如VGG,ResNet等一些效果比较好的网络,而且在使用了这些2D网络的预训练参数作为初始化之后,I3D网络也不需要很多的视频数据去训练了。 44 | 45 | ### 为什么使用光流 46 | 47 | > 其实就是发现用光流比不用效果好。 48 | 49 | 本文所使用的网络结构是从Inception-v1经过inflated得来的,之所以不使用ResNet是因为当时有很多论文做过消融实验,发现在视频任务上Inception结构比ResNet效果稍微好一些。但是由于ResNet太过统治地位,所以在一年后的Non Local论文里作者又用ResNet把I3D实现了。 50 | 51 | ### 主流视频模型的异同 52 | 53 | 下面通过图2来对比说明各种模型结构的异同: 54 | 55 | 56 | 57 | a)CNN + LSTM:此方式更多的是把视频看做一种图像分类问题,从image1到imageK其是一帧帧图像去过神经网络模型的,整个抽特征的过程是完全分开的,抽完特征之后再送入一个lstm网络,lstm是可以进行时序建模的,所以可以把每个时间戳的特征糅合起来,得到视频特征,经过一系列计算,用最后一个时间戳的特征经过一个全连接层得到分类结果。但是这种方法在一些数据集上表现并不是很好。 58 | 59 | b)3D-ConvNet:该方式比较暴力,就是将一个视频分成多个视频片段,每个视频片段中包括K张图片,然后将这些图片当作一个volume整个送给网络。这也就意味着你的网络可以进行时空学习,就是说网络的卷积核必须要是3维的了,不仅要处理二维上的图像,而且还要处理额外的时间维度,卷积核尺寸也就是3x3x3,这就会导致模型的参数量很大,相当于所有层都多了一个维度。这种方式由于参数量大,在小的数据集上效果可能不是很好,但是在大数据集上可以显现出优势。 60 | 61 | c)Two-Stream:结合光流与图像,光流自身蕴涵了非常准确的的物体运动信息,变相的是一种视频里时序信息的一个特征表示。双流网络本身比较简单,而且对模型的要求也比较低,训练简单,而且效果也好。双流包含两个2D网络,即空间流与时间流,其中空间流的输入为一帧或多帧图像,其主要负责学习场景信息;时间流的输入为光流图像,用来负责学习运动信息,两个分支分别得到分类特征或者结果,然后做一些late fusion操作(即在logit层做融合,也就是将分类结果融合)。 62 | 63 | d)3D-Fused Two-Stream:它可以看作是b)和c)两种方式的结合,开始阶段是按照双流网络的方式来做,用两个2D CNN分别提取图像与光流的特征,但是在两个特征融合时并不是采用简单的加权平均,而是用一个比较小的3D网络来替代,如果说之前的融合方式为later fusion,那么这种融合方式就是early fusion(特征层面先融合,然后再去做分类)。 64 | 65 | e)Two-Stream 3D-ConvNet:也就是本文提出的双流i3d网络,作者认为在有足够多的训练数据下,3D CNN的效果是要好于2D CNN的,但是3D CNN对于时序信息的获取并没有使用光流好,所以本文还是保留了光流,但是双流中每一支都是一个3D CNN,所以也就不存在early fusion和late fusion了,也就没有必要在提取特征之后再加一个3D CNN来做融合,所以最终直接做了加权平均。 66 | 67 | ### I3D的实现细节 68 | 69 | #### 1.如何做inflate 70 | 71 | 简单来说,就是将一个2D网络暴力的变成3D网络。以ResNet50为例,只要遇到一个2D的卷积核,就将其变为3D的卷积核,遇到2D的pooling层,就将其变为3D的pooling层,而整体的架构都不变。这就是inlfate过程,其优点就是不用再去设计网络结构,所有设计好的2D网络都可以直接拿来用。 72 | 73 | #### 2.如何做bootstrap 74 | 75 | 上面通过inflate操作得到一个视频理解网络只是第一步,更难的问题是如何把这个3D网络训练起来。 76 | 77 | Bootstrapping的字面意思是引导,也就是当你已经有一些东西之后,然后在其上面做一些改进从而让这个东西变得更好。本文的意思就是你如何从一个已经训练好的2D网络(如resnet50)出发,用它去初始化一个3D模型,然后在这个初始化好的3D模型上面继续去做训练。 78 | 79 | 一般的,如果想用一个已经预训练好的模型来做初始化,最简单有效的方式是两个网络应该是一模一样的,这样就可以把预训练好的参数搬过来就可以了。但现在是预训练好的是一个2D网络,而即将要训练最后要用的网络是一个3D网络,虽然它们整体架构相同,但是具体到每一步操作它都是不一样的,那么如何用2D模型参数去初始化3D模型呢? 80 | 81 | 对于2D网络的预训练模型初始化,对于同一张图像,在预训练模型上的输出与参数初始化后的模型输出,理论上是相同的(模型一致,参数相同)。受此启发,假如对同一张图片反复地做N次复制粘贴,最终得到一个视频(视频中全都是同样的视频帧),如果有某种方式将2D预训练模型的参数对3D网络作初始化,使得两者在该视频上的输出是一致的,那么就能说明该初始化方式是有效的。**具体的做法就是将所有的2D filter全都在时间的维度上也复制粘贴N次,和视频对应起来,那么3D网络的参数就成了WxN,假如2D网络的输入为WxX,那么3D网络就是得到了N份的WxX,如果想让两者的输出保持一致,就需要做一些scaling操作,也就是在所有的2D filter上除以N,最终N倍的WxX除以N之后仍然是WxX**。这样就能保证你的输入不管是一张图还是一个视频,通过网络的输出都是一样的。 82 | 83 | #### 3.如何控制池化层让感受野在合适的范围 84 | 85 | #### 4.如何将一个3D网络变为双流的3D网络 86 | 87 | #### 5.以Inception V1为例说明 88 | 89 | 90 | 91 | Inception的inflate过程:首先是7x7卷积inflate成7x7x7卷积,然后是一层1x3x3 max pooling,接下来为两层三维Conv以及一层max pooling(仍然没有做时间维度的下采样),然后经过两层Inception Module之后才会进行一层3x3x3的max pooling,后续类似。其中Inception Module和2D的结构一模一样,只是将二维卷积核inflate成三维。 92 | 93 | > 2D中的max pooling核大小为3x3,stride为2x2,理论上inflate之后应该kernel为3x3x3,stride为2x2x2,但是实际操作中,时间维度上并没有做下采样,inflate之后kernel为1x3x3,stride为1x2x2,最近的文章也都发现这个问题,从slowfast方法开始,基本都不再做时间维度上的下采样,比如输入的为64帧,输出的也是64帧,因为64帧图像本身对应的基本就是2~3s的视频片段,包含的动作有限。 94 | 95 | #### 6.五种视频模型的参数量以及输入输出 96 | 97 | 98 | 99 | - 3D-ConvNet的模型参数明显比较大,如果用2D网络+LSTM或者2D的双流网络则参数量最小;Two-Stream I3D相对参数量不算太大; 100 | - 2D-ConvNet+LSTM的输入为25帧RGB图像,时间跨度为5s(视频fps为25,每5帧取1帧,那么25帧就是覆盖了5s); 101 | - 3D-ConvNet必须要是连续的帧输入,如果输入为16帧RGB图像,其实就不到1s的视频(16/25=0.64s); 102 | - Two-Stream输入是先任选一帧RGB图像,然后用接下来的10帧计算10个光流图,其实就是11帧图,时间跨度约为0.4s; 103 | - 3D-Fused用了5帧RGB图像和50帧光流图像,时间跨度约2s; 104 | - Two-Stream I3D使用了64帧RGB图像以及64帧光流图像,时间跨度为2.56s; 105 | - 测试阶段,为了公平比较,每种方式都是用10s跨度的输入。 106 | 107 | ## Part5.实验 108 | 109 | 分别在UCF101,HMDB51和Kinetics400上对比,结果显示Two-Stream I3D效果最好。 110 | 111 | image 112 | 113 | - Two-Stream I3D在所有的设置下都能达到最好的结果;2D+LSTM和3D ConvNet的效果普遍比较差; 114 | - 对于某个方法,无论时间流与空间流的效果是好是坏,但是如果用late fusion的方式结合之后,效果都能大幅提升,说明光流始终是对视频理解有帮助的; 115 | 116 | 用K400预训练,在其它数据集上的迁移效果: 117 | 118 | image 119 | 120 | 其中original是不用k400预训练,fixed是用k400预训练,但是不对backbone参数更新,Full-FT是用k400预训练,并对所有参数更新。从结果看,整体微调的效果会更好。 121 | 122 | 主流方法的对比: 123 | 124 | image 125 | 126 | - 3D ConvNet方法的结果并不好(C3D);双流的方法效果也不差,与双流I3D差的不多。 127 | - 对比了ImageNet+K400预训练和只用K400预训练的结果,效果差不多,说明只用K400做视频模型预训练的有效性。 128 | 129 | ## Part6.总结 130 | 131 | 文章主要解决了两个问题: 132 | 133 | - 如果用已经预训练好的2D模型,想直接复用参数:通过inflate操作直接扩展成3D网络,不用重新设计网络结构; 134 | - 如果想自己设计新的3D网络,没有预训练模型:K400数据集足够大,可以使用K400数据集去做预训练; 135 | -------------------------------------------------------------------------------- /notes/012_detr.md: -------------------------------------------------------------------------------- 1 | [Paper](https://arxiv.org/pdf/2005.12872.pdf) | [Talk](https://www.bilibili.com/video/BV1GB4y1X72R?spm_id_from=333.999.0.0) 2 | 3 | ## Part1.标题&作者 4 | 5 | End-to-End Object Detection with Transformers: 使用transformer来做端到端的目标检测。 6 | 7 | End-to-End对目标检测任务意义很大,事实上从深度学习开始火一直到DETR,目标检测领域都很少有End-to-End的方法,大部分方法至少都还需要一个nms(非极大值抑制)后处理操作,无论是proposal based方法 8 | 还是anchor based方法,亦或是non-anchor based的方法,最后都会生成很多的预测框,需要利用nms来去除冗余的框。由于nms的存在,模型在调参上就变得很复杂,而且就算训练好一个模型,部署起来也非常困难, 9 | 因为nms这个操作不是所有硬件都支持的。所以,一个简单的End-to-End的目标检测系统是大家一直梦寐以求的。 10 | 11 | DETR解决了上面的痛点,它既不需要proposal也不需要anchor,直接利用transformer能全局建模的能力,把目标检测看作是一个集合预测的问题。而且,也因为有了这种全局建模的能力,DETR不会输出那么多冗余的框, 12 | 最后出什么结果就是什么结果,不需要再用nms去做后处理。如此一来,让模型的训练和部署都变得简单不少。 13 | 14 | 作者在官方代码里也有提到,他们的目的就是不想让大家都觉得目标检测是一个比分类难很多的任务,它们其实都可以用一种简单优雅的框架来做,而不像之前的很多目标检测框架一样需要很多的人工干预、先验知识,而且还需要 15 | 很多复杂的库,或者普通的硬件不支持的一些算子。 16 | 17 | 作者团队全部来自Facebook AI。 18 | 19 | ## Part2.摘要 20 | 21 | DETR将目标检测任务直接看成是一个集合预测的问题。本来的任务是给定一张图片,然后去预测一堆框,得到框的位置坐标和框内的物体类别,而这些框其实就是一个集合,对于不同的图片来说,它里面包含的框也是不一样的,每个图片所对应的集合也是不一样的,我们的任务就是给丁一张图片,然后去把这个集合预测出来。 22 | 23 | DETR的主要贡献: 24 | 25 | - 将目标检测做成一个端到端的框架,把之前特别依赖于人的先验知识的部分都给删掉了,最突出的就是nms部分以及生成anchor的部分;一旦将这两部分移掉之后,就不用费劲心思的去设计anchor,最后也不会出很多框,也不会用到nms,也不会有那么多的超参需要去调,整个网络就会变得非常简单; 26 | 27 | DETR主要提出的两个东西: 28 | 29 | - 新的目标函数:它通过二分图匹配的方式,强制模型去输出一组独一无二的预测,也就是说没有冗余的框了,每个物体理想状态下就会生成一个框; 30 | - 使用了transformer encoder-decoder架构:一个细节是transformer decoder中还有另外一个输入learned object queries(有些类似anchor的意思); 31 | 32 | DETR的优势: 33 | 34 | - 简单:不依赖其它的库,只要硬件支持cnn和transformer,就一定能支持detr; 35 | - 性能:在COCO上与Faster RCNN基线网络取得差不多的效果,而且模型内存、速度和Faster RCNN也差不多; 36 | - 拓展性:detr能够非常简单的拓展到其它任务上,比如全景分割。 37 | 38 | ## Part3.引言 39 | 40 | DETR的引言其实就是摘要的加长版本,然后加了很多细节。 41 | 42 | 目标检测任务就是对于每一个感兴趣的物体去预测一些框和物体的类别,其实就是一个集合预测的问题。但是现在大多数框架都是用一种间接的方式去处理集合预测的问题: 43 | 44 | - proposal based::RCNN系列工作,Faster R-CNN、Mask R-CNN、Cascade R-CNN; 45 | - anchor based:YOLO、Focal Loss; 46 | - non-anchor based:CenterNet、FCOS; 47 | 48 | 以上方法都没有直接的去做集合预测的问题,而是设计了一个替代任务,要么是回归要么是分类去解决目标检测问题。但是这些方法的性能很大程度上都受限于后处理操作(nms),因为这些方法都会生成大量冗余的框。 49 | 50 | 之前也有一些简化后处理的尝试工作,比如learnable nms、soft nms,它们一定程度上简化了目标检测流程,但是要么是融入了更多的先验知识,要么就是在比较难的benchmark数据集上效果不好。 51 | 52 | **DETR的主要流程:** 53 | 54 | image 55 | 56 | - 给定一张图片,先用一个CNN去抽取特征; 57 | - 将特征拉直后送入一个transformer的encoder-decoder,其中encoder的作用就是去进一步地学习全局信息,实验显示这种全局特征有助于去移除冗余的框; 58 | - 经encoder全局建模之后,用decoder生成很多预测框; 59 | - 把预测框和ground truth框做匹配,最后在匹配上的框里面去计算loss。 60 | 61 | 图中未画出的object query: 当有了图像特征之后,还会有一个object query,query其实就是限定了你要出多少个框,然后通过query和特征不停地去做交互(在decoder里做自注意力操作),从而得到最后的输出的框。论文中选择的框数是100,意味着无论是什么图片,最终预测得到的都是100个框。 62 | 63 | 接下来的问题就是:所预测出的100个框,如何去和ground truth去做匹配计算loss呢?这也就是本文最重要的一个贡献,把该问题看做是一个集合预测的问题,最后就可以利用二分图匹配的方法去计算loss。 64 | > 以上图为例,ground truth只有两个框,在训练时,通过计算预测得到的100个框和这两个ground truth框之间的matching loss,从而得到在这100个预测中哪两个框是独一无二的对应到图中红色和黄色ground truth框。一旦决定好这个匹配关系之后,然后才会想普通的目标检测一样,去算一个分类的loss,再算一个bounding box的loss,至于那些没有匹配到ground truth的框,其实就会被标记为"no object",也就是所谓的背景类。 65 | 66 | 推理阶段:推理时前三步和训练时相同,只有第四步不同,由于推理时不需要计算loss,只需要在第三步得到预测框之后,通过卡定一个阈值,比如置信度>0.7的结果作为最终输出。 67 | 68 | 实验结果:DETR在COCO数据集上,取得了和fast rcnn相当的结果,无论在ap指标还是在模型大小和速度上都差不多。值得一提的是,DETR在大物体的上的ap结果会好很多,这得益于transformer中优异的全局建模能力,而基于anchor的方法就会受限于anchor的大小;但同时DETR也有缺陷,比如在小物体上的效果就不太好(deformble detr通过多尺度的特征解决了小物体的问题,同时也解决了detr训练慢的问题)。 69 | 70 | ## Part4.相关工作 71 | 72 | 该节大概讲了三个部分:一是先讲了一下集合预测这个问题,以及之前大家都是用什么方法去解决集合预测问题;二是介绍了一下transformer以及parallel decoding,就是如何不像之前的transformer decoder一样去做那种自回归的预测,而是一次性的将预测结果返回;三是介绍了目标检测之前的相关工作。 73 | 74 | **目标检测** 75 | 76 | 现在大多数的检测方法都是根据一些已有的相关猜测然后去做预测。比如,对于two-stage的目标检测方法来说,它们的猜测就是中间的proposal,对于single-stage的目标检测方法来说,它们的初始猜测就是anchor,或者说是物体的中心点。之前这些方法的性能和刚开始的初始猜测非常相关,所以如何做后处理得到最后的预测对最后的性能的影响是至关重要的。作者从以下两个方面阐述了这件事情: 77 | 78 | - Set-based loss:用集合的思想来做,之前也有类似的用集合思想来做目标检测的方法,比如learnable nms和relation network,它们都可以利用类似自注意力的方法去处理物体之间的联系,从而得出独一无二的预测结果,不需要任何的后处理步骤,但是这些方法的性能往往比较低,为了和最好的方法对齐,这些方法经常需要用一些人工干预,比如用手工设计的场景特征去帮助模型学习。而DETR的目标是将目标检测做的尽可能的简单,不希望过程特别复杂,也不希望用到过多的人工先验知识。 79 | - Recurrent detectors:之前也有用encoder-decoder结构做目标检测的工作,当时的recurrent detector都是用的rnn结构,属于自回归模型,所以时效性和性能会很差。而DETR用的是transformer的encoder-decoder结构,encoder使模型能够得到全局的信息,而且不带掩码的decoder可以使目标框一次性的输出,从而达到了parallel decoding。 80 | 81 | ## Part5.模型方法 82 | 83 | 本章主要讲两个东西:(1)基于集合的目标函数;(2)DETR网络结构。 84 | 85 | ### 5.1 Set prediction loss 86 | 87 | DETR的输出是一个固定的集合,无论输入的图片是什么,最终都会输出n个框(论文中n=100)。一般的,n=100应该是要比图中所包含的物体数多很多的,普通的一张图片也就包含几个或十几个物体,对COCO数据集而言,包含物体最多的也没有超过100,所以设置成100是足够用的。 88 | 89 | DETR每次出100个输出框,但实际上一个图片的GT box可能只有几个,如何去做匹配计算loss呢?如何知道哪个预测框对应哪个GT box呢?作者将该问题转化成了一个二分图匹配的问题。 90 | 91 | #### 二分图匹配 92 | 93 | image 94 | 95 | 一个例子:如何分配一些工人去做一些工作,使得总支出最少。如上图,有三个工人abc,去完成三个工作xyz,因为每个工人个体的差异,完成每项工作所需的时间是不同的,于是有一个cost matrix,每个元素代表完成时间,二分图匹配就是寻找一个最优解使得cost最小。 96 | 97 | 由上可知,目标检测也可以转换成二分图匹配问题,abc看作是100个预测的框,xyz看作是GT_box,cost matrix中元素放的就是loss值,然后通过scipy.linear_sum_assignment包(匈牙利算法)就可以得到最优解。 98 | 99 | 寻找最优解和之前利用先验知识去把预测框和proposal或者anchor做匹配的方式是差不多的,只不过这里的约束更强,就是一定要得到一个一对一的匹配关系,不像之前是一对多,也就是说现在只有一个框和Ground Truth框是对应的,这样后面才不需要去做nms后处理。**一旦确定100个框中有哪几个框是和Ground Truth是对应的,就可以计算loss了**。 100 | 101 | image 102 | 103 | 损失函数如上,也是包含分类损失与回归损失两个部分,DETR中有两个与普通的目标检测不同的地方: 104 | 105 | - 为了使分类损失与回归损失在相同的取值空间,去掉了log计算; 106 | - 回归损失中不再使用L1 loss,因为L1 loss和出框的大小有关系,框越大,计算得到的loss就容易大。因为DETR用了transformer,对大物体比较友好,经常会出大框,就会导致loss大,不利于优化,所以DETR中不仅用了L1 loss,还使用了一个generalized iou loss,该损失与框的大小没有关系。 107 | 108 | ### 5.2 网络框架 109 | 110 | image 111 | 112 | DETR前向过程: 113 | 114 | - 假设输入尺寸为3x800x1066,首先通过一个CNN得到特征,维度为2048x25x34(1/32),由于后续需送入transformer,通过1x1卷积降维至256x25x34; 115 | - 通过Positional encoding给transformer加入位置编码,这里用的是一个固定的位置编码,维度为256x25x34(因为需要和上面的特征相加,维度必须一致),相加之后就是transformer的输入; 116 | - 将特征拉直(25x34 -> 850)为850x256,其中850就是输入transformer的序列长度,256为transformer的head dimension; 117 | - 通过6个transformer encoder进行特征提取,输出的特征维度不变,仍然为850x256; 118 | - object query(100x256)与encoder的输出(850x256)作为decoder的输入,通过反复的cross sefl-attention最后得到100x256的特征; 119 | - decoder输出特征之后,接一些常规的head(FFN),分别做类别以及box的预测; 120 | - 得到预测框之后与GT box做匹配,利用匈牙利算法计算得到目标函数。 121 | 122 | **object query** 123 | 124 | > object query是一个learnabel positional embedding,是可学习参数,维度为100x256,256是为了和backbone输出的维度对应,这样才可以一起做惩罚,100是告诉模型最后有100个输出框。其实可以将其理解为一种Anchor机制,或者是一种condition,就是给定一个条件之后,模型基于该条件做出判断。在transformer decoder中做的就是cross-attention,输入为object query和backbone+encoder输出的全局特征,通过一系列attention之后得到输出。 125 | -------------------------------------------------------------------------------- /notes/013_dalle2.md: -------------------------------------------------------------------------------- 1 | # DALL·E 2: Hierarchical Text-Conditional Image Generation with CLIP Latents 2 | 3 | [paper](https://arxiv.org/pdf/2204.06125.pdf) | [talk]() | [项目主页](https://openai.com/dall-e-2/) 4 | 5 | ## Part1.前言 6 | 7 | DALL·E 2是OpenAI继DALL·E与GLIDE之后,有关文本图像生成工作的又一力作。 8 | 9 | - DALL·E 2可以根据文本描述去生成**原创性**的图片(fake image),实现任意概念、属性或者风格的组合; 10 | - DALL·E 2还可以根据文本对已有的图片进行编辑和修改,可以任意添加和移除图片中的物体,甚至可以考虑到阴影、反射、纹理等细节; 11 | - 即便没有文本输入,DALL·E 2依旧可以做一些图像生成的工作,比如相同风格的图像生成。 12 | 13 | 从最近的DALL·E 2到google的Imagen,底层都是使用扩散模型(diffusion model)去做图像生成,相比于GAN其作为后起之秀,仍有很多值得去挖掘的地方。 14 | 15 | ## Part2.标题&作者 16 | 17 | 题目:使用CLIP训练好的特征,做层级式、依托于文本的图像生成。 18 | 19 | Hierarchical(层级式)结构:DALL·E 2是先生成一个小分辨率的图片,比如64x64,然后再利用一个模型上采样到256x256,然后再使用一个模型上采样到1024x1024,最终生成一个高清大图。 20 | 21 | Text-Conditional:DALL·E 2本身完成的任务就是根据文本去生成图像。 22 | 23 | CLIP Latents:DALL·E 2是先训练好一个CLIP模型,找到图像与文本之间的相连关系,这时给定一个文本,通过CLIP的文本编码器将其映射为文本特征;然后DALL·E 2再训练一个prior模型,其输入为文本特征,输出为图像特征,然后将图像特征送给图像解码器,从而生成一个完整的图像。所以整个DALL·E 2模型是离不开CLIP特征的。 24 | 25 | 作者全部来自OpenAI,一作参与过CLIP与DALL·E的工作,Mark Chen也是DALL·E的原班作者,主要是做Codex与GPT3的,因为图像解码部分使用的是扩散模型(diffusion model),Prafulla Dhariwal与Alex Nichol都是这方面的专家,他们做过iGPT,最近又写了Imporve DDPM(denoising diffusion model)。 26 | 27 | DALL·E 2可以看作是CLIP模型加上GLIDE模型,而GLIDE模型就是一个基于扩散模型的文本生成的方法。 28 | 29 | ## Part3.摘要 30 | 31 | 之前基于对比学习的方法如CLIP已经可以学得很稳健的图像特征,既能抓住语义信息又能抓住风格信息。为了能够借助这些特征来做图像生成,文章提出了一个两阶段模型,分别为**prior** 与 **decoder**。prior就是给定一个文本描述,生成一个类似于CLIP的图像特征,然后通过decoder生成一张图像。 32 | 33 | 从文本到图像的生成过程可以直观的理解为以下几个阶段: 34 | 35 | image 36 | 37 | 作者发现,这种显式的生成图像特征的方式,能够显著的提升图像的diversity(多样性),说明了就是prior的必要性,而且对生成图像的写实程度和与文本的匹配程度都没有损失。相比而言,GAN生成的图像虽然也很逼真,但是都差不多,不太具备原创性。 38 | 39 | 基于扩散模型的图像decoder,可以基于给定的图像特征生成很多不同的图片,图片的语义和风格比较接近,只是细节不同。 40 | 41 | 因为DALL·E 2是一个从文本生成图像的任务,很容易地通过CLIP模型作为中间的桥梁,从而实现通过文本直接对图像进行编辑的功能,而且是zero-shot的,无需训练。 42 | 43 | DALL·E 2的模型结构:decoder使用的是扩散模型,prior模型里尝试了auto regressive自回归模型与扩散模型,发现还是使用扩散模型的效率又高,效果又好。所以DALL·E 2整个都是扩散模型。 44 | 45 | ## Part4.引言 46 | 47 | 视觉领域最近的一些进展主要是使用了更大的模型和更大的数据集,数据集主要是一些图像、文本对。最典型的方法就是CLIP,其拥有很多特质,比如one-shot能力,而且学得的特征也很稳健,尤其对于分布偏移的数据,另外如果finetune一些下游任务效果也不错。 48 | 49 | 目前,扩散模型在图像生成领域也是一个很好的工具,在视频生成任务上也有很好的效果。扩散模型是一种概率分布模型,它生成的图片是从一个分布里去采样,多样性比较好,但它的保真度比不过GAN,因为GAN本身就是为了以假乱真去优化的。从2020年开始,一些列的工作把扩散模型的保真度做的更好,比如DDPM、Improved DDPM、Diffusion models beats GANs,GLIDE、DALL·E 2,这一系列工作采用了很多的技巧,其中最重要的一个是guidance technique(引导),它能够通过牺牲一部分多样性来达到更好的保真度,在指标上与GANs不相上下,也是这两年变得火热的原因。 50 | 51 | image 52 | 53 | 模型结果图如上,上半部分其实就是CLIP,下半部分才是真正的DALL·E 2。 54 | 55 | 对于CLIP模型,给定一个文本及其对应的图像,分别通过一个文本编码器和图像编码器得到文本特征与图像特征,两者互为正样本,该文本与其它图像互为负样本,通过这种方式去做对比学习,将文本特征与图像特征拉入一个合并的、多模态的特征空间。训练完成CLIP模型之后,将其文本编码器与图像编码器freeze,可作为特征提取器使用,在DALL·E 2中CLIP全程都是freeze的。 56 | 57 | DALL·E 2采用的是两阶段的训练方式,第一阶段为prior,第二阶段为decoder。文章提到,在生成图像时如果有一个显式的生成图像特征的过程,就是先从文本生成文本特征,再从文本特征生成图像特征,然后再由图像特征生成图像效果会好很多。具体地,在训练时: 58 | 59 | - 给定一个文本&图像对,通过CLIP text-encoder(freeze)对文本提取文本特征; 60 | - 通过CLIP image-encoder(freeze)对图像提取图像特征,作为prior的ground truth,也就是说给定文本特征,用prior预测图像特征,以此来训练得到prior模型(在推理时,给定一个文本特征,通过prior模型可以预测得到类似于CLIP的图像特征); 61 | - 通过prior得到图像特征之后,将其送入一个基于扩散模型的decoder,最终生成图像。 62 | 63 | 由上可知,DALL·E 2就是将CLIP与GLIDE叠加在了一起,但是里面有很多值得借鉴的技巧,而且大力出奇迹效果确实很好。另外文章中并没有说该方法为DALL·E 2,而是unCLIP,因为CLIP是从输入(文本、图像)到特征的过程,而unCLIP是从文本--文本特征--图像特征--图像,可看作是是从文本特征到图像的过程,类似于CLIP的反过程。 64 | 65 | ## Part5.模型方法 66 | 67 | 文章中比较简略的写了prior与decoder的实现细节,只看这一篇论文可能并不能对整体的框架有很好的了解。下面一部分会从GAN,VAE,VQVAE,DALL·E开始介绍,使得对图像生成有更全面的了解。 68 | 69 | ![image](https://user-images.githubusercontent.com/22740819/190552576-35f4c85f-d8be-4fbc-889d-6ccdeb4ca58b.png) 70 | 71 | 图片来自:https://lilianweng.github.io/posts/2021-07-11-diffusion-models/ 72 | 73 | ### 5.1 GAN 74 | 75 | image 76 | 77 | GAN需要训练两个网络,生成器(generator)与判别器(discriminator)。给定一个随机噪声,通过生成器生成一张图片,然后将生成的图片送给判别器,同时给一些真实图片给判别器,然后让判别器判断哪些是真图片,哪些是假图片,最终其实是一个二分类问题。通过生成器与判别器之间的相互较量,生成器也不断的优化,使得生成比较真实的图片。因为GAN使用的目标函数就是为了以假乱真,所以GAN生成的图片保真度一般都比较高。 78 | 79 | 经过多年时间对GAN的改造,如今GAN也比较好用,所需的数据也不是很多,能够在各个场景下面使用,但是一个致命缺点是训练不稳定,主要原因是需要同时训练生成器与判别器两个网络,另外因为GAN的主要优化目标是让图片尽可能的真实,其多样性不太好,它的多样性主要就是来自于输入的随机噪声,简单来说就是它的创造性不好,不是一个概率模型,它的生成都是隐式的,就是通过一个网络去生成,不知道具体是遵循的什么分布,所以,GAN在数学上不如后续的VAE,扩散模型优美。 80 | 81 | ### 5.2 Auto-Encoder, DAE, VAE, VQ-VAE 82 | 83 | image 84 | 85 | **Auto-Encoder**: 给定一个输入x,通过一个编码器得到特征,该特征维度一般比较小,所以经常称之为bottleneck,然后再经过一个解码器,最终得到一个图像,训练时的目标函数是生成的图像尽可能的重建输入x,因为是自己重建自己,所以叫自编码器。 86 | 87 | **Denoising Auto-Encoder**: DAE相对于AE是首先对输入x进行一定程度的打乱得到x_c,后续过程与AE相同,最终输出还是重建x,而不是x_c。这个改进证明非常有用,尤其是在视觉领域,会使得训练得到的模型更加鲁棒、不容易过拟合,部分原因是图像像素的冗余性太高了,即使把输入的图片x进行一定程度的污染,模型还是能抓住它的本质将其重建出来。 88 | 89 | > 无论是AE、DAE还是MAE,其关键都是为了学习中间的bottleneck特征,然后用于分类、分割等下游任务,它并不是用来做生成的,因为学得的特征z并不是一个概率分布,没办法对其进行采样,并不像GAN中那样是一个随机噪声,它是一个专门用来重建的特征,但是这种encoder-decoder确实是一种很好的结构,为了使用这种结构用于图像生成,有了后续的VAE。 90 | 91 | **Variational Auto-Encoder**: 92 | 93 | image 94 | 95 | VAE与AE非常不一样,虽然整体框架仍然是encoder-decoder结构,但是它中间不再是学习一个固定的bottleneck特征,而是去学习一个分布,VAE中假设该分布是一个高斯分布,就可以用均值和方差来表述。具体地,在encoder得到特征之后,在后面加一些FC层,去预测均值和方差,在得到均值和方差之后,就用上面的公式采样得到一个z出来,这样的话VAE就可以用来做生成了。因为在训练完成VAE模型之后,就可以将前面的encoder丢掉,z可以是从高斯随机噪声中抽样出来的一个样本,然后通过一个decoder去生成一张图片。 96 | 97 | > 由于VAE预测的是一个概率分布,从贝叶斯的角度看,前面的部分就是给定x得到z的过程,是一个后验概率,然后学习得到的distribution其实就是一个先验分布;后面部分是给定z预测得到图像x的过程,其实就是maxilize likelyhood,从数学上就优美了很多。而且VAE也有一些很不错的性质,因为它学得的是一个分布,然后从分布里抽样,它生成的图片多样性就比GAN好很多。 98 | 99 | **VQ-VAE**: 100 | 101 | image 102 | 103 | VQ-VAE整体上与VAE差不多,其中VQ就是vector quantization,就是把VAE量化。原因是生活中的图像、声音等这种信号都是连续的,大部分任务都是回归任务,但实际上将其表示出来去解决这些问题时其实都将其离散化了,图像就变成了像素,语音也都进行了抽样,大部分工作的比较好的模型也都是分类模型,又都从回归任务变成了分类任务。所以,用之前的VAE方式就不好把模型做大,而且分布z也不好学,所以取而代之的是不去做这个分布的预测,而是用一个codebook代替,这里的codebook可以理解为一个聚类中心,尺寸为KxD,一般K=8192,D=512或768,也就是有8192个聚类中心,如果给定一个图片,经过一个编码器得到特征f,然后将特征图f的向量去跟codebook的向量做对比,然后把距离最近的聚类中心对应的编码索引存放到z矩阵里,一旦做完特征匹配,通过z中的映射得到一个新的特征向量f_q(quantised feature),经过量化后的特征就会非常的可控,因为它全部来自于codebook,不是一个随机的东西,优化起来就会比较容易,后续通过decoder恢复得到图像的过程就和之前一样。 104 | 105 | VQ-VAE其实非常有用,它后来不仅用在了DALL·E项目,还用在了视觉领域的自监督学习中,比如BEIT、VL-BEiT等。 106 | 107 | **DALL·E**: 108 | 109 | ### 5.3 Diffusion Model 110 | 111 | ### 5.4 DALL·E 2 112 | 113 | DALL·E 2的训练集也是图像&文本对。假设给定一个图片输入x,z_i与z_t分别表示CLIP生成的图像与文本特征,整个DALL·E 2模型可以分为两个部分: 114 | 115 | - prior:根据一个文本y,生成一个图像特征z_i; 116 | - decoder:输入z_i,通过decoder生成图像x; 117 | 118 | #### 5.4.1 decoder 119 | 120 | decoder其实是一个GLIDE的变体,首先它用了CLIP模型的guidance,只不过使用的形式在具体的操作上稍微有些变化,技术细节可以看代码。 121 | 122 | DALL·E 2中也使用了classifier-free guidance,guidance信号要么来自于CLIP模型,要么来自于文本。实际使用中是10%的时间随机将CLIP特征设成0,训练时50%的时间把文本特征直接丢掉。 123 | 124 | 为了生成高分辨率的图片,decoder中做了级联式的结构,使用了两个difusion model做上采样,先将分辨率从64x64采样到256x256,再从256x256上采样到1024x1024。另外为了训练时的稳定性,在训练的过程中加入了很多的噪声,而且difusion model的结构主要基于U-Net,只使用了普通的卷积,没有attention操作,所以在推理时可以用在任何尺寸,而不用担心序列长度必须保持一致。 125 | 126 | #### 5.4.2 prior 127 | 128 | prior模型的作用是给定一个文本,去生成一个图像特征z_i,用于后续decoder的输入。DALL·E 2中针对prior采用了两种方案: 129 | 130 | - Autoregressive prior: 该方式与DALL·E和GPT就比较像,输入为文本特征,同时也有CLIP生成的图像特征,然后将图像特征遮住去做自回归预测,这种方式一般训练效率比较低; 131 | - Diffusion prior: 132 | 133 | 无论是Autoregressive prior还是Diffusion prior,都用了classifier-free guidance,因为效果确实好。 134 | 135 | 对于Diffusion prior,实际是训练了一个transformer decoder,因为它的输入输出都是embedding,所以用U-Net不太合适,直接用transformer更合适。 136 | -------------------------------------------------------------------------------- /notes/014_vilt.md: -------------------------------------------------------------------------------- 1 | # ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision 2 | 3 | [paper](https://arxiv.org/pdf/2102.03334.pdf) | [talk](https://www.bilibili.com/video/BV14r4y1j74y/?spm_id_from=333.999.0.0) 4 | 5 | ## 前言 6 | 7 | ViLT提出了一个极其简单的做多模态学习的框架结构,它把模态的特征抽取做到了极小化,把主要的计算量都放在了后面的模态融合部分,大大的提高了模型的推理速度,而且让整个方法的建模变得非常简单,在很大的程度上推动了过去一年多模态学习的进展。 8 | 9 | 它主要就是通过**移除多模态学习框架中的目标检测**(region feature)部分,极大的简化了整个学习框架。 10 | 11 | image 12 | 13 | 如上图所示,通常的多模态学习框架中,对于text部分都是用一个linear embedding来得到word embedding,但是对视觉部分的处理非常不同,可主要分为三类: 14 | 15 | - Region Feature:给定一张图像,通过一个CNN,然后再用一些ROI操作抽取得到区域性特征,相当于做了一个目标检测任务,得到的bbox可以想象成文本侧的token,组成序列;比如,图像中检测出100个物体,相当于100个token,然后于文本的token做后续的融合。其优点是能和文本侧一样有一个离散型的token(也就是bbox),缺点就是由于使用了目标检测,视觉处理耗时占比很大,如上图中整个pipeline耗时900ms,其中视觉的处理占了885ms。 16 | - Grid Feature:使用CNN对图像进行特征提取,用最后一层的特征图作为融合部分的输入,比如7x7大小的特征图拉直之后就是49个token的特征序列。 17 | - Patch Projection:对图像先分patch,然后通过linear projection得到图像的embedding。ViLT视觉部分耗时只有0.4ms,但是其训练耗时并没有缩短,需要64张32g的V100,训练3天才能完成训练;而且效果和之前的region feature方法相比也比较一般,其最大优势就是推理耗时的大大缩减。 18 | 19 | ## 标题&作者 20 | 21 | Vision-and-language Transformer:使用transformer做多模态任务; 22 | 23 | without convolution and region feature:并不需要使用一个CNN backbone抽取特征,也不需要通过目标检测提取区域特征; 24 | 25 | ## 摘要 26 | 27 | Vision-and-Language Pre-training(VLP)视频文本预训练任务,非常依赖于视觉特征的抽取过程,比如region feature based方法先用目标检测提取区域特征,grid feature based方法也是使用了CNN来提取特征,总之都是需要一个额外的网络来抽取视觉特征。这两类方法主要有两个缺点:1)效率/速度比较低,抽取视觉特征的时间甚至比做多模态融合的时间还要多;2)受限于预训练模型抽取局部特征,表达能力有限,还是端到端的训练更好。 28 | 29 | ViLT中视觉部分采用和文本部分同样的处理方式,只用了一个linear embedding,速度相比之前的多模态方法快了很多,而且性能在某些下游任务上也有提升。 30 | 31 | ## 引言 32 | 33 | 先pre-training再finetuning的范式也被拓展到了多模态学习领域,由于预训练的重要性,也催生了多模态预训练的研究工作。 34 | 35 | 一般的,多模态方法都是采用图像-文本对作为预训练数据,以图像-文本匹配和masked language modeling作为学习目标,然后再在一些下游任务上进行微调。 36 | 37 | 具体的,文本通常就是采用transformer结构,而对于图像来说,如何将图像pixels转换成具有语义的离散型的特征(类似于文本token)送给transformer是至关重要的。 38 | 39 | 在ViLT之前,对于图像的处理通常是使用一个目标检测器进行目标检测,优势是:1)得到明确的离散化高语义特征(bounding box);2)VQA、image caption、image-text retrieval等这些下游任务往往都是和物体有非常直接的联系。大多数的VLP模型都是采用的在**Visual Genome**数据集上预训练好的目标检测器,该数据集包含1600类物体、400个属性,主要是类别够丰富。这类方法的缺点就是**抽取特征成本太大**。 40 | 41 | 为了降低视觉特征抽取的计算成本,Pixel Bert方法是使用了一个在ImageNet上预训练好的ResNet对图像进行特征提取,然后把最后得到的特征图当作是一个离散的序列,和**vit hybrid**类似,这样计算量就只剩下backbone,没有了检测相关的部分(roi,nms)。 42 | 43 | 大部分的VLP方法都还是聚焦于如何提高视觉编码器的性能来使提升最后表现,不太关注运行效率的问题。而且对于region feature方法来说都是提前把目标特征抽好存在本地硬盘,抽视觉特征的过程是离线的,训练时直接拿来用,还是比较轻量的,但是做推理时就无法避免。 44 | 45 | ViLT借鉴了ViT对图像的处理方式,通过将图像切分patch,然后利用一个linear projection得到图像embedding,从而取消掉繁琐的图像特征提取过程。在一定程度上,ViLT算是ViT在多模态领域里的扩展。 46 | 47 | ViLT主要贡献: 48 | 49 | - ViLT是迄今为止最简单的用来做vision-language的模型,这种设计显著降低了运行时间和参数量; 50 | - 在减少计算复杂度的同时,还能保证性能不掉; 51 | - 训练时用了更多的数据增强方式; 52 | 53 | ## 背景知识 54 | 55 | **Vision-and-Language Models分类**: 56 | 57 | 1)图像和文本的表达力度是否平衡,比如参数量与计算量是否相当; 58 | 59 | 2)图像和文本两个模态如何做融合; 60 | 61 | 根据上面的方式,众多vision-and-language模型可分为以下四类: 62 | 63 | ![image](https://user-images.githubusercontent.com/22740819/207830401-145ea70f-91e6-4a25-b9bf-37414fef88f4.png) 64 | 65 | (a)text embedding与模态融合都比较轻量,visual embedding很重,代表工作为VSE; 66 | 67 | (b)text和visual embedding都比较重,只有模态融合部分比较轻量,代表作为CLIP,特别适合做抽特征、retrieval 的任务,不太适合做VQA等任务,因为融合做的不够充分; 68 | 69 | (c)text比较轻量,visual embedding比较重,通常使用目标检测,而且做模态融合时计算量也比较大,又使用了一个transformer,性能也是最好; 70 | 71 | (d)ViL指出,多模态任务中,特征融合部分一定要充分; 72 | 73 | **模态融合方法** 74 | 75 | 1)single-stream approaches:只用一个模型处理两个输入,可以先把两个输入concat; 76 | 77 | 2)dual-stream approaches:用两个模型先各自处理各自的输入,后续再做融合; 78 | 79 | 由于dual-stream参数更多,ViLT还是选择了single-stream的融合方法。 80 | 81 | **视觉特征抽取方法** 82 | 83 | 对于大多数的VLP方法,文本侧的处理一般都是使用预训练好的bert里的tokenizer,不同的是视觉特征抽取: 84 | 85 | 1)region feature:backbone抽取特征 -- RPN获得候选框 -- NMS过滤得到最终bounding boxes -- RoI head将bbox映射得到一维向量,最终得到了region feature; 86 | 87 | 2)grid feature:使用一个CNN backbone提取特征,将最后一层特征图拉直后作为embedding; 88 | 89 | 3)patch projection:先分patch,再通过linear projection映射得到embedding; 90 | 91 | ## 模型方法 92 | 93 | image 94 | 95 | **模型结构:** 96 | 97 | ViLT是一个single-stream方法,只用一个transformer encoder做模态融合。 98 | 99 | 文本侧是通过一个预训练好的bert tokenizer得到word embedding,假设文本序列长度为L(token数量),embedding的维度为H(一般为768),那么text embedding就是一个LxH的矩阵。 100 | 101 | 图像侧是先切分为patch,通过linear projection后得到visual embedding,假设有N个patch,每个patch embedding维度为H,那么visual embedding就是一个NxH的矩阵。 102 | 103 | Modal-type embedding指定了当前token是哪种模态(0为文本,1为图像),维度为1xH;对于single-stream方法来说,两个模态的输入是拼接后送入一个transformer的,所以需要告知encoder对于拼接的输入哪部分分别是什么模态。 104 | 105 | Token position embedding与Patch position embedding都是位置的编码,从1~N。 106 | 107 | 实际操作时,Modal-type embedding、Token/Patch position embedding与Word/Patch embedding三者是直接相加起来的,而不是concat;而text embedding与visual embedding两者作为整体是concat起来的,然后送给transformer,序列维度为 (N + L + 2) x H。 108 | 109 | **loss:** 110 | 111 | - Image Text Matching:成对的text-image为正样本,随机配对的为负样本,这里只用CLS token的输出做计算; 112 | - Masked Language Modeling:专门针对文本的loss,和bert中的相同; 113 | - Word Patch Alignment:使用了optimal transports最优传输理论,简单来讲就是将文本的输出和图像的输出当作是一个概率分布,计算两个分布的距离,对于成对的输入来说距离越近越好; 114 | 115 | **两个细节:** 116 | 117 | - Whole Word Masking:整个词做mask。以词汇“giraffe”(长颈鹿)为例,使用tokenizer会将其分为词根 ["gi", "##raf", "##fe"] ,如果只把中间的token做mask,["gi", "[MASK]", "##fe"],其实以gi为开头fe为结尾的词汇并不多,这就会导致模型很容易重建出giraffe,那么在做多模态任务时,可能不需要借助图像的信息就可以重建出来,这个loss就失去了意义,可以理解为学到的是short-cut解。为了避免这种情况,ViLT是把整个词汇做mask,这样句子中就没有giraffe,如果想重建出来肯定需要图像的信息,以此来加强文本于图像的联系。 118 | - Image Augmentation:之前的一些借助于目标检测的多模态学习方法,由于视觉特征离线提取的,没办法做数据增强。而ViLT既然做到了端到端的学习,是可以做一些数据增强的。但是,对于比如color jitter增强方式,对于颜色的改变可能导致与文本不匹配,比如文本为“绿色的草地”,如果图像变成了红色则会引入噪声。所以,ViLT所采用的RandAug中舍弃了color jitter与cutout,最大限度保证了图像和文本可以匹配。 119 | 120 | ## 实验 121 | 122 | **数据集** 123 | 124 | image 125 | 126 | ViLT在预训练阶段采用了以上4个数据集: 127 | 128 | - MS COCO:每个图片对应5个caption,虽然只有10w张图,但是有50w image-text pair对,文本长度平均有11个词; 129 | - VG:10w张图片,500w image-text pair对,文本比较短平均5个词; 130 | - GCC:300w张图片,每张图片只对应一个caption; 131 | - SBU:80w张图片,每张图片只对应一个caption; 132 | 133 | 以上4个数据集合起来通常被成为**4 Million**(4个数据集的图片数量)。 134 | 135 | **实验对比** 136 | 137 | - 分类任务 138 | 139 | image 140 | 141 | 从推理耗时来看,ViLT有明显的优势,大概需要~15ms,从性能来看ViLT还是不如region feature方法,只是速度-性能比较平衡。 142 | 143 | - Retrieval 任务 144 | 145 | image 146 | 147 | 表3为one-shot结果,即没有在下游任务的数据集上进行finetune,表示进行了finetune。在检索任务上的结论与分类任务类似,ViLT速度快,但是性能不如region feature方法。 148 | 149 | - 消融实验 150 | 151 | image 152 | 153 | 从消融实验结果来看,训练步数越高,性能也会提升;whole word masking有提升但比较小;图像做mask并重建效果并不好;图像侧数据增强很有通,提升明显; 154 | 155 | ## 结论与展望 156 | 157 | 本文提出了一个非常轻量的多模态预训练方法-- ViLT,没有使用任何的CNN backbone提取视觉特征。性能虽然不是最好,但是速度快,可作为一个不错的baseline。 158 | 159 | 几个扩展方向: 160 | 161 | - Scalability:模型尺度,越大越好; 162 | - Masked Modeling for Visual Inputs:视觉部分的mask方式,图像重建辅助任务; 163 | - Augmentation Strategies:数据增强策略; -------------------------------------------------------------------------------- /notes/018_llama.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # LLaMA: Open and Efficient Foundation Language Models 4 | 5 | [paper](https://arxiv.org/pdf/2302.13971v1.pdf) | [code](https://github.com/facebookresearch/llama) 6 | 7 | ## 作者&标题 8 | 9 | 开放的、高效的基础语言模型。 10 | 11 | 作者团队来自Meta AI,一作 Hugo Touvron 同时也是 DeiT、DINO 等工作的作者。 12 | 13 | ## 摘要 14 | 15 | 本文提出了一个大语言模型 - LLaMA,参数量由 7B 到 65B(70亿~650亿),模型在数万亿的 tokens 上进行训练,展现出即便只使用公开数据集(不包含专有的、无法访问的数据集)也可以得到很好的效果。 16 | 17 | LLaMA-13B 在大多数 benchmark 上都优于 GPT-3 (175B),LLaMA65B 与最好的模型 Chinchilla-70B 和 PaLM-540B 具有同等的竞争力。 18 | 19 | ## 1.引言 20 | 21 | 在大量文本语料库上训练的大语言模型(LLM)已经显示出它们的涌现能力。大模型的一个假设是:更多的参数将带来更好的性能。但是,当计算资源有限时,通常是由在更多数据上训练较小模型来实现最佳性能的。 22 | 23 | 数据集大小和模型大小的选择不仅仅要考虑训练阶段的计算资源,更要关注推理时的预算。假设给定目标性能水平,首选模型不是训练速度最快的模型,而应该是推理速度最快的模型,尽管更大型模型更加容易达到指定性能水平,但较小的模型最终推理时会更便宜。 例如,尽管有工作建议在 200B tokens上训练 10B 模型,但我们发现即使在 1T tokens 之后,7B 模型的性能仍在继续提高。 24 | 25 | 基于以上的考虑,该工作聚焦于: 26 | 27 | - 在训练语料固定的前提下,训练出一系列不同大小(7B、13B、33B、65B)的语言模型; 28 | - LLaMA-13B 在大多数 benchmark 上都优于 GPT-3 (175B),LLaMA65B 与最好的模型 Chinchilla-70B 和 PaLM-540B 具有同等的竞争力,由于其参数量少的优势,使得再单个 GPU 上也可以跑起来; 29 | - 与 Chinchilla,PaLM 和 GPT-3 不同,LLaMA 训练只使用了公开数据集,并且是开源的; 30 | 31 | 最后,文章对 transformer 结构的修改、训练方法、效果对比做了一个介绍。 32 | 33 | ## 2.方法 34 | 35 | LLaMA 的训练方法与 GPT-3 类似,并遵循了 Chinchilla 方法中的模型尺度规则,简而言之是使用标准的优化方法在大量的文本数据上训练得到一个大的 transformer。 36 | 37 | ### 2.1预训练数据 38 | 39 | ![image](https://github.com/Tramac/paper-reading-note/assets/22740819/2104618d-c2f1-4764-8af5-8e37159398ec) 40 | 41 | 预训练数据混合了上面的多个来源,涵盖了多个领域,这些数据均是公开的。上表中给出了每个数据集的采样比例,每个数据集被训练的 epoch 数量(怎么 统计的?)以及所占硬盘的大小。 42 | 43 | **English CommonCrawl** 44 | 45 | 整合了 2017-2020 的 CommonCrawl 数据,并做了以下处理: 46 | 47 | - 进行 line level 的数据去重; 48 | - 使用 fastText 去除非英文的界面; 49 | - 用 ngram 语言模型去除低质量的内容; 50 | - 使用线性模型进行references in Wikipedia v.s. randomly sampled pages,丢弃不在references中的页面; 51 | 52 | **C4** 53 | 54 | 实验过程中发现,使用不同预处理的 CommonCrawl 数据可以提高性能,因此加入了 C4 数据集,并做了以下处理: 55 | 56 | - 去重; 57 | - 语言识别(language identification steps):和CCNet进行高质量过滤的主要不同是,依赖启发式的方法,比如标点符号、token的个数、语句所在的webpage; 58 | 59 | **Github** 60 | 61 | 使用了 Google BigQuery 上可用的公开 GitHub 数据,并做以下处理: 62 | 63 | - 只保留了支持 Apache、BSD 以及 MIT 协议的 projects; 64 | - 基于行长和字母数字的比例进行高质量代码筛选; 65 | - 删除带有正则表达式的样板,比如头文件; 66 | - file level使用精确匹配进行文件的去重; 67 | 68 | **Wikipedia** 69 | 70 | 使用了维基百科 2022年6月 ~ 8月期间的数据,覆盖了 20 种语言,并删除超链接、注释等其他样板(boilerplate)。 71 | 72 | **Gutenberg and Books3** 73 | 74 | 使用了两本书的预料: 75 | 76 | - Gutenberg Project:包含开放域的数据; 77 | - Books3 section of ThePile:book level的去除,去掉了90%的重复样本; 78 | 79 | **ArXiv** 80 | 81 | 使用了 arXiv 的数据,增强其科学数据的比例,并去除了文章的第一部分和参考文献,去除.tex file、各种注解。 82 | 83 | **Stack Exchange** 84 | 85 | 问答网站的高质量问答数据,包含从计算机、化学等不同领域,并做以下处理: 86 | 87 | - 保留来自最大28个网站的数据,去除掉HTML; 88 | - 进行回答分数的排序; 89 | 90 | ### Tokenizer 91 | 92 | 使用 BPE(bytepair encoding)方法对上述语料进行 tokenizer,共有 1.4T tokens,除了 Wikipedia and Books domains训练了2个epoch之外,其他数据训练基本只过了一个 epoch。 93 | 94 | ### 2.2模型 95 | 96 | 和大多数的大模型一样,LLaMA 也是基于 transformer 结构,并且引入了后续的一些在其他大模型上的改进,以下是与原始架构的主要区别,以及我们在哪里找到了这种变化的灵感(括号中): 97 | 98 | **Pre-normalization [GPT3]** 99 | 100 | 为了提高训练稳定性,对于每一个 transformer sub-layer,对其输入做归一化,而不是对输出做,归一化方法使用的是 RMSNorm。 101 | 102 | **SwiGLU activation function [PaLM]** 103 | 104 | 使用 PaLM 中的 SwiGLU 替代 ReLU,并且维度使用 2/3 4d,用于提高性能。 105 | 106 | **Rotary Embeddings [GPTNeo]** 107 | 108 | 移除了绝对位置编码,取而代之的是 rotary positional embeddings(RoPE)。 109 | 110 | 111 | 112 | 不同尺度模型的具体参数如下: 113 | 114 | ![image](https://github.com/Tramac/paper-reading-note/assets/22740819/54c811e8-6caf-4613-9bf2-5352254ffd4a) 115 | 116 | ### 2.3 优化方法 117 | 118 | 优化方法为 AdamW,超参数: 119 | 120 | - β1 = 0.9,β2 = 0.95 121 | - cosine learning rate,终止学习率为最大学习率的 10% 122 | - Weight decay = 0.1 123 | - gradient clipping = 1.0 124 | - Warmup steps = 2000 125 | 126 | ### 2.4 其他补充 127 | 128 | 为了提高训练速度,做了以下几个优化: 129 | 130 | - 使用 causal multi-head attention 来减少内存使用和运行时间,该方法不存储 attention 的权重,不计算 key/query scores, 此实现可在 [xformers](https://github.com/facebookresearch/xformers) 库中找到; 131 | - 为了进一步提高训练效率,减少了反向传播过程中重新计算的激活操作,更准确地说,保存了计算成本高昂的激活层,例如线性层的输出。 这是通过手动实现 Transformer 层的反向传播函数来实现的,而不是依赖 PyTorch autograd; 132 | - 使用模型、序列并行进一步减少模型的内存使用量; 133 | - 此外,尽可能地重叠激活计算和 GPU 之间通过网络进行的通信。 134 | 135 | **LLaMA-65B 使用 2048 张 80G 显存的 A100,在 1.4T tokens 上训练需 21 天。** 136 | 137 | ## 3 结果 138 | 139 | LLaMA 在 zero-shot 和 few-shot 任务上共评测了 20 个 benchmark。 140 | 141 | - Zero-shot: 提供任务的文字描述(指令?)和测试示例, 模型生成答案或者对建议的答案进行排名; 142 | - Few-shot:我们提供了一些任务示例(1 到 64 之间)和一个测试示例,该模型将此文本作为输入并生成答案或对不同的选项进行排名; 143 | 144 | ![image](https://github.com/Tramac/paper-reading-note/assets/22740819/913319c9-298f-4c70-b8c7-d898d71a81c1) 145 | 146 | 其他 benchmark 上的结果对比详见论文。 147 | 148 | ## 4 Instruction Finetuning 指令微调 149 | 150 | 虽然 LLaMA-65B 已经可以遵循一些基础的指令了,但是发现少量的 finetune 在 MMLU 数据集上有明显的性能提升, 151 | 152 | 何谓指令指令精调(我的疑惑是它为什么叫 instruction finetuning 而不是直接叫 finetune,两者的区别是什么)? 153 | 154 | **finetuning on instructions data** 或许比较好的解释了两者的区别和联系,由于语言大模型中微调数据一般都是带指令的,所以叫做指令微调,比如下面一组微调数据: 155 | 156 | image 157 | 158 | 对传统的 finetune 而言,只需要 input 和 output 就可以了,而语言大模型中的微调通常会给出一个指令,比如上面的 instruction 信息。 159 | 160 | 指令微调数据通常不需要太多,大概使用1000条数据就可以取得不错的效果,太多反而有可能带偏基座模型,之所以少量数据可以驱动指令学习的两个原因: 161 | 162 | - 数据质量高(一定要高才有效); 163 | - 基座模型强; 164 | 165 | 没指令微调和有指令微调的效果对比: 166 | 167 | image 168 | 169 | ## 5 Bias, Toxicity and Misinformation 170 | 171 | 三者该如何理解? 172 | 173 | LLM 已经被证明可以重现和放大训练数据中存在的 bias,并生成有害的或令人反感的内容。因为 LLaMA 的训练数据很大一部分来自于网络数据,因此可以确定的是 LLaMA 模型有可能生成此类内容,并在相关的 benchmark 上验证了 LLaMA-65B 确实存在此问题。几个 benchmark 如下: 174 | 175 | - RealToxicityPrompts:有害的提示,比如侮辱、仇恨言论或威胁 176 | - CrowS-Pairs:“众包刻板印象对”数据集,以衡量9种类型的偏见的程度-种族/肤色,性别/性别认同或表达,性取向等 177 | - WinoGender:判断一个模型的共解析性能是否受到代词性别的影响 178 | - TruthfulQA:用来衡量一个模型的真实性 179 | 180 | ## 6 Carbon footprint 181 | 182 | 很有意思的一个章节,以二氧化碳排放量的角度阐述了语言大模型训练一次需要效果多"耗资源", 183 | 184 | ![image](https://github.com/Tramac/paper-reading-note/assets/22740819/6795d680-d01c-4a62-9cdf-69b69acc2f24) 185 | 186 | 相比其它方法已经很节省资源了,但是 emm。。。 187 | 188 | ## 7 相关工作 189 | 190 | 略 191 | 192 | ## 8 结论 193 | 194 | 该文章开源了一系列语言模型,其中 LLaMA-13B 比 GPT-3 模型大小小10倍,但是效果优于 GPT-3,LLaMA-65B 比 Chinchilla-70B 和 PaLM-540B 更强。 195 | 196 | 和之前的一些工作不同,LLaMA 证明了,即便是只在公开的数据集上训练也可以得到 SOTA 效果。 197 | 198 | 并且想LLaMA开源,致力于促进语言大模型的发展。 199 | 200 | 未来将开源出更大规模的模型。 -------------------------------------------------------------------------------- /notes/020_lora.md: -------------------------------------------------------------------------------- 1 | # LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 2 | 3 | [paper](https://arxiv.org/pdf/2106.09685.pdf) | [code](https://github.com/microsoft/LoRA) | [LoRA-PEFT](https://github.com/huggingface/peft) 4 | 5 | ## 1 题目&作者 6 | 7 | LoRA:语言大模型的低秩适配。目前除了 NLP 领域,LoRA 在 stable diffusion 中的应用也异常广泛,所以这里叫**大模型的低秩适配**更合适。 8 | 9 | 作者来自微软团队,Edward Hu [主页](https://edwardjhu.com/)。 10 | 11 | ## 2 摘要 12 | 13 | 自然语言处理的一个重要范式是先在一般领域的数据上进行大规模训练,然后迁移至特定任务或领域上使用。当预训练更大的模型时,重新训练所有的模型参数基本变得不太可行。以 GPT-3 175B 为例,如果将其部署在各个实例上,每个实例都有 175B 个参数,这个成本时非常昂贵的。本文提出了低秩适配(Low-Rank Adaptation),它将模型的预训练权重冻结,然后在 Transformer 的每一层使用可训练的低秩分解矩阵,从而大大减少了下游任务的可训练参数量。与使用 Adam 全量微调的 GPT-175B 相比,LoRA 可以将可训练参数数量减少 10000倍,GPU 内存需求减少 3 倍。就表现而言,LoRA 在 RoBERTa、DeBERTa、GPT-2 和 GPT-3 等多个模型上与全量微调相比性能相当或更优,尽管它有更少的可训练参数,更高的训练吞吐量,另外不像 adapter,没有额外的推理延迟(?)。除此之外,本文还对语言模型适应中的等级缺陷进行了实证研究,证实了 LoRA 的有效性。 14 | 15 | ## 3 引言 16 | 17 | 自然语言处理中的许多应用都依赖于一个大的预训练模型,然后再迁移到下游任务,该过程通常是通过微调的方式来实现,一般会对预训练模型的所有参数都进行更新。微调的主要缺点是新模型包含和预训练模型同样多的参数量,当模型逐渐变得很大时,计算和时间成本将变得越来越高。 18 | 19 | 为了缓解这种情况,许多工作尝试在迁移到新的任务时仅调整模型的一部分参数或者学习一个外部模块。这种方式,除了每个任务的预训练模型之外,只需要存储和加载一小部分针对该任务的参数,大大提高了部署效率。然而,目前通过扩展模型深度或减少模型可用序列的方法会引入**推理延迟(inference latency)**,更重要的是,这些方法通常不如 baseline 效果好,只是在速度和性能上做了权衡。 20 | 21 | 一些工作指出,模型通常是**过参数化**的,它们的有效性可能只依赖更小的内在维度(low intrinsic dimension),**模型主要依赖这个低的内在维度去做任务适配**。所以,假设**模型在适配任务时参数的改变量是低秩的**,由此引出低秩自适应方法lora,**通过低秩分解来模拟参数的改变量**,从而以极小的参数量来实现大模型的间接训练。 22 | 23 |
24 | image 25 |
26 | 27 | 如上图,以 GPT-3 175B 模型为例,左侧 W 为预训练模型权重,维度为 dxd,微调过程中只推理不参与训练,右侧 A、B为两个低秩的矩阵,维度分别为 dxr 和 rxd,一般 r 会远远小于 d,微调过程中只更新 A、B两个低秩权重,输出为两个分支的和。可学习参数量由 dxd 降低为 dxr + rxd=dx2r。 28 | 29 | LoRA 的优势: 30 | 31 | - 使用 LoRA,针对下游任务微调时,预训练模型权重可以冻住,只更新若干个 LoRA 模块(即A、B矩阵),显著减少存储需求和下游任务之间的切换开销; 32 | - LoRA 使训练更高效以及对硬件要求更低,因为对大多数参数来说不需要再计算梯度和维护优化器状态; 33 | - LoRA 简单的线性设计使得可训练矩阵和冻住的权重在 merge 时很容易,方便部署,且没有引入推理延迟; 34 | 35 | ## 4 问题描述 36 | 37 | 给定一个预训练好的自回归语言模型 PΦ(y|x),其中 Φ 表示模型参数。PΦ(y|x) 可以是一个基于 Transformer 结构的通用的多任务模型,比如 GPT,当将该预训练模型迁移至下游任务时,比如文本摘要生成,其训练数据为 context-target 文本对 Z = {(xi , yi), ...},xi 为文章内容,yi为它的摘要。 38 | 39 | 全量微调时,模型先用预训练模型权重Φ0做初始化,然后以下面的目标函数逐步更新权重Φ0 + ∆Φ: 40 | 41 |
42 | image 43 |
44 | 45 | 全量微调主要的缺点是,对于每一个下游任务,学习一组不同的参数 ∆Φ,而这组 ∆Φ 的维度和 Φ0 的维度相同,因此,如果预训练模型很大,比如 GPT-3,那么 Φ0 的大小为 175B,这么多的参数在存储和部署多个实例时将变得很难。 46 | 47 | 本文提出了一个更高效的参数更新方法,模型的参数更新量 ∆Φ=∆Φ(Θ) 被进一步编码成一组维度更小的参数 Θ,其中 Θ 的大小远远小于 Φ0,因此,计算 ∆Φ 的任务变为只优化 Θ: 48 | 49 |
50 | image 51 |
52 | 53 | 因此,本文提出了一个使用低秩表示来编码 ∆Φ 的方法,既计算高效且存储高效。以 GPT-3 175B 为例,可训练参数量 Θ 只有全量权重 Φ0 的 0.01%。 54 | 55 | ## 5 相关工作 56 | 57 | 已有的工作主要有两个问题: 58 | 59 | - **Adapter Layers 会引入推理延迟**:? 60 | - 直接优化 prompt 比较难 61 | 62 | ## 6 方法 63 | 64 | #### 6.1 低秩分解 65 | 66 | 一个神经网络一般包括多个密集连接层,这些层通过矩阵乘法来实现,而这些矩阵通常是满秩(full-rank)的。一些工作指出,预训练好的**语言模型具有较低的内部维度(instrisic dimension)**,在任务适配(迁移下游任务)过程中,即使随机投影到较小的子空间,仍然可以学习到相关的信息。受此启发,本文假设在更新权重时,∆Φ 应该也符合低秩的特性。 67 | 68 | 对于一个维度为 dxk 的预训练权重 W0,在对其更新时我们将其增量 ∆W 低秩分解为两个矩阵 B 和 A,维度分别为 dxr 和 rxk,并且 r 远远小于 d 和 k,即 W0 + ∆W = W0 + BA。在训练期间,W0是冻住不更新的,只有 A 和 B 包含可训练参数,需要指出的是 W0 和 ∆W 均是和相同的输入做乘法运算,然后将其各自的输出相加得到最终的输出。对于模型的其中一层运算,可用下面公式表示: 69 | 70 |
71 | image 72 |
73 | 74 | 其中,A 使用高斯分布初始化,B初始化为0,所以在训练开始时 ∆W = BA = 0,这也比较符合常理。需要注意:在实际计算时,对 ∆Wx 做了尺度变换,乘以 α / r,这个操作**可以减少调整超参数的需要**。 75 | 76 | #### 6.2 Transformer 中使用 LoRA 77 | 78 | 原则上,可以将 LoRA 应用于神经网络中的任意权重。在 Transformer 结构中,self-attention 模块有 4 个矩阵,分别为 Wq,Wk,Wv和 Wo,以及两个 MLP模块中的矩阵。本文仅在 attention 模块的矩阵中使用 LoRA,MLP 模块在训练时冻住不训练。 79 | 80 | **优点和限制** 81 | 82 | - 最大的优点是减少内存和存储的需求,相比全量微调可降低 3 倍。以 GPT-3 175B 为例,显存消耗从 1.2T 减少到 350G;当 r=4,且仅在Wq 和 Wv 上使用 LoRA 时,checkpoint 大小减少了 10000x 倍,从 350G 到 35M,可以用更少的 GPU 进行训练,避免 I/O 瓶颈。 83 | - 可以在部署时以更低的成本切换任务,只替换 LoRA 权重,而不是所有参数。 84 | - 与全量微调相比,速度提高了 25%。 85 | 86 | ## 7 实验 87 | 88 | 本文在多个模型上(RoBERTa、DeBERTa、GPT-2、 GPT-3 175B),多个任务上(NLU、NLG),多个数据集上(GLUE、WikiSQL、SAMSum)做了实验。 89 | 90 | 几种对比方法: 91 | 92 | - Fine-Tuning (FT) :全量微调,或微调某几层的全部参数; 93 | - Bias-only or BitFit:只训练 bias,其余参数冻住; 94 | - Prefix-embedding tuning (PreEmbed):在输入的 tokens 中插入特殊的 tokens,这些特殊 tokens 一般不在词表中并且已经训练过了,我理解应该是只学习词嵌入层; 95 | - Prefix-layer tuning (PreLayer):是上面方法的扩展,只学习 transformer 层后的激活层; 96 | - Adapter tuning:在 self-attention 模块和 MLP 模块与残差连接之间插入 adapter(前面频繁提到的会引入推理延迟的方法); 97 | - LoRA:只在 self-attention 的 Wq 和 Wv 中使用 LoRA,可训练参数量由 r 决定,|Θ| = 2 × L × d × r,其中L为使用 Lora 的层数; 98 | 99 | **文本理解任务对比** 100 | 101 |
102 | image 103 |
104 | 105 | **文本生成任务对比** 106 | 107 |
108 | image 109 |
110 | 111 |
112 | image 113 |
114 | 115 | 从上表的结果看,LoRA 在参数量和效果上的 trade-off 做的最好。 116 | 117 | ## 8 深入 Low-Rank 的应用 118 | 119 | #### 8.1 哪些 weight 应该使用 LoRA 120 | 121 | Transformer中的权重矩阵比较多,比如 self-attention 部分:Wq、Wk、Wv、Wo;MLP部分:W1、W2。论文只研究了LoRA应用于transformer Attention层上的效果,发现**同时对Wq和Wv应用Lora效果较好**。 122 | 123 |
124 | image 125 |
126 | 127 | #### 8.2 r 参数的影响 128 | 129 | 对于一般的任务,rank=1,2,4,8 即可,而对于一些领域差距比较大的任务可能需要更大的rank。 130 | 131 |
132 | image 133 |
134 | 135 | ## 9 结论 136 | 137 | 微调大语言模型是非常昂贵的,本文提出 LoRA ,一个有效的低秩适配方法,既不引入推理延迟,也不减少输入序列的长度,同时保持模型的高质量,重要的是,当部署成服务时,它可以通过共享大多数模型参数来快速切换下游任务。虽然本文只专注于 Transformer 语言模型,但其原理也适用于任何具有密集型层的网络。 138 | 139 | 未来工作: 140 | 141 | - LoRA 可以和其它有效的适配方法相结合,有可能带来改进; 142 | - 微调和 LoRA 背后的机制尚不清楚,如何将预训练期间学到的特征更有效的转化到下游任务中,或许使用 LoRA 比全亮微调更容易回答这个问题; 143 | - 目前主要依靠启发式方法来选择应用 LoRA 的权重矩阵,有没有更有指示性的方法来做? 144 | - ΔW 是低秩不足(?)的,表明 W 可能也是低秩不足的,这或许有一定的启发作用; 145 | 146 | ## Bonus: 几个关键点 147 | 148 | - 什么是low-rank?rank-deficiency? full-rank?intrinsic dimension?intrinsic rank? 149 | - Low-rank:低秩,通常指的是矩阵的秩(rank)比较小,即该矩阵包含的信息量比较少,可以被较少的特征向量或奇艺值所表示。在很多应用中,低秩矩阵可以用来表示数据中的共性信息和规律,从而实现数据的压缩、降维和分析等目的。 150 | - Rank-deficiency:秩亏,指的是一个矩阵的秩比它的行数或列数小,即矩阵中存在线性相关的行或列,从而导致矩阵的行列式为零,不能被逆运算。通俗地说,秩亏矩阵的行或列中存在冗余信息,可以由其它行或列表示出来,因此该矩阵包含的信息量比较少,不能完全描述数据的特征。秩亏矩阵在实际应用中很常见,例如在图像处理和机器学习中,数据矩阵中可能存在噪声、缺失值或冗余特征,导致矩阵秩降低。在这种情况下,我们需要采用一些方法来处理秩亏矩阵,以提高数据的表现力和预测准确率,常用的方法包括:PCA、SVD、核矩阵分解(Kernel Matrix Factorization)等,这些方法可以用来降维、去噪、填补缺失值等。 151 | - Full-rank:满秩,指的是一个矩阵的秩等于它的行数或列数中的较小值,即矩阵中的所有的行或列都是线性独立的,可以唯一的表示出矩阵的所有元素。满秩矩阵通常具有很好的性质和应用,如可逆、有唯一解、唯一表示等。满秩矩阵在实际应用中也很常见,例如在线性回归、最小二乘法、矩阵分解等问题中,通常需要矩阵满秩的条件来保证算法的有效性和稳定性。 152 | - Instrisic dimension:内在维度,指数据集中所包含的最少信息所需要的维数,或者说数据集中实际独立变化的方向的数量。它是指数据集固有的本质维度,不受数据在高维空间中的嵌入方式或表示方式的影响。具体来说,如果一个数据集可以被嵌入到一个 d 维空间,而且在这个空间中,数据集的每个样本点只需要 k 个坐标来描述,那么数据集的内在维度就是 k。内在维度对于数据分析和机器学习来说是非常重要的,因为它可以帮助我们更好的理解数据集的本质结构,并且可以减少计算和存储的开销。例如,当处理高位数据时,内在维度可以帮助我们找到数据中真正有用的特征,从而提高模型的性能和准确度。另外,内在维度还可以用于数据压缩、可视化和降维等领域。 153 | - Intrinsic rank:内在秩,指一个数据集中最重要的线性无关的特征的数量,它可以被看作是数据集的内在维度的一个度量。内在秩的概念通常用于描述低秩矩阵近似问题中,其中我们希望通过一个低秩矩阵来近似一个高秩矩阵,以减少存储和计算的开销。具体来说,如果一个数据集可以表示为一个秩为 k 的矩阵的线性组合,而且这个 k 是数据集中最重要的线性无关特征的数量,那么这个数据集的内在秩就是 k。换句话说,**内在秩是指能够用来描述数据集最重要信息的最少的线性无关特征向量**。内在秩和内在维度的概念有些类似,但内在秩更多的关注于矩阵的结构和线性无关的特征的数量,而内在维度则更多的关注于数据集的实际维度和独立变化方向的数量。在某种情况下,内在秩和内在维度可能是相通的,但在其他情况下,它们可能会有所不同。 154 | - 什么是推理延迟 inference latency?为什么说 LoRA 是 No Additional Inference Latency 的? 155 | - **Latency**:延时,主要从用户的视角来看,也就是用户提交一个prompt,然后得到response的时间。特殊情况batch_size=1只给一个用户进行服务,Latency是最低的。计算方法为生成一个token所需要的单位时间数,如16 ms/token。 156 | - **Throughput**:吞吐率,主要是从系统的角度来看,单位时间内能处理的tokens数,如16 tokens/sec。扩大Throughput的方法一般就是提升Batch_size,也就是将一个一个用户的请求由之前的串行改为并行。 157 | - LLM inference 主要关注两个指标:Latency 和 Throughput。Latency 影响体验,也就是返回结果要快,用户体验好;Throughput 影响系统成本,高 Throughput 则系统的单位时间处理量就到,利用率高,但是会影响到 Latency,这两个指标一般情况下要做 trade-off。 158 | - LoRA 可以明确的计算并存储 W (W = W0 + BA),而且 W0 和 BA 的维度一致均为 dxk,当切换到其它下游任务时,可以通过 W - BA 得到 W0,从而复用初始权重 W0,只需要加上新的 B'A'即可。我猜是因为 W0 + BA 这个 + 操作太简单了,所以说没有引入推理延迟。 159 | - LoRA 训练参数相比全量微调参数节约多少的计算方式? 160 | - 使用LoRA 的参数量:|Θ| = 2 × L × d × r,其中 L 为层数;不使用 LoRA 的参数量:|Θ| = L × d × d;节约比例:d / (2r)。 161 | - Adaptation 怎么理解? 162 | - 文中出现了多次 adaptation 这个词,个人理解,将预训练模型迁移至下游任务的这个过程叫做 adaptation,这也是 LoRA 名字的由来 Low-Rank Adaptation,一种低秩的迁移下游任务的方法。 163 | -------------------------------------------------------------------------------- /notes/022_dreambooth.md: -------------------------------------------------------------------------------- 1 | # DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation 2 | 3 | [paper](https://arxiv.org/pdf/2208.12242.pdf) | [code](https://link.zhihu.com/?target=https%3A//github.com/XavierXiao/Dreambooth-Stable-Diffusion) 4 | 5 | ## 标题&作者 6 | DreamBooth:通过微调 text-to-image 扩散模型以实现 subject-driven 生成。 7 | 8 | text-to-image 指的是常规的从文本到图像的扩散模型,根据文本提示生成高质量和多样化的图像,但是这些模型缺乏在指定场景中合成它们的能力。 9 | 10 | subject-driven 可以理解为输入的少量图像所确定的主体(subject),比如示意图中的柯基犬。 11 | 12 | DreamBooth 将两者结合,text 指定场景,image 给定主体,合成该主体在不同场景下的图像。 13 | 14 | 作者来自谷歌团队。 15 | 16 | ## 摘要 17 | 目前,大型的 text-to-image 模型已经能够根据给定的「text prompt」来生成高质量、多样化的图像,然而,这些模型缺乏**特定主体的再现能力**,特别是对个人定制的物体,很难实现个人物体在风格、造型等方面的再现能力。 18 | 19 | DreamBooth 提出了一种具备「定制化」(personalization)能力的 text-to-image 方法:**通过一种基于「new autogenous class-specific prior preservation loss」的微调策略,训练少量需要定制化物体的图片,实现该生成物体在风格上、背景多样化的再创造**,在保证物体特征不变的前提下,姿势、视角和光照条件以及背景内容可以自定义(这些主要得益于预训练模型学到的先验知识)。 20 |
21 | image 22 |
23 | 如上图所示,输入 4 张柯基的照片,在保持柯基的外貌特征不变的前提下,可以将其背景改为在水里、狗窝等,充满创意。 24 | 25 | 通俗理解为,DreamBooth 的微调使模型将「unique identifier」与「specific subject」绑定在了一起,实现精准的生成目标内容。 26 | > unique identifier:个人理解就是对指定主体的描述,包含在 text prompt 中,比如一只“柯基”的照片; 27 | > specific subject:即少量图像中指定的主体,比如柯基犬。 28 | 29 | 因为,通常的文生图模型无法仅通过 text prompt 来精准的定位视觉生成空间的特定目标(比如柯基),只能在 dog 这个大类里面,带有随机性的生成各种各样的狗,即使 prompt 描述的非常精细,也无法与视觉空间形成精准的映射,那假如在视觉空间上放置一个精准定位词[V],就像是在目标位置放置了一个 GPS,这样就可以在诸多的 dog 中定位到柯基这个特定类别了。 30 |
31 | image 32 |
33 | 34 | ## 引言 35 | 目前,大型的 text-to-image 模型已经可以基于「text prompt」生成高质量、多样化的图像了,这得益于模型从大量的「image-caption pairs」数据中学得的强大的语义先验知识(semantic prior)。 36 | 37 | 举例说明,大量的数据训练使模型学得了将单词 “dog” 与各种各样的狗的图片(各种姿势、场景下)绑定在了一起,所以,当你让模型生成有关 “dog” 的图像时,即可得到不同姿势、场景、光照、视角下的新的图像。虽然,这些模型的综合能力是非常强的,但它无法精确地再现某个特定的主体,比如「柯基A」。主要原因是模型的「输出域 output domain」的表达能力是有限的,即使是 text prompt 再怎么详细,也可能产生具有不同外观的实例。此外,即使模型的「text embedding」在「language-vision」空间中是共享的,也无法准确的重建出给定的主体的外观,而只能创建出与给定主体相类似的内容,如下图所示: 38 |
39 | image 40 |
41 | 上图给出了某个特定闹钟的图像作为输入,其中 DALL-E2 和 Imagen 两个方法所生成的图像虽然形似,但都不是这个给定的闹钟,而 DreamBooth 生成的闹钟和给定的完全相同。 42 | 43 | 本文提出了一种具备「定制化」能力的 text-to-image 模型,目标是扩展模型的「language-vision」字典,使得能够「绑定」新的词汇与特定主体。 44 | > 通俗一些,比如通常的文生图模型已经学得的「language-vision」已经包含了 *“dog” - 各类狗*之间的映射,现在 DreamBooth 可以新增一个 *“柯基A” - 用户指定的柯基犬* 的映射关系,使得当用户让模型生成有关“柯基A”的图像时,肯定就是这个用户所给定的这一只。 45 | 46 | 效果类似于magic photo booth “神奇照相亭” —— 一旦拍摄了几张某个对象的图像,照相亭就会根据简单直观的文本提示生成该对象在不同条件和场景下的照片。 47 | 48 | DreamBooth 通过微调 text-to-image 模型,训练数据为指定图像与包含特定词的 text prompt 对,从而使特定实例「class-specific instance」与某个特定词「unique identifier」绑定在一起。为了防止语言漂移「language drift」导致模型将类名(例如“狗”)与特定实例相关联,本文提出了一种**autogenous, class-specific prior preservation loss**,它利用了预训练模型学得的语义先验知识,鼓励它生成与指定主体相同的类不同实例。 49 | > 看到这里,对「unique identifier」的理解应该就比较明确了,字面意思为唯一标识符,直观意思就是对特定主体的表示,如“柯基”。那么,训练数据对就是:{image: 柯基图1, text prompt: 一张柯基的图片}。 50 | 51 | ## 3.方法 52 | 53 | 给定少量包含某个特定主体的图片,无需任何文本描述,目标是生成该主体在「 text prompt」指定场景下的新图像。 54 | 3.1 节介绍了 text-to-image diffusion models 的背景知识,3.2 节介绍了所提出的将「unique identifier」与「 specific object」绑定在一起的技术,3.3 节介绍了所提出的「class-specific prior-preservation loss」,用以解决微调时的「language drift」问题。 55 | 56 | ### 3.1 Text-to-Image Diffusion Models 57 | 58 | 扩散模型的背景知识比较复杂,论文中也没有展开,这里推荐苏剑林的 [blog](https://spaces.ac.cn/archives/9152) 中对 diffusion model 的解释,感兴趣的可以看看。 59 | 60 | 本文我们只针对 text-to-image 扩散模型进行介绍:假设已知一个扩散模型为 $\hat{x_{\theta} }$,给定一个初始噪声 ε(正态分布),以及一个条件向量 $c = Γ(P)$,其中 P 表示「 text prompt」, Γ 表示「 text encoder」,那么生成图像可以表示为: $x_{gen} = \hat{x_{\theta} }(\epsilon, c )$ ,优化该模型的损失函数为均方误差,如下: 61 | 62 | $$ 63 | \mathbb{E}_{x,c,\epsilon ,t}[w_t||\hat{x}_{\theta}(\alpha_tx + \sigma_t\epsilon , c) - x||] 64 | $$ 65 | 66 | 其中,x 为真实图像 ground truth,c 为条件向量,由 text prompt 生成,$\alpha_tx$ 、$\sigma_t$ 和 $w_t$ 为控制噪声和采样质量的参数,随扩散时间 t 变化的函数。 67 | 68 | ### 3.2 Personalization of Text-to-Image Models 69 | 70 | 我们的第一个任务是将指定的主体实例「注入」到模型「输出域」中,以便在生成新图像时可以从模型输出域中「索引」到这个主体。 71 | 72 | 一个自然的想法是,使用少量的(few-shot)包含该主体的数据对模型进行微调,但是对生成模型来说,使用少量的样本进行微调时必须特别小心,因为很容易造成过拟合或「mode collapse」(模型坍塌)。目前已经有部分工作来避免这些问题,但是它们的目标都是寻求生成与给定主体类似的目标,而我们的目标是保留主体的外观。 73 | 74 | 对于「过拟合」和「模型坍塌」问题,本文观察到一个奇怪的发现:使用 3.1 中的损失函数,如果对微调进行谨慎的设置,并不会出现这些问题。(没明白这一句是要表达什么,感觉与前面内容有冲突。。。) 75 | 76 | **Designing Prompts for Few-Shot Personalization** 77 | 78 | 为 few-shot 微调设计 prompt。 79 | 我们的目标是:**将一个新的(unique identifier, subject)关系对「注入」到模型“字典”中**。为了绕过为给定图像写详细描述的开销,本文选择一种更加简单的方法,即对所有输入图像均采用**a [identifier] [class noun]**的 prompt,其中 80 | 81 | - [identifier]:对指定主体的标识符,比较细粒度,比如柯基。 82 | - [class noun]:指定主体的更粗粒度的类别,比如 cat、dog 等。可以由用户提供或者通过一个分类器生成。 83 | 84 | 所设计的 prompt 中选择添加一个 [class noun] 来进行约束,我猜是为了和预训练时使用的 prompt 更加契合,并且发现如果不使用 [class noun] 约束会造成训练时间变长和 「language drift」,同时性能降低。本质上,我们想要寻求一种能够充分利用预训练模型学得的先验知识的方法,并将其与「unique identifier」结合。 85 | 86 | **Rare-token Identifiers** 87 | 88 | 我们发现,如果选取现有的单词作为 [identifier] 并不是最优的,因为模型必须学会将它们与它们原始的含义分开,然后在将其与给定的主体结合起来。这就促使我们想要选取的 [identifier] 在预训练模型中是具有弱先验的,即**预训练模型不怎么认识这个词**,在这里被称作「rare-token」。 89 | > 单词具有强先验 == 模型见过很多次这个词 90 | 91 | 一种危险的做法是选取英文中的随机字符并将它们连接起来生成罕见的 [identifier],比如 “xxy5syt00”。但是,实际上这种特殊的单词可能被 tokenizer 分开,所分开的词仍然具有强语义性。 92 | 93 | 本文提供了一种寻找「rare-token」的方式:首先在词表中找出罕见的 token,然后将该 token 进行反转,作为最终的 identifier,以此来最大可能降低改词具有强先验的概率。具体的,本文采取的方式是**从 T5-XXL 模型词表的 5000~10000 区间内随机选取 1-3 个 token 进行组合作为 [identifier]**。 94 | 95 | ### 3.3 Class-specific Prior Preservation Loss 96 | 97 | 根据本文的实验,**finetune 模型的所有层可使主体的保真度更高**,但调整所有层时有可能导致以下两个问题: 98 | 99 | - language drift:这是在语言模型中是一个经常遇到的问题,通常一个在大规模文本预料上训练好的语言模型,当迁移到下游任务进行 fine-tuning 时,有可能丢失该语言的语法和语义知识,本文也是第一个发现在 diffusion model 中也存在相似的现象,即**模型会慢慢遗忘如何生成与主体相同类别的图像**; 100 | - reduced output diversity:即输出多样性可能减少。Text-to-image 扩散模型天然具有大量的输出多样性,当在少量样本上进行微调时,我们希望能够以新颖的视角、姿势及清晰度生成新的主体图像。但是由于样本少,存在输出 101 | 姿势、视角多样性变少的风险,尤其是当模型训练时间过长时。 102 | 103 | 为了缓解上述两个问题,本文提出一种「autogenous class-specific prior preservation loss」,以鼓励多样性并避免「language drift」。本质上,文本的方法是**用它自己生成的样本来监督模型,以便在小样本微调开始时保>留先验信息**,这使得它能够生成属于该大类(这里指的是 dog 这种大类)的不同图像,并保留有关该类先验的知识,以便与有关主体实例的知识结合使用。 104 | 105 | 具体来说,给定一个符合正态分布的随机噪声 $z_{t_1} \sim \mathcal{N}(0, I)$ 以及条件向量 $c_{pr} := \Gamma (f("a [class \ noun]"))$,使用一个固定的预训练好的扩散模型生成样本 $x_{pr} = \hat x(z_{t_1}, c_{pr})$,则损失函数为: 106 | 107 | $$ 108 | \mathbb{E}_{x,c,\epsilon, \epsilon',t} [w_t||\hat x_\theta (\alpha _t + \sigma _t\epsilon , c) - x||_{2}^{2} + 109 | \lambda w_{t'}||\hat x_\theta (\alpha _{t'}x_{pr} + \sigma _{t'}\epsilon ', c_{pr}) - x_{pr}||_{2}^{2}] 110 | $$ 111 | 112 | 其中第二项是用用自己生成的图像来监督模型,用于保留模型先验。 113 | 114 | > 用模型本来生成的图像作为监督信号,当然是希望保留原来的信息了。 115 | 116 |
117 | image 118 |
119 | 120 | 上图为训练示意图,尽管很简单,但我们发现**这种保留先验「prior-preservation」的损失对于鼓励输出多样性和克服「language-drift」是很有效的,另外还发现我们可以训练模型进行更多迭代,而不会出现过度拟合的风险**。 121 | 122 | 经实验,以下参数即可达到很好的结果: 123 | 124 | | 超参数 | 值 | 125 | | ------------ | -------------------------------------------- | 126 | | Items | 1000 | 127 | | Lambda | 1 | 128 | | Lr | 1e-05 for Imagen,5e-06 for Stable Diffusion | 129 | | dataset size | 3-5 images | 130 | 131 | 在训练过程中,使用 prompt “a [class noun]” 生成了 ~1000个样本(用于计算损失第二项),但很少部分被用到。 132 | 133 | 使用 TPUv4 训练 Imagen 只需要 5 分钟,使用 NVIDIA A100 训练 stable diffusion 同样只需要 5 分钟。 134 | 135 | ## 4. 实验 136 | 137 | **Evaluation Metrics** 138 | 139 | - CLIP-I:生成图像和真实图像 CLIP embeddings 之间的平均余弦相似度,但它不是为了区分可能具有高度相似的文本描述的不同主体而构建的; 140 | - DINO:本文新提出的,生成图像和真实图像 ViTS/16 DINO embeddings 之间的余弦相似度。 141 | 142 | **对比方法** 143 | 144 | - DreamBooth using Imagen 145 | - DreamBooth using Stable Diffusion 146 | - Textual Inversion using Stable Diffusion 147 | > Textual Inversion 是一个只是 finetune 模型的 text encoder 模块其中的一小部分的方法。 148 | 149 | 主体保真度与 prompt 保真度对比: 150 |
151 | image 152 |
153 | 154 | 实际生成效果对比: 155 |
156 | image 157 |
158 | 159 | - Textual Inversion 方法已经完全不是给定的物体了。 160 | 161 | 有无「prior-preservation loss」的效果对比: 162 |
163 | image 164 |
165 | 166 | - 使用「prior-preservation loss」明显增加了多样性。 167 | 168 | ## 5.局限性 169 | 170 |
171 | image 172 |
173 | 174 | 上图给出了一些可能存在的问题: 175 | 176 | - 与给定场景不符; 177 | - 场景不准; 178 | - 过拟合; 179 | -------------------------------------------------------------------------------- /notes/024_easyphoto.md: -------------------------------------------------------------------------------- 1 | 2 | # EasyPhoto: Your Personal AI Photo Generator 3 | 4 | [paper](https://arxiv.org/abs/2310.04672.pdf) | [sd-webui-EasyPhoto](https://github.com/aigc-apps/sd-webui-EasyPhoto) | [easyphoto](https://github.com/aigc-apps/easyphoto) 5 | 6 | ## 题目&作者 7 | 8 | 你的个人 AI 照片生成器。 9 | 10 | 作者团队全部来自阿里团队。 11 | 12 | ## 摘要 13 | 14 | [Stable Diffusion web UI](https://github.com/AUTOMATIC1111/stable-diffusion-webui) 是一个基于 Gradio 搭建的 web 界面,提供了很多 stable diffusion 模型相关的功能。本文为该 UI 提供了一个新的插件「EasyPhoto」,可以实现 AI 人像生成。通过使用 5~20 张特定用户的相关图像对模型进行微调(通常是训练一个 LoRA),达到基于任意模板生成 AI 照片的目的。 15 | 16 | 我们目前的实现支持多人、不同照片风格的修改,此外,还允许用户使用强大的 SDXL 模型生成精彩的模板图像,以此来增强 EasyPhoto 提供更多样化和令人满意结果的能力。 17 | 18 | EasyPhoto 的 pipeline 的能力还在继续扩展,期望后续不局限于人脸的生成。 19 | 20 | ## 1.引言 21 | 22 | AIGC 真实人像写真,妙鸭相机作为 AIGC 领域一款收费产品成功的向大家展示了如何使用 AIGC 技术少量的人脸图片建模,快速提供**真、像、美**的个人写真,在极短的时间拥有大量的付费用户。 23 | 24 | 同时,随着 Stable Diffusion 领域开源社区的快速发展,社区也涌现出了类似 FaceChain 这样基于 Modelscope 开源社区结合 diffusers 的开源项目,用于指导用户快速开发个人写真。然而对于大量使用 SD web UI 的 AIGC 玩家,短时 25 | 间内却没有一个效果足够好的开源插件,去适配真人写真这一功能。 26 | 27 | EasyPhoto 使用 SD 模型的 image-to-image 能力,保证生成图像的真实、准确性。通过用户上传几张同一个人的照片,快速训练 LoRA 模型,然后结合用户上传的模版图片,快速生成**真、像、美**的写真图片。 28 | 29 | > 用户上传的几张照片被称为「digital doppelganger」。 30 | 31 | 在推理阶段,通过使用 ControlNet 来控制生成图像与模板图像之间的相似性。但是会存在几个问题: 32 | 33 | - identity loss:身份丢失 34 | - boundary artifacts:边界伪影 35 | 36 | 为了克服上面的问题,所以使用了 two-stage 的扩散过程。该方法确保了生成的图像保证了上传图像的身份正确(即肯定得是同一个人),并且极大限度的减少视觉不一致性。 37 | 38 | 本文主要内容: 39 | 40 | - EasyPhoto 中提出了一个新的训练 LoRA 模型的方法,通过集成多个 LoRA 模型来保持生成结果的人脸保真度; 41 | - 结合强化学习方法来优化 LoRA 模型的「facial identity rewards」,进一步提高生成结果与训练图像之间的身份相似度; 42 | - 提出一个 tow-stage inpaint-based diffusion 过程,旨在生成具有高相似度和美观度的图像;图像预处理过程经过精心设计,为 ControlNet 创造合适的指导;此外,利用强大的 SDXL 模型来生成模板,从而产生各种多样化且真实的输出; 43 | 44 | ## 2.相关工作 45 | 46 | ### 2.1 Stable Diffusion 47 | 48 | Stable Diffusion 作为 Stabibity-AI 开源的图像生成模型,分为 SD1.5 / SD2.1 / SDXL 等版本,是通过对海量的图像文本对(LAION-5B)进行训练结合文本引导的扩散模型,使用训练后的模型,通过对输入的文字进行特征提取,引导扩散模型在多次的迭代中生成高质量且符合输入语义的图像。 49 | 50 | ### 2.2 ControlNet 51 | 52 | ControlNet 通过添加部分训练参数,对 Stable Diffusion 模型进行扩展,用于处理一些额外的输入信号,例如边缘、深度图、人体姿态等,从而完成利用这些额外输入的信号,引导扩散模型生成与信号相关的图像内容。 53 | 54 | ### 2.3 LoRA 55 | 56 | LoRA 是一种基于低秩矩阵的对大模型进行少量参数微调训练的方法,广泛应用于各种大模型的下游微调任务。AI 真人写真需要保证最后生成的图像和我们想要的生成的人是相像的,这就需要我们使用 LoRA 技术,对输入的少量图片,进行一个简单的训练,从而使得我们可以得到一个小的指定人脸(ID)的模型。 57 | 58 | ### 2.4 人脸相关 AI 技术 59 | 60 | 针对AI写真这一特定领域,**如何使用尽量少的图片,快速的训练出又真实又相像的人脸Lora模型,是能够产出高质量AI写真的关键**,网络上也有大量的文章和视频资料为介绍如何训练。这里介绍一些在这个过程中,我们使用的开源AI模型,用于提升最后人脸LoRA训练的效果。 61 | 62 | 在这个过程中我们大量的使用了 [ModelScope](https://www.modelscope.cn) 和其他Github的开源模型,用于完成如下的人脸功能 63 | 64 | | 人脸模型 | 模型卡片 | 功能 | 使用 | 65 | |-------------|-------------|-------|-------| 66 | | FaceID | https://github.com/deepinsight/insightface | 对矫正后的人脸提取特征,同一个人的特征距离会更接近 | EasyPhoto图片预处理,过滤非同ID人脸EasyPhoto训练中途验证模型效果EasyPhoto预测挑选基图片 | 67 | | 人脸检测 | cv_resnet50_face | 输出一张图片中人脸的检测框和关键点 | 训练预处理,处理图片并抠图预测定位模板人脸和关键点 | 68 | | 人脸分割 | cv_u2net_salient | 显著目标分割 | 训练预处理,处理图片并去除背景 | 69 | | 人脸融合 | cv_unet-image-face-fusion | 融合两张输入的人脸图像 | 预测,用于融合挑选出的基图片和生成图片,使得图片更像ID对应的人 | 70 | | 人脸美肤 | cv_unet_skin_retouching_torch | 对输入的人脸进行美肤 | 训练预处理:处理训练图片,提升图片质量预测:用于提升输出图片的质量 | 71 | 72 | ### 2.5 SD Web UI 73 | 74 | [SD Web UI](https//github.com/AUTOMATIC1111/stable-diffusion-webui)] 是最常用的 Stable Diffusion 开发工具,我们提到的文图生成 / ControlNet /LoRA 等功能,都被社区开发者贡献到这一工具中,用于快速部署一个可以调试的文图生成服务,所以我们也在 SDWebUI 下实现了 EasyPhoto 插件,将上面提到的 人脸预处理/训练/艺术照生成全部集成到了这一插件中。 75 | 76 | ## 3.训练过程 77 | 78 | AI 真人写真生成是一个基于 Stable Diffusion 和 AI人脸相关技术,实现的定制化人像 LoRA 模型训练和指定图像生成 pipeline 的集合。 79 | 80 | **EasyPhoto生成** 81 | 82 |
83 | image 84 |
85 | 86 | 上图为 EasyPhoto 的生成(推理)阶段示意图,其主要步骤如下: 87 | 88 | 1. 首先使用人脸检测对输入的指定模板进行人脸检测(crop & warp),并结合数字分身进行模板替换; 89 | 2. 采用 FaceID 模型挑选用户输入的最佳 ID Photo 和模板照片进行人脸融合(face fusion); 90 | 3. 使用融合后的图片作为基底图片,使用替换后的人脸作为 control 条件,加上数字分身对应的 LoRA,进行图到图局部重绘生成; 91 | 4. 采用基于 stable diffusion + 超分的方式进一步在保持 ID 的前提下生成高清结果图。 92 | 93 | **EasyPhoto训练** 94 | 95 |
96 | image 97 |
98 | 99 | 上图为 EasyPhoto 的训练示意图,整个 pipeline 基于开源模型 stable diffusion + 人物定制 LoRA + ControlNet 的方式完成图像生成。训练采用了大量的人脸预处理技术,用于把用户上传的图片进行筛选和预处理,并引入相关验证和模型融合技术。 100 | 101 | 主要步骤如下: 102 | 103 | 1. 采用 FaceID 和图像质量分数对所有图片进行聚类和评分,筛选出非同 ID 照片; 104 | 2. 采用人脸检测和主体分割(saliency detection),抠出第 1 步筛选后的人脸图片进行人脸检测抠图,并分割去除背景; 105 | 3. 采用美肤模型优化部分低质量人脸,提升训练数据的图片质量; 106 | 4. 采用单一标注的方案,对处理后的训练图片进行标注(EasyPhoto 中固定 prompt 为 "easyphoto_face, easyphoto, 1person"),并使用相关的 LoRA 训练; 107 | 5. 训练过程中采用基于 FaceID 的验证步骤,间隔一定的 step 保存模型,并最后根据相似度融合模型; 108 | 109 | > validation step 是一个比较重要的步骤,具体的操作是在训练过程中计算输入图像与生成图像(由训练的 LoRA 结合一个 canny ControlNet 生成)之间的 FaceID gap,该过程有助于 LoRA模型的融合,最终确保训练后的 LoRA 模型为用户期望得到的。另外,face_id score 最高的生成图像会被选作 face_id image,将用于增强推理生成的身份相似性。 110 | 111 | 训练时同时训练了多个 LoRA 模型,它们的训练目标以及集成方法暂不展开。 112 | 113 | ## 4. 推理过程 114 | 115 |
116 | image 117 |
118 | 119 | 上图展示了单 ID 下的推理过程示意图。主要包含三个部分:1)人脸预处理,获取模型输入图像和 ControlNet 所需的输入;2)第一次 diffusion,生成类似于用户输入的粗略结果;3)第二次 diffusion,修复边界伪影,使结果更加真实。 120 | 121 | 推理过程的输入包括一个「inference template」 和一个「Face id Image」,其中 face_id image 是训练阶段的验证过程中生成的 face_id score 最大的图像。 122 | 123 | ### 4.1 人脸预处理 124 | 125 | 基于「inference template」生成 AI 写真的直接方法是用 SD 模型修复模板的人脸区域,此外,引入 ControlNet 可以显著增强生成图像与用户的身份一致性和相似性。 126 | 127 | 然而,直接应用 ControlNet 来修复人脸区域可能会引入「伪影」问题或以下问题: 128 | 129 | - 「template image」与「input image」不一致:这里的 input image 应该指的是 face_id image,很明显,是因为模板图像中的关键点与 face_id image 中的关键点不兼容,因此,利用 face_id image 图像作为 ControlNet 的输入将不可避免的导致最终结果不一致。 130 | - 修复区域缺陷:mask 人脸区域并用新的 face 修复会导致明显的缺陷,特别是边界区域,这件对生成结果的真实性影响很大。 131 | - ControlNet 使用之后无法保证身份一致性:由于训练过程中未使用 ControlNet,因此在推理过程中使用 ControlNet 可能会破坏训练后的 LoRA 模型的保留用户身份 ID 的能力。 132 | 133 | 为了解决上述问题,本文提出了三种人脸预处理方法,以获得第一次 Diffusion 阶段的输入图像、mask以及 reference image。 134 | 135 | - Align and Paste:针对模板与 face_id image 之间的 **face landmark 不匹配**问题,本文提出了一种「affine transformation」和「face-pasting」算法。首先,分别得到 template image 和 face_id image 的 face landmark;然后,计算出能够将两者 face landmark 对齐的仿射变换矩阵 M;最后,将 face_id image 应用该变换之后直接贴在 template image 上(仅人脸区域)。该过程保留了 face_id image 的 landmark 的同时还与 template image 完成了对齐。随后,替换人脸后的图像将作为 openpose ControlNet 的输入,既保证和 face_id image 的身份一致性以及也保留与 template image 的人脸结构相似性。 136 | - Face Fuse:为了纠正由「mask inpainting」造成的**边界伪影**,本文提出了一种 canny ControlNet 方法,以指导图像生成过程并确保有和谐的边缘。但是,template image 和 target ID 的 canny 边缘之间可能存在兼容性问题,为了解决该问题,本文使用了一个 FaceFusion 算法,用来融合 template image 与 roop image。融合后的图像对边缘的稳定性有明显的改善,有助于减轻边界伪影问题,使得在第一次 diffusion 时得到更好的结果。 137 | > roop image 是一张用户的 ground truth 图片。 138 | 139 | - ControlNet-based Validation:因为在训练阶段训练 LoRA 时并没有训 ControlNet,直接在推理阶段使用 ControlNet 可能会对 LoRA 模型的**身份保存能力**产生影响。为解决该问题,在训练阶段引入了 「ControlNet for validation」,验证图像是由训练图像通过 LoRA 模型和 ControlNet 模型结合生成得到,然后比较生成图像与训练图像之间的 face_id score,以有效的集成 LoRA 模型,通过合并不同阶段的模型并考虑 ControlNet 的影响,大大增强了模型的泛化能力。总之,这种验证方法保证了在推理阶段使用 ControlNet 时的模型保证身份一致性的问题。 140 | 141 | ### 4.2 第一次 Diffusion 142 | 143 | 第一次 diffusion 是基于 template image 生成一张与「input user id」一致的图像。模型的输入为 template image 与 user's image 融合后的图像,同时还有由 template image 得到的校准后的 face mask(扩展到包含耳朵)。 144 | 145 | 为了增强对图像生成过程的控制,集成了三个 ControlNet 单元: 146 | 147 | - Canny ControlNet:通过使用融合图像的 canny edge 作为 ControlNet 的控制条件,指导模型使 template 与 face_id image 融合的更精确。与原始 template image 相比,融合图像已经结合了 id 信息,所以,使用融合图像的 canny edge 可以最大限度的减少**边界伪影**问题; 148 | - Color ControlNet:由融合图像的 color 作为 ControlNet 控制条件,修复了区域内的**颜色分布**,确保一致性和连贯性; 149 | - OpenPose ControlNet:由 replaced image 的 openpose 作为 ControlNet 的控制条件,保证用户的 face 一致性和 template image 的面部结构。 150 | 151 | 通过合并这些 ControlNet 单元,第一次扩散过程已经可以生成与用户指定 ID 非常相似的高保真结果了。 152 | 153 | ### 4.3 第二次 Diffusion 154 | 155 | 第二次 diffusion 致力于微调和细化人脸边界附近的伪影问题。此外,还提供了 mask 嘴部附近区域的选项,以增强特定区域内的生成效果。 156 | 157 | 与第一次 diffusion 类似,首先将上一阶段的输出图像与 user's image(roop image)进行融合,以此作为第二阶段的输入。同时,fuse image 也作为 canny ControlNet 的输入,更好的控制生成过程。此外,还使用了 tile ControlNet 来实现更高的分辨率,利用增强生成图像的细节和整体质量。 158 | > user's image = roop image 159 | 160 | 在最后一步中,对生成的图像进行后处理,将其调整为与 inference template 同样的尺寸,这保证了生成图像与模板之间的一致性和兼容性。此外,还使用了美肤算法和人像增强算法,进一步提高最终结果的质量和外观。 161 | 162 | ### 4.4 Multi User Ids 163 | 164 | EasyPhoto 还同时支持多个 user IDs 的生成,这是一个单 ID 功能的扩展。 165 | 166 |
167 | image 168 |
169 | 170 | 上图为「multi-user IDs」生成的推理过程。 171 | 172 | 首先在 inference template 上进行人脸检测,然后分为多个 mask,对于每个只包含单个人脸的 mask 其它人脸区域均被白色遮盖住,那么该问题就被简化为了单 user ID 生成问题。 173 | 174 | ## 5.Anything ID 175 | 176 | Anything ID 不局限于某个特定的人脸,可以是任何的 ID 特征,在此不展开了。 177 | 178 | ## 6.实验 179 | 180 | - 写实风 181 | 182 |
183 | image 184 |
185 | 186 | - 漫画风 187 | 188 |
189 | image 190 |
191 | 192 | - 多 ID 生成 193 | 194 |
195 | image 196 |
197 | 198 | - SDXL 生成的图像作为 template image 199 | 200 |
201 | image 202 |
203 | -------------------------------------------------------------------------------- /notes/025_latent_diffusion_model.md: -------------------------------------------------------------------------------- 1 | ## 1 题目&作者 2 | 利用 latent diffusion model 实现高分辨图像生成。 3 | 作者团队来自 Runway。 4 | 5 | ## 2 摘要 6 | Stable Diffusion 通过将图像生成过程分解为逐步去噪自编码过程实现了SOTA的生成结果,并且该方式允许通过额外的控制条件来指导生成。然而,由于这些模型通常直接在像素空间中操作,导致 diffusion model 的训练成本和推理成本都很高。 7 | 为了在有限的计算资源上训练 diffusion model,同时保留生成图像的质量和灵活性,本文提出,首先通过一个 pretrained autoencoder 将图像从像素空间转到 latent 空间,然后在 latent 空间上进行 diffusion 训练,通过找到一个近似最优点,实现模型复杂度和细节保真度之间的平衡。 8 | 另外,通过在模型结构中引入 cross-attention layer,使得 diffusion model 生成图像时更加灵活,可以处理文本、边界框等一般条件的输入,并且可以以卷积的方式实现高分辨率图像的合成。 9 | 10 | ## 3 引言 11 | 图像生成在计算机视觉领域取得了显著的成就,但同时也伴随着巨大的计算资源需求。特别是复杂自然场景下的高分辨率图像生成,目前主要是基于可扩展的自回归(AR)transformers 模型,可能包含数十亿参数。另一方面,生成对抗网络(GANs)受限于数据,对于复杂、多模态数据分布拟合的并不是很好。 12 | 最近,以 denoising autoencoders 层级结构为基础的 diffusion models 在图像生成任务上取得了很好的结果,并且在条件控制以及高分辨生成上也有 SOTA 的结果。另外,无条件控制的 diffusion models 也可以应用于图像修复、着色等任务。diffusion models 是一个 likelihood-based 模型,不会像GANs那样出现模式崩溃(mode-collapse)和训练不稳定,并且通过大量参数共享,能够在不涉及数十亿参数的情况下学习自然图像的复杂数据分布。 13 | 14 | **Democratizing High-Resolution Image Synthesis** 15 | Diffusion Models 属于是 likelihood-based 方法,可以容易的通过扩大模型规模来实现对数据中不易察觉的细节建模。但是直接在 RGB 图像这种高维空间进行训练和推理是非常耗时的。所以,要想使得高分辨率图像生成变得可用,降低复杂度是非常必要的。 16 | 17 | **Departure to Latent Space** 18 | 对于任意一个 likelihood-based model,学习过程可以大致分为两个阶段:1)perceptual compression,该阶段消除了高频细节信息,但仍然学到很少的语义变化;2)semantic compression,学习数据中的概念和语义信息。因此,我们的目标是首先找到一个感知上等效但计算上更合适的空间,在该空间上训练用于高分辨率图像合成的扩散模型。 19 | 根据之前的一些经验,我们将训练过程分为两个阶段:首先,训练一个 autoencoder,将图像从 RGB 高维空间映射到一个更低维的表示空间,该空间和原始的数据是 perceptually equivalent 的(感知等价,我的理解是虽然维度不同,但感知上并没有变化)。重要的是,与之前的工作相比,我们不需要依赖过度的空间压缩,因为我们在学习到的 latent 空间中训练 Diffusion Model,这在空间维度方面表现出更好的缩放特性。 降低复杂度还可以通过单次推理实现从 latent 空间高效生成图像(其实就是通过 decoder 将 latent 转为图像)。 我们将该方法称为 Latent Diffusion Models。 20 | 其中,autoencoder 仅需要训练一次即可,然后就可以复用在不同的训练实验或其它任务上(或者说,在训练 Diffusion Models 时,VAE 往往是冻结住不训练的,直接用之前训好的权重即可)。 21 | 22 | ## 4.相关工作 23 | 24 | **Generative Models for Image Synthesis** 25 | GANs 的主要缺点:1)优化困难;2)数据量比较大时,很难拟合整个数据分布; 26 | VAE 的缺点:虽然能够生成高分辨率的图像,但是质量无法和 GANs 媲美; 27 | autoregressive 自回归模型:有不错的生成质量,但计算量太大,只适用于低分辨率图像; 28 | 29 | **Diffusion Probabilistic Models** 30 | 生成效果好,但是直接在 pixel space 计算,效率低。 31 | 32 | **Two-Stage Image Synthesis** 33 | VQ-VAEs、VQGANs。 34 | 35 | ## 5.方法 36 | 原始的 Diffusion Models 虽然通过对相应的 loss 进行降采样来降低计算量,但由于其仍是在 pixel 空间上计算,所以还是需要巨大的计算量。 37 | 本文提出,先使用一个 autoencoding model 将图像从 pixel space 映射到 latent space,且两者是 perceptually equivalent 的,重要的是该过程可以极大地减少计算复杂度。 38 | 39 | ### 5.1 Perceptual Image Compression 40 | Perceptual Image Compression 在这里指的就是将图像从 pixel space 映射到 latent space,即感知压缩。 41 | 本文的 perceptual compression model 是基于 perceptual loss 和 patch-based adversarial objective 训练了一个 autoencoder,通过保证局部真实性限制了重建过程在图像流形内(写的太难懂了),也避免了 L1 或 L2 损失容易引入的模糊问题。 42 | 43 | 假设,给定一个 RGB 图像 $x ∈ \mathbb{R} ^{H\times W\times 3}$,encoder $\varepsilon$ 将 $x$ 编码到 latent 空间,表示为 $z = \varepsilon (x)$,而 decoder $\mathcal{D}$ 将 latent 空间中的向量重建为图像,表示为 $\tilde{x} = \mathcal{D} (z) = \mathcal{D} (\varepsilon (x))$,其中 $z ∈ \mathbb{R} ^{h\times w\times c}$。通常,将 $f = H / h = W / w$ 成为降采样率。 44 | 45 | 为了避免落入高方差的 latent 空间,本文实验了两种不同类型的正则化方法: 46 | - KL-reg:在符合标准正态分布的 latent 上施加一个轻微的 KL 惩罚,类似于 VAE; 47 | - VQ-reg:在 decoder 中使用一个向量量化层,类似于 VQGAN; 48 | 49 | ### 5.2 Latent Diffusion Models 50 | 51 | Diffusion Models 是一种基于概率的生成模型,它们通过模拟数据的扩散过程来学习数据的分布。核心思想是将数据生成过程视为一个逆向的马尔可夫链过程,其中每一步都涉及到对数据添加噪声,直到数据完全转变为随机噪声。然后,模型通过逆向这个过程来学习如何从噪声中恢复出原始数据的分布。 52 | 53 | 用公式表示如下: 54 | $L_{DM} = \mathbb{E} _{x,\epsilon ∼ \mathcal{N}(0,1),t } [\left \| \epsilon - \epsilon_{\theta } (x_t,t) \right \|_{2}^{2} ]$ 55 | 其中 t 的取值为 {1,...T}。 56 | 57 | Generative Modeling of Latent Representations 指的是在 latent 空间中从随机噪声到 latent 向量的去噪过程。低维的 latent 向量表示,保留了原始数据中重要的语义信息,且降低了计算复杂度;以 Unet 为主要结构,其归纳偏置使得最终生成的图像细节更好。 58 | 该过程用公式表示如下: 59 | $L_{LDM} := \mathbb{E} _{\epsilon (x),\epsilon ∼ \mathcal{N}(0,1),t } [\left \| \epsilon - \epsilon_{\theta } (z_t,t) \right \|_{2}^{2} ]$ 60 | 61 | ### 5.3 Conditioning Mechanisms 62 | Conditioning Mechanisms(条件机制)是指将额外信息或条件输入到模型中,以控制或引导生成过程的方法。这些条件可以是类别标签、文本描述、图像或其他任何能够影响生成结果的信息。条件机制使得模型能够生成特定于这些条件的数据样本,从而提高了模型的灵活性和应用范围。 63 | 64 | 实现方式: 65 | - 在UNet架构中引入了 cross-attention 层,这些层能够将条件信息(如文本、图像或其他模态的数据)引入到UNet的不同中间层,从而影响生成过程。 66 | 67 | 假设,条件信息为 $y$,通过一个 encoder $\tau _{\theta }$ 将 $y$ 映射为 $\tau _{\theta } ∈ \mathbb{R} ^{M\times d_{\tau } }$,然后将其通过一个 cross-attention 层与 UNet 的中间层进行融合: 68 | $Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d} } )\cdot V$ 69 | 其中,$Q=W_{Q}^{(i)} \cdot \varphi _{i} (z_t), K=W_{K}^{(i)}\cdot \tau _\theta (y), V=W_{V}^{(i)}\cdot \tau _\theta (y)$,而 $\varphi _i(z_t) ∈ \mathbb{R} ^{N\times d_{\epsilon }^{i} }$ 表示的是 UNet 的中间层特征。 70 | 71 |
72 | image 73 |
74 | 75 | ## 6.实验 76 | 77 | ### 6.1 On Perceptual Compression Tradeoffs 78 | 该部分在 vae 降采样率和生成质量之间做了权衡。 79 | 80 |
81 | image 82 |
83 | 84 | 当 f = 4,8,16 时,速度和生成质量之间相对比较权衡。< 4 时,速度太慢,> 16 时,质量太差。 85 | 86 | ### 6.2 Image Generation with Latent Diffusion 87 | unconditional image synthesis 无条件控制 88 |
89 | image 90 |
91 | ProjectedGAN 的效果貌似很好。 92 | 93 | ### 6.3 Conditional Latent Diffusion 94 | - text-conditional 文本控制 95 |
96 | image 97 |
98 | 99 | - class-conditional 类别控制 100 |
101 | image 102 |
103 | 104 | ### 6.4 Super-Resolution with Latent Diffusion 105 | LDMs 还可以通过 concatenation 操作对低分辨率图像进行超分重建。 106 | 107 | ### 6.5 Inpainting with Latent Diffusion 108 | inpainting 指的是对图中 mask 区域进行填充,LDMs 也可以完成该任务。 109 | 110 | 结果略。 111 | 112 | ## 7.结论 113 | 本文提出了潜在扩散模型(LDMs),这是一种简单且高效的方法,显著提高了去噪扩散模型的训练和采样效率,同时不降低其质量。基于此,我们的跨注意力条件机制使得实验能够在广泛的条件图像合成任务上与最先进的方法相比取得有利的结果,而无需特定任务的架构。 114 | -------------------------------------------------------------------------------- /notes/027_sdxl.md: -------------------------------------------------------------------------------- 1 | # SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis 2 | 3 | SDXL 作为一个技术报告,我们直接上干货! 4 | 5 | ## 1 性能对比 6 | 首先对比一下 SDXL 相较于 SD 1.5 及 SD 2.1 的**性能优势**: 7 | 8 |
9 | image 10 |
11 | 12 | - 单独的SDXL 1.0 Base模型的表现明显优于之前的所有SD版本,而完整的SDXL 1.0模型(Base模型 + Refiner模型)则实现了最佳的图像生成整体性能 13 | 14 | ## 3 模型对比 15 | 16 | SDXL 相较于 SD 1.5 & 2.1 在模型结构上的差异: 17 |
18 | image 19 |
20 | 21 | ### 2.1 UNet 结构差异 22 | 23 | U-Net 的 Encoder 和 Decoder 结构从之前系列的 4stage 改成3stage([1,1,1,1] -> [0,2,10]),在第一个stage中不再使用Spatial Transformer Blocks,而在第二和第三个stage中大量增加了Spatial Transformer Blocks,并舍弃最后一个 stage; 24 | > 这样做的原因:在具有更高特征维度的第一个stage中,不使用 Spatial Transformer block,可以明显减少显存占用和计算量。然后在第二和第三个stage这两个维度较小的feature map上使用数量较多的 Spatial Transformer block,能在大幅提升模型整体性能(学习能力和表达能力)的同时,优化了计算成本。舍弃掉最后一个具有最小维度 feature map 的 stage,是为了让SDXL的出图分辨率提升至1024x1024(理论上从 128x128 大小的特征上重建出 1024x1024 的图是要比 64x64 的特征上重建更简单)。 25 | 26 | **UNet 模型(Base部分)参数量增加到2.6B,参数量为之前模型的3倍左右**。 27 | 28 | ### 2.2 Text Encoder 差异 29 | 30 | SDXL 使用更强大的 pre-trained text encoder,并且使用了两个 text encoder,分别是 OpenCLIP ViT-bigG(694M)和OpenAI CLIP ViT-L/14(123.65M),大大增强了 SDXL 对文本的提取和理解能力,同时提高了输入文本和生成图片的一致性; 31 | > 两个 text encoder 提取到的文本特征 concat 之后送入 UNet 中的 cross-attention 模块; 32 | 33 | **Text encoder 部分参数量共 694+123=817M 左右**。 34 | 35 | 除了常规的 text embedding 之外,同时引入 pooled text embedding 作为文本控制条件; 36 | > 具体地,对 OpenCLIP ViT-bigG 提取到的文本特征进行 max pooling 操作([N, 77, 2048] -> [N, 1, 2048])得到 pooled text emb,将其嵌入到Time Embeddings中(add操作),作为辅助约束条件(强化文本的整体语义信息),但是这种辅助条件的强度是较为微弱的。 37 | 38 | ### 2.3 VAE 差异 39 | 40 | VAE 部分结构不变,只对训练过程做了优化。 41 | 42 | SDXL 使用了和之前 Stable Diffusion 系列一样的 VAE 结构(KL-f8),但在训练中选择了更大的 batch size(256 vs 9),并且对模型进行指数滑动平均操作(**EMA**,exponential moving average),EMA对模型的参数做平均,提高了性能并增加模型鲁棒性。 43 | 44 | 下表是Stable Diffusion XL的VAE在COCO2017 验证集上,图像大小为256×256像素的情况下的性能: 45 |
46 | image 47 |
48 | 49 | (注:SDXL 的 VAE 是从头开始训练的) 50 | 51 | 上面的表中的三个VAE模型结构是一样的,不同点在于SD 2.x VAE是基于SD 1.x VAE微调训练了Decoder部分,同时保持Encoder部分权重不变,使他们有相同的Latent特征分布,所以**SD 1.x和SD 2.x的VAE模型是互相兼容的**。而SDXL VAE是重新从头开始训练的,所以其Latent特征分布与之前的两者不同。 52 | 53 | 由于Latent特征分布产生了变化,SDXL VAE 的**缩放系数**也产生了变化。VAE 在将 Latent 特征送入U-Net之前,需要对Latent特征进行缩放让其标准差尽量为1,之前的Stable Diffusion系列采用的缩放系数为0.18215,由于SDXL的VAE进行了全面的重训练,所以缩放系数重新设置为0.13025。 54 | 55 | **注意:由于缩放系数的改变,SDXL VAE 模型与之前的Stable Diffusion系列并不兼容。如果在SDXL上使用之前系列的VAE,会生成充满噪声的图片。** 56 | 57 | 与此同时,与Stable Diffusion一样,VAE模型在SDXL中除了能进行图像压缩和图像重建的工作外,通过**切换不同微调训练版本的VAE模型,能够改变生成图片的细节与整体颜色(更改生成图像的颜色表现,类似于色彩滤镜)。** 58 | 59 | 需要注意的是:原生 SDXL VAE采用 FP16 精度时会出现数值溢出成 NaNs 的情况,导致重建的图像是一个黑图,所以必须使用 FP32 精度进行推理重建。如果大家想要FP16精度进行推理,可以使用[sdxl-vae-fp16-fix](https://huggingface.co/madebyollin/sdxl-vae-fp16-fix)版本的SDXL VAE模型,其对FP16出现的NANs的情况进行了修复。 60 | 61 | ## 训练策略优化 Micro-Conditioning 62 | 63 | SDXL 在训练阶段提出了很多优化方法,包括图像尺寸条件化、图像裁剪参数条件化以及多尺度训练策略。 64 | 65 | - **size-conditioning** 66 | 67 | 之前在Stable Diffusion的训练过程中,主要分成两个阶段,先在256x256的图像尺寸上进行预训练,然后在512x512的图像尺寸上继续训练。 68 | 而这两个阶段的训练过程都要对最小图像尺寸进行约束。通常有两种处理方式:1)丢弃小于最小尺寸的数据;2)将小尺寸图像进行超分辨上采样。 69 | 如果选择第一种处理方式,会导致训练数据中的大量数据被丢弃,从而很可能导致模型性能和泛化性的降低。下图展示了如果将尺寸小于256x256的图像丢弃,**整个数据集将减少39%的数据**。如果再丢弃尺寸小于512x512的图像,**未利用数据占整个数据集的百分比将更大**。 70 |
71 | image 72 |
73 | 74 | 如果选择第二种处理方式,对于图像尺寸过小的场景,**目前的超分模型可能会在对图像超分的同时会引入一些噪声伪影,影响模型的训练,导致生成一些模糊的图像**。 75 | 76 | 为了解决上述问题,SDXL 提出了 size-conditioning 策略,即将原始图像分辨率信息作为空间条件引入到 UNet 的训练中。具体地,使用 Fourier feature encoding 对 original height 和 original width 分别编码,然后将特征 concat 后加在Time Embedding上,从而**将图像尺寸信息作为条件控制引入训练过程**。这样以来,模型在训练过程中能够学习到图像的原始分辨率信息,从而在推理生成阶段,会根据用户设定的尺寸,更好地适应不同尺寸的图像生成,而不会产生噪声伪影的问题。 77 | 78 | 下图展示了使用 size-conditioning 的效果: 79 |
80 | image 81 |
82 | 如下图所示,在使用了 size-conditioning 策略后,Base模型已经对不同图像分辨率有了“自己的判断”。当输入低分辨率条件时,生成的图像较模糊;在不断增大分辨率条件时,生成的图像质量不断提升。 83 | 84 | - crop-conditioning 85 | 86 | 之前的Stable Diffusion系列模型,由于需要输入固定的图像尺寸用作训练,很多数据在预处理阶段会被裁剪。**生成式模型中典型的预处理方式是先调整图像尺寸,使得最短边与目标尺寸匹配,然后再沿较长边对图像进行随机裁剪或者中心裁剪**。虽然裁剪是一种数据增强方法,但是训练中对图像裁剪导致的图像特征丢失,**可能会导致AI绘画模型在图像生成过程中出现不符合训练数据分布的特征**。 87 | 88 | 下图给出了一些使用 crop resize 造成的失败案例: 89 |
90 | image 91 |
92 | 93 | 为了解决上述问题,SDXL 提出了 crop-conditioning 策略,即在加载数据时,将左上角的裁剪坐标(c_top,c_left)利用 Fourier feature encoding 编码后加在Time Embedding上(实际应用时是先和 size-conditioning 特征 concat 之后在与 time embedding 相加),以此将 crop 信息作为控制条件引入 U-Net(Base)模型中,从而在训练过程中让模型学习到对“图像裁剪”的认识。 94 | 95 | 下图展示了使用 crop-conditioning 策略的效果: 96 |
97 | image 98 |
99 | 从上图中可以看到,将不同的 c_crop 坐标条件的生成图像进行了对比,当设置 c_crop=(0,0) 时可以生成主要物体居中并且无特征缺失的图像,而采用其它的坐标条件则会出现有裁剪效应的图像。 100 | 101 | size-conditioning 策略和 crop-conditioning 策略都能在 SDXL 训练过程中使用(在线方式应用),同时也可以很好的迁移到其他生成式模型的训练中。伪代码如下: 102 |
103 | image 104 |
105 | 106 | - **Multi-Aspect Training** 107 | 108 | 真实世界的图像是有一个非常广泛的尺寸和长宽比范围的,而通常 text-to-image 模型生成的图都是限制在 512x512 或 1024x1024 这种正方形的尺寸上,其实这是不太合理的。 109 | 110 | 基于此,SDXL 提出了多尺度训练策略。首先采用 size-conditioning 和 crop-conditioning 这两种策略在256x256 和 512x512 的图像尺寸上分别预训练600000步和200000步(batch size = 2048),**总的数据量约等于 (600000 + 200000) x 2048 = 16.384亿**。 111 | 112 | 接着Stable Diffusion XL在 1024x1024 的图像尺寸上采用多尺度方案来进行微调,并将数据分成不同纵横比的桶(bucket),并且**尽可能保持每个桶的像素数接近1024×1024,**同时相邻的bucket之间height或者width一般相差64像素左右,Stable Diffusion XL的具体分桶情况如下图所示: 113 |
114 | image 115 |
116 | 其中Aspect Ratio = Height / Width,表示高宽比。 117 | 118 | 在训练过程中,一个Batch从一个桶里的图像采样,并且在每个训练步骤(step)中可以在不同的桶之间交替切换。**除此之外,Aspect Ratio也会作为条件嵌入到U-Net(Base)模型中,嵌入方式和上面提到的其他条件嵌入方式一致,让模型能够更好地学习到“多尺度特征”。** 119 | 120 | 与此同时,SDXL在多尺度微调阶段依然使用 crop-conditioning 策略,进一步增强 SDXL 对图像裁剪的敏感性。 121 | 122 | 在完成了多尺度微调后,SDXL 就可以进行不同Aspect Ratio的图像生成了,**不过官方推荐生成尺寸默认为1024x1024。** 123 | 124 | ### **Refiner** 125 | 126 | SDXL 中新增了一个重要模块:refiner。 127 | 128 | SDXL 是一个**二阶段的级联扩散模型**,包括 Base 模型和 Refiner 模型。其中**Base模型的主要工作和Stable Diffusion 1.x-2.x一致**,具备文生图(txt2img)、图生图(img2img)、图像inpainting等能力。在Base模型之后,级联了Refiner模型,**对Base模型生成的图像Latent特征进行精细化提升,其本质上是在做图生图的工作**。 129 | 130 | **SDXL Base模型由U-Net、VAE以及CLIP Text Encoder(两个)三个模块组成**,在FP16精度下Base模型大小6.94G(FP32:13.88G),其中U-Net占5.14G、VAE模型占167M以及两个CLIP Text Encoder一大一小(OpenCLIP ViT-bigG和OpenAI CLIP ViT-L)分别是1.39G和246M。 131 | 132 | **SDXL Refiner模型同样由U-Net、VAE和CLIP Text Encoder(一个)三个模块组成**,在FP16精度下Refiner模型大小6.08G,其中U-Net占4.52G、VAE模型占167M(与Base模型共用)以及CLIP Text Encoder模型(OpenCLIP ViT-bigG)大小1.39G(与Base模型共用)。 133 | 134 | 比起Stable Diffusion 1.x-2.x,**SDXL的参数量增加到了66亿(Base模型35亿+Refiner模型31亿),并且先后发布了模型结构完全相同的0.9和1.0两个版本**。Stable Diffusion XL 1.0在0.9版本上使用**更多训练集+RLHF**来优化生成图像的色彩、对比度、光线以及阴影方面,使得生成图像的构图比0.9版本更加鲜明准确。 135 | 136 | 级联 refiner 之后的生成 pipeline 如下: 137 |
138 | image 139 |
140 | 141 | #### Bonus 142 | 143 | 文中对一些闭源工作表达了不满(没错,Midjourney 就是你:),下面直接贴出文中原话: 144 | > A major concern in the field of visual media creation is that while black-box-models are often recognized as state-of-the-art, the opacity of their architecture prevents faithfully assessing and validating their performance. This lack of transparency hampers reproducibility, stifles innovation, and prevents the community from building upon these models to further the progress of science and art. Moreover, these closed-source strategies make it challenging to assess the biases and limitations of these models in an impartial and objective way, which is crucial for their responsible and ethical deployment. With SDXL we are releasing an open model that achieves competitive performance with black-box image generation models. 145 | -------------------------------------------------------------------------------- /notes/028_consistency_models.md: -------------------------------------------------------------------------------- 1 | # Consistency Models 2 | 3 | [Paper](https://arxiv.org/pdf/2303.01469.pdf) | [code](https://github.com/openai/consistency_models) 4 | 5 | ## 题目&作者 6 | 7 | Consistency models:一致性模型 8 | 9 | 作者团队来自OpenAI 宋飏,[个人主页](https://yang-song.net/)。 10 | 11 | Consistency Models [poster](https://yang-song.net/assets/pdf/ICML2023/consistency.pdf)。 12 | 13 | ## 摘要 14 | 15 | 16 | 本文提出了一种新的生成模型 -- Consistency Models,旨在解决 Diffusion Models 在生成时由于迭代采样过程导致速度慢的问题。它可以直接从噪声生成高质量图像,既可以支持快速单步生成,也支持多步采样以提高样本质量,并且支持zero-shot data editing,如 image inpainting、colorization 以及 super-resolution,无需针对这些任务进行专门训练。 17 | 18 | Consistency Models 有两种训练方式:一是从 pre-trained Diffusion Models 中蒸馏,二是独立训练。实验证明,在蒸馏训练时,Consistency Models在一步和少步生成中均优于已有的从 Diffusion Models 蒸馏技术。而在单独训练时,Consistency Models 作为一种新型生成模型,在某些基准测试中优于现有的一步、非对抗生成模型。 19 | 20 | ## 1 引言 21 | 22 | Diffusion Models 是一种 score-based 生成模型,它的一个关键特征是其迭代采样过程,即从随机噪声中逐步去噪的过程。这种迭代采样过程可以在 compute 和 quality 之间形成一种 trade-off,一般地,迭代步数越多,生成质量越高。 23 | 24 | 这种迭代采样过程使得和一些单步生成模型如 GANs、VAEs、normalizing flows 相比,diffusion models 生成过程通常需要 10~2000 倍的计算量,这就导致推理时很慢,对于一些对实时性有要求的应用上是不友好的。 25 | 26 | Diffusion Models 可以看作是一个 continuous-time(连续时间)扩散过程,其正向过程就是一个的连续时间的随机过程,可以用一个SDE(stochastic differential equation,随机微分方程)描述,这是一个**朗之万动力学**中的经典问题,在数学上有充分证明的理论工具来支撑。其逆向过程具有**与正向过程SDE相同的联合分布**。 27 | 28 | 上面提到扩散过程的逆向过程可以用一个 SDE 描述(逆向随机过程),事实上,**存在一个确定性过程(用 ODE 描述)也是它的逆向过程**。这个ODE称为**概率流ODE(probability flow ODE, PF ODE)**,它沿着概率流的轨迹(也就是ODE的解函数)建立了从噪声分布中的点 $x(T)∼pT(x(T))$ 与到数据分布中的点 $x(0) \sim p_{T}(x(T)$ 的映射,也就是说**PF ODE建立了高斯分布样本与数据分布样本的映射。** 29 | 30 | 本文提出学习一个模型,将任何时间步长的任何点映射到轨迹的起点。该模型的一个显着特性是 self-consistency,即**同一轨迹上的点映射到同一初始点**。所以将这个模型称为 consistency models(一致性模型)。 31 | 32 | Consistency Models 可以仅通过一次计算将随机噪声(ODE 轨迹的终点 $x_{T}$)转换生成数据样本(ODE 轨迹的初始点 $x_{0}$,也就是原图像)。并且,通过在多个时间点连接 consistency models 的输出,可以提高样本质量并以更多计算为代价执行零样本数据编辑,类似于 diffusion models 中的迭代采样过程。 33 | 34 | 本文提供了两种训练 consistency models 的方法: 35 | 36 | - Distillation from Diffusion Models 37 | - Training in Isolation 38 | 39 | ## 2 Diffusion Models 40 | 41 | Diffusion Models 在前面的 paper reading 中已经介绍过很多次了,但是常看常新,每篇 paper 的解读视角都不一样,本文也是一样。 42 | 43 | Consistency models 很大程度上受到 continuous-time diffusion models 理论的启发。Diffusion models 将原始数据 $x_{0}$,分 T 步逐渐添加高斯噪声,形成随机过程 $x_0, ..., x_T$,当 T 趋向于无穷大时,$x_T$ 趋于标准正态分布。逆向地,生成过程是一个从噪声逐步去噪的过程。 44 | 45 | 设 $p_{data}(x)$ 代表数据分布,diffusion models 的正向随机过程可以用一个 SDE (随机微分方程)描述: 46 | 47 | $$dx_t=\mu (x_t,t)dt + \sigma(t)dw_t$$ 48 | 49 | 其中 $t\in [0,T]$,$\mu$ 和 $\sigma$ 分别为偏移和扩散系数,$w_t$ 符合标准的布朗运动。 50 | 51 | 上述 SDE 的一个显着特性是存在一个 ODE(常微分方程)形式的解轨迹: 52 | 53 | $$dx_t=\left [ \mu (x_t,t)-\frac{1}{2} \sigma (t)^2 \bigtriangledown \log_{}{p_t(x_t)} \right ]dt $$ 54 | 55 | 其中,$\bigtriangledown \log_{}{p_t(x)}$ 是$p_t(x)$ 的得分方程,该函数是 diffusion models 的直接或间接学习目标。因此,diffusion models 被认为是 **score-based** 的生成模型。 56 | 57 | 或者说,diffusion models 其实是训练了一个网络 $s_\phi (x,t)$ 来拟合 $\bigtriangledown \log_{}{p_t(x)}$,然后 diffusion 的采样过程可以理解为给定 $x_{T} \sim \mathcal{N}(0,I)$,有: 58 | 59 | $$\frac{\mathrm{d} x_t}{\mathrm{d} t} = -ts_\phi (x_t,t)$$ 60 | 61 | 给定起始点,给定每个点的梯度后,通过迭代计算得到 $x_{\epsilon}$,其中 $\epsilon$ 是一个小正数,(比如 EDM 中使用的 0.002),用 $x_{\epsilon}$ 当做采样得到的样本(去噪后的图像)。这里引入 $\epsilon$ 是为了避免在 $t=0$ 处易出现的数值不稳定。 62 | 63 | ## 3 Consistency Models 64 | 65 | 本文提出了一种新型的生成模型 -- consistency models,既支持单步生成,也支持多步迭代生成,可以在计算量和生成质量之间做 trade-offs。其训练方式也有两种:从 pre-trained diffusion models 蒸馏和独立训练。 66 | 67 | ### 3.1 Definition 定义 68 | 69 | Consistency 在 diffusion 的基础上,定义一个 consistency function(一致性函数):$f:(x_{t},t) \longmapsto x_{\epsilon}$,该函数具有 self-consistency 特性,即:从 PF ODE 中的任意一个 $(x_t,t)$,它的输出是一致的,用公式表示为:$f(x_t, t)=f(x_{t^{'}},t^{'})$,其中$t,t^{'}\in [\epsilon ,T]$。 70 | 71 | 上述表示可能不太好理解,我们结合下面图一、图二作一个直观描述: 72 | 73 |
74 | image 75 | image 76 |
77 | 78 | 79 | 已知一个前向扩散过程(PF ODE),定义一个一致性函数 $f(x_t,t)$,给定扩散过程中的任意一点$(x_t,t)$(噪声图),$f(x_t,t)$ 都可以直接(单步)将 $x_t$ 去噪至原图 $x_0$。 80 | 81 | 或者说,Consistency Model 在 Diffusion Model 的基础上,新增了一个约束:**从某个样本到某个噪声的加噪轨迹上的每一个点,都可以经过一个函数 $f$ 映射为这条轨迹的起点。** 显然,同一条轨迹上的点经过 $f$ 映射结果都是同一个点。这也是训练 Consistency Model 时所使用的损失约束。 82 | 83 | ### 3.2 Parameterization 参数化 84 | 85 | 上节提到的一致性函数具有以下两个特性: 86 | 87 | 1. $f(x_{\epsilon},\epsilon)=x_{\epsilon}$,即存在一个 boundary condition(边界条件),即对于轨迹的起点 $x_{\epsilon}$,有 $f(x_{\epsilon},\epsilon)=x_{\epsilon}$; 88 | 2. 任意 $t_{1},t_{2}\in [\epsilon ,T]$ 满足 $f(x_{t_{1}},t_{1})=f(x_{t_{2}},t_{2})$; 89 | 90 | Consistency Model 的目标是找到一个 $f_{\theta}$,能满足上面这两个条件,来拟合 $f$,通常有两种方式对其参数化: 91 | 92 | 1. 假设有一个深度神经网络,用 $F_{\theta}$ 表示,可以拟合 $f_{\theta}$,则 consistency models 可以被参数化为: 93 | 94 | $$f_{\theta}(x,t) = \left\{\begin{matrix} 95 | x & t=\epsilon \\ 96 | F_{\theta}(x,t) & t \in (\epsilon ,T) 97 | \end{matrix}\right.$$ 98 | 99 | 2. 参考 EDM,使用 skip connections,consistency models 可以设计为: 100 | 101 | $$f_{\theta}(x,t) = c_{skip}(t)x + c_{out}(t)F_{\theta}(x,t)$$​ 102 | 103 | 由于第二种方式在形式上与 diffusion models 很接近,所以本文也是采用此方式。 104 | 105 | 式中 $c_{skip}(t)$ 和 $c_{out}(t)$​ 被设计为: 106 | 107 | $$c_{skip}(t) = \frac{\sigma _{data}^{2} }{(t-\epsilon )^{2}+\sigma _{data}^{2}},c_{out}(t)=\frac{\sigma_{data}(t-\epsilon)}{\sqrt{t^2+\sigma_{data}^{2}} }$$ 108 | 109 | 显然,当 $t=\epsilon$ 时,一定满足边界条件,$c_{skip}(0)=1$,$c_{out}(0)=0$​,即第一点性质。 110 | 111 | 那么第二个性质怎么去拟合呢?难道是随机从轨迹中采样两个点,送入 $f_{\theta}$ 约束其相同吗? 112 | 113 | 事实上,当已经有一个训练收敛的 Diffusion Model 时,可以通过最小化下面这个 consistency distillation loss 来去拟合第二个性质: 114 | 115 | $$\mathcal{L}_{CD}^{N}(\theta,\theta^{-};\phi ):=\mathbb{E}[\lambda(t_{n})d(f_{\theta}(x_{t_{n+1}},t_{n+1}),f_{\theta ^{-}}(\hat{x}_{t_{n}}^{\phi},t_{n}))]$$ 116 | 117 | 即从样本集中采样一个样本,加噪变为 $x_{t_{n+1}}$,然后利用预训练的 Diffusion 模型去一次噪,预测到另外一个点 $\hat{x}_{t_{n}}^{\phi}$,然后计算这两个点送入 $f_{\theta}$​ 后的结果,用特定损失函数约束其一致。 118 | 119 | 这里的预测过程形式化地写就是,已知 $s_{\phi}(x,t)$ 和 $\frac{dx_{t}}{dt}=-ts_{\phi}(x_{t},t)$,用 ODE Solver $\Phi$ 去解这个 ODE: 120 | 121 | $$\hat{x}_{t_{n}}^{\Phi}=x_{t_{n+1}}+(t_{n}-t_{n+1})\Phi(x_{t_{n+1}},t_{n+1};\Phi)$$ 122 | 123 | 比如常用的 Euler solver 就是 $\Phi(x,t;\phi)=-ts_{\theta}(x,t)$。DDIM、DPM++等都是 ODE Solver 的一种。 124 | 125 | Consistency Model 论文附录证明了,当最小化 $\mathcal{L}_{CD}^{N}$ 为 0 时,$f_{\theta}$ 和 $f$ 的误差上确界足够小。所以,通过最小化 $\mathcal{L}_{CD}^{N}$ 就能让 $f_{\theta}$ 和 $f$ 足够接近。 126 | 127 | ### 3.3 Sampling 采样 128 | 129 | 文中多次出现 sample 这个描述,该如何理解呢?看下面一段话: 130 | 131 | “we can generate samples by sampling from the initial distribution $\hat{x}_{T} \sim \mathcal{N}(0,T^2I)$ and then evaluating the consistency model for $\hat{x}_{\epsilon } = f_{\theta}(\hat{x}_{T},T)$” 132 | 133 | 从初始的高斯分布中采样得到噪声这个过程称为 sampling,利用 $f_{\theta}$​ 从噪声计算得到图像的过程称为 generate samples。需要结合语义看,本文中的 sample 一般就是指的原图像。 134 | 135 | 在得到了一个合理的 $f$ 的近似 $f_{\theta}$ 后,就可以调用下面的采样算法从噪声生成样本了: 136 | 137 |
138 | image 139 |
140 | 141 | ## 4 Training Consistency Models via Distillation 142 | 143 | Consistency Models 的第一种训练方式是从预训练好的 diffusion models $s_\phi (x,t)$ 中蒸馏。 144 | 145 | 理论部分不展开了(其实是数学弱鸡看不太懂了:)),这里直接贴一个算法步骤: 146 | 147 |
148 | image 149 |
150 | 151 | ## 5 Training Consistency Models in Isolation 152 | 153 | 另一种训练方式是不依赖任何预训练模型,直接单独训练,算法如下: 154 | 155 |
156 | image 157 |
158 | 159 | ## 6 实验 160 | 161 |
162 | image 163 |
164 | 165 | 判定两个点的 $f_{\theta}$ 预测结果是否一致时使用的损失函数可以是 MSE、LPIPS 等等损失,实际上,针对自然图片的损失 LPIPS 在 Consistency Model 的训练过程中取得了最好的结果。 166 | 167 |
168 | image 169 |
170 | 171 | ## 参考 172 | 173 | - https://wrong.wang/blog/20231111-consistency-is-all-you-need 174 | - https://yang-song.net/assets/pdf/ICML2023/consistency.pdf 175 | -------------------------------------------------------------------------------- /notes/029_latent_consistency_models.md: -------------------------------------------------------------------------------- 1 | [paper](https://arxiv.org/pdf/2310.04378.pdf) | [code](https://github.com/luosiallen/latent-consistency-model) 2 | 3 | ## 题目&作者 4 | latent 一致性模型,在只有几步迭代的情况下快速生成高分辨率的图像。 5 | 作者团队来自清华大学,一作[主页](https://luosiallen.github.io/)。 6 | 7 | ## 摘要 8 | Latent Diffusion models(LDMs)在合成高分辨率图像方面取得了显著的成果,但是其迭代采样过程计算量大,导致生成速度慢。为了克服这个缺点,本文提出了 Latent Consistency Models(LCMs),可以在任何 pre-trained LDMs 上以最少的步骤实现快速推理生成,基于 pre-trained LDMs 蒸馏训练一个 LCMs 模型,在 768x768 分辨率仅需 32 个 A100 GPU 时。另外,本文还提出了一种 Latent Consistency Fine-tuning(LCF),一种专为在定制图像数据集上微调 LCM 的方法。 9 | 10 | ## 1 引言 11 | Diffusion models 作为一类强大的生成模型,在多个领域取得了显著成果,特别是在高分辨率文本到图像的合成任务中表现出色。但 Diffusion models 有一个明显的缺点:由于迭代采样过程导致生成速度慢,- 限制了它们在实时应用中的可行性。 12 | 13 | 为了提高采样速度,研究者们提出了多种方法,其中最受关注的一个工作的是 Consistency Models。然而,Consistency models 仅限于像素空间图像生成任务,使其不适合合成高分辨率图像。 此外,尚未探索 conditional diffusion model 的应用和 classifier-free guidance 的结合,使得该方法不适合 text-to-image 任务。 14 | 15 | 类比于 Latent Diffusion Models 和 Diffusion Models 的关系,本文提出的 Latent Consistency Models 也是将 Consistency Models 在像素空间的操作通过一个 auto-encoder 转移至 Latent 空间。 16 | 17 | 本文主要贡献: 18 | - 提出 Latent Consistency Models(LCMs),实现快速高分辨图像生成。LCMs 将 consistency models 应用于 latent 空间,可以在 pre-trained LDMs 上实现几步甚至一步生成; 19 | - 提出一个简单高效的 guided consistency distillation 方法,实现从 Stable Diffusion 的蒸馏训练。同时提出了 skipping-step 策略加速收敛; 20 | - 提出了一种针对 LCMs 的 fine-tuning 方法,使预训练的 LCMs 能够有效地适应定制数据集,同时保留快速推理的能力。 21 | 22 | ## 2 相关工作 23 | 主要是简述了 Diffusion Models、Accelerating DMs、Latent Diffusion Models 以及 Consistency Models 等工作,在此就不展开了。 24 | 25 | ## 3 题要 26 | 本节主要简单回顾了 Diffusion Models 和 Consistency Models 的定义。 27 | -------------------------------------------------------------------------------- /notes/030_stable_diffusion_2.x.md: -------------------------------------------------------------------------------- 1 | # Stable Diffusion 2 2 | 3 | [homepage](https://stability.ai/news/stable-diffusion-v2-release) | [code](https://github.com/Stability-AI/stablediffusion) 4 | 5 | Stable Diffusion 2.x 是 Stable Diffusion 1.x 的改进版,原理上没有太大差异,主要是训练数据、训练过程以及模型选择的不同,这里就直接放 stable diffusion 2.x 的改进点。 6 | 7 | ## 1 Stable Diffusion 2.0 相较于 1.0 的改进点 8 | 9 | ### 1.1 模型结构 10 | 11 | #### 1.1.1 Text Encoder 12 | 13 | - 模型由 CLIP ViT-L/14 升级为 CLIP ViT-H/14 14 | Stable Diffusion 1.x 系列中的 Text Encoder 采用的是 OpenAI 开源的 CLIP ViT-L/14 模型,其模型参数量为123.65M;而Stable Diffusion V2系列则换成了新的 OpenCLIP 模型—— CLIP ViT-H/14 模型(基于LAION-2b数据集训练),其参数量为354.03M,比SD 1.x的Text Encoder模型大了3倍左右。具体对比如下表所示: 15 | 16 | | Text Encoder | emb dims |Params | ImageNet Top1 | Mscoco image retrieval at 5 | Flickr30k image retrieval at 5 | 17 | | --------------- | ------------ | --------- | ------------------ | -------------------------------- | --------------------| 18 | | Openai L/14 | 768 | 123.65M | 75.4% | 61% | 87% | 19 | | CLIP ViT-H/14 | 1024 | 354.03M | 78.0% | 73.4% | 94% | 20 | 21 | SD2.0 中所使用的新的 text encoder 模型在多个指标上均有明显的提升,表明 CLIP ViT-H/14 模型的 Text Encoder 能够输出更准确的文本语义信息。 22 | 23 | - 使用Text Encoder倒数第二层的特征来作为U-Net模型的文本信息输入 24 | SD 1.x 使用的是 Text Encoder 倒数第一层的特征。Imagen 和 novelai 在训练时也采用了Text Encoder倒数第二层的特征,**因为倒数第一层的特征存在部分丢失细粒度文本信息的情况,而这些细粒度文本信息有助于SD模型更快地学习某些概念特征**。 25 | 26 | #### 1.1.2 VAE 27 | 28 | SD2.0 和 SD1.x 的 VAE 部分是一致的。 29 | 30 | #### 1.1.3 UNet 31 | 32 | SD 2.0 U-Net与SD 1.x U-Net的整体架构是一样的,但由于切换了 Text Encoder 模型,在 SD 2.0 中 U-Net 的 **cross attention dimension** 从 SD 1.x U-Net 的 768 变成了 1024,从而 U-Net 部分的整体参数量有一些增加(860M -> 865M)。与此同时,在 SD 2.0 U-Net 中不同 stage 的 attention 模块的 **attention head dim** 是不固定的(5、10、20、20),而 SD 1.x 则是不同 stage 的 attention 模块采用固定的 attention head 数量(8),这个改动不会影响模型参数量。 33 | 34 | ### 1.2 训练数据和训练过程 35 | 36 | #### 1.2.1 训练数据 37 | 38 | Stable Diffusion 2.0模型从头开始在LAION-5B数据集的子集(该子集通过LAION-NSFW分类器过滤掉了NSFW数据,过滤标准是punsafe=0.1和美学评分>= 4.5)上**以256x256的分辨率训练了550k步,**然后接着**以512x512的分辨率在同一数据集上进一步训练了850k步**。 39 | 40 | SD 1.x系列模型主要采用LAION-5B中美学评分>= 5以上的子集来训练,而到了SD 2.0版本采用美学评分>= 4.5以上的子集,**这相当于扩大了训练数据集**。 41 | 42 | #### 1.2.2 不同训练过程得到的不同版本的模型 43 | 44 | - 512-base-ema.ckpt:SD 2.0的基础版本模型 45 | - 768-v-ema.ckpt:在512-base-ema.ckpt模型的基础上,使用[v-objective(Progressive Distillation for Fast Sampling of Diffusion Models)损失函数先训练 150k 步,然后以 768x768 分辨率在 LAION-5B 数据集的子集上又进行了140k步的训练得到 46 | - 512-depth-ema.ckpt:在512-base-ema.ckpt 模型的基础上继续进行 200k 步的微调训练。只不过在训练过程中增加了图像深度图(深度图信息由 MiDaS 算法生成)作为控制条件 47 | - 512-inpainting-ema.ckpt: 在 512-base-ema.ckpt 模型的基础上继续训练了200k步。和 stable-diffusion-inpainting 模型一样,使用 LAMA 中提出的Mask生成策略,将Mask作为一个额外条件加入模型训练,从而获得一个图像inpainting模型 48 | - x4-upscaling-ema.ckpt: stable-diffusion-x4-upscaler 模型是基于 Latent Diffusion 架构的4倍超分模型,采用了**基于VQ-reg正则的VAE模型**,下采样率设置为 f=4。这个模型使用LAION中分辨率大于 2048x2048 的子集(10M)作为训练集训练迭代了 1.25M 步,同时在训练过程中设置 512x512 的crop操作来降低显存占用与加速训练。如果我们用SD系列模型生成512x512分辨率的图像,再输入 stable-diffusion-x4-upscaler 模型就可以得到 2048x2048 分辨率的图像。 49 | 50 | ## 2 Stable Diffusion 2.1 相较于 2.0 的改进点 51 | 52 | SD 2.0在训练过程中采用NSFW检测器过滤掉了可能包含安全风险的图像(punsafe=0.1),但是同时也过滤了很多人像图片,这导致SD 2.0在人像生成上效果并不理想,**所以SD 2.1在SD 2.0的基础上放开了过滤限制(punsafe=0.98),在SD 2.0的基础上继续进行微调训练**。 53 | 54 | 最终SD 2.1的人像的生成效果得到了优化和增强,同时与SD 2.0相比也提高了生成图片的整体质量,其base生成分辨率有512x512和768x768两个版本: 55 | 56 | - 512-base-ema.ckpt(stable-diffusion-2-1-base模型):在stable-diffusion-2-base(512-base-ema.ckpt) 模型的基础上,放开NSFW检测器限制(punsafe=0.98),使用相同的训练集继续微调训练220k步。 57 | - 768-v-ema.ckpt(stable-diffusion-2-1模型):在stable-diffusion-2(768-v-ema.ckpt 2.0)模型的基础上,使用相同NSFW检测器规则(punsafe=0.1)和相同数据集继续微调训练了55k步,然后放开NSFW检测器限制(punsafe=0.98),额外再微调训练了155k步。 58 | 59 | ### Ref: 60 | - https://zhuanlan.zhihu.com/p/632809634 61 | -------------------------------------------------------------------------------- /notes/031_sdxl_turbo.md: -------------------------------------------------------------------------------- 1 | # SDXL Turbo: Adversarial Diffusion Distillation 2 | [paper](https://arxiv.org/pdf/2311.17042) | [code](https://github.com/Stability-AI/generative-models) 3 | 4 | ## 摘要 5 | 6 | 本文提出了一种新的蒸馏训练方法 -- Adversarial Diffusion Distillation (ADD) ,训练得到的 SDXL Turbo 模型只需要1-4步就能够生成高质量图。利用已有的 diffusion models 作为 teacher 信号,使用 score distillation 方法,结合 adversarial loss,以确保即使在一两个采样步骤的状态下也能确保证图像的保真度。 7 | 8 | 分析表明,ADD 的单步生成结果明显优于其它的 few-step 方法,如 GANs、LCM 等,并且仅用 4 步采样就能达到 SDXL 的 SOTA 性能。 同时,ADD 是第一个利用基础模型实现单步实时图像生成的方法。 9 | 10 | ## 1 引言 11 | 12 | Diffusion Models 的一个主要问题是由于其多步迭代过程导致推理很慢。 13 | 14 | **SDXL Turbo 模型本质上依旧是 SDXL 模型,其网络架构与 SDXL 一致**,可以理解为一种经过蒸馏训练后的SDXL模型,优化的主要是生成图像时的采样步数。 15 | 16 | 本文的主要贡献: 17 | 18 | - 提出 ADD(Adversarial Diffusion Distillation)方法,可以使已有的 pretrained diffusion models 仅通过 1~4 步采样就可以生成高质量图像; 19 | - 该方法将 adversarial training 和 score distillation 结合在一起; 20 | - ADD 性能优于 LCM、LCM-XL 以及 GANs 等方法,单步采样即可生成复杂的图像生成任务; 21 | - 若使用 4 步采样,ADD-XL 的性能甚至优于其 teacher 模型 SDXL; 22 | 23 | ## 2 背景 24 | 25 | 为了解决 Diffusion Models 推理慢的问题,有一些 model distillation 方法被提出,比如 progressive distillation 和 guidance distillation,它们可以将采样步骤减少到 4-8 步,但是性能有明显的下降,而且仍然需要一个迭代训练过程。 26 | > progressive distillation:渐进式蒸馏,目标是将一个步骤很多的教师扩散模型蒸馏为一个步骤较少的学生模型,一般通过反复迭代的方式进行。 27 | > guidance distillation 28 | 29 | LCM、LCM-LoRA 可以实现单步采样,并且可以即插即用到已有的 SD 模型中(详见 LCM 的解读)。InstaFlow 提出使用 Rectified Flows 来实现更好的蒸馏过程。 30 | 31 | 上述这些方法都有共同的缺陷:生成的图像存在模糊和伪影问题。 32 | 33 | GANs 虽然可以单步生成,但是其性能明显不如 diffusion-based models。 34 | 35 | Score Distillation Sampling 也被称为 Score Jacobian Chaining,是最近被提出的一种蒸馏方法,该方法用于将基础 text-to-image 模型的知识提取到 3D 合成模型中。 36 | 37 | ## 3 Method 38 | 39 | ### 3.1 Training Procedure 40 | 41 |
42 | image 43 |
44 | 45 | 网络结构由三部分组成: 46 | 47 | 1)ADD-student, 用 pretrained diffusion models 做初始化,参数记为 $\theta$; 48 | 2)discriminator,判别器,参数记为 $\varphi$; 49 | 3)DM teacher,一个 diffusion models 作为 teacher,参数冻住,记为 $\psi$; 50 | 51 | 训练阶段,给定一张原始图片 $x_{0}$,通过前向扩散过程得到噪声图像 $x_{s} = \alpha_{s}x_{0} + \sigma_{s}\epsilon$,送入 ADD-student 生成样本 $\hat{x}_{\theta } (x_{s}, s)$,然后将 $\hat{x}_{\theta }$ 和 $x_{0}$ 送入判别器以计算 adversarial loss。 52 | > 实际实验中,系数 $\alpha_{s}$ 和 $\sigma_{s}$ 是相同的,因为采样步长 $s$ 是从 ${\tau_{1},...,\tau_{1000}}$ 中均匀采样 N 个样本得到的,其中 N = 4,这也决定了推理时需要的迭代次数。 53 | 54 | 为了从 DM teacher 中蒸馏知识,将 $\hat{x}_{\theta }$ 送入到 teacher 模型中,去噪得到 $\hat{x}_{\psi } (\hat{x}_{\theta,t},t)$,两者计算蒸馏损失 $\mathcal{L}_{distill}$。 55 | 56 | ### 3.2 Adversarial Loss 57 | 58 | 借鉴了 GANs 的思想,设计了Hinge loss(支持向量机SVM中常用的损失函数)作为 SDXL Turbo 模型的 adversarial loss,通过一个 Discriminator 来辨别 student 模型(SDXL 1.0 Base)生成的图像和真实的图像,以确保即使在一个或两个采样步数的低步数状态下也能有高图像保真度,**同时避免了其他蒸馏方法中常见的失真或模糊问题**。 59 | 60 | ### 3.3 Score Distillation Loss 61 | 62 | 经典的蒸馏损失函数,让一个强力 Diffusion Model 作为 teacher 模型并冻结参数,让 student 模型(SDXL 1.0 Base)的输出和教师模型的输出尽量一致,具体计算方式使用的是**机器学习中经典的L2损失**。 63 | 64 | 整个训练过程的损失函数可以表示为: 65 | 66 | $$\mathcal{L} = \mathcal{L}_{adv}^{G}(\hat{x}_{\theta}(x_{s},s), \phi) + \lambda \mathcal{L}_{distill}(\hat{x}_{\theta}(x_{s},s), \psi)$$ 67 | 68 | 其中,$\lambda=2.5$。 69 | 70 | ## 4 实验 71 | 72 | ### 4.1 消融实验 73 | 74 |
75 | image 76 |
77 | 78 | ### 4.2 性能对比 79 | 80 | - 单步结果 81 |
82 | image 83 |
84 | 85 | - 4 步结果 86 |
87 | image 88 |
89 | 90 | ### 4.3 速度对比 91 | 92 |
93 | image 94 |
95 | 96 | ### 4.4 不同蒸馏方法对比 97 | 98 |
99 | image 100 |
101 | 102 | ### ref: 103 | 104 | - https://zhuanlan.zhihu.com/p/643420260 105 | -------------------------------------------------------------------------------- /notes/032_llava.md: -------------------------------------------------------------------------------- 1 | # Visual Instruction Tuning 2 | 3 | ## 摘要 4 | 5 | 使用机器生成(machine-generated)的指令遵循数据来微调 LLMs,可以提高模型的 zero-shot 能力,但是在多模态领域该方式的有效性还未得到验证。本文首次尝试仅使用 GPT-4 来生成多模态 language-image 指令遵循数据,并且通过在这些生成的数据上进行指令精调,提出了一个端到端训练的多模态模型 LLaVA。LLaVA 连接了一个 vision encoder 和一个 LLM,用于通用的视觉-语言理解。 6 | 7 | 为了促进未来对视觉指令遵循的研究,本工作构建了两个 benchmark,包含多样性(diverse)和挑战性(challenging)的应用导向(application-oriented)任务。实验表明,LLaVA 展现出了令人印象深刻的多模态聊天能力,在合成的多模态指令遵循数据集上与 GPT-4 相比获得了85.1%的相对分数。在科学问答(Science QA)上进行微调后,LLaVA 和 GPT-4 的协同作用达到了92.53%的准确率。 8 | 9 | ## 1 引言 10 | 11 | 本文主要贡献: 12 | 13 | - Multimodal instruction-following data:提出了一个数据重构的流程,使用ChatGPT/GPT-4将图像-文本对转换为适当的指令遵循格式 14 | - Large multimodal models:提出了一个多模态大模型,通过将 CLIP 的 visual encoder 与 Vicuna 的 language decoder 连接,并在生成的指令性视觉-语言数据上进行端到端的微调 15 | - Multimodal instruction-following benchmark:开源了两个多模态 benchmark 16 | - Open-source:开源,包括多模态指令数据生成方式、codebase、checkpoints、visual chat demo 17 | 18 | ## 2 相关工作 19 | 20 | Multimodal Instruction-following Agents 多模态指令遵循范式主要分为两大类: 21 | 22 | - end-to-end 训练:比如图像编辑领域的工作 InstructPix2Pix,输入图像和文本指令,实现图像编辑 23 | - 通过 LangChain/LLMs 协调各种模型系统:如 Visual ChatGPT、X-GPT、MM-REACT、VisProg、ViperGPT 等 24 | 25 | Instruction Tuning 指令精调:在 NLP 领域,指令精调已经成为了训练范式的一部分,如 InstructGPT、ChatGPT 等都是指令精调后的对话模型;在多模态领域,有一些利用蒸馏的方法,如 Flamingo 等 26 | 27 | ## 3 视觉指令数据生成 28 | 29 | 已经有一些开源的多模态数据 image-text 对,比如 CC、LAION 等。但是无法直接作为指令遵循数据使用,如果进行人工处理是非常耗时且标准难以统一的。受 NLP 领域利用 GPT 实现文本标注的启发,本文提出了一种使用 ChatGPT/GPT-4 实现多模态指令遵循数据生成的方法。 30 | 31 | 对于一张图像 $X_v$ ,其 caption 表示为 $X_c$ ,自然地可以构造一组问题 $X_q$ ,期望模型以 caption 回答这些问题。本文利用 GPT-4 生成了一些 question list,如下: 32 | 33 | - 生成简短的图像描述指令 list 34 | 35 | ![brief image desc](https://github.com/user-attachments/assets/cb253fce-ff77-4cc4-b931-d320cd05aff0) 36 | 37 | - 生成详细的图像描述指令 list 38 | 39 | ![detail image desc](https://github.com/user-attachments/assets/c42f9c3b-4613-4b23-bd92-ae10f577ca2b) 40 | 41 | LLaVA 中单条指令数据格式可以构造为:$Human: X_q X_v Assistant: X_c $。 42 | 43 | 数据格式已经确定,但是近通过上述简单的 question 构造的数据缺乏多样性以及推理难度。为了解决该问题,使用 GPT-4 来丰富数据,但是 GPT 只能接收文本 prompt,所以需要先将图像编码为视觉特征,让视觉特征作为 prompt 来请求 GPT,那么视觉特征的表示形式(symbolic representations)有以下两种类型: 44 | 45 | - Caption:通常从不同的角度描述视觉场景 46 | - Bounding boxes:通常定位场景中的目标,每个 box 对目标及其空间位置进行编码 47 | 48 | 利用以上两种信息,可以生成三类指令遵循数据: 49 | 50 | - Conversation:问题涉及图像的视觉内容,包括对象类型、数量、对象动作、对象位置、对象之间的相对位置等,只有那些有明确答案的问题才被考虑在内。 51 | - Detailed description:为了包含图像的丰富和全面的描述,首先使用 GPT-4 生成了一个问题列表;对于每张图像,然后从列表中随机抽取一个问题,让 GPT-4 生成详细的描述。 52 | - Complex reasoning:以上两种类型侧重于视觉内容本身,在此基础上进一步创建了深入的推理问题,答案通常需要通过遵循严格的逻辑逐步推理过程。 53 | 54 | 对于每种数据类型,首先手动设计一些示例(这是数据收集阶段唯一的人工标注),然后被用作 GPT-4 上下文学习的种子示例。以下是每种数据类型的示例: 55 | 56 | ![](https://github.com/user-attachments/assets/4368a6dd-930a-4fca-8f0b-93499dcacd4a) 57 | 58 | (我觉得这里应该给出 prompt 示例,举例说明是如何从 caption 和 boxes 信息请求 GPT-4 得到以下三种对话类型的) 59 | 60 | 通过以上方式,LLaVA 共收集了 158K 样本,其中 58K conversations,23K detailed description,77K complex reasoning。同时做了 ChatGPT 和 GPT-4 生成质量的对比,结果是 GPT-4 更好。 61 | 62 | ## 4 视觉指令微调(Visual Instruction Tuning) 63 | 64 | ### 4.1 模型结构 65 | 66 | ![](https://github.com/user-attachments/assets/20ca1402-f781-4cb4-9849-2c4142868254) 67 | 68 | 主要目标是有效地利用预训练的 LLM 和视觉模型的能力。模型结构如上,LLM 选择的是 Vicuna,Vision Encoder 选择的为 CLIP。 69 | 70 | 整体结构比较好理解,主要就是图像通过 vision encoder 编码之后,需要一个 **Projection W** 将其对齐到语言空间,然后将 visual tokens 和 language tokens 拼接之后送入 LLM,最终得到 response。 71 | 72 | 其中,projection W 是非常轻量的,LLaVA 中使用的是 MLP,另外也可以考虑用 gated cross-attention 和 Q-former 代替。 73 | 74 | ### 4.2 训练 75 | 76 | 模型训练的输入序列如下(示例为两轮对话): 77 | 78 | ![](https://github.com/user-attachments/assets/05be3b2c-0f6b-4949-8fe7-53c5b76e886e) 79 | 80 | 对于每一张图 $X_v$,生成多轮对话数据 $(X^1_q, X^1_a, ..., X^T_q, X^T_a)$,其中 T 是对话轮数。第 t 轮的指令为: 81 | 82 | ![](https://github.com/user-attachments/assets/514e0e0c-cc1d-430f-8e36-9afd7e4b24a2) 83 | 84 | 或者说,只有在第一轮对话时,指令输入包含图像,后续的对话指令只有问题。 85 | 86 | 指令微调本质还是 LLM 预测下一个 token,训练目标仍然是一个自回归过程。具体来说,对于长度为 L 的序列,目标回答 $X_a$ 的概率为: 87 | 88 | ![](https://github.com/user-attachments/assets/6e860f70-1bf2-4361-9986-b67f53bbadfb) 89 | 90 | 其中,$/theta$ 是可训练参数,模型预测答案和停止的位置,因此只有绿色的序列/标记用于计算自回归模型中的损失。 91 | 92 | 对于 LLaVA 的训练,包含了两个阶段的指令调优过程: 93 | 94 | - **Stage 1: Pre-training for Feature Alignment** 95 | 96 | 首先对 CC3M 数据集清洗得到 595K 的 image-text pair 对(paper 附录中有清洗流程,数据处理挺重要的,建议看一下细节),按照最简单的方式将其转换为指令遵循数据格式,转换之后每个样本都是一个单轮对话。 97 | 98 | 在 pre-training 阶段,只训练 projected W,vision encoder 和 LLM 都是 frozen 的,主要目的就是将图像特征 $H_v$ align 到 LLM 的语言空间中。这一阶段可以理解为**训练一个兼容于 LLM 的 visual tokenizer**。 99 | 100 | - **Stage 2: Fine-tuning End-to-End** 101 | 102 | 该阶段仍然保持 visual encoder frozen,继续训练 projection layer 和 LLM。主要在两个场景上进行了微调: 103 | 104 | - Multimodal Chatbot:多模态对话,训练数据就是上面清洗得到的 158K 样本 105 | - Science QA:科学问答,训练数据就是将 ScienceQA 处理成了单轮对话的形式 106 | 107 | 训练细节: 108 | 109 | - 8 x A100 110 | - pre-training on CC-595K for 1 epoch,lr=2e-03,batch_size=128 111 | - finetune on LLaVA-Instruct-158K for 3 epoch,lr=2e-05,batch_size=32 112 | - Adam with no weight decay,cosine learning rate,warmup ratio of 3% 113 | - Pretraining on CC-595K 耗时 4h,finetune on Instruct-158K 耗时 10h,finetune on ScienceQA 耗时 4h 114 | 115 | ## 5 实验 116 | 117 | ### 5.1 Multimodel Chatbot 118 | 119 | 对话效果展示直接看 paper。 120 | 121 | **Quantitative Evaluation** 122 | 123 | 量化评估主要衡量模型的指令遵循能力,利用 GPT-4 来判断生成结果的质量(感觉这里有点不公平,LLaVA 的训练数据就是 GPT-4 生成的,然后用 GPT-4 作为标准肯定是更友好的,但是应该也没有更好的办法了),具体方式为: 124 | 125 | > After obtaining the responses from both models, we feed the question, visual information (in the format of textual descriptions), and the generated responses from both assistants, to the judge (i.e., text-only GPT-4). 126 | 127 | benchmark 有两个: 128 | 129 | - **LLaVA-Bench (COCO)** 130 | 131 | 从 COCO-Val-2014 中随机选取 30 张图,对于每张图片,使用上面提到的方法生成三种类型((conversation, detailed description, complex reasoning)的 question,共 90 条数据。该 benchmark 反映了模型对具有一致视觉输入的对齐行为和能力。对于三种类型的训练数据做了消融实验,结果是同时使用三种类型数据,性能更好,指标如下: 132 | 133 | ![](https://github.com/user-attachments/assets/f275b3a0-98bb-4bd9-b871-8b4b1c5391c8) 134 | 135 | - **LLaVA-Bench (In-the-Wild)** 136 | 137 | 为了评估模型在更具挑战性的任务和对新领域的泛化能力,本文收集了24张多样化的图片,总共60个问题,包括室内和室外场景、梗图、绘画、素描等,并为每张图片提供了高度详细且手动策划的描述和适当的问题选择。与 Flamingo 和 BLIP-2 的对比结果: 138 | 139 | ![](https://github.com/user-attachments/assets/71c618a8-60c8-4ccb-8ccf-f4d79767ed80) 140 | 141 | ### 5.2 ScienceQA 142 | 143 | ScienceQA 数据集包含 21k 多模态多项选择题,覆盖 3 个 projects、26 个 topics、127 个 categories 和 379 个 skills,其中训练集 12726,验证集 4241,测试集 4241。 144 | 145 | 和其它方法之间的对比: 146 | 147 | ![](https://github.com/user-attachments/assets/8b40e854-48ca-426c-b63c-b309933c6862) 148 | 149 | 另外,在 ScienceQA 数据上进行了一系列的消融实验,主要对比了以下几个方面: 150 | 151 | - visual features 152 | 153 | 对比了使用 CLIP vision encoder 最后一层之前和之后的特征,结果是使用最后一层之前的特征性能更好,原因可能是与之前的层相比,CLIP的最后一层特征可能更多地关注全局和抽象的图像属性,而之前的层可以更多地关注有助于理解特定图像细节的局部属性。 154 | 155 | - Chain-of-thought 156 | 157 | 对比了 reasoning-first 和 reasoning-first,结论是 reasoning-first 可以大大提高收敛性,但对最终性能的贡献相对较小。 158 | 159 | - Pre-training 160 | 161 | 跳过 pre-training,直接在 ScienceQA 上 train from scratch,性能下降 5.11%,说明了 pre-training 的有效性。 162 | 163 | - Model size 164 | 165 | 对比了 13B 和 7B 模型,显然 13B 更好。 166 | 167 | 具体指标如下: 168 | 169 | ![](https://github.com/user-attachments/assets/a018dc6a-b9c1-45ee-863e-dbca79abfd1b) 170 | 171 | ## 6 数据生成时的一些细节 172 | 173 | - GPT-4 生成 conversation 数据的 prompt 174 | 175 | ![](https://github.com/user-attachments/assets/54073b8d-9bd0-4d86-8107-c60a20573626) 176 | -------------------------------------------------------------------------------- /notes/033_minigpt4.md: -------------------------------------------------------------------------------- 1 | # MiniGPT-4: Enhancing Vision-Language Understanding with Advanced Large Language Models 2 | 3 | [paper](https://arxiv.org/pdf/2304.10592) | [project page](https://minigpt-4.github.io/) | [code](https://github.com/Vision-CAIR/MiniGPT-4) | [huggingface](https://huggingface.co/Vision-CAIR/MiniGPT-4) 4 | 5 | 团队来自阿卜杜拉国王科技大学。 6 | 7 | ## 摘要 8 | 9 | 最近的 GPT-4 已经证明了非凡的多模态能力,我们认为 GPT-4 的多模态生成能力的主要是利用了更强的 LLM。为了验证该结论,本文提出 MiniGPT-4,仅通过一个 projection layer 将 visual encoder 和 LLM 进行对齐。实验结果表明,MiniGPT-4 展示出了很多类似于 GPT-4 的功能,同时还观察到其它新的能力。 10 | 11 | 实验中发现仅对原始 image-text pair 进行预训练可能会产生不自然的语言输出,这些输出缺乏连贯性,包括重复和碎片化的句子。为了解决这个问题,在第二阶段构造了一个高质量、对齐的数据集,使用对话模板进一步微调模型。这一步被证明对于增强模型的生成可靠性和整体可用性至关重要,另外模型计算效率很高,因为只使用大约 500 万个对齐的 image-text pair 训练投影层。 12 | 13 | ## 1 引言 14 | 15 | 本文主要贡献: 16 | 17 | - 通过将 visual feature 和 LLM 对齐,可以实现 vision-language 的涌现能力,实验证明 MiniGPT-4 拥有 GPT-4 类似的能力; 18 | - MiniGPT-4 是 computational efficiency 的,仅通过训练一个 projection layer 就可以实现 align; 19 | - 本文发现仅通过公开的数据集进行预训练,输出缺乏连贯性,需要 high-quality、well-aligned 数据继续进行 fine-tune。 20 | 21 | ## 2 相关工作 22 | 23 | **LLM** 24 | 25 | 早期的语言模型 BERT、GPT-2、T5,大语言模型 GPT-3、Megatron-Turing NLG、Chinchilla、PaLM、OPT、BLOOM、LLaMA,预训练+后训练范式的形成 InstructGPT、ChatGPT、Alpaca、Vicuna 等。 26 | 27 | **Leveraging Pre-trained LLMs in Vision-Language Tasks** 28 | 29 | 连接 visual encoder 与 LLM 的主要方式有: 30 | 31 | - Flamingo 中的 gated cross-attention 32 | - BLIP-2 中的 Q-Former 33 | - MLP 34 | 35 | ## 3 方法 36 | 37 | 38 | 39 | MiniGPT-4 旨在将预训练的 vision encoder 与 LLM 之间进行对齐。其中选择 Vicuna 作为 language decoder,与 BLIP-2中 一样使用 ViT-G/14 + Q-Former 作为 visual encoder,使用一个 linear projection layer 进行两者之间的对齐。 40 | 41 | MiniGPT-4 采用了两阶段的训练,pre-training 阶段使用收集的大量对齐的 image-text 对来获取视觉语言知识,fine-tune 阶段在一个小的高质量的 image-text 数据集上训练。 42 | 43 | ### 3.1 pre-training stage 44 | 45 | 数据:Conceptual Caption,SBU,LAION 数据集结合得到预训练阶段的数据,使用 batch size 256 共训练 20000 steps,覆盖约 5 million image-text pairs。 46 | 47 | 参数:预训练时仅训练 linear projection layer。 48 | 49 | 预训练阶段的问题:很难产生连贯的语言输出,例如生成重复的单词或句子、碎片化的句子或不相关的内容。 50 | 51 | ### 3.2 high-quality aligment dataset 52 | 53 | 为了解决上述预训练模型的问题,需要构造一批高质量、对齐的数据进行后续的 fine-tune。 54 | 55 | **Initial aligned image-text generation** 56 | 57 | 给定一张图片,首先使用第一阶段的预训练模型生成描述,为了使模型能够产生更详细的描述,我们设计了一个符合 Vicuna 语言模型 conversation 格式的提示,如下所示: 58 | 59 | ```python 60 | ###Human: Describe this image in detail. Give as many details as possible. Say everything you see. ###Assistant: 61 | ``` 62 | 63 | 其中 `` 表示 linear projection 后的 visual features(一堆浮点数?应该就是类似 visual token embedding)。 64 | 65 | 为了识别不完整的句子,然后检查生成的句子是否超过 80 个 token。如果没有,继续使用 prompt:`###Human: Continue ###Assistant:` 令模型继续生成,最终使模型生成更加全面的描述。从 CC 数据集中随机选取 5000 张图使用上述方式生成了一份微调数据集。 66 | 67 | (使用预训练模型生成数据继续微调,左脚蹬右脚上天?不太能理解。) 68 | 69 | **Data post-processing** 70 | 71 | 以上生成的图像描述仍然有很多噪声并且包含错误,例如单词或句子的重复以及不连贯陈述的存在。为了解决这些问题,使用 ChatGPT 对描述信息进行 refine,prompt 如下: 72 | 73 | ```python 74 | Fix the error in the given paragraph. Remove any repeating sentences, meaningless characters, not English sentences, and so on. Remove unnecessary repetition. Rewrite any incomplete sentences. Return directly the results without explanation. Return directly the input paragraph if it is already correct without explanation. 75 | ``` 76 | 77 | 后处理之后,再手动验证每个图像描述的正确性,保证其高质量。具体来说,检查每个生成的图像描述是否遵循我们想要的格式,并通过消除 ChatGPT 无法检测到的冗余词或句子来手动细化生成的描述。最终 5000 个样本清洗出 3500 条作为第二阶段的训练。 78 | 79 | ### 3.3 Fine-tune 80 | 81 | 在第二阶段,训练数据格式如下: 82 | 83 | ```python 84 | ###Human: ###Assistant: 85 | ``` 86 | 87 | (这和第一阶段有什么区别,为什么要单独说?) 88 | 89 | 其中,`` 随机从类似下面的指令中进行选取: 90 | 91 | ``` 92 | "Describe this image in detail" 93 | "Could you describe the contents of this image for me" 94 | ``` 95 | 96 | NOTE:It is important to note that we do not calculate the regression loss for this specific text-image prompt. 97 | 98 | (也很奇怪,哪些方法会对 `` 这写 prompt 计算 loss?) 99 | 100 | ## 4 结果展示 101 | 102 | - 生成图像描述 103 | - 识别图像中的有趣信息 104 | - 发现图像中不寻常的内容 105 | - 根据手写文本生成网站 106 | - 识别图像中的问题并提供解决方案的能力 107 | - 根据图像作诗或歌词 108 | - 根据图像写故事 109 | - 生成图像评论 110 | - 检索与图像相关的信息 111 | - 给定图像教人烹饪 112 | 113 | 论文展示了上述的一些能力,具体例子直接看 paper。 114 | 115 | ## 5 局限性 116 | 117 | - Language hallucination:幻觉 118 | - Inadequate perception capacities:感知能力不足 119 | 120 | Paper 读下来整体感觉像是一个报告,很多东西都没有交代清楚,但是 MiniGPT-4 这个工作很火,可能是是做多模态比较早? 121 | -------------------------------------------------------------------------------- /notes/034_qwenvl.md: -------------------------------------------------------------------------------- 1 | # Qwen-VL: A Versatile Vision-Language Model for Understanding, Localization, Text Reading, and Beyond 2 | 3 | [paper](https://arxiv.org/pdf/2308.12966) | [code](https://github.com/QwenLM/Qwen-VL/tree/master) 4 | 5 | ## TL;DR 6 | 7 | Qwen-VL: Qwen-VL 以 Qwen-7B 的预训练模型作为语言模型的初始化,并以 [Openclip ViT-bigG](https://github.com/mlfoundations/open_clip) 作为视觉编码器的初始化,中间加入单层随机初始化的 cross-attention,经过约1.5B的图文数据训练得到。最终图像输入分辨率为448。 8 | 9 | Qwen-VL 给出了大量的数据清洗细节,这点非常赞,个人认为现阶段对数据有深入的认识和丰富的清洗经验非常重要,比调参更重要。(真的每当听到诸如 “你只是整了一些数据” 此类的话就非常反感:)) 10 | 11 | 一些训练技巧: 12 | 13 | - 大量的数据清洗方法 14 | - 为了避免图像细节丢失,使用更高分辨率输入,为了缓解引入的计算量,使用 window attention 15 | - 训练时始终使用一些纯文本数据,以维持原有的 LLM 能力 16 | 17 | ## Abstract 18 | 19 | 本文介绍了 Qwen-VL 系列工作,一组 vision-language 模型。以Qwen-LM 作为基座,通过以下设计赋予其视觉能力:1)visual receptor;2)input-output interface;3)3-stage training pipeline;4)multilingual multimodal cleaned corpus。除了传统的图像描述(image description)和问答(qution-answerning)能力,Qwen-VL 还通过对齐 image-caption-box 扩展出了 grounding 和 text-reading 能力。在众多的多模态模型对比中,Qwen-VL 系列取得了 SOTA 的效果。 20 | 21 | ## 1 Introduction 22 | 23 | 当前的开源 VLM 训练和优化还是不足的,和那些闭源模型比还有一定差距。 24 | 25 | 由于现实世界的视觉场景非常复杂,细粒度(**fine-grained**)的视觉理解对 VLM 非常重要,但在这个方向上的尝试还不够,大多数开源 VLM 仍然以粗粒度(coarse-grained)方法感知图像,缺乏细粒度感知的能力,例如 object grounding 或 text reading。 26 | 27 | Qwen-VL 通过引入一个 **visual receptor** 使得 LLM 基座模型具备了视觉能力,visual receptor 由一个 language-aligned visual encoder 和一个 position-aware adapter 构成。 28 | 29 | 总结来说,Qwen-VL 系列模型具备以下特征: 30 | 31 | - Leading performace:在相同尺寸的模型对比中,在多个 benchmark 上都取得了 SOTA 结果; 32 | - Multi-lingual:支持多语种; 33 | - Multi-image:允许任意的 image-text 数据交错输入; 34 | - Fine-grained visual understanding:得益于更高分辨率的图像输入以及细粒度语料的使用,Qwen-VL 表现出极具竞争力的细粒度视觉理解能力,与现有的 VLM 相比,Qwen-VL 具有更好的 grounding、text-reading、text-oriented question answering 和 fine-grained dialog 能力。 35 | 36 | ## 2 Method 37 | 38 | ### 2.1 Model Architecture 39 | 40 | ![](https://github.com/user-attachments/assets/d2805997-8e11-462f-9c6c-af58f56713a1) 41 | 42 | **Large Language Model**:Qwen-VL 采用 Qwen-7B 作为 language decoder。 43 | 44 | **Visual Encoder**:visual encoder 采用的是 CLIP ViT-bigG。 45 | 46 | **Position-aware Vision-Language Adapter**: 47 | 48 | 为了缓解长图像特征序列带来的效率问题,Qwen-VL 引入了一个 vision-language adapter 来压缩图像特征,其包括一个随机初始化的单层 cross-attention 模块。该模块使用一组可训练向量(Embeddings)作为 query vectors,由 visual encoder 得到的 image features 作为 key,以此将视觉特征序列压缩为 256 的固定长度。 49 | 50 | (这里的 256 指的是 token embedding 维度还是 token 数量?) 51 | 52 | 此外,考虑到位置信息对细粒度图像理解的重要性,将 2D absolute positional encodings 合并到 cross-attention 的 query-key 中(具体如何实现?),以减轻压缩过程中位置细节的潜在损失。最终将长度为 256 的压缩图像特征序列输入到大型语言模型中。 53 | 54 | ### 2.2 Inputs and Outputs 55 | 56 | **Image Input** 57 | 58 | 图像经过 visual encoder 和 adapter 处理之后得到固定长度的图像特征序列,为了区分图像特征输入和文本特征输入,使用两个 special tokens 进行区分:` `和 ``,标记图像特征的开始和结束。 59 | 60 | **Bounding Box Input and Output** 61 | 62 | 为了增强模型的细粒度视觉理解和 grouding 能力,Qwen-VL 的训练涉及 region 描述、问题和 detections。与其它的多模态模型不同,Qwen-VL 的输入包括 bounding box 信息及其对应区域的描述。对于 box,首先用归一化对坐标进行了处理(处理至范围[0, 1000),不太理解?),并且转换为指定的字符串格式:"(Xtoplef t, Ytoplef t), (Xbottomright, Ybottomright)"。坐标信息与其它文本信息一致,tokenizer 无需额外的 positional vocabulary。为了区分上面的 detection string 和常规的指令 text string,使用 `` 和 `` 两个 special tokens 进行区分。此外,为了将 region 描述信息与其对应的 box 对应起来,使用 `` 和 `` 两个 special tokens 对框内的描述内容进行标记。 63 | 64 | (这里应该给出一条训练数据的示例) 65 | 66 | ## 3 Training 67 | 68 | ![](/home/zhaoxiangming/.config/Typora/typora-user-images/image-20241219100216907.png) 69 | 70 | Qwen-VL 的训练 pipeline 包括三个阶段:前两个阶段为 pre-training,最后一个阶段为 instruction fine-tune。 71 | 72 | ### 3.1 Pre-training 73 | 74 | 第一个阶段的 pre-training,主要使用 large-scale,weakly labeled,web-crawled 的 image-text pairs 进行训练,数据包含了几个开源数据集(LAION-en、LAION-zh、LAION-COCO、DataComp、Coyo)以及一些内部数据,并对数据进行了清理,由原始的 5 billion 清理至 1.4 billion,其中 77.3% 为英文语料,22.7% 为中文语料,具体分布如下: 75 | 76 | ![](https://github.com/user-attachments/assets/14136fb9-ebf2-4d40-bb41-f530a9796a35) 77 | 78 | 79 | 80 | 在该阶段训练时,将 LLM 进行 freeze,仅优化 vision encoder 和 VL adapter 部分,图像输入分辨率为 224 x 224。训练目标为 minimize the cross-entropy of the text tokens。 81 | 82 | ### 3.2 Multi-task Pre-training 83 | 84 | 该阶段,Qwen-VL 使用了 high-quality、fine-gained 的数据进行训练,图像输入分辨率更高,且 image-text 交替输入(第一阶段应该只有单轮输入)。各任务所使用的数据集和样本量: 85 | 86 | ![](https://github.com/user-attachments/assets/0729b30a-e763-432a-a430-29630a2c9a89) 87 | 88 | 训练数据格式: 89 | 90 | ![](https://github.com/user-attachments/assets/5786b267-6441-43fa-bf58-c93212a0789c) 91 | 92 | 对于 text generation 任务(纯文本),使用了内部数据来维持 Qwen-VL 的 LLM 能力(应该是怕模型坍塌,使原本的语言能力丢失)。 93 | 94 | 该阶段,图像输入分辨率提高到 448 x 448,以此减少图像信息的丢失。 95 | 96 | 需要说明的是,使用高分辨率的 vision transformer 会带来计算量的增加,一种解法是在 vision transformer 中使用 **window attention**,比如每 4 个 layer 中,其中 3 个使用窗口大小为 224x224 的 window attention,1个使用原始的 attention。 97 | 98 | 训练时打开了 LLM,整个 Qwen-VL 均参与训练,训练目标和第一阶段一致,即 predict next token。 99 | 100 | ### 3.3 Supervised Fine-tuning 101 | 102 | 该阶段主要是在指令数据上进行微调以提高对话能力,得到的模型为 Qwen-VL-Chat。数据主要来自 caption data 和由 LLM self-instruction 生成的对话数据,通常只解决单图像对话和推理,仅限于图像内容理解。另外通过手动注释、模型生成和策略连接构建了一组额外的对话数据,以将引入 localization 和多图理解能力。此外,在训练期间混合多模态和纯文本对话数据,以确保模型在对话能力方面的泛化性。 103 | 104 | 最终使用的指令数据量为 350K,该阶段训练时 freeze 住 vision encoder,仅优化 LLM 和 VL adapter 部分。 105 | 106 | 训练数据格式: 107 | 108 | ![](https://github.com/user-attachments/assets/1f0a19c0-cfd5-442d-afbb-cf5fbe74779b) 109 | 110 | 训练数据示例如下: 111 | 112 | ```json 113 | [ 114 | { 115 | "id": "identity_0", 116 | "conversations": [ 117 | { 118 | "from": "user", 119 | "value": "你好" 120 | }, 121 | { 122 | "from": "assistant", 123 | "value": "我是Qwen-VL,一个支持视觉输入的大模型。" 124 | } 125 | ] 126 | }, 127 | { 128 | "id": "identity_1", 129 | "conversations": [ 130 | { 131 | "from": "user", 132 | "value": "Picture 1: https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg\n图中的狗是什么品种?" 133 | }, 134 | { 135 | "from": "assistant", 136 | "value": "图中是一只拉布拉多犬。" 137 | }, 138 | { 139 | "from": "user", 140 | "value": "框出图中的格子衬衫" 141 | }, 142 | { 143 | "from": "assistant", 144 | "value": "格子衬衫(588,499),(725,789)" 145 | } 146 | ] 147 | }, 148 | { 149 | "id": "identity_2", 150 | "conversations": [ 151 | { 152 | "from": "user", 153 | "value": "Picture 1: assets/mm_tutorial/Chongqing.jpeg\nPicture 2: assets/mm_tutorial/Beijing.jpeg\n图中都是哪" 154 | }, 155 | { 156 | "from": "assistant", 157 | "value": "第一张图片是重庆的城市天际线,第二张图片是北京的天际线。" 158 | } 159 | ] 160 | } 161 | ] 162 | ``` 163 | 164 | ## 4 Evaluation 165 | 166 | Qwen-VL 评估了 Image Caption、VQA、Text-oriented VQA、Refer Expression Comprehension、Few-shot Learning、Instruction Following 等,具体结果直接看 paper,不在这里贴了。 167 | 168 | 各阶段训练 setting 169 | 170 | ![](https://github.com/user-attachments/assets/eccdfd2d-92d2-4ed3-9464-b9289b6e05b6) 171 | 172 | ## Bonus 173 | 174 | ### 数据清洗 175 | 176 | - Image-text pairs 177 | 178 | 对于爬虫数据以及开源数据集(LAION-en、LAION-zh、LAION-COCO、DataComp、Coyo)处理如下: 179 | 180 | 1. Removing pairs with too large aspect ratio of the image 删除长宽比过大的图像 181 | 2. Removing pairs with too small image 删除太小的图 182 | 3. Removing pairs with a harsh CLIP score (dataset-specific) 删除 CLIP 相关性得分较低的数据(特定数据集) 183 | 4. Removing pairs with text containing non-English or non-Chinese characters 删除文本包含非英文和非中文的数据 184 | 5. Removing pairs with text containing emoji characters 删除文本中包含表情符号的数据 185 | 6. Removing pairs with text length too short or too long 删除文本太长或太短的数据 186 | 7. Cleaning the text's HTML-tagged part 清理掉文本中 HTML 的内容 187 | 8. Cleaning the text with certain unregular patterns 清理掉文本中某些非常规的 pattern 188 | 189 | 对于学术 caption 数据集,删除文本中包含特殊 tag 的数据。 190 | 191 | - Multi-task 数据 192 | 193 | - VQA 194 | 195 | 对于 VQAv2 数据集,根据最大置信度选择 answer 作为标注,对于 VQA 数据集不做任何操作 196 | 197 | - Grounding 198 | 199 | 对于 GRIT 数据集,发现 caption 经常包含 recursive grounding box,使用贪心算法来清理 caption,以确保每个图像都包含大多数没有 recursive box。对于其他 grounding 数据集,只需将名词/短语与各自的 box 坐标连接起来。 200 | 201 | - OCR 202 | 203 | - 我们使用 Synthdog 方法合成 OCR 数据集。具体的,使用 COCO 数据集中的图作为背景,然后选择 41 种英文字体和 11 种中文字体生成文本,其它的就使用 Synthdog 的默认参数。由于文本是生成的,所以我们知道它的坐标位置,可以将坐标直接作为 label。 204 | - 对于 PDF 数据,使用 PyMuPDF 按照以下步骤得到标注结果: 205 | 1. Extracting all texts and their bounding boxes for each page. 206 | 2. Rendering each page and save them as an image file. 207 | 3. Removing too small image. 208 | 4. Removing images with too many or too few characters. 209 | 5. Removing images containing Unicode characters in the "Latin Extended-A" and "Latin Extended-B" blocks. 210 | 6. Removing images containing Unicode characters in the "Private Use Area (PUA)" block. 211 | 212 | - 对于 HTML 网页数据,使用 Puppeteer 按照以下步骤处理: 213 | 1. Extracting all texts for each webpage. 214 | 2. Rendering each page and save them as an image file. 215 | 3. Removing too small image. 216 | 4. Removing images with too many or too few characters. 217 | 5. Removing images containing Unicode characters in the "Private Use Area (PUA)" block. 218 | -------------------------------------------------------------------------------- /notes/035_fuyu8b.md: -------------------------------------------------------------------------------- 1 | # Fuyu-8B 2 | 3 | [blog](https://www.adept.ai/blog/fuyu-8b) | [huggingface](https://huggingface.co/adept/fuyu-8b) 4 | 5 | ## TL; DR 6 | 7 | 无 vision encoder 和 adapter(encoder-free),纯解码器结构的多模态大模型。 8 | 9 | ## Model Architecture 10 | 11 |
12 | 13 | Adept 是一家做 Copilot 创业的公司,要想高效地帮助用户,必须要准确地理解用户正在干什么,这就需要准确地理解屏幕上的图片、表格、文字等内容。 14 | 15 | 现有的多模态大模型大多是 Visual Encoder + Adapter + LLM 的结构,这些模型通常只能处理固定分辨率的模型结构。对于分辨率或长宽比不同的图像,只能通过缩放、裁剪或填充来对齐,但这无疑会大大损失掉图片中的原有信息。 16 | 17 | 另外,这些模型一般都需要经过多个不同的训练阶段,比如 Visual Encoder 通常来自 CLIP,它是以对比学习的方式单独训练的,或者先 pre-training 在 finetune,或者多任务训练、不同分辨率训练等。 18 | 19 | Fuyu 是一个纯 decoder-only transformer,**没有专门的 vision encoder 和 Adapter**。图片切分成 patch 之后,直接经过线性映射输入到 transformer 中,移除了 position embeddings,patch 之间的换行用 `\n` 来表示。这种简化的结构使得 Fuyu 支持任意图像分辨率的输入,无需单独的高分辨率和低分辨率训练阶段,大大简化了训练和推理过程。 20 | 21 | ## Evaluation 22 | 23 |
24 | 25 | 选择了四个最常用的图像理解数据集进行评估。Fuyu 模型在这些指标上表现良好,不过这些数据集主要关注自然图像,和 Fuyu 实际场景有所不同,并没有进行专门的优化。 26 | 27 | ## 总结 28 | 29 | Fuyu-8B 是站在产品的角度设计模型,主打快速响应和多功能性,简化的架构和训练程序不仅降低了部署和扩展的难度,而且还提高了模型的可解释性和透明度。 30 | 31 | 图像 patch 并映射之后直接送入 transformer,并没有处理和文本之间的语义 gap,能有比较好的效果和之前的认知有些 diff。 32 | 33 | 没有公开更多的数据和训练细节。 34 | -------------------------------------------------------------------------------- /notes/036_deepseekvl.md: -------------------------------------------------------------------------------- 1 | # DeepSeek-VL 2 | 3 | ## TL;DR 4 | 5 | - hybrid vision encoder + vision adaptor + LLM 6 | - 更加注重预训练阶段,多模态-语言之间平衡训练,避免语言能力退化; 7 | - 引入 hybrid vision encoder 支持 1024x1024 高分辨输入,提高对图像的细节理解能力; 8 | - 使用 case taxonomy(分类),构造了一份高质量的 SFT 数据; 9 | 10 | ## Abstract 11 | 12 | DeepSeek-VL 主要在以下三个方面进行了设计: 13 | 14 | - Data Construction 15 | 16 | 数据构造确保了多样性、scalable 并且广泛涵盖了现实世界的场景数据,如网络截图、PDF、OCR、图表以及专家知识等。另外,通过一个 case 分类的方法区分各种任务和场景,构造出一个指令微调数据集。 17 | 18 | - Model Architecture 19 | 20 | 考虑到性能以及实际使用场景的需要,DeepSeek-VL 使用了一个 hybrid vision encoder,可以高效处理 1024x1024 分辨率的图像输入,同时保持相对较低的计算开销。高分辨率输入确保了模型能够捕捉到各种视觉任务相关的语义和细节信息。 21 | 22 | - Training Strategy 23 | 24 | 首先,一个强的视觉-语言模型应该具有很强的语言能力。为了确保在 pre-training 阶段能够保留 LLM 能力,DeepSeek-VL 从一开始训练就对 LLM 和视觉能力之间进行了动态的平衡,从文本开始,逐渐调整比率以促进两种模态的平衡,最终实现加入视觉能力的同时不损失 LLM 本身的能力。 25 | 26 | DeepSeek-VL 提供了 1.3B 和 7B 两个大小的模型,从实验结果看均取得了不错的效果。 27 | 28 | ## 1 Introduction 29 | 30 | 在现实世界场景中,大多数开源模型和专有模型的性能差距在很大程度上很明显,这主要是由于以下原因: 31 | 32 | - 预训练不充分,大多都在指令微调阶段做工作; 33 | - 为了在 benchmark 上刷分,很多方法在指令微调阶段合并各种学术数据集,但在真实场景使用体验方面往往不是很好; 34 | - 在模型架构方面,之前的工作大多采用一个 pre-trained vision encoder,通过一个 adapter 与 LLM 进行对齐。这种方式通常仅支持较低分辨率的图像输入,如 336x336 或 448x44,对于小目标的识别不是很友好; 35 | - 多模态训练后,语言能力会退化,视觉和语言之间没有做好 trade-off。 36 | 37 | ## 2 Data Construction 38 | 39 | 训练数据分为两部分:Vision-Language pre-training Data 和 Vision-Language Supervised Fine-Tuning Data。 40 | 41 | 其中,VL pre-traning data 用来增强模型的基础多模态理解能力,用在 stage1 和 stage2 的训练;VL supervised fine-tuning data 用来教模型完成特定的下游任务,用于 stage3 的训练。 42 | 43 | ### 2.1 Vision-Language pretraining Data 44 | 45 | 预训练数据包含一系列开源数据以及一部分 DeepSeek 私有数据。然后对数据集做了详细的分类: 46 | 47 | - Interleaved image-text:图像-文本交错输入的数据,有利于模型的 in-context learning 能力; 48 | - Image caption 49 | - Table and chart:图、表数据 50 | - Web Code 51 | - Document OCR:文档中提取 OCR 52 | - Scene text OCR:场景图片中提取 OCR 53 | - Text-only corpus:DeepSeek-LLM 的纯文本训练数据,主要为了避免语言能力退化 54 | 55 | 各个部分数据来源以及占比: 56 | 57 |
58 | 59 |
60 | 61 | 需要注意的是,纯文本数据占了 70%,说明在预训练阶段语言能力的保留非常重要。 62 | 63 | ### 2.2 Supervised Fine-tuning Data 64 | 65 | SFT 数据同样包含多模数据和纯文本数据,也有一部分是私有数据,私有数据主要针对实际使用场景进行了精心设计。每个部分的数据来源和占比如下: 66 | 67 |
68 | 69 |
70 | 71 | 纯文本数据仍然占有很高的比例,47.9%,精调的数据 占有 10.5%。 72 | 73 | 具体的 case taxnonomy 方法可以看后面的 Bonus 部分。 74 | 75 | ## 3 Approach 76 | 77 | ### 3.1 Architecture 78 | 79 | **Hybrid Vision Encoder** 80 | 81 | hybrid vision encoder 用的是 SigLIP + SAM-B 的组合。 82 | 83 | SigLIP 这类的 CLIP family 模型主要提取的是 high-level 的语义特征(这和 CLIP 的训练数据有关,都是图像级的描述),它对于一些 low-level 特征并不敏感,比如 OCR 或者 grounding 等。为了解决该问题,引入了另一个 pre-trained vision encoder,即 SAM-B,可以接受 1024x1024 的高分辨率输入,用来针对图像中的细节信息。 84 | 85 | 具体来说,给定 1024x1024 的图像,SAM-B 会生成 64x64x256 的 feature map,然后 VL adaptor 将其插值为 96x96x256,然后使用两层 stride=2 的卷积层对 feature map 进行下采样,得到 24x24x1024 的特征图,最终 reshape 成 576x1024 的 feature map。另外,低分辨的分支 SigLIP 也会生成 576x1024 大小的特征图,将两者 concat 之后最终得到 576x2048 的 feature map,也就是说图像最终会分为了 576 个 token,每个 token 的特征维度为 2048,这也是前文提到的 **fixed token budget**。 86 | 87 | **Vision-Language Adaptor** 88 | 89 | adaptor 用的是两层 hybrid MLP。首先分别使用一个单层 MLP 处理 SigLIP 和 SAM-B 两个分支的特征输出,然后将特征 concat 之后得到上面的 576x2048 的 feature map,再使用一个 MLP 将其映射至 LLM 空间。 90 | 91 | **Language Model** 92 | 93 | LLM 用的是 DeepSeek-LLM,这里不做展开了。 94 | 95 | ### 3.2 Training Pipelines 96 | 97 |
98 | 99 |
100 | 101 | DeepSeek-VL 的训练分为三个阶段:1)vision-language adaptor warmup;2)joint vision-language pre-training;3)supervised fine-tunining。 102 | 103 | #### 3.2.1 Stage 1: Training Vision-Language Adaptor 104 | 105 | 第一阶段的主要目标就是对齐视觉和语言特征空间。和 LLaVA 一样,该阶段将 vision encoder 和 LLM freeze 住,只训练 adaptor 的参数,训练数据为来自 ShareGPT4V 的 1.25 million 的 caption 数据和 2.5 million 的 Document OCR 数据。 106 | 107 | 实际上,LLM 相比,adaptor 的参数量要小得多,有可能限制模型能力的学习。因此有个问题是:**在这个阶段,是否需要这么多的数据训练?**本文做了实验验证: 108 | 109 |
110 | 111 |
112 | 113 | 结果表明,在这个阶段扩展数据规模并不能带来收益,甚至可能导致性能较差。所以在第二阶段会选择 unfreeze LLM。 114 | 115 | #### 3.2.2 Stage 2: Joint Vision-Language pretraining 116 | 117 | 该阶段保持 vision encoder freeze,同时训练 adaptor 和 LLM。 118 | 119 | 最初,DeepSeek-VL 尝试用多模态数据直接训练LLM,然而,发现虽然多模态性能的指标逐步提高,但语言指标存在明显且严重下降。这种现象可能有两个因素引起:1)大多数多模态训练语料过于简单,并且与语言数据的复杂性和分布存在显着差异;2)训练过程中在多模态和纯语言之间似乎存在竞争的关系,有可能导致 LLM 语言能力的灾难性遗忘。 120 | 121 | 为了解决该问题,DeepSeek-VL 提出 joint language-multimodel training strategy。在训练期间,不仅使用多模态数据,同时还用了大量的纯语言数据,在两者之间做一个 trade-off。经过实验分析,有以下结论: 122 | 123 | 1. 引入语言数据显著减轻了语言能力的下降; 124 | 2. 引入引言数据并不会导致多模态性能的显著损失; 125 | 3. 不同模态的性能与训练数据集中各自的比例密切相关,证实了两种模态之间的竞争关系。 126 | 127 | 最终,纯文本数据和多模态数据的比例大约为 7:3。 128 | 129 | 然而,模型的预训练阶段会产生大量的计算成本,并且在 7B 模型上执行迭代需要大量的计算能力和时间。一种策略是先较小的模型(1.3B 模型)上进行实验验证,然后将其迁到 7B 模型。但是,在第二阶段的训练中,1.3B 模型的表现不是特别稳定,随后的实验使我们能够确定这个问题的根本原因:1.3B模型参数量有限以及训练数据集中 SFT 数据的缺失,这两者都阻碍了模型准确遵循指令的能力。即使模型拥有正确选项的知识,也很难精确地生成它们。 130 | 131 | #### 3.2.3 Stage 3: Supervised Fine-tuning 132 | 133 | 该阶段同时优化 LLM、adaptor 以及 vision encoder(但是 SAM-B 部分 frozen,显存扛不住),基本和其它多模方法一致的设置。 134 | 135 | 关于训练阶段的消融实验: 136 | 137 |
138 | 139 |
140 | 141 | 看起来 adaptor warm up 带来的提升有限。 142 | 143 | ### 3.3 Hyperparameters and Infrastructures 144 | 145 | 训练超参数如下,使用的训练框架为 high-flyer(幻方自己家的训练平台) 146 | 147 |
148 | 149 |
150 | 151 | ## 4 Evaluation 152 | 153 | 评测部分包括公开的多模 benchmark、LLM benchmark、人工评估,结果在这里不详细展开了,直接看 paper 吧。 154 | 155 | ## Bonus 156 | 157 | 1. case taxonomy 具体是如何做的? 158 | 159 | 首先收集一些线上的 GPT-4v 和 Gemimi 测试用例,然后对这些测试用例进行分类,如 recognition, conversion, analysis, reasoning, evaluation, and safety,具体细节如下: 160 | 161 |
162 | 163 |
164 | 165 | 结构化的分类可以作为 representative prompts(?)选取时的 guideline,并且可以通过调整每个类别数据的占比来优化模型性能。 166 | 167 | 2. modality warm-up? 168 | 169 | 其实就是第一个阶段只训 adaptor,用来先把模态空间对齐。 170 | -------------------------------------------------------------------------------- /notes/037_internvl.md: -------------------------------------------------------------------------------- 1 | # InternVL 2 | 3 | [paper](https://arxiv.org/pdf/2312.14238) | [github](https://github.com/OpenGVLab/InternVL) |[zhihu](https://zhuanlan.zhihu.com/p/702946079) 4 | 5 | ## TL;DR 6 | 7 | - 将 vision encoder scale up 到 6B; 8 | - 相比其它的 VLM 方法还多了一个 QLLaMA; 9 | - 提出一种 progressively aligns 渐进式对齐策略将视觉与LLM空间对齐(contrastive training + generative training + SFT); 10 | - InternVL 可以做 visual perception、image/video-text retrival、image caption、VQA、multi-model dialogue 多种任务; 11 | - 虽然效果很好,但还是感觉 pipeline 太复杂了; 12 | 13 | ## Abstract 14 | 15 | InternVL 将 vision encoder 扩展至 6B,然后使用一种渐进式对齐策略逐步与 LLM 对齐。该模型可以把 vision encoder 当做一个 foundation model 来做一些常规的视觉任务,如像素级图像识别等,也可以和其它多模态模型一样应用于视觉-语言任务,如 zero-shot 图像/视频分类、检索,也可以做对话系统。 16 | 17 | ## 1 Introduction 18 | 19 | 已有的 VLLMs 通常使用一个轻量的 adaptor 将 vision 与 language 特征空间对齐,这种方式有以下问题: 20 | 21 | - Disparity in parameter scales:不同模块之间的参数量存在明显差异,LLM 通常在 10B 量级,而 vision encoder 一般在 1B 左右,这种 gap 可能导致对 LLM 的能力利用不充分; 22 | - Inconsistent representation:vision encoder 的特征空间与 LLM 的特征空间通常是不一致的(这不就是 adaptor 要解决的问题吗,列在这里感觉不合适); 23 | - Inefficient connection:轻量、随机初始化的的 adaptor 可能并不高效。 24 | 25 | InternVL 的出发点就是弥补 vision encoder 与 LLM 之间 parameter scale 和 feature representation ability 的 gap。有三个主要设计: 26 | 27 | 1. Parameter-balanced vision and language components:vision encoder scaled up 至 6B,选择一个 8B 的 LLM middleware(讨厌死这些强行的新概念了,不如直接 adaptor)实现 reorganize visual features based on user commands(真的不知道在说些什么,我理解就是做 align); 28 | 2. Consistent representations:使用一个 pre-trained multilingual LLaMA 作为 middleware,实现 vision encoder 与 LLM 的对齐; 29 | 3. Progressive image-text alignment:渐进式对齐策略,先在在大规模噪声 image-text 数据上进行对比学习,逐渐过渡到在 fine-grained 数据上进行生成学习。 30 | 31 | 这些设计使得 InternVL 有以下优势: 32 | 33 | 1. Versatile:多功能的,vision encoder 可以单独作为一个视觉基础模型来处理视觉感知任务; 34 | 2. Strong:强大的性能 35 | 3. LLM-friendly:由于与 LLM 对齐特征空间,模型可以顺利地与现有的 LLM 集成,比如 LLaMA 系列、Vicuna 以及 InternLM。 36 | 37 | ## 2 Related Work 38 | 39 | Vision Foundation Models:CNN、ViT 等 40 | 41 | Large Language Models:GPT 系列、LLaMA、Vinuna、InternLM、MOSS、ChatGLM、Qwen 等 42 | 43 | Vision Large Language Models: GPT-4v、MiniGPT-4、VisionLLM、KOSMMOS-2、Qwen-VL 等 44 | 45 | ## 3 Method 46 | 47 | ### 3.1 Architecture 48 | 49 | **Large-Scale Vision Encoder: InternViT-6B** 50 | 51 | InternViT-6B 就是一个 vanilla ViT,只是将模型参数量扩展至 6B,为了在精度、速度和稳定性之间做好 trade-off,对 InternViT-6B 进行超参搜索,最终模型参数为: 52 | 53 |
54 | 55 |
56 | 57 | **Language Middleware: QLLaMA** 58 | 59 | QLLaMA 是 LLaMA 的多语言版本,在这里用来做 visual feature 和 linguistic feature 之间的对齐。在 LLaMA 权重的基础之上,额外添加了随机初始化的96个可学习 query 以及 cross-attention(共有10亿参数)。通过这种方式,QLLaMA可以将视觉特征平滑地整合到语言模型中,从而进一步增强了视觉特征与语言特征的对齐程度。 60 | 61 | 和其它常规的 adaptor (如 Q-Former、MLP)相比,QLLaMA 有三个优势: 62 | 63 | 1. 使用 LLaMA pre-trained weight 初始化,相比 Q-Former、MLP 的随机初始化具有更多的先验(但是 query 和 cross-attention 不还是随机初始化的么?这部分参数也很大); 64 | 2. QLLaMA 也是 8B 的参数规模,比 Q-Former 大 42 倍,大模型可能带来更高的性能; 65 | 3. 对齐阶段的训练可以使用对比学习,这种方式可以模型做一些 zero-shot image classification 和 image-text retrieval 任务(其实就是 CLIP 的训练方式) 66 | 67 | **"Swiss Army Knife" Model: InternVL** 68 | 69 |
70 | 71 |
72 | 73 | 通过 vision encoder 和 language middleware 之间的灵活结合,InternVL 可以支持多种纯视觉或 vision-language 任务(前面说过太多次了:)): 74 | 75 | 1. visual perception tasks:vision encoder 单独抽出来就是一个特征提取器,和传统视觉任务一样,接个 global average pooling 或 MLP 可以做图像分类; 76 | 2. contrastive tasks:得益于对比学习的对齐方式,InternVL 还可以用来做 image-text retrieval 任务,如上图的 (a)(b); 77 | 3. generative tasks:和 QFormer 不同,得益于 scaled-up 参数量,QLLaMA 固有 image caption 能力;QLLaMA 的 queries 可以 reorganize the visual representations,然后作为 text 输入给 QLLaMA,随后生成文本; 78 | 4. multi-modal dialogue:多模态对话,这里有两种选择,其一是只利用 vision encoder 的特征作为 LLM 的输入,图(c),另外一种是同时用 vision encoder 和 QLLaMA 的输出,图(d)。 79 | 80 | ### 3.2 Alignment Strategy 81 | 82 | InternVL 将整个训练过程叫做 alignment,而其它 VLM 方法大多把训练 adaptor 的阶段叫做 align,注意这里的区别。所以,stage2 的图示可以看到,从 InternViT-6B 到 QLLaMA 是通过一个 cross-attention 连接的,这部分在其它 VLM 中叫 adaptor(emm...)。 83 | 84 |
85 | 86 |
87 | 88 | InternVL 的训练包含三个渐进式阶段: 89 | 90 | **Vision-Language Contrastive Training** 91 | 92 | 该阶段是在 web-scale、noisy image-text pairs 数据上,通过 contrastive learning 将 InternViT-6B 与 multilingual LLaMA-7B 对齐。数据集都是公开的,包括 LAION-en、LAION-multi、LAION-COCO、COYO、Wukong 等,将这些数据集整合之后过滤掉一些质量极低的数据,得到该阶段的训练数据,共 4.98B,详细信息如下: 93 | 94 |
95 | 96 |
97 | 98 | 该阶段之后,vision encoder 就可以作为一个视觉基础模型使用了。 99 | 100 | **Vision-Language Generative Training** 101 | 102 | 该阶段,通过一个 cross-attention 将 vision encoder 与 QLLaMA 进行连接,其中 QLLaMA 是用第一阶段的 LLaMA 权重做初始化。 103 | 104 | > 这里有点不懂,为什么要做第一个阶段将 vision encoder 与 LLaMA 对齐,难道只是为了可以做一些视觉任务?即便是先对齐 LLaMA,这里的 QLLaMA 应该也不可以任意替换其它模型吧,毕竟这里是用第一阶段的 LLaMA 来做初始化的 105 | 106 | 训练时,保持 vision encoder 和 QLLaMA frozen,仅训练额外新增的 learnable queries 和 cross-attention 层。 107 | 108 | > 这里的 learnable queries 和 cross-attention 应该对应于其它 VLM 方法中的 adaptor(就是 QFormer?),所以,InternVL 本质并不是把 adaptor 给 scale up 了,而是在常规的 adaptor 后接了一个 LLaMA,这个 LLaMA 是在第一阶段训好的 109 | 110 | 这一阶段的训练数据是在第一阶段的数据基础之上进一步过滤,最终只有 1.03B。 111 | 112 | 和 BLIP-2 中的训练目标一致,该阶段的 loss 包含三个部分:image-text contrastive (ITC) loss、image-text matching (ITM) loss 和 image-grounded text generation (ITG) loss。 113 | 114 | **Supervised Fine-tuning** 115 | 116 | 为了验证 InternVL 在多模态对话任务中的性能,通过一个 MLP 层将其与现成的 LLM decoder 进行连接,继续进行 SFT 训练。数据构成如下,大约共 4 million 数据: 117 | 118 |
119 | 120 |
121 | 122 | 由于 QLLaMA 和 LLM 的特征空间相似(QLLaMA 的特征空间能和 Qwen 的相似吗?),即使冻结 LLM decoder,也可以实现稳健的性能,可以只训练 MLP 或者训练 MLP 和 QLLaMA,这种方法不仅加快了SFT过程,而且保持了LLM 的原始语言能力。 123 | 124 | ## 4 Experiments 125 | 126 | 实验部分给出了在 Visual Perception Benchmarks(image classification、semantic segmentation)、Vision-Language Benchmarks(image/video classification、image-text retrieval、image caption)、Multi-Modal Dialogue Benchmarks 多个任务上的效果。 127 | 128 | 下面给出一个和其它 VLM 方法对比: 129 | 130 |
131 | 132 |
133 | 134 | 一个注意的点是,用 MLP 替换 QLLaMA 貌似掉点并不多。 135 | 136 | ## Bonus 137 | 138 | 1. learnable query 具体是什么概念?如何实现? 139 | 140 | 概念应该来自 Q-Former 141 | 142 | 2. The queries of QLLaMA reorganize the visual representations. 具体是什么操作? 143 | -------------------------------------------------------------------------------- /notes/038_blip2.md: -------------------------------------------------------------------------------- 1 | # BLIP-2 2 | 3 | [paper](https://arxiv.org/abs/2301.12597) | [github](https://github.com/salesforce/LAVIS/tree/main/projects/blip2) 4 | 5 | ## TL;DR 6 | 7 | - 提出 Q-Former 8 | - 两阶段只训练 Q-Former 部分,vision encoder 和 LLM 始终不参与训练 9 | - 多任务训练:ITC、ITG、ITM 10 | 11 | ## Abstract 12 | 13 | 大模型的预训练成本越来越高,本文提出的 BLIP-2,是一种通用且高效的预训练策略,可以从已有的预训练 imge encoder 和 LLM 引导 vision-language 预训练。BLIP-2 的核心是利用一个轻量的 Query Transformer,经过两阶段的训练,实现 vision encoder 与 LLM 的特征空间对齐。 14 | 15 | ## 1 Introduction 16 | 17 | 在训练图文多模态模型时,现有方法往往采用端到端重新预训练的模式,这会产生两个比较突出的问题: 18 | 19 | - **训练成本高**:多模态模型需要大量数据,且参数量大,端到端 train from scratch 的成本比较高; 20 | - **模型灾难性遗忘**:由于数据分布很可能不一致,如果直接将单模态的预训练模型加入到多模态模型中进行联合训练,可能会产生灾难性遗忘问题; 21 | 22 | 多模态大模型的核心问题是 **cross-model alignment**,即模态对齐。本文提出 BLIP-2: 23 | 24 | - **利用 pre-trained 单模态模型**,避免train-from-scratch,减少训练成本; 25 | - **将单模态模型的参数进行冻结**,从而避免灾难性遗忘问题,充分利用已经训练好的单模态模型; 26 | - **利用Q-Former来对图文进行对齐**,从而让图像和文本产生交互; 27 | 28 | ## 2 Related Work 29 | 30 | **End-to-end Vision-Language Pre-training** 31 | 32 | SimVLM、PaLI、CoCa、OPT 33 | 34 | **Modular Vision-Language Pre-training** 35 | 36 | VisualGPT、Flamingo 37 | 38 | ## 3 Method 39 | 40 | BLIP-2 的训练分为两个阶段:1)vision-language representation learning stage with a frozen image encoder;2)vision-to-language generative learning stage with a frozen LLM。 41 | 42 | ### 3.1 Model Architecture 43 | 44 |
45 | 46 |
47 | 48 | 模型结构主要由三部分构成:**Image encoder、Q-Former、LLMs**。 49 | 50 | Q-Former 包括两个 transformer submodule(左侧的为 image transformer,右侧为 text transformer),它们共享一个 self-attention 层。随机初始化一个 learned queries 作为 image transformer 的输入,Image Encoder 提取到的视觉特征输入至 cross-attention 与 query 融合;文本输入 text transformer 提取得到文本特征。Learned Queries 同时还可以通过共享参数的 self-attention 与 text 特征进行融合。 51 | 52 | > Q-Former 中的 transformer 结构由 BERT-base 的权重做初始化,image transformer 中的 cross-attention 部分随机初始化,参数量共 188M。 53 | 54 | > Learned Queries 的 size 为 (32, 768),相比于 image encoder 输出的图像特征 (257, 1024) 轻量很多。 55 | 56 | ### 3.2 第一阶段:representation learning stage 57 | 58 |
59 | 60 |
61 | 62 | 在该阶段的训练使用了三个任务: 63 | 64 | - **Image-Text Contrastive Learning(ITC)**:通过对比学习对齐图像表示和文本表示,使其互信息最大化,使用的 loss 是经典的 InfoNCE loss; 65 | 66 | > image_feats是多个特征,因为query tokens是32个,而text_feat是单个特征,即 [CLS] token 的特征。因此在计算图文相似度的时候,会将 32 个特征与图像特征以此计算相似度,选择最大值作为最终相似度。 67 | > 68 | > 在该阶段为了避免信息泄露,使用了一个单模态的 self-attention mask,所以 queries 和 text 在该阶段是互相看不到的。 69 | > 70 | > 因为 image encoder 是 freeze 的,所以可以使用更大的 batch size,不需要像 BLIP 中那样维护一个队列来放足够多的负样本。 71 | 72 | - **Image-grounded Text Generation (ITG)**:该任务是给定 image 作为 condition,令 Q-Former 生成文本; 73 | 74 | > 因为 Q-Former 的结构不允许图像特征与文本特征直接交互,图像信息只能先经过 queries 提取,再通过 self-attention 与 text 融合,所以该阶段使用一个 causal self-attention mask 来控制 query-text 的交互,queries 的 token 可以相互看到,但是它看不到 text token,而 text token 可以看到所有的 queries token 以及自身之前的 token。 75 | 76 | - **Image-Text Matching (ITM)**:旨在学习图像和文本特征之间的细粒度对齐。这是一个二分类任务,预测输入的 image-text 对是 positive 还是 negative 的。 77 | 78 | > 在该阶段使用一个 bi-directional self-attention mask,即 queries 和 text tokens 全部可以相互看到。 79 | 80 | 在该阶段 image encoder 冻结,使用 image-text pair 数据仅训练 Queries 和 Q-Former 部分,让Queries能够将 Image Encoder 中提取的原始图像特征,转化为和文本特征很接近的特征,这个阶段相当于在将图像特征拉近到文本特征。 81 | 82 | ### 3.3 第二阶段:generative pre-training stage 83 | 84 |
85 | 86 |
87 | 88 | 该阶段通过一个 FC 层将 Q-Former 与 frozen LLM 连接起来。整个流程是:frozen Image Encoder 生成原始的图像特征,而 query tokens 和 Q-Former 从原始图像特征中提取关键的图像特征 query embeddings,然后该特征经过全连接层映射到 LLMs 的文本 embedding 空间中。在这里,query embeddings 就相当于soft visual prompts,和文本embedding一起,输入到冻结的LLMs中,最后生成目标文本。 89 | 90 | BLIP-2 尝试了两种 LLM 结构,即 decoder-based LLMs 和 encoder-decoder-based LLMs。对于 encoder-decoder-based 来说,text 会被分为两部分,第一部分会作为 encoder 的输入,第二部分作为 decoder 的监督信号。 91 | 92 | ### 3.4 Model Pre-training 93 | 94 | **Pre-training data** 95 | 96 | 训练数据使用的和 BLIP 中的一致,共 129M 张图,包括 COCO、Visual Genome、CC3M、CC12M、SBU、LAION400M 等;然后每张图像先用 CapFilt method 生成一条 caption,再用 BLIP-large 生成 10 条 caption,然后将这些 caption 用 CLIP ViT-L/14 计算图文相似度之后排序,留取得分最高的两个 caption 作为训练数据,每次从两个 caption 中随机选取一个作为 image-text pair 训练。 97 | 98 | **Pre-trained image encoder and LLM** 99 | 100 | image encoder 使用的是 CLIP ViT-L/14 或 EVA-CLIP ViT-g/14,选择倒数第二层的特征作为 image features;对于 decoder-based LLMs 用的是 OPT,encoder-decoder-based LLMs 用的是 FlanT5。 101 | 102 | **Pre-training settings** 103 | 104 | 略。 105 | 106 | ## 4 Experiment 107 | 108 | 这里只放一下和 SOTA 方法的效果对比: 109 | 110 |
111 | 112 |
113 | 114 | 上表可以看出BLIP-2在利用更少可训练参数的基础上,在VQA、Image Captioning、ITR等多模态任务上都取得不错的效果。 115 | -------------------------------------------------------------------------------- /notes/039_internvl1.5.md: -------------------------------------------------------------------------------- 1 | # InternVL 1.5 2 | 3 | [paper](https://arxiv.org/pdf/2404.16821) | [code](https://github.com/OpenGVLab/InternVL) | [zhihu](https://zhuanlan.zhihu.com/p/699439759) | [model](https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5) | [demo](https://internvl.opengvlab.com/) 4 | 5 | ## TL;DR 6 | 7 | - 更强的 vision encoder,结合 continuous learning 训练策略 8 | - 动态分辨率,将图像分割成 448×448的小块,最高可支持4k分辨率的图 9 | - 多语言数据集,主要是中英文 10 | 11 | ## Abstract 12 | 13 | InternVL 1.5 主要做了以下改进: 14 | 15 | - **更强的 vision encoder**:对 vision encoder InternViT-6B 实施了 continuous learning 的策略,使用高质量的图文数据对其进行提炼。这一过程不仅增强了模型理解视觉内容的能力,还提高了其在各种 LLMs 中的适应性。此外,使用 InternLM2-20B 作为语言基础模型也提供了强大的初始语言处理能力 16 | 17 | - **动态分辨率**:采用动态高分辨率策略,将图像分割成448×448的小块,根据图像的纵横比和分辨率,小块的数量从1到40不等(即4K分辨率)。为了捕捉全局上下文,还额外包括了一个全图的缩略图输入 18 | 19 | - 多语言数据集:收集了多样化的公共数据集,涵盖了高质量的自然场景、图表、文档以及英文和中文对话。此外,还使用开源 LLMs 开发了一个数据翻译流水线,可以轻松扩展到更多语言 20 | 21 | ## 1 Introduction 22 | 23 | 开源模型和专有商业模型如(GPT-4V、Gemini系列等)之间的能力仍存在明显差距。本文]认为主要原因有以下几点: 24 | 25 | - Parameter Scale:最近的专有商业 MLLMs 通常不少于1000亿参数,而开源模型通常使用3亿参数的视觉基础模型(VFM),并将其与7亿或13亿参数的LLMs集成; 26 | - Image Resolution:专有商业模型通常采用动态分辨率方法,保持原始纵横比以促进详细场景和文档理解。相比之下,开源模型通常使用固定分辨率进行训练,如336×336和448×448,导致与商业模型相比能力上有相当大的差距; 27 | - Multilingual Capability:专有模型通常利用广泛的多语言数据集进行训练,提高不同语言的性能。然而,开源模型主要使用英语数据,依靠LLMs的零样本能力来处理其他语言。 28 | 29 | ## 2 Related Work 30 | 31 | **Proprietary Commercial MLLMs** 32 | 33 | GPT-4v、Gemini 1.5、QwenVL-Plus/Max、Claude-3V、Step-1V、Grok-1.5V 34 | 35 | **Open-Source MLLMs** 36 | 37 | LLaVA、MiniGPT-4、VisionLLM、Qwen-VL、CogVLM 38 | 39 | **Vision Foundation Models for MLLMs** 40 | 41 | CLIP-ViT、SIGLIP、CLIP-ViT+CLIP-ConvNext、SigLIP-L+SAM-B 42 | 43 | ## 3 InternVL 1.5 44 | 45 | ### 3.1 Overall Architecture 46 | 47 |
48 | 49 |
50 | 51 | InternVL 1.5 的整体结构如上,遵循 ViT-MLP-LLM 的架构,将预训练的 InternViT-6B 与预训练的 InternLM2-20B 通过一个随机初始化的 MLP 投影层进行集成。 52 | 53 | 在训练期间,使用了一种动态分辨率策略,根据输入图像的纵横比和分辨率,将图像划分为448×448像素大小的小块,数量从1到12不等。在测试期间,可以直接扩展到40块(即4K分辨率)。为了增强高分辨率的可扩展性,我们简单地采用了 Pixel Shuffle 操作,将视觉token的数量减少到原始数量的四分之一。因此,在模型中,一个 448×448 的图像由256个 visual token 表示。 54 | 55 | > patch size 为 14,448/14=32,32×32/4=256 56 | 57 | ### 3.2 Strong Vision Encoder 58 | 59 | 已有的多模态模型通常都是使用一个 pre-trained ViT 作为 vision encoder,这些 ViT 一般是在固定的低分辨率 224×224 上训练得到的,因此,当任务处理来自互联网以外的来源的高分辨率图像或图像时,它们的性能会降低,例如文档图像。 60 | 61 | **InternViT-6B-448px-V1.2** 62 | 63 | 在 InternViT-6B 的基础之上做了以下改进。首先,发现倒数第四层的特征对多模态任务更好,所以,因此直接丢弃了最后三层的权重,将 InternViT-6B 从 48 层减少到 45 层。然后,我们将 InternViT-6B 的分辨率从 224 提高到 448,并将其与 Nous-Hermes-2-Yi-34B(LLM)连接。 64 | 65 | > 这里没说明白,为什么 LLM 突然从 InternLM 换成了 Yi-34B 66 | 67 | 为了使模型具有处理高分辨率和 OCR 的能力,vision encoder 和 MLP 均参与训练,该部分的训练数据为 image caption 和 OCR 数据的结合,最终得到 InternViT-6B-448px-V1.2。 68 | 69 | **InternViT-6B-448px-V1.5** 70 | 71 | 继续对 v1.2 训练,该阶段图像的分辨率从固定的448×448扩展到动态448×448,即将图像分割为448×448的patch,数量从1到12不等,此外,还扩充了预训练数据集的数据规模、质量和多样性,使得 1.5 版本模型强大的鲁棒性、OCR能力和高分辨率处理能力。 72 | 73 | 值得一提的是,尽管 LLM 从 Nous-Hermes-2-Yi-34B 更改为 InternLM2-20B,InternViT 与新的 LLM 保持了出色的兼容性和可移植性,这表明 InternViT-6B 在 MLLM 预训练阶段学习到的视觉特征广泛适用,并且不限于特定的 LLM。 74 | 75 | ### 3.3 Dynamic High-Resolution 76 | 77 | 动态分辨率的处理主要包括两个过程: 78 | 79 | **Dynamic Aspect Ratio Matching** 80 | 81 |
82 | 83 |
84 | 85 | 如上图所示,为了在处理过程中保持自然纵横比,我们从预定义的纵横比集合中动态匹配最优的纵横比。由于计算资源有限,我们在训练中允许最多12块。因此,这个集合包括了由1到12块形成的所有35种可能的纵横比组合,例如{1:1, 1:2, 2:1, 3:1, ..., 2:6}。在匹配过程中,对于每个输入图像,我们计算其纵横比,并与35个预定义的纵横比进行比较,通过测量绝对差值。如果多个预定义的纵横比匹配(例如,1:1和2:2),我们优先选择不超过输入图像面积两倍的纵横比,从而防止低分辨率图像的过度放大。 86 | 87 | **Image Division & Thumbnail** 88 | 89 | 确定了合适的纵横比后,将图像调整到相应的分辨率。例如,一个 800×1300 的图像将被调整到 896×1344。然后,将调整大小的图像分割成 448×448 像素的小块。除了这些小块,我们还包括了整个图像的缩略图(Thumbnail)以捕捉全局上下文。这个缩略图被缩小到448×448,帮助模型理解整体场景。因此,在训练期间,visual tokens 的数量范围从 256 到 3328。在测试期间,小块的数量可以增加到最多40块,从而产生10496个 visual tokens。 90 | 91 | ### 3.4 High-Quality Bilingual Dataset 92 | 93 | **Pre-training Dataset** 94 | 95 |
96 | 97 |
98 | 99 | 预训练阶段,多样化的数据集组合确保了 InternVL 的鲁棒性,迎合了跨任务的各种语言和视觉元素。 100 | 101 | **Fine-tuning Dataset** 102 | 103 |
104 | 105 |
106 | 107 | finetune 阶段使用精心挑选的数据集,以提高模型在广泛的多模态任务上的性能。 108 | 109 | **Data Translation Pipeline** 110 | 111 |
112 | 113 |
114 | 115 | 为了增强模型的多语言能力,使用了一个数据翻译 pipeline。利用最先进的开源 LLMs 或 GPT-3.5 将英语数据集转换为另一种语言(例如中文),在双语标记中保持一致性和准确性。此外,它可以通过调整语言提示轻松扩展到包含更多语言,而不依赖于手动注释过程。在 finetune 部分的数据表格中,注释了每个数据集的语言。对于最初是英文的数据集,"zh"的注释表明我们已经使用翻译流水线将其翻译成中文。例如,COYO 和GRIT最初是英文数据集,我们已经将它们翻译成中文。通过利用这个翻译流水线,InternVL 1.5的中文能力得到了极大的增强。 116 | 117 | # 4 Experiments 118 | 119 | InternVL 1.5 的训练分为两个阶段:1)pre-training 阶段训练 vision encoder 和 MLP projector;2)fine-tune 阶段训练所有参数。 120 | 121 | **Comparison with State-of-the-Art MLLMs** 122 | 123 |
124 | 125 |
126 | 127 |
128 | 129 |
130 | 131 | **Ablation Study** 132 | 133 | Larger LLMs need Larger VFMs:更大的 LLM 需要搭配更大的 vision encoder 134 | 135 | -------------------------------------------------------------------------------- /notes/040_internvl2.md: -------------------------------------------------------------------------------- 1 | # InternVL2: Better than the Best—Expanding Performance Boundaries of Open-Source Multimodal Models with the Progressive Scaling Strategy 2 | 3 | [blog](https://internvl.github.io/blog/2024-07-02-InternVL-2.0/) | [zhihu](https://zhuanlan.zhihu.com/p/706547971) | [huggingface](https://huggingface.co/collections/OpenGVLab/internvl20-667d3961ab5eb12c7ed1463e) 4 | 5 | ## TL;DR 6 | 7 | - 渐进式的训练策略,模型尺度覆盖更广 8 | - 多模态的输入和输出 9 | - 更广泛的训练数据,比如医学数据,视频数据 10 | 11 | InternVL2 没有 paper,更像是在 InternVL 1.5 上做了一些小的改进。从标题来看:利用渐进式扩展策略拓展开源多模态模型的性能边界。主要强调了渐进式策略。 12 | 13 |
14 | 15 |
16 | 17 | InternVL2 系列既有适合嵌入式设备部署的 1B 模型,也有性能优先的 108B 模型,覆盖广泛。凭借更大规模的语言模型,InternVL2-Pro 展现出了出色的多模态理解能力,在各项基准测试中与商业闭源模型的性能相当。 18 | 19 | InternVL2 系列主要有以下设计: 20 | 21 | - **Progressive with larger language models**:提出了一种渐进式对齐的训练策略,从而形成第一个与大型语言模型原生对齐的视觉基础模型。通过采用模型由小到大、数据由粗粒度到细粒度的渐进式训练策略,我们以相对较低的成本完成了大型模型的训练。这种方法在有限的资源下已经表现出了优异的性能。 22 | - **Multimodal input**:模型支持多种输入模式,包括文本、图像、视频和医疗数据。 23 | - **Multitask output**:得益于 VisionLLMv2 的能力,模型支持各种输出格式,例如图像、边界框和蒙版,表现出广泛的多功能性。通过将 MLLM 与多个下游任务解码器连接起来,InternVL2 可以推广到数百个视觉语言任务,同时实现与专家模型相当的性能。 24 | 25 | ### Model Card 26 | 27 |
28 | 29 |
30 | 31 | - 采用了和 InternVL 1.5 中一致的动态分辨率策略 32 | - pre-training 阶段变成了只训练 MLP,个人感觉是因为之前的 vision encoder 训的比较好了,直接拿过来用即可 33 | - fine-tune 阶段依然是训练整个模型 34 | 35 | ### Performance 36 | 37 | 和商业模型对比: 38 | 39 |
40 | 41 |
42 | -------------------------------------------------------------------------------- /notes/041_qwen2vl.md: -------------------------------------------------------------------------------- 1 | # Qwen2-VL 2 | 3 | [paper](https://arxiv.org/pdf/2409.12191) | [code](https://github.com/QwenLM/Qwen2-VL) | [blog](https://qwenlm.github.io/zh/blog/qwen2-vl/) 4 | 5 | ## TL;DR 6 | 7 | - 动态分辨率处理:引入naive dynamic resolution技术,能够灵活处理不同分辨率的输入 8 | - 多模态位置编码:创新性提出多模态旋转位置编码(M-RoPE),促进跨文本、图像和视频的位置信息的有效融合 9 | - 图像和视频的统一理解框架:图像被处理为两个相同帧,保持与视频处理的一致性,使用3D tubes替代2D patches处理方式 10 | - 详细的对数据格式,基础设施的描述,很赞 11 | 12 | ## Abstract 13 | 14 | Qwen2-VL 引入了动态分辨率机制,使模型能够动态地将不同分辨率的图像处理成不同数量的 visual tokens。使模型生成更高效和准确的视觉表示,模型同时还集成了 M-RoPE,促进跨文本、图像和视频的位置信息的有效融合。Qwen2-VL 采用统一的范式来处理图像和视频,增强了模型的视觉感知能力。为了探索 LVLMs 的潜力,Qwen2-VL 研究了 LVLMs 的 scaling laws。通过对模型参数量(2B、8B、 72B) 以及训练数据量的扩增,Qwen2-VL 系列实现了极具竞争力的性能。在各种多模态基准测试中取得了与 GPT-4o 和 Claude3.5-Sonnet 等领先模型相当的结果,优于其他通用模型。 15 | 16 | ## 1 Introduction 17 | 18 | LVLMs 的一般范式是 visual encoder→cross-modal connector→LLM,基于 high-quality 数据集和 next-token prediction 的目标,完成模型的训练。很多方法都是在这个范式的基础之上做一些改进:更大的模型结构、更高的输入分辨率、MoE、模型集成、更复杂的 adaptor。 19 | 20 | 然而,当前的 LVLMs 通常局限于固定分辨率的输入。对于不同分辨率的图像,会先经过上采样或下采样至固定尺寸后再送给模型。虽然这种一刀切的策略能够处理不同分辨率的图像,但是限制了模型在不同尺度上捕获信息的能力,特别是会导致高分辨率图像中细节信息的丢失。 21 | 22 | 此外,大多数 LVLM 依赖于 frozen CLIP-style vision encoder,这种预训练模型的视觉表征能力通常比较有限,尤其是对复杂的推理任务或者需要理解图像中的复杂细节时。有些工作试图通过在 LVLM 训练过程中微调 vision encoder 来解决这些限制,为了进一步增强模型对不同分辨率的适应性,本文在 LVLM 训练过程中引入了动态分辨率训练。另外,还在 ViT 中使用 2D RoPE,使模型更好地捕捉不同空间尺度的信息。 23 | 24 | 对于视频 video,本质是一些图像帧序列,许多方法将其视为一个单独的模态。和 text 这种 1D 信息不同,使用 1D 位置编码对 video 这种具有 3D 空间特征的信息进行编码是不充分的,为了弥补这一差距,本文提出 Multimodal Rotary Position Embedding (M-RoPE),使用单独的组件分别表示时序和空间信息,这使得模型能够自然地理解动态内容,例如视频或流数据,提高其理解和与世界交互的能力。 25 | 26 | Qwen2-VL的关键进展包括: 27 | 28 | - **读懂不同分辨率和不同长宽比的图片**:Qwen2-VL 在 MathVista、DocVQA、RealWorldQA、MTVQA 等视觉理解基准测试中取得了全球领先的表现。 29 | - **理解20分钟以上的长视频**:Qwen2-VL 可理解长视频,并将其用于基于视频的问答、对话和内容创作等应用中。 30 | - **能够操作手机和机器人的视觉智能体**:借助复杂推理和决策的能力,Qwen2-VL 可集成到手机、机器人等设备,根据视觉环境和文字指令进行自动操作。 31 | - **多语言支持**:为了服务全球用户,除英语和中文外,Qwen2-VL 现在还支持理解图像中的多语言文本,包括大多数欧洲语言、日语、韩语、阿拉伯语、越南语等。 32 | 33 | ## 2 Approach 34 | 35 | Qwen2-VL 系列由 3 个大小的模型组成,分别是 Qwen2-VL-2B、Qwen2-VL-7B 和 Qwen2-VL72B。 36 | 37 | ### 2.1 Model Architecture 38 | 39 |
40 | 41 |
42 | 43 | Qwen2-VL 保留了 Qwen-VL 的框架。为了适应于各种规模的 adaptor,Qwen2-VL 实现了一个参数量约为 675M 的 ViT,可以同时处理图像和视频输入。为了进一步增强模型在视频中有效感知和理解视觉信息的能力,Qwen2-VL 引入了几个关键升级: 44 | 45 | - **Naive Dynamic Resolution** 46 | 47 | Qwen2-VL 现在可以处理任何分辨率的图像,将它们动态转换为可变数量的 visual tokens。为了支持此功能,我们将 ViT 中原始的绝对位置编码替换为 2D-RoPE,用于捕捉图像的二维位置信息。在推理阶段,不同分辨率的图像被打包成单个序列,为了减少每个图像的 visual tokens 数量,在ViT之后用了一个简单的 MLP 层,将相邻的 2 × 2 tokens 压缩为单个 token。使用特殊 token $<|vision_start|>$ 和 $<|vision_end|>$ 表示 visual tokens 的开始和结束。因此,分辨率为224 × 224的图像,使用 patch_size=14的 ViT 编码,在进入LLM之前将被压缩为 66 个 tokens。 48 | 49 | > 224/14=16,16/2=8(MLP压缩),8x8+2=66 50 | 51 | - **Multimodal Rotary Position Embedding (M-RoPE)** 52 | 53 | 1D-RoPE 只能用于编码 1D 位置信息,M-RoPE 有效的对多模态输入的位置信息进行了建模。通过对原始 RoPE 解构为三个组件来实现的:(temporal, height, width)。对于 text 输入,这些组件使用相同的位置 ID,使得 M-RoPE 在功能上等同于 1D-RoPE。对于图像,每个 visual token 的时间ID保持不变,而不同的 id 根据 token 在图像中的位置分配给 height 和 weight。 54 | 55 | - **Unified Image and Video Understanding** 56 | 57 | Qwen2-VL 采用混合训练方案,结合图像和视频数据,使其同时具备图像理解和视频理解能力。 58 | 59 | > image understanding 和 video comprehension,单纯的记录一下 understanding 和 comprehension。。。 60 | 61 | 为了尽可能完整地保留视频信息,我们以每秒两帧(fps=2)的速度对每个视频进行采样。然后使用 depth=2 的 3D 卷积处理视频输入,允许模型处理 3D tubes 而不是 2D patches,从而使其能够在不增加序列长度的情况下处理更多的视频帧。为了平衡对长视频处理的计算需求,我们动态调整每个视频帧的分辨率,将每个视频的总 tokens 数限制为 16384。这种训练方法在模型长视频理解能力和训练效率的能力之间取得了平衡。 62 | 63 | 2.2 Training 64 | 65 | 和 Qwen-VL 一样,还是采用三阶段的训练。 66 | 67 | 第一阶段使用 image-text pairs 仅训练 vision encoder 和 adaptor(paper 中并没有提这部分,但应该是训了的);第二阶段训练整个模型;第三阶段在指令数据集上训练 adaptor+LLM。 68 | 69 | Qwen2-VL 的预训练数据包括 image-text pairs、OCR、交错的 image-text 文章、VQA、视频对话、image knowledge 等类型。数据源主要来自 web pages、开源数据集、合成数据,**数据截止日期为2023年6月**(现在都这么来评估数据量了:))。 70 | 71 | 在第一阶段 pre-training,Qwen2-VL 训练了大概 600B tokens,vision encoder 使用的是 DFN 中的 ViT,将其中的位置编码替换为了RoPE-2D,LLM 采用的 Qwen2。该阶段主要通过OCR和图像分类任务学习图像-文本关系、图像中的文本内容识别。这种基础训练有助于模型稳健地理解视觉-文本相关性以及与 LLM 空间对齐。 72 | 73 | > 现在大模型的训练数据量大多用覆盖的 token 数衡量了,因为数据太多了,基本都是一个 epoch 或更少。 74 | 75 | 第二阶段的 pre-training,使用了另外 800B tokens,引入了更多的混合图像-文本数据,促进对视觉和文本信息之间相互作用的更细致的理解。同时还使用了纯文本数据,保证语言模型能力不退化。 76 | 77 | 在整个 pre-training 阶段,Qwen2-VL 总共处理了 1.4 trillion tokens,不仅包含 text tokens,还包含 image tokens。然而,在训练过程中,我们只为 text tokens 提供监督(因为回答只有 text)。 78 | 79 | 在第三阶段指令微调时,使用 ChatML 的格式构造指令遵循数据,该阶段的数据集不仅包含纯文本对话数据,还包括多模态对话数据,多模态数据部分包括 image QA、文档解析、多图比较、视频理解、视频对话、agent 交互等类型数据。 80 | 81 | 2.2.1 Data Format 82 | 83 | 与 Qwen-VL 一致,Qwen2-VL 仍然使用 special tokens 来区分视觉和文本输入。视觉 token 的起始和结束用 `<|vision_start|>` 和 `<|vision_end|>` 表示。 84 | 85 | **Dialogue Data** 86 | 87 | 对于指令微调数据集中的对话数据格式,使用了 ChatML 格式,每个交互语句都标记了两个 special tokens(`<|im_start|>` 和 `<|im_end|>`)来表明对话终止(即:我说完了,该你说了:))。下面示例蓝色标记的部分表示会监督的部分: 88 | 89 |
90 | 91 |
92 | 93 | **Visual Grounding** 94 | 95 | 为了赋予模型 visual grounding 能力,bounding box 坐标归一化至 [0, 1000),用 `(X_topleft, Y_topleft), (X_bottomright, Y_bottomright)` 四元组表示。然后使用 special tokens `<|box_start|>` 和 `<|box_end|>` 表示坐标内容的开始和结束。为了准确地将边界框与其文本描述对应起来,还引入了 `<|object_ref_start|>` 和 `<|object_ref_end|>` 来表示框内容描述的起始和结束,示例如下: 96 | 97 |
98 | 99 |
100 | 101 | **Visual Agent** 102 | 103 | 为了可以使 Qwen2-VL 作为通用 VL-Agent,我们将 UI 操作、机器人控制、游戏和导航等各种代理任务视为顺序决策问题,使 Qwen2-VL 通过多步动作执行来完成任务。对于每个任务,我们首先定义一组可执行的动作和 keywords pattern (图中下划线部分) 用于函数调用,然后 Qwen2-VL 分析 observations、执行推理和规划、执行所选 action 并与环境交互以获得新的 observations(听起来像是强化学习)。这个循环迭代地重复,直到任务成功完成。数据格式如下: 104 | 105 |
106 | 107 |
108 | 109 | 2.3 Multimodal Model Infrastructure 110 | 111 | Qwen2-VL 的训练是基于阿里云的 PAI-Lingjun Intelligent Computing Service 平台完成的。 112 | 113 | > scalable computing(可扩展计算)、auto resuming(自动恢复)、straggler detection(掉队检测),可见稳定性对于大模型训练的重要程度。 114 | 115 | **Storage 存储** 116 | 117 | 数据存储采用阿里云的 ultra-speed CPFS(Cloud Parallel File Storage)。文本数据和视觉数据的存储是解耦的,文本数据只存储在 CPFS 上,并使用 mmap 提高访问效率;视觉数据使用阿里云的 OSS(Object Storage Service)进行存储。在训练期间,我们通过 OS S的 python-client 访问视觉数据,并调整并发性和重试参数,以避免达到 QPS 限制。我们还发现**视频数据解码是主要的瓶颈**,尤其是对于长视频,经过一些开源技术和阿里内部工具的试用,最终采用了 **caching decoding technique**。 118 | 119 | **Parallelism 并行化** 120 | 121 | Qwen2-VL 使用了 3D parallelism,结合了 data parallelism (DP),tensor parallelism (TP) 和 pipeline parallelism (PP)。另外还利用了 deepspeed 的 zero-1 redundancy optimizer 以节省内存。Sequence parallelism (SP) 用来挑选 checkpoint 也可以节省内存。 122 | 123 | 在启用 TP 训练时,我们总是将 vision encoder 和 LLM 分片在一起,而不是将所有的 vision encoder 合并在一起,因为它的参数相对较少。同时我们还发现由于卷积算子的不确定性行为,TP 训练会导致不同的模型 shared-weights,为了解决这个问题,通过离线减少共享权重,从而避免额外的 all-reduce 通信步骤,这种方法对性能的影响很小。 124 | 125 | 对于 Qwen2-VL 72B 使用了 1F1B PP 技术,我们将 vision encoder、adaptor 和 LLM 的几个 decoder layers 合成一个 stage,剩余的 decoder layer 均匀切分。 126 | 127 | **Software** 128 | 129 | PyTorch 2.1.2 + CUDA 11.8、flash-attention、LayerNorm、RMSNorm、Adam。 130 | 131 | > 这一章节展示了很多数据细节和训练细节,有很多不是太懂,但能感受到 Qwen 团队很想把所有踩到的坑都告诉你,很赞的开源精神。 132 | > 133 | > 感觉现在大模型的壁垒很大程度上就是数据+训练技巧+计算资源。 134 | 135 | 3 Experiments 136 | 137 | 3.1 Compare to SOTAs 138 | 139 |
140 | 141 |
142 | 143 | 其它的 agent 能力等就不在这里展示了,详细的结果直接看论文吧。 144 | -------------------------------------------------------------------------------- /notes/042_deepseekvl2.md: -------------------------------------------------------------------------------- 1 | # DeepSeek-VL2 2 | 3 | [paper](https://arxiv.org/pdf/2412.10302) | [code](https://github.com/deepseek-ai/DeepSeek-VL2) 4 | 5 | ## TL;DR 6 | 7 | - MoE Vision-Language Models 8 | - 支持动态分辨率 9 | 10 | ## Abstract 11 | 12 | DeepSeek-VL2 是一个 MoE 模型,相比于 DeepSeek-VL 主要有两个改进:1)视觉部分采用了一种 dynamic tiling 视觉编码策略,可以处理不同长宽比的高分辨率图像;2)语言部分更新至 DeepSeekMoE 模型,采用了 multi-head latent attention 机制,将 kv cache 压缩至 latent 空间,以实现高效的推理和高吞吐量。 13 | 14 | 基于改进的 vision-language 数据集训练,DeepSeek-VL2 在 VQA、OCR、document/table/chart 理解、visual grounding 等多种任务上表现出了很强的能力。 15 | 16 | DeepSeek-VL2 系列共有 DeepSeek-VL2-Tiny、DeepSeek-VL2-Small 和 DeepSeek-VL2 三种变体,参数量分别为 1B、2.8B 和 4.5B。 17 | 18 | ## 1 Introduction 19 | 20 | DeepSeek-VL2 利用了 Mixture-of-Experts(MoE)架构,相比于 DeepSeek-VL 主要有以下三个方面的改进: 21 | 22 | 1. 支持动态大小、高分辨率图像输入,增强了视觉理解能力; 23 | 2. 更强的 LLM,显著提高了训练和推理效率; 24 | 3. 改进 vision-language 数据构造 pipeline,不仅提高了整体性能,同时也支持视觉基础能力,如 visual grounding; 25 | 26 | ## 2 Model Architecture 27 | 28 |
29 | 30 |
31 | 32 | DeepSeek-VL2 包括三个核心模块:1)vision encoder;2)vision-language adaptor;3)MoE-based LLM。 33 | 34 | **Dynamic Tiling Strategy** 35 | 36 | DeepSeek-VL 中使用的是一个 hybrid vision encoder,分别用 SigLIP 和 SAM-B 处理 384×384 和 1024×1024 分辨率的图像,虽然这种方式适用于大多数任务,但是将图像分辨率限制在了 1024×1024 以内,对于具有更高分辨率或极端长宽比的图像不太友好。 37 | 38 | 受 InternVL 2 和 LLaVA-NeXT 的启发,DeepSeek-VL2 采用了一个 dynamic tiling strategy,将高分辨图像切分为块。这种方式可以实现仅用一个 SigLIP-SO400M-384 处理各种不同长宽比、分辨率的图像。原始 SigLIP 主要针对 384×384 分辨率的图像,为了使用不同长宽比,DeepSeek-VL2 设置了一组候选分辨率 $𝐶_R = {(𝑚 · 384, 𝑛 ·384) | 𝑚 ∈ N, 𝑛 ∈ N, 1 ≤ 𝑚, 𝑛, 𝑚𝑛 ≤ 9}$,其中 𝑚 : 𝑛 就是长宽比(aspect ratio)。 39 | 40 | 给定一张尺寸为 (𝐻, 𝑊) 的图,首先依据候选长宽比 𝐶𝑅 计算需要 padding 的区域,padding 之后将其 resize 到最合适的尺寸 (𝑚𝑖 · 384, 𝑛𝑖 · 384)。然后将图像切分为 𝑚𝑖 × 𝑛𝑖 个尺寸为 384×384 的块,然后再加一个全局小图(global thumbnail view)。最终,SigLIP 需要处理共 (1 + 𝑚𝑖 × 𝑛𝑖) 个图像块,每个图像块生成 27 × 27 = 729 个 维度为 1152 的 visual token embedding。为了提高计算效率和控制 context length(visual token 数量),在处理多个(> 2)图像时禁用 dynamic tiling strategy(?)。 41 | 42 | **Vision-Language Adaptor** 43 | 44 |
45 | 46 |
47 | 48 | vision encoder 之后,先使用一个 2×2 pixel shuffle 操作将每个图像块的 visual tokens 数从 27×27 压缩至 14×14=196 个。 49 | 50 | > 2×2 pixel shuffle 51 | 52 | 然后,使用三个 special tokens 分别标记不同类型的 visual tokens: 53 | 54 | - 对于 global thumbnail tile 的 14×14 个 token,在每一行的末尾添加一个 `` token,最终有 14×15=210 个 tokens; 55 | - 对于 𝑚𝑖 × 𝑛𝑖 个 local tile 的 token,首先将它们组成形状为 (𝑚𝑖 · 14, 𝑛𝑖 · 14) 的 2D grid,然后在最后一列的末尾添加一个 `` token,表示每个 local tile 每一行的结束; 56 | - 此外,在 global thumbnail tile 和 local tiles 之间添加一个 `` 来区分两者; 57 | 58 | 最终,全部的 visual sequence 包括 210 + 1 + 𝑚𝑖 · 14 × (𝑛𝑖 · 14 + 1) 个 visual tokens。随后使用两层 MLP 投影到语言模型的特征空间中。 59 | 60 | **DeepSeekMoE LLM** 61 | 62 | LLM 使用的是 DeepSeekMoE,该模型使用了 Multi-head Latent Attention(MLA)机制,通过将 KV Cache 压缩至 latent 空间提高推理效率和吞吐率。同时,该模型还结合了 MoE 架构,允许通过稀疏计算进行有效的推理。训练 MoE 期间,为每个 expert 引入了一个 **global bias**,以改善 expert 之间的负载(cost-effectively)平衡。D eepSeek-VL2 最终有三个尺寸:1.0B、2.8B 和 4.5B。完整的结构参数如下: 63 | 64 |
65 | 66 |
67 | 68 | > Tiny 中并没有使用 MLA,猜测 MLA 相比 MHA 会有性能损耗?所以能不用就不用了? 69 | 70 | ## 3 Data Construction 71 | 72 | DeepSeek-VL2 的训练分为三个阶段:1)VL alignment;2)VL pre-training;3)SFT。每个阶段都有特定的数据集。 73 | 74 | ### 3.1 Vision-Language Alignment Data 75 | 76 | alignment 阶段仅训练 MLP adaptor,对齐 vision encoder 和 LLM 特征空间。该阶段使用 ShareGPT4V 数据集,共约 1.2M 样本。 77 | 78 | ### 3.2 Vision-Language Pretraining Data 79 | 80 | pre-training 数据的特点是量大、覆盖范围广、质量较差。 81 | 82 | pre-training 数据使用了 vision-language 和 text-only 数据,保持 VL 能力和纯文本性能之间的平衡。在 DeepSeek-VL2 中 VL data 和 text-only data 比例为 7:3。其中 VL data 可以划分为以下几类: 83 | 84 | - Interleaved image-text data:图文交互数据 85 | - Image captioning data:caption 数据 86 | - Optical character recognition data:OCR 87 | - Visual question-answering (QA) data:VQA 88 | - Visual grounding data:目标及其坐标信息用 <|ref|> 特殊 token 区分 89 | - Prompt: Locate <|ref|><|/ref|> in the given image. 90 | - Response: <|ref|><|/ref|><|det|>[[x1, y1, x2, y2],...]<|/det|> 91 | - Grounded conversation data 92 | - Prompt: <|grounding|>Can you describe the content of the image? 93 | - Response: Two <|ref|>dogs<|/ref|><|det|>[[x1, y1, x2, y2],...]<|/det|> are running on the grass. 94 | 95 | ### 3.3 Supervised Fine-tuning Data 96 | 97 | SFT 数据的特点是量少,但质量高。 98 | 99 | SFT 数据包括开源数据集以及高质量的私有 QA pairs 数据。 100 | 101 | - General visual question-answering 102 | 103 | 虽然公开的 VQA 数据集的多样性好,但是通常有以下问题:1)response 简短;2)OCR 质量差;3)幻觉内容严重。为了解决这些问题,根据原始问题、图像、OCR 信息重新生成 response(用什么方法?)。 104 | 105 | 在开发过程中,我们观察到 DeepSeek-VL2 的早期版本,尤其是 DeepSeek-VL2 Tiny 偶尔会在中文响应中混入英文单词,但在更大的模型中没有出现该现象,这可能是 pre-training 阶段中&英文数据配比不平衡以及模型能力限制导致的。为了解决小模型中的这个问题,我们使用了一个私有的 Chinese QA 数据集(多大规模?),缓解了语言混合问题。此外,还创建了一个额外的内部数据集来补充现实世界的视觉知识,包括动漫、网红事物、美食和艺术。 106 | 107 | - OCR and document understanding 108 | 109 | 主要是对开源 OCR 数据集清洗,删除低质部分;对于 document understanding,从内部数据中构造出一个子数据集,然后,生成特定于文档理解的多轮会话 QA 对。 110 | 111 | - Table and chart understanding 112 | 113 | 基于公开数据集,重新生成 response。 114 | 115 | - Reasoning, logic, and mathematics 116 | 117 | 对公开的 reasoning-focused 数据集添加更详细的推理过程,并且标准化相应格式。实验过程中发现,详细的 reponse 对 Tiny 这种规模的模型帮助不大,可能受限于模型能力。 118 | 119 | - Textbook and academic questions 120 | 121 | 主要来自教科书内容,该数据集主要强调跨多个学术学科的大学级内容。 122 | 123 | - Web-to-code and plot-to-Python generation 124 | 125 | 对开源数据集的 response 进行了质量优化,同时收集了一些 web code、python plot code。 126 | 127 | - Visual grounding 128 | 129 | 来源于一些公开数据集,为了提高模型能力,我们将数据中的 query 部分内容翻译成了中文,并创建了额外的负样本。我们还添加了 in-context 视觉基础数据(我理解就是多图数据),其中该任务涉及跨多个图像定位同一类别的对象。 130 | 131 | - Grounded conversation 132 | 133 | - Text-Only datasets 134 | 135 | ## 4 Training Methodology 136 | 137 | ### 4.1 Training Pipelines 138 | 139 | DeepSeek-VL2 训练包括三个阶段:1)initial stage 使用 image-text pairs 数据训练 vision encoder + adaptor;2)pre-training 阶段训练整个模型;3)SFT 阶段同样训练整个模型。所有阶段的任务均是 **next token prediction**。 140 | 141 | **Vision-Language Alignment** 142 | 143 | 基于 pre-trained DeepSeekMoE 语言模型,该阶段的主要目标就是对齐视觉空间和语言空间,使得 LLM 能够有效的处理视觉输入。和 LLaVA、DeepSeek-VL 不同的是,该阶段把 vision encoder 也放开训练了。 144 | 145 | **Vision-Language Pre-training** 146 | 147 | pre-training 阶段主要是增强模型的多模态理解能力,每个任务不那么强但都要会,同时保证原始语言能力不退化。该阶段训练所有参数,共训了 ~800B tokens。 148 | 149 | **Supervised Fine-Tuning** 150 | 151 | 该阶段主要是增强模型的指令遵循能力和对话能力。同样的,也是调整所有参数。 152 | 153 | ### 4.2 Hyperparameters and Infrastructures 154 | 155 | 训练超参数如下: 156 | 157 |
158 | 159 |
160 | 161 | 训练框架还是幻方自家的 High-flyer,并行计算时一个主要挑战是 vision encoder 和 LLM 计算量的不平衡,跨 GPU load 时需要注意 vision encoder,避免 pipeline bubbles 以及 GPU 利用率低。为了解决这个问题,我们在pipeline 并行策略中实现了 vision encoder 的 fine-grained layer 划分;此外,我们在前向和后向过程中跨不同数据并行等级执行图像 tile 负载平衡,以减轻动态分辨率策略引起的图像块数量不平衡。 162 | 163 | DeepSeek-VL2 使用 16/33/42 个节点的集群在 7/10/14 天完成,每个节点配备 8 个 NVIDIA A100 GPU。 164 | 165 | ## 5 Evaluation 166 | 167 | 对比了在 OCR-related benchmarks 和 VQA、math-related benchmarks 上的对比效果: 168 | 169 | - OCR-related 170 | 171 |
172 | 173 |
174 | 175 | - general QA 和 math-related 176 | 177 |
178 | 179 |
180 | 181 | 从结果来开,同期的工作水平相差不大,如 Qwen2-VL 和 InternVL2 182 | 183 | 另外,paper 还放了一些示例,这里不就贴了,直接看论文吧。 184 | -------------------------------------------------------------------------------- /notes/043_megapairs.md: -------------------------------------------------------------------------------- 1 | # MegaPairs: Massive Data Synthesis For Universal Multimodal Retrieval 2 | 3 | [paper](https://arxiv.org/pdf/2412.14475) | [github](https://github.com/VectorSpaceLab/MegaPairs) 4 | 5 | ## Abstract 6 | 7 | - 多模态检索效果不佳是因为**缺乏训练数据** 8 | - 提出一种数据合成方法--**MegaPairs**,基于开源的图像数据集,利用 VLM 和 LLM 生成大量训练数据 9 | - 使用 MegaPairs 生成的高质量数据集,效果优于 70 倍大小的已有数据 10 | - 训练数据规模:50W、2600W 11 | 12 | 该方法的局限性: 13 | 14 | - 数据合成 pipeline 未开源 15 | - finetune 代码未开源 16 | - 当前版本不支持中文:文本侧基座无论是 CLIP-based 和 MLLM-based 都是仅英文模型 17 | 18 | ## 1 Introduction 19 | 20 | CLIP、ALIGN、SigLIP 们的局限性: 21 | 22 | - 做不了组合图像检索、多模态文档检索等 23 | 24 | MagicLens 等数据合成方法的局限性: 25 | 26 | - 生成数据的可扩展性、质量、多样性、可用性较差 27 | - 可扩展性:网上的数据只有一小部分网页包含多个图像 28 | - 质量:多图时要么不相关,要么内容重复 29 | - 多样性:相关图像内容单调,多样性差 30 | - 可用性:生成的数据集不开源 31 | 32 | ## 2 方法 33 | 34 | ### 2.1 MegaPairs 数据构造 35 | 36 | 每个 data instance 是一个三元组:$$(\mathcal{I_q}, \mathcal{I_t}, \mathcal{T_{q\to t}})$$,其中$$\mathcal{I_q}$$为 query image,$$\mathcal{I_t}$$ 为 target image,$$ \mathcal{T_{q\to t}}$$ 描述了从 query 到 target 的过渡关系。 37 | 38 | 构造以上的三元组主要有两个挑战: 39 | 40 | 1. 保证图像对的相关性和多样性 41 | 2. 精确地 instruction 标注 42 | 43 | #### 2.1.1 相关图像 pairs 挖掘 44 | 45 | ![image](https://github.com/user-attachments/assets/77d7cf18-e429-45b0-9667-8ff38b130e35) 46 | 47 | 如上图(a)中的 pipeline,首先有一个大规模的图像数据集(DataComp-1B,10亿),对于每一个 query 图像 $$(\mathcal{I_q}, \mathcal{C_q})$$,其中 $$\mathcal{C_q}$$ 是图像 $$\mathcal{I_q}$$ 所对应的 caption,先利用多个相似性模型(EVA-CLIP image encoder)来搜索一组不同的相关 target 图像,即正样本:$$(\mathcal{I_{t_1}}, \mathcal{I_{t_2}},...,\mathcal{I_{t_n}})$$。 48 | 49 | 相似性模型: 50 | 51 | - EVA-CLIP image encoder 用于 visual-semantic 相关资源的挖掘 52 | - DINOv2 用于visual-pattern 相关资源的挖掘 53 | - EVA-CLIP text encoder 用于 caption 相关资源的挖掘 54 | 55 | 我们选择相似得分在(0.8, 0.96) 之间的样本作为 target 图像,<0.8 认为是不相关的样本,去除 >0.96 的样本是为了消除重复样本。 56 | 57 | **难负样本**对于检索模型很重要。在有了上面的 query 和 targets 后,对于每一个 pair $$(\mathcal{I_q}, \mathcal{I_{t_i}})$$,MegaPairs 将 targets 中的 $${\{\mathcal{I_{t_j}} | t_j \ne t_i}\}$$ 作为难负样本。 58 | 59 | > 这里没太懂,理论上 query 和 targets 中的图都是互为正样本的,但为什么还能作为难负样本? 60 | 61 | #### 2.1.2 开放式 instruction 生成 62 | 63 | 如上图(b)中的 pipeline,对于每一个图像 pair $$(\mathcal{I_q}, \mathcal{I_{t_i}})$$,先使用 MLLM(InternVL2-26B)生成两张图的共同概念和差异,然后使用 LLM(LLaMA3-8B)生成 instruction,使用 LLM 有效的增加了 instruction 的多样性。 64 | 65 | 最终,可以构建出三元组数据:$$(\mathcal{I_q}, \mathcal{T_{q\to {t_i}}}, \mathcal{I_{t_i}})$$,其中 $$(\mathcal{I_q}, \mathcal{T_{q\to {t_i}}})$$ 可以用来检索 $$\mathcal{I_{t_i}}$$。 66 | 67 | ### 2.2 MMRet Model 68 | 69 | #### 2.2.1 CLIP-based MMRet 70 | 71 | CLIP 本身是一个对偶 encoder 结构,两个独立的 encoder 分别编码 image 和 text,得到各自的 embedding,为了得到 multimodel embedding,使用一个 **score-fusion strategy**,直接将 image embedding 和 text embedding 相加,得到最终特征。 72 | 73 | > 既然是直接相加,为什么叫 score-fusion strategy?需要看一下 UniIR 74 | 75 | #### 2.2.2 MLLM-based MMRet 76 | 77 | MLLM-based 方法通常是先用一个 ViT 提取得到 image token embedding,再将 image token 与 text token 同时送入 LLM(LLaVA-1.6),两者的融合靠 LLM 完成。 78 | 79 | 另外,MMRet 额外使用一个 task-specific instructions 作为输入,用以提高泛化性,整体的 query 输入如下: 80 | 81 | $$ \{task\_inst\} \{q_t\} \ \{q_i\} \ [EOS]$$ 82 | 83 | > task-specific instruction 和 query text 的区别: 84 | 85 | 其中,$$[EOS]$$ token 的最后一层的 normalized 输出作为最终特征。 86 | 87 | #### 2.2.3 Multimodel 对比学习 88 | 89 | MegaPairs 使用对比学习将原始的 CLIP 和 MLLM 转换为 MMRet 模型,即采用标准的 InfoNCE loss 作为训练目标。 90 | 91 | 和单模态不同的是,MMRet 中的 query 和 candidate 可以是 image、text、image-text 的任意组合。 92 | 93 | > 训练数据是固定的三元组,各个模态的随机组合在训练时是如何处理的? 94 | 95 | ## 3 实验 96 | 97 | ### 3.1 在图像检索任务上的 zero-shot 能力 98 | 99 | CLIP-based MMRet 的 batch size=2048,每个query 对应1个正样本对应4个难负样本,图像大小 resize 至 224x224。MLLM-based MMRet 的 batch-size=144,每个 query 对应1个正样本和3个难负样本,图像大小 resize 至 512x512,且使用 LoRA 训练。 100 | 101 | ![image](https://github.com/user-attachments/assets/c201dcf0-3004-4621-bff5-2df960b9533a) 102 | 103 | - MMRet-MLLM 模型在四个 benchmark 中的三个中达到了 SOTA 104 | - MMRet 在所有模型尺度上都表现出卓越的性能 105 | - MMRet-Base 模型超越了更大的模型,证明了 MegaPairs 数据集的有效性 106 | 107 | > 但是 R@x 的指标都很低啊 108 | 109 | ### 3.2 在 MMEB 上的多模态任务的表现 110 | 111 | #### 3.2.1 Zero-shot 能力 112 | 113 | MMRet-MLLM 在 MegaPairs 上训,在 MMEB 上测,结果如下: 114 | 115 | ![image](https://github.com/user-attachments/assets/1efe957c-ad76-4cda-bb9a-ff2fac8550bf) 116 | 117 | #### 3.2.2 Supervised Fine-tuning 表现 118 | 119 | MMRet-MLLM 先在 MegaPairs 上训,再在 MMEB 上微调一个 epoch,结果如下: 120 | 121 | ![image](https://github.com/user-attachments/assets/45eadc21-627d-4a62-8112-9192f908af2a) 122 | 123 | > 这里没有说对比方法有没有在 MegaPairs 上训练。 124 | 125 | ### 3.3 MegaPairs 数据集的详细研究 126 | 127 | #### 3.3.1 数据的可扩展性和质量 128 | 129 | ![image](https://github.com/user-attachments/assets/6e3fdabb-1dac-4ddf-ac4a-e38012133356) 130 | 131 | - 随着训练数据量增多,性能也逐步提升,说明 MegaPairs 数据集的可扩展性 132 | - 上图中虚线是 MagicLens-B 模型在其 36.7M 数据规模训练得到的结果,而使用 0.5M MegaPairs 数据即可达到相同的结果,说明了 MegaPairs 数据的高质量 133 | 134 | #### 3.3.2 难负样本的影响 135 | 136 | 在 MegaPairs 中,对于一个 query,使用相似性模型检索得到的召回集后,对于那些不是 target 的图像会被当做难负样本。 137 | 138 | 训练中使用这种难负样本对效果的提升: 139 | 140 | ![image](https://github.com/user-attachments/assets/eeea1d39-eb66-4b03-8f37-aa9773cab9aa) 141 | 142 | > Qry:query image negative 指的应该是同一个 batch 内除了自身外其它的 query image 可以作为负样本。 143 | 144 | #### 3.3.3 构造三元组数据时的搜索策略 145 | 146 | ![image](https://github.com/user-attachments/assets/1f19ed6c-200d-4195-8bde-d1a4c8710b7c) 147 | 148 | - 从结果看,使用相似性模型挖掘数据时,三者同时使用挖掘出的数据质量最好 149 | 150 | 151 | 152 | 数据集示例: 153 | 154 | ![image](https://github.com/user-attachments/assets/3312ae3e-0499-4204-a383-0f7ab5635960) 155 | -------------------------------------------------------------------------------- /notes/044_vlm2vec.md: -------------------------------------------------------------------------------- 1 | # VLM2Vec: Training Vision-Language Models for Massive Multimodal Embedding Tasks 2 | 3 | [paper](https://arxiv.org/pdf/2410.05160) | [code](https://github.com/TIGER-AI-Lab/VLM2Vec) 4 | 5 | ## Highlight 6 | 7 | - 代码都开源了 8 | - 框架比较通用 9 | 10 | ## 摘要 11 | 12 | - 提出 MMEB,一个多模态 embedding benchmark,覆盖分类、VQA、多模态检索、visual grounding 四个任务,另外包括 20 个训练集和 16 个评估集,现在被广泛应用 13 | - 开源 VLM2VEC,一个基于对比学习的训练框架,可以处理图像-文本的任意组合,生成固定维度的向量 14 | 15 | ## 引言 16 | 17 | 目前多模态 embedding 面临的主要问题: 18 | 19 | - 现有的工作通常只评估视觉 embedding 的效果,比如 ImageNet 分类、COCO/Flickr 检索 20 | - 诸如 CLIP、BLIP、SigLIP 等模型,要么是分别处理文本和图像,要么只对视觉与文本特征进行简单的融合,限制了捕捉图文关系的能力 21 | - 泛化能力差,或者说 zero-shot 场景能力不足 22 | 23 | ## MMEB 24 | 25 | MMEB 是一个用于在多个任务上评估多模态 embedding 能力的 benchmark。共 36 个数据集,包括 classification、VQA、retrieval、visual grounding 四个任务,每个任务都被转化为一个 ranking 问题。模型输入包括一个 instruction 和一个 query(可以是 image、text 的任意组合),任务就是从 candidates 中挑选正确的答案,其实就是选 TOP1。 26 | 27 | 36 个数据集可以分为两类:20 个 in-distribution 数据集用于训练,16 个 OOD 数据集用于评估。 28 | 29 | MMEB 子数据集构成: 30 | 31 | ![image](https://github.com/user-attachments/assets/56f0e167-cc2c-44cb-9445-7bd24f14761e) 32 | 33 | 各数据集统计如下: 34 | 35 | ![image](https://github.com/user-attachments/assets/09af704c-f73d-4058-8626-32e04a55684e) 36 | 37 | 评估时,embedding 模型分别对 query 和 target candidates 提取 embedding,直接计算 Precision@1。candidate 的数量直接影响检索成本,数量越大评估成本越高,数量越小 benchmark 越简单,容易过拟合。所以 MMEB 取了一个相对平衡的值 1000。 38 | 39 | 各个任务的输入形态 40 | 41 | - Classification:query 为 instruction 和 image,以及可选的相关文本,target 为 class label,candidates 数量等于类别数量 42 | - VQA:query 包括 instruction、image 以及一个 question,target 为 answer,candidates 包括一个 gt 和 999 个干扰选项 43 | - Retrieval:query 和 target 可以是 text、images、instruction 的任意组合,candidates 包括一个 gt 和 999 个干扰选项 44 | - Visual Grounding:query 包括 instruction 和 image,candidates 包括一个 gt 和 999 个干扰选项 45 | 46 | > 对于 query 输入,文本部分包括 instruction 和 text,两者可能比较容易迷惑,举个例子说明: 47 | > 48 | > 对于一个检索任务,Query Text 为:Find me an everyday image that matches the given caption. Man riding a motor bike on a dirt road on the countryside. 其中 Find me an everyday image that matches the given caption. 为 instruction,而 Man riding a motor bike on a dirt road on the countryside. 为 text。 49 | > 50 | > 相当于 instrcution 表明了任务,text 是具体的 query 内容。 51 | 52 | ## VLM2VEC 53 | 54 | VLM2VEC 基于对比学习框架,可以将任意的 VLM 模型转换为 embedding 模型。 55 | 56 | ![image](https://github.com/user-attachments/assets/e209cb8d-4833-471f-9b7f-43a596b28466) 57 | 58 | 假设,一个相关的 query-target 对表示为 $$(q, t^+)$$,两者均可以是单张图、一条文本或者图-文组合。在 query 上加入 instruction 可以构成模型的输入: 59 | 60 | $q_{inst} = [IMAGE_TOKEN] Instruct: \{task\_definition\} \n\ Query: \{q\}$ 61 | 62 | 其中,task_definition 是一个占位符,用来填写用一句话描述的 embedding 任务。 63 | 64 | 给定一个 VLM 模型,将 query 和 target 送入模型并分别得到 embedding:$$(h_{q_{inst}}, h_{t^+})$$。我们取最后一层的最后一个 token 的特征作为最终 embedding。 65 | 66 | 损失函数为标准的 InfoNCE,每个 batch 内的其它样本作为负样本。 67 | 68 | 通过 GradCache 增大 batch size 69 | 70 | 因为难负样本的获取通常比较困难,所以增大 batch size 变得非常重要。增大 batch size 的一个瓶颈是 GPU 显存,本文采用了 GradCache,一种梯度缓存技术,将对比损失和编码器之间的反向传播解耦,沿 batch 维度删除编码器反向传播数据依赖关系。 71 | 72 | ## 实验 73 | 74 | VLM2VEC 采用了 Phi-3.5-V 和 LLaVA-1.6 作为 backbone,做了 full model fine-tuning 和 LoRA。图像分辨率有 1344x1344和336x336两种设置。对于 20 个训练数据集,对于样本量超过 50K 的数据集,随机挑选出 50K 作为训练数据,总共有 662K 数据。使用 GradCache 后,对于全参数训练来说,batch-size 由 4 可以增大至 1024。 75 | 76 | **结果对比** 77 | 78 | ![image](https://github.com/user-attachments/assets/91d8425d-2279-4cde-9898-4db852e4a9dc) 79 | 80 | - Fine-tuning 之后,在 IND 上的结果才 67.5,是不是有点低? 81 | - LoRA 的效果比全量FT更好,不太理解 82 | 83 | **跨任务的泛化性** 84 | 85 | ![image](https://github.com/user-attachments/assets/304ea49b-e301-4438-8dd3-5edd43104096) 86 | 87 | - 整体上,VLM2VEC 训练检索任务,在其他任务上的泛化能力更强一些 88 | 89 | **Instruction 的影响** 90 | 91 | ![image](https://github.com/user-attachments/assets/400de692-fae4-4e1b-a761-cbfe00e5fc75) 92 | 93 | - 对于 CLIP 来说,加入 instruction 效果变差 94 | - 对于 VLM2VEC,加入 instruction 明显变好 95 | -------------------------------------------------------------------------------- /notes/045_gme.md: -------------------------------------------------------------------------------- 1 | # GME: Improving Universal Multimodal Retrieval by Multimodal LLMs 2 | 3 | [paper](https://arxiv.org/pdf/2412.16855) | [code](https://github.com/modelscope/ms-swift/blob/main/examples/train/embedding/train_gme.sh) 4 | 5 | ## HighLight 6 | 7 | - 代码开源 8 | - 通过两阶段训练挖掘难负样本 9 | - 仅训练了英文,不支持中文 10 | - 仅训了 LoRA,全参数训练效果不如 LoRA 11 | 12 | ## 摘要 13 | 14 | - 提出一种训练数据合成 pipeline 15 | 16 | - 提出一个通用的多模态 ebdedding 框架:GME 17 | 18 | - 提供了一个多模态检索 benchmark:UMRB 19 | 20 | ## 引言 21 | 22 | 多模态检索之前的做法: 23 | 24 | - 基于CLIP架构,设计不同模态间的融合方式 25 | 26 | - 利用 visual plugin 模块,将 vision token 送入 LLM,进而得到多模态特征 27 | 28 | 本文有一个亮点是**支持visual documents**,比如文档截屏。 29 | 30 | ## Universal Multimodal Retrieval 31 | 32 | image 33 | 34 | - Single-Modal Retrieval:图搜图、文搜文 35 | - Cross-Modal Retrieval:文搜图 36 | - Fused-Modal Retrieval:query 和 candinates 可以是任意组合 37 | 38 | ### UMRB 39 | 40 | UMRB 包括 47 个评估集,主要由一些公开数据集的子集组成。 41 | 42 | image 43 | 44 | 鉴于 UMRB 的规模庞大,为了加快实验验证和分析,我们从每个类别中抽取了一个数据集子集,构成一个较小的数据集,名为 UMRB-Partial,占比 39%。 45 | 46 | ## 方法 47 | 48 | image 49 | 50 | - 输入可以是 image、text、image-text pairs 51 | - 最后一层的最后一个 token 的 hidden state 作为 embedding 52 | - 训练时不训原来的目标,即没有 AR 任务 53 | - 训练基于对比学习 54 | 55 | **难负样本** 56 | 57 | 对于难负样本的挖掘,使用了两阶段的训练: 58 | 59 | 1. Initial Training:先使用随机挑选的负样本训练得到模型 $$M_1$$ 60 | 2. Hard Negative Mining and Continue Training:对每个 query 使用 $$M_1$$ 检索 top K 个 candidates,挑选出不相关的样本作为难负样本(需要标注),使用这些难负样本继续训练。 61 | 62 | ### Fused-Modal 数据合成 63 | 64 | image 65 | 66 | 数据合成的整体思路是根据 candidate 生成 query,然后组成 query-candidate 对。 67 | 68 | 首先需要获取高质量的 candidates,我们主要从维基百科的段落中提取数据,为了增加 candidates 的 domain 多样性,使用一个 domain classification 模型,将提取到的数据分类,只保留分类得到大于0.5的数据,然后按类别均匀抽样,最终得到 313,284 的 candidates,每个都包括图像和文本。 69 | 70 | **Doc2Query Generation** 71 | 72 | 将每个 candidates 的文本先送入 Qwen2.5-72B-Instruct 生成 query,为了保证生成的 query 的质量,使用 gte-Qwen2-1.5B-instruct 将 candidates 的文本建了一个索引库,然后用生成的 query 检索这个库,如果对应的 candidates 文本出现在 top20 中,则认为是高质量 query,其实就是为了保证 candidates 的 text 与 生成的 query 的相关性。 73 | 74 | 这一步之后,首先可以得到 T --> IT 训练数据。 75 | 76 | **Entity Extraction and Query Rewrite** 77 | 78 | 为了将 query 扩充为 image-text pair,先用一个 LLM 提取出 query 文本中的实体,同时对 query 文本进行冲泻,然后检索到实体的图像,从而构成 image-text query。 79 | 80 | 举个例子,假如第一步生成的 query 文本为:“Where is Iris pseudacorus native?”。利用 LLM 将其重写为 “Where is the native habitat of this plant?”,并且提取其中的实体 “Iris pseudacorus”,然后找到一张 Iris pseudacorus 图片,最终构成 image-text 对。 81 | 82 | 经过这一步之后,可以得到 IT --> IT 训练数据。 83 | 84 | **Image Retrieval and Generation** 85 | 86 | 对于上一步中图像的获取,采用了两种方式。一是用 Google 直接搜索,选取 top5 的结果;二是使用文生图模型 FLUX.1-dev 直接生成。 87 | 88 | 对于第二种方式,先用一个 LLM 将实体概念进行扩充后在进行文生图。 89 | 90 | **Data Filtering** 91 | 92 | 为了保证合成数据的高质量,使用 Promptagator 对数据进行了过滤。 93 | 94 | 我们发现对于 FLUX.1 生成的数据质量通常比较高,但是 Google 检索得到的图经常有噪声。所以,对于 Google 检索得到的图,用 CLIP 计算图文的相关性,丢弃到得到小于 0.2 的数据。 95 | 96 | 经过上面的 pipeline,共生成了 1,102,000 条数据。 97 | 98 | ## 实验 99 | 100 | 训练数据共800W,其中文-文100W,图-图100W,文-图200W,fused 数据 200W,另外200W不知道是什么,paper 中没说清楚。 101 | 102 | Backbone 使用的是 QWen2-VL 的 2B 和 7B,并使用 LoRA 训练。 103 | 104 | image 105 | 106 | **GME 特征是否足够通用?** 107 | 108 | 具体来说,embedding 是否具有模态通用性,即不同模态中相同语义内容的 embedding 空间距离是否相近。同时,在每个模态的子空间中,特征也足够具有分辨力。 109 | 110 | image 111 | 112 | - CLIP 对不同模态之间的语义相似性没有判别能力 113 | - VISTA 对特征的判别粒度没有 GME 强 114 | 115 | **Fused-Modal Data的消融** 116 | 117 | image 118 | 119 | - 同时使用 FLUX.1 和 Google 检索的数据性能最好 120 | 121 | **Training Scaling Law** 122 | 123 | image 124 | 125 | - 800W数据仍然没有饱和 126 | 127 | **训练策略消融** 128 | 129 | image 130 | 131 | - 全参数微调的效果不如 LoRA,这点和 VLM2VEC 的结论一致,实在奇怪,理论上数据量也足够大了 132 | --------------------------------------------------------------------------------