<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>知乎 &#8211; DeepHour | 暮云</title>
	<atom:link href="https://blog.deephour.com/tag/%E7%9F%A5%E4%B9%8E/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.deephour.com</link>
	<description>归来仍然是少年</description>
	<lastBuildDate>Tue, 02 Apr 2024 06:19:42 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://blog.deephour.com/wp-content/uploads/2023/07/cropped-logo配色图-32x32.png</url>
	<title>知乎 &#8211; DeepHour | 暮云</title>
	<link>https://blog.deephour.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>多模态大模型 CLIP, BLIP, BLIP2, LLaVA, miniGPT4, InstructBLIP 系列解读(转载)</title>
		<link>https://blog.deephour.com/2024/04/02/%e5%a4%9a%e6%a8%a1%e6%80%81%e5%a4%a7%e6%a8%a1%e5%9e%8b-clip-blip-blip2-llava-minigpt4-instructblip-%e7%b3%bb%e5%88%97%e8%a7%a3%e8%af%bb%e8%bd%ac%e8%bd%bd/</link>
					<comments>https://blog.deephour.com/2024/04/02/%e5%a4%9a%e6%a8%a1%e6%80%81%e5%a4%a7%e6%a8%a1%e5%9e%8b-clip-blip-blip2-llava-minigpt4-instructblip-%e7%b3%bb%e5%88%97%e8%a7%a3%e8%af%bb%e8%bd%ac%e8%bd%bd/#respond</comments>
		
		<dc:creator><![CDATA[暮云岚]]></dc:creator>
		<pubDate>Tue, 02 Apr 2024 06:19:42 +0000</pubDate>
				<category><![CDATA[AI技术]]></category>
		<category><![CDATA[多模态]]></category>
		<category><![CDATA[知乎]]></category>
		<guid isPermaLink="false">https://blog.deephour.com/?p=6353</guid>

					<description><![CDATA[作者：榴莲酥链接：https://zhuanlan.zhihu.com/p/653902791来源：知乎著作权&#8230;&#160;<a href="https://blog.deephour.com/2024/04/02/%e5%a4%9a%e6%a8%a1%e6%80%81%e5%a4%a7%e6%a8%a1%e5%9e%8b-clip-blip-blip2-llava-minigpt4-instructblip-%e7%b3%bb%e5%88%97%e8%a7%a3%e8%af%bb%e8%bd%ac%e8%bd%bd/" rel="bookmark">阅读更多 &#187;<span class="screen-reader-text">多模态大模型 CLIP, BLIP, BLIP2, LLaVA, miniGPT4, InstructBLIP 系列解读(转载)</span></a>]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="512" src="https://blog.deephour.com/wp-content/uploads/2024/04/多模态-1024x512.png" alt="" class="wp-image-6354" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/多模态-1024x512.png 1024w, https://blog.deephour.com/wp-content/uploads/2024/04/多模态-300x150.png 300w, https://blog.deephour.com/wp-content/uploads/2024/04/多模态-768x384.png 768w, https://blog.deephour.com/wp-content/uploads/2024/04/多模态.png 1440w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">作者：榴莲酥<br>链接：https://zhuanlan.zhihu.com/p/653902791<br>来源：知乎<br>著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</p>



<p class="wp-block-paragraph">视觉+语言的多模态大模型目前主流方法是：借助预训练好的大语言模型和图像编码器，用一个<strong>图文特征对齐模块</strong>来连接，从而让语言模型理解图像特征并进行更深层的问答推理。</p>



<p class="wp-block-paragraph">这样可以利用已有的大量单模态训练数据训练得到的单模态模型，减少对于高质量图文对数据的依赖，并通过<strong>特征对齐、指令微调</strong>等方式打通两个模态的表征。</p>



<p class="wp-block-paragraph">主要的几个方法梳理如下：</p>



<figure class="wp-block-image"><img decoding="async" width="720" height="608" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-20.jpeg" alt="" class="wp-image-6377" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-20.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-20-300x253.jpeg 300w" sizes="(max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph">接下来会逐一讲解这几个方法对应的论文细节，以及最后补充了MME这篇工作中对多模态大模型进行综合评估。</p>



<h2 class="wp-block-heading">CLIP (Contrastive Language-Image Pre-training)</h2>



<p class="wp-block-paragraph"><strong>基本思想</strong>：CLIP的基本算法原理是文本和图像在特征域进行对齐。</p>



<p class="wp-block-paragraph"><strong>模型结构</strong>：</p>



<ul class="wp-block-list">
<li>为了对image和text建立联系，首先分别对image和text进行特征提取，image特征提取的backbone可以是resnet系列模型也可以是VIT系列模型；text特征提取目前一般采用bert模型。</li>



<li>特征提取之后，由于做了normalize，直接相乘来计算余弦距离，同一pair对的结果趋近于1，不同pair对的结果趋近于0，因为就可以采用对比损失loss（info-nce-loss）【这里要比较大的batch size才能有效果，类似于维护一个大的特征相似度矩阵】</li>
</ul>



<figure class="wp-block-image"><img decoding="async" width="720" height="534" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-10.jpeg" alt="" class="wp-image-6366" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-10.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-10-300x223.jpeg 300w" sizes="(max-width: 720px) 100vw, 720px" /><figcaption class="wp-element-caption">对比学习，维护一个图文特征相似度矩阵</figcaption></figure>



<ul class="wp-block-list">
<li>利用clip进行图像分类有两种方式，一种是直接利用zero-shot 方式进行预测，如下图所示，将text假设为 a photo of [object], 分别对image 和 text进行特征提取以及余弦距离，当object为目标类别时，相似度最高，即为预测结果（效果好）；还有一种方式就是再重新finetune，同样也是对类别设计几种不同的文本，这样效果能够达到sota的水平！</li>
</ul>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="506" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-6.jpeg" alt="" class="wp-image-6362" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-6.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-6-300x211.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /><figcaption class="wp-element-caption">目标类别对应的图文特征余弦距离最大</figcaption></figure>



<p class="wp-block-paragraph"><br><br><strong>训练loss</strong>：参考对比学习损失，采用了info-nce-loss。</p>



<ul class="wp-block-list">
<li>交叉熵代价函数（cross entropy）：最基础的有监督学习多分类损失函数，gt是n个类别的one-hot编码，目标是最小化gt的one-hot标签和预测logits的负对数乘积在多个类别上的加和，从信息论的角度也就是最小化模型数据分布与训练数据之间的KL散度；</li>
</ul>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="511" height="95" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-3.jpeg" alt="" class="wp-image-6359" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-3.jpeg 511w, https://blog.deephour.com/wp-content/uploads/2024/04/image-3-300x56.jpeg 300w" sizes="auto, (max-width: 511px) 100vw, 511px" /><figcaption class="wp-element-caption">n个类别多分类的交叉熵代价函数</figcaption></figure>



<ul class="wp-block-list">
<li>NCE（noise contrastive estimation）：和交叉熵类似，但是把多分类问题转化成了二分类问题，一个类是数据类别 data sample，另一个类是噪声类别 noisy sample，目标是学习数据样本和噪声样本之间的区别，也就是“噪声对比（noise contrastive） <a href="https://zhuanlan.zhihu.com/p/506544456">https://zhuanlan.zhihu.com/p/506544456</a></li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="622" height="158" src="https://blog.deephour.com/wp-content/uploads/2024/04/image.jpeg" alt="" class="wp-image-6355" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image.jpeg 622w, https://blog.deephour.com/wp-content/uploads/2024/04/image-300x76.jpeg 300w" sizes="auto, (max-width: 622px) 100vw, 622px" /><figcaption class="wp-element-caption">噪声对比NCE-loss</figcaption></figure>
</div>


<ul class="wp-block-list">
<li>Info-NCE：是NCE的一个简单变体，把噪声样本从一个类别又划分为多个类看待。公式中的temp是一个温度超参数（标量），如果忽略temp，那么infoNCE loss其实就是cross entropy loss，只是在cross entropy loss里，k指代的是数据集里类别的数量，而InfoNCE loss里，k指的是负样本的数量。公式分母中的sum是在1个正样本和k个负样本上做的，做的是一个k+1类的分类任务，目的就是想把query这个图片分到k+这个类。</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="720" height="190" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-1.jpeg" alt="" class="wp-image-6357" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-1.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-1-300x79.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /><figcaption class="wp-element-caption">Info-NCE loss</figcaption></figure>
</div>


<ul class="wp-block-list">
<li>温度系数temperature(本文固定0.07)：作用是控制logits的分布形状，对于既定的logits分布的形状，当temp值变大，则(q*k)/temp变小，指数运算之后更小，导致原来的logits分布更平滑。相反，如果temp取得值小，原来的logits分布里的数值就相应的变大，指数运算之后更大，则这个分布变得更集中，更peak。需要取一个合适的数值，既不会对所有的负样本一视同仁，也不会过度关注难样本。</li>
</ul>



<p class="wp-block-paragraph"><strong>细节</strong>：CLIP用了大量的训练数据以及训练资源，大力出奇迹。CLIP用了400million的image-text pair对进行训练，对于image backbone，CLIP尝试了两种结构，DN50x64 和 vit-L，分别用了592 个 V100 + 18天 的时间 和 256 个 V100 + 12天 的时间，非大公司直接劝退。</p>



<h2 class="wp-block-heading">BLIP（Bootstraping language image pre-training）</h2>



<p class="wp-block-paragraph"><strong>基本思想</strong>：</p>



<p class="wp-block-paragraph">兼顾图文理解和生成的多模态模型（Multimodal mixture of Encoder-Decoder），同时在三个视觉语言目标上联合预训练：图像文本对比学习ITC、图像文本匹配ITM、图像条件语言建模LM；同时提出了一种高效利用网络收集的嘈杂图文对的采样+过滤机制。<br>bootstraping翻译成“自举”有点别扭，我还是习惯理解为有放回抽样/迭代优化。</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="416" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-12.jpeg" alt="" class="wp-image-6368" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-12.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-12-300x173.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><br><strong>模型结构</strong>：</p>



<ul class="wp-block-list">
<li>图像块的编码（ViT）：图像打成patches块后进行编码，增加cls token来记录全局的特征（作用类似位置编码，保留patches的空间特征）</li>



<li>文本的编码（BERT）：对句子进行编码，增加cls token记录句子的全局特征</li>



<li>Image-grounded text encoder：在文本embedding中注入了图像特征，通过在self-attention和FFN中间增加一层cross-attention来对齐text-encoder和img-encoder的特征。</li>



<li>Image-grounded text decoder：用causal self-attention层（预测下一个token）代替了双向自注意力层（建立当前输入token的表达）【和左边的encoder共享除了self-attention之外的层】</li>
</ul>



<p class="wp-block-paragraph"><strong>训练loss</strong>：<br>预训练阶段同时优化3个loss项，每个图文对只过1次vision-transormer(算力消耗较大)，过3次text-transormer</p>



<ul class="wp-block-list">
<li>Image-Text Contrastive Loss (ITC)理解功能：优化vision-transormer+text-transormer，让匹配的图文对有较高相似度的表达（用了soft labels），多模态中的经典loss-&gt;使其<strong>互信息最大化</strong>；</li>



<li>Image-Text Matching Loss (ITM)理解功能 ：优化Image-grounded text encoder，学习图文的<strong>细粒度匹配</strong>的二分类，采用了hard negative mining strategy；</li>



<li>Language Modeling Loss (LM)生成功能：优化image-grounded text decoder，学习如何从给定图生成连贯的文本描述，采用交叉熵代价函数以自回归方式最大化对应文本概率。</li>
</ul>



<p class="wp-block-paragraph"><br><br><strong>Captioning and Filtering</strong>：一种高效的数据集增强方法，从网页噪声图像文本对中学习，采样生成器+噪声过滤器，都是从相同的预训练模型初始化，并在小型人工注释数据集e.g.COCO上单独进行微调。</p>



<ol class="wp-block-list">
<li>采样生成器captioner：基于图像的文本解码器（生成），用LM的loss进行微调</li>



<li>噪声过滤器filter：基于图像的文本编码器（判别），用ITC+ITM进行微调，判断图文是否匹配</li>
</ol>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="296" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-21.jpeg" alt="" class="wp-image-6378" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-21.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-21-300x123.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><br><strong>效果</strong>：从用人工标注的图文对得到的预训练模型开始初始化，captioner生成合成文本，filter过滤合成文本和网页描述文本，得到过滤后的相对干净的网页文本和合成文本-&gt;用来训练BLIP，往复进行。</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="349" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-24.jpeg" alt="" class="wp-image-6381" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-24.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-24-300x145.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><br><strong>数据集</strong>：<br>图像编码器使用 ImageNet-1K 上预训练的 ViT 初始化，文本编码器以 BERT-Base 初始化，按照Vit-B 2880/ Vit-L 2400的batch-size训练 20 Epochs，预训练阶段图像尺寸224*224，微调阶段尺寸384*384.<br>用了以下3部分数据集预训练，加起来大概是 14M。</p>



<ul class="wp-block-list">
<li>COCO</li>



<li>Visual Genome</li>



<li>网络数据：Conceptual Captions，Conceptual 12M（噪声较大），SBU Captions</li>
</ul>



<p class="wp-block-paragraph">还尝试了一个额外的噪声文本较多的web 数据集 LAION（115M 图像）。</p>



<h2 class="wp-block-heading">BLIP2</h2>



<p class="wp-block-paragraph"><br><strong>基本思想</strong>：</p>



<p class="wp-block-paragraph">如标题所言 Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models，分两个阶段，通过利用预训练好的视觉模型和语言模型来提升多模态效果和降低训练成本。</p>



<p class="wp-block-paragraph"><strong>模型结构</strong>：</p>



<p class="wp-block-paragraph">BLIP-2 由预训练的Image Encoder，预训练的Large Language Model，和一个可学习的 Q-Former 组成。</p>



<ul class="wp-block-list">
<li>Image Encoder：从输入图片中提取视觉特征，尝试了两种网络结构，CLIP 训练的 ViT-L/14和EVA-CLIP训练的 ViT-g/14（去掉了最后一层）。</li>



<li>Large Language Model：大语言模型进行文本生成，尝试了接入decoder-based LLM 和 encoder-decoder-based LLM两种结构。</li>



<li>Q-Former：弥补视觉和语言两种模态的modality gap，可以理解为固定图像编码器和固定LLM之间的<strong>信息枢纽</strong>，选取最有用的视觉特征给LLM来生成文本。</li>
</ul>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="562" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-13.jpeg" alt="" class="wp-image-6370" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-13.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-13-300x234.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph">Q-Former由Image Transformer和Text Transformer两个子模块构成，它们共享相同自注意力层。</p>



<ul class="wp-block-list">
<li>Image Transformer：通过和image encoder交互来提取视觉特征，输入是一系列（文中用的32个*768长度）可学习的 Queries，这些Query通过<strong>自注意力层</strong>相互交互，并通过<strong>交叉注意力层</strong>与冻结的图像特征交互，还可以通过<strong>共享的自注意力层</strong>与文本进行交互；输出的query尺寸是32*768，远小于冻结的图像特征257*1024(ViT-L/14)。</li>



<li>Text Transformer：既作为文本编码器也作为文本解码器，它的自注意力层与Image Transformer共享，根据预训练任务，用不同的self-attention masks来控制Query和文本的交互方式。</li>
</ul>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="219" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-4.jpeg" alt="" class="wp-image-6360" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-4.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-4-300x91.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><strong>训练过程</strong>：</p>



<p class="wp-block-paragraph">为了减少计算成本并避免灾难性遗忘，BLIP-2 在预训练时冻结预训练图像模型和语言模型，由于简单地冻结预训练模型参数会导致视觉特征和文本特征难以对齐，为此BLIP-2提出两阶段预训练 Q-Former 来弥补modality gap：表示学习阶段和生成学习阶段。</p>



<ol class="wp-block-list">
<li>第一个预训练阶段，vision-language<strong>表示学习</strong>，将 Q-Former 连接到冻结的图像编码器image encoder，目标是Q-Former学习与文本最相关的视觉表示。和BLIP类似，通过联合优化 ITC + ITG + ITM 三个预训练loss，并在Query和Text之间<strong>采用不同的注意力掩码策略，从而控制Image Transformer和Text Transformer的交互方式</strong>。</li>
</ol>



<ul class="wp-block-list">
<li>ITC(Image-Text Contrastive Learning)：优化目标是对齐图像特征和文本特征，也就是对齐image transformer输出的query representation与来自text transformer输出的text representation。为了避免信息泄漏，ITC采用了<strong>单模态自注意掩码</strong>，不允许query和text看到对方。计算时先计算每个query与文本embedding之间的相似度，然后选择最高的作为图文相似度。</li>



<li>ITG(Image-grounded Text Generation)：优化目标是给定输入图像作为条件，训练 Q-Former 生成文本，迫使query提取包含所有文本信息的视觉特征。由于 Q-Former 的架构不允许冻结的图像编码器和文本标记之间的直接交互，因此生成文本所需的信息必须首先由query提取，然后通过自注意力层传给text token。ITG采用<strong>多模态causal attention mask</strong>来控制query和text的交互，query可以相互感知，但不能看见text token，每个text token都可以感知所有query及其<strong>前面的text标记【半矩阵，生成式任务的常见做法】</strong>。这里将 [CLS] 标记替换为新的 [DEC] 标记，作为第一个文本标记来指示解码任务。</li>



<li>ITM( Image-Text Matching)：优化目标是进行图像和文本表示之间的细粒度对齐，学一个二分类任务，即图像-文本对是正匹配还是负匹配。这里将image transformer输出的每个query嵌入输入到一个二类线性分类器中以获得对应的logit，然后将所有的logit平均，再计算匹配分数。ITM使用<strong>双向自注意掩码</strong>，所有query和text都可以相互感知。</li>
</ul>



<ul class="wp-block-list">
<li>第二个预训练阶段，vision-to-language<strong>生成学习</strong>，将 Q-Former 连接到冻结的大语言模型LLM，将 Q-Former 的输出给到冻结的 LLM 来执行视觉到语言的生成学习，目标是训练Q-Former使其输出的视觉表示对LLM可用。</li>
</ul>



<ul class="wp-block-list">
<li>使用<strong>全连接层</strong>将输出的query embedding线性投影到与 LLM 的text embedding相同的维度，然后将投影的query embedding添加到输入text embedding前面。由于 Q-Former 已经过预训练，可以提取包含语言信息的视觉表示，因此它可以有效地充当<strong>信息枢纽</strong>，将最有用的信息提供给 LLM，同时删除不相关的视觉信息，减轻了 LLM 学习视觉语言对齐的负担【相当于soft visual prompts】。</li>



<li>尝试了decoder-based LLM 和 encoder-decoder-based LLM：对于decoder-based LLM，基于language modeling loss进行预训练，用Q-Former提取的视觉表示生成文本描述；对于encoder-decoder-based LLM，基于prefix language modeling loss进行预训练，把前缀和视觉表示一起输入LLM encoder，由LLM decoder生成后续文本。</li>
</ul>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="254" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-2.jpeg" alt="" class="wp-image-6358" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-2.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-2-300x106.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><br><strong>VQA任务微调结构</strong>：</p>



<p class="wp-block-paragraph">把问题和Q-Former提取的视觉表示一起输入LLM从而得到答案，不过还多了一个把问题也加入了Q-Former的输入，使提取的图像特征和问题更相关。这种方式也用在了他们的下一篇文章InstructBLIP中，用于注入指令进行微调。</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="592" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-22.jpeg" alt="" class="wp-image-6379" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-22.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-22-300x247.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><br><strong>数据集</strong>：<br>预训练数据集：</p>



<ol class="wp-block-list">
<li>沿用BLIP的数据集，加起来总共129M：COCO, Visual Genome, Conceptual Captions 3M+12M, SBU Captions, 额外的 web 数据集 LAION400M 的一部分，该数据集包含 115M 图像，具有更多的噪声文本；</li>



<li>采用了 BLIP 里面提出的 CapFilt 方法从网络图像合成文本描述（选top2)。</li>
</ol>



<p class="wp-block-paragraph">预训练好的Image Encoder和 LLM：</p>



<ol class="wp-block-list">
<li>视觉模型：CLIP训练的 ViT-L/14；EVA-CLIP训练的 ViT-g/14</li>



<li>LLM ：基于解码器的LLM-OPT；基于编解码器的LLM-FlanT5</li>
</ol>



<p class="wp-block-paragraph"><strong>训练设定</strong>：第一阶段预训练250k步，第二阶段预训练80k步，图像输入尺寸224*224，更多细节看原文。</p>



<p class="wp-block-paragraph"><strong>效果展示</strong>：可做到视觉知识推理、视觉常识推理、视觉对话、个性化图像到文本生成等，只需在视觉提示之后附加文本提示作为 LLM 的输入。</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="732" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-17.jpeg" alt="" class="wp-image-6374" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-17.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-17-295x300.jpeg 295w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><br><strong>不足</strong>：</p>



<ul class="wp-block-list">
<li>上下文学习能力缺失：由于预训练数据集中的每个数据只包含一个图文对，LLM无法学习单个序列中多个图文对的相关性。</li>



<li>冻结参数的 LLM 的风险：比例输出攻击性语言，传播社会偏见，解决办法是指令微调，或者过滤掉有害的数据集。</li>
</ul>



<h2 class="wp-block-heading">LLaVA（Large Language and Vision Assistant）</h2>



<p class="wp-block-paragraph"><br><strong>基本思想</strong>：</p>



<p class="wp-block-paragraph">使用仅限语言的GPT-4生成多模态语言图像指令跟随数据，提出一种连接视觉编码器和LLM的端到端训练多模态大模型。</p>



<p class="wp-block-paragraph"><br><strong>模型结构</strong>：</p>



<p class="wp-block-paragraph">使用视觉编码器CLIP ViT-L/14+语言解码器LLaMA构成多模态大模型，然后使用生成的数据进行指令微调。输入图片X经过与训练好的视觉编码器的到图片特征Z，图片特征Z经过一个映射矩阵W转化为视觉Token H，这样Vison Token H_v与Language Token H_q指令就都在同一个特征空间，拼接后一起输入大模型。这里的映射层W也可以替换为更复杂的网络来提升性能，比如Flamingo中用的gated cross-attentio，BLIP-2中用的Q-former。</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="734" height="102" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-1.png" alt="" class="wp-image-6369" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-1.png 734w, https://blog.deephour.com/wp-content/uploads/2024/04/image-1-300x42.png 300w" sizes="auto, (max-width: 734px) 100vw, 734px" /></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="284" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-5.jpeg" alt="" class="wp-image-6361" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-5.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-5-300x118.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><br><strong>训练</strong>：</p>



<p class="wp-block-paragraph">使用如下图的方式组织每一轮的对话输入输出，训练模型预测助手的答案以及在哪里停止，因此仅使用绿色序列和标记来计算<strong>自回归模型</strong>中的损失，即根据所有前轮的指令和回答来预测当前目标回答X_a，也就是经典的next token prediction。</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1296" height="192" src="https://blog.deephour.com/wp-content/uploads/2024/04/image.png" alt="" class="wp-image-6356" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image.png 1296w, https://blog.deephour.com/wp-content/uploads/2024/04/image-300x44.png 300w, https://blog.deephour.com/wp-content/uploads/2024/04/image-1024x152.png 1024w, https://blog.deephour.com/wp-content/uploads/2024/04/image-768x114.png 768w" sizes="auto, (max-width: 1296px) 100vw, 1296px" /><figcaption class="wp-element-caption">自回归损失-通过所有前轮的指令和回答来预测当前目标回答X_a</figcaption></figure>



<p class="wp-block-paragraph"><br>文中使用了两阶段的训练方式：</p>



<ol class="wp-block-list">
<li>预训练特征对齐模块（映射层W），冻结视觉编码器和LLM，只训练<strong>映射矩阵W得到上面公式的最大似然</strong>，相当于为冻结的 LLM 训练一个适配的visual tokenizer。</li>



<li>端到端的微调语言模型+映射层。</li>
</ol>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="246" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-18.jpeg" alt="" class="wp-image-6375" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-18.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-18-300x103.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><br><strong>数据</strong>：</p>



<p class="wp-block-paragraph">使用ChatGPT/GPT-4将数据转化为多模态指令跟随数据（multimodel instrustion-following data）。具体来说，为了将输入图像编码为视觉特征来作为纯文本 GPT的(soft) promt，文中用了两种类型的表达：</p>



<ul class="wp-block-list">
<li>caption描述：从不同角度描述视觉场景；</li>



<li>bbox检测框：定位场景中的对象，每个框对对象概念及其空间位置进行编码。</li>
</ul>



<p class="wp-block-paragraph">通过这两类符合表示，将视觉内容传达给了语言大模型，然后人工设计了3种对话方式，利用GPT-4进行生成和扩充，分别是对话、细节描述和复杂推理。最后总共收集了158K独特的语言图像指令跟随样本，包括58K对话数据、23K详细描述数据、77K复杂推理数据。</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="780" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-11.jpeg" alt="" class="wp-image-6367" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-11.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-11-277x300.jpeg 277w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<h2 class="wp-block-heading"><br>MiniGPT-4</h2>



<p class="wp-block-paragraph"><br><strong>基本思想</strong>：</p>



<p class="wp-block-paragraph">GPT-4 具有先进的多模态生成能力的主要原因在于利用了更先进的大型语言模型（LLM），因此提出仅用一个投影层将一个冻结的视觉编码器和一个冻结的 LLM（Vicuna）对齐。</p>



<p class="wp-block-paragraph"><br><strong>模型结构</strong>：</p>



<p class="wp-block-paragraph">类似BLIP2，包括一个冻结的视觉编码器（ViT-G/14 + Q-Former）， 一个冻结的 LLM（Vicuna）， 一个投影层。</p>



<p class="wp-block-paragraph"><strong>两阶段训练</strong>：</p>



<p class="wp-block-paragraph">第一阶段在大量对齐的图像文本对上对模型进行预训练，以获取基础的视觉语言知识。 在第二阶段，使用规模较小但更高质量的图文对数据集和精心设计的对话模板对预训练模型进行微调，以增强模型的生成可靠性和可用性。关于loss设计论文没有讲太细，看代码里面应该主要是计算language modeling loss： <a href="https://link.zhihu.com/?target=https%3A//github.com/Vision-CAIR/MiniGPT-4/blob/main/minigpt4/models/mini_gpt4.py%23L320" target="_blank" rel="noreferrer noopener">https://github.com/Vision-CAIR/MiniGPT-4/blob/main/minigpt4/models/mini_gpt4.py#L320</a></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="537" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-7.jpeg" alt="" class="wp-image-6364" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-7.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-7-300x224.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<h2 class="wp-block-heading">InstructBLIP(Instruction Tuning)</h2>



<p class="wp-block-paragraph"><br><strong>基本思想</strong>：</p>



<p class="wp-block-paragraph">基于 BLIP-2 提出指令微调的范式，借助额外的 instruction 提取更有用的视觉特征。</p>



<p class="wp-block-paragraph"><strong>模型结构</strong>：</p>



<p class="wp-block-paragraph">InstructBLIP 的架构和 BLIP-2 相似，从预训练好的 BLIP-2 模型初始化，由图像编码器、LLM 和 Q-Former 组成。为了进行指令微调，在BLIP-2的基础上把 instruction text tokens也作为输入同时给到Q-former和LLM。其中可学习的K个queries 通过Q-former中共享的 self-attention 和输入指令交互，通过 cross-attention 和输入图片的特征交互，鼓励提取与任务相关的图像特征。</p>



<p class="wp-block-paragraph"><br><strong>训练</strong>：和BLIP-2一致，分两个阶段</p>



<ul class="wp-block-list">
<li>第一个vision-language表示学习阶段，将 Q-Former 连接到冻结的图像编码器image encoder，目标是Q-Former学习与文本最相关的视觉表示。</li>



<li>第二个vision-to-language生成学习阶段，将 Q-Former 连接到冻结的大语言模型LLM，将 Q-Former 的输出给到冻结的 LLM 来执行视觉到语言的生成学习，目标是训练Q-Former使其输出的视觉表示对LLM可用。</li>
</ul>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="407" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-15.jpeg" alt="" class="wp-image-6372" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-15.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-15-300x170.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><br><strong>推理</strong>：</p>



<p class="wp-block-paragraph">分两种情况，对于大部分描述性任务，如 image captioning，open-ended VQA 等，InstructBLIP 可以直接使用 LLM 生成的文本作为输出；对于选择性任务，如 classification 和 multi-choice VQA ，参考vocabulary ranking method，将LLM生成的内容词汇限制为<strong>候选列表进行排序</strong>，计算每个候选的对数似然，选择最高值的一个作为最终预测。</p>



<p class="wp-block-paragraph"><br><strong>数据集</strong>：</p>



<p class="wp-block-paragraph">作者将11类任务的26个数据集转化成指令微调的格式，把它们分成13个 held-in 数据集用于指令微调，和13个 held-out 数据集用于 Zero-Shot 能力的评估。held-out分两种，一种是这些数据在训练期间没被模型见过，但是同类型的任务中学过，另一种是在训练和同类型的任务都不涉及（比如下图中全为白框的4个任务）。</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="450" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-23.jpeg" alt="" class="wp-image-6380" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-23.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-23-300x188.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><br><strong>采样策略</strong>：</p>



<p class="wp-block-paragraph">在训练期间，所有的 held-in 数据集的训练集混合，总数量太大且每个数据集的规模存在显着差异，均匀混合会导致模型过拟合较小的数据集，欠拟合较大的数据集。因此，文中提出根据<strong>数据集的大小的平方根</strong>或者其他正相关比例进行采样。更多训练细节见原文。</p>



<p class="wp-block-paragraph"><br><strong>指令模板</strong>：</p>



<p class="wp-block-paragraph">对于每个任务，人工制作了10-15个高质量的自然语言指令模板。对于一些偏爱简洁响应的数据集，在 instruction 中增加了 &#8220;short&#8221;, &#8220;briefly&#8221; 来减小模型过拟合的风险，防止模型始终生成很短的输出。</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="577" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-19.jpeg" alt="" class="wp-image-6376" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-19.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-19-300x240.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<h2 class="wp-block-heading">MME多模态大模型评估体系</h2>



<p class="wp-block-paragraph"><br>链接： <a href="https://link.zhihu.com/?target=https%3A//github.com/BradyFU/Awesome-Multimodal-Large-Language-Models/tree/Evaluation" target="_blank" rel="noreferrer noopener">A Comprehensive Evaluation Benchmark for Multimodal Large Language Models</a></p>



<p class="wp-block-paragraph"><br><strong>基本思路</strong>：</p>



<p class="wp-block-paragraph"><br>针对多模态大模型提出评估基准MME，在14个子任务上评估了目前比较前沿的12个大模型的感知和认知能力。</p>



<p class="wp-block-paragraph"><strong>通用的全面评估基准应具备以下四个特点</strong>：</p>



<ol class="wp-block-list">
<li>涵盖不同层次的能力，包括感知和认知能力。前者指识别特定对象，如对象的存在、数量、位置和颜色。后者指通过组合LLM中的感知信息和知识推导出更复杂的答案（前者是后者的前提）。</li>



<li>数据或注释应尽可能不来自现有的公开可用数据集，以避免数据泄漏的风险。</li>



<li>指令应尽可能简明扼要，并符合人类的认知。所有模型应在相同统一的指令下进行测试，以进行公平比较，一个优秀的MLLM也应能够推广到这种简明扼要的指令。</li>



<li>MLLM对指令的响应应直观且便于定量分析。</li>
</ol>



<p class="wp-block-paragraph"><strong>对应的设计</strong>：</p>



<ol class="wp-block-list">
<li>MME涵盖了感知和认知能力的考察，总共有14个子任务：
<ol class="wp-block-list">
<li>感知能力：OCR能力和粗粒度识别、细粒度识别，前者识别对象的存在、数量、位置和颜色，后者识别电影海报、名人、场景、地标和艺术作品。</li>



<li>认知能力：包括常识推理、数值计算、文本翻译和代码推理。</li>
</ol>
</li>



<li>所有的指令-答案对都是人工构建的。对于涉及到的少数公共数据集，也仅使用图像，而不直接依赖于其原始注释。同时，我们努力通过真实照片和图像生成来收集数据。</li>



<li>MME的指令设计简明扼要，以避免对模型输出的影响，基本假设是一个好的MLLM应能够适配简单且常用的指令。</li>



<li>根据MLLM的输出准确&amp;客观，主要是以&#8221;是&#8221;&#8221;否&#8221;问答，便于进行定量统计。需要注意的是，文中还尝试设计了带有多项选择题的指令，但发现当前的MLLM可能无法遵循复杂的指令。</li>
</ol>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="612" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-14.jpeg" alt="" class="wp-image-6371" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-14.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-14-300x255.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><br>在12个当前比较SOTA的方法上的评估结果：</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="602" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-8.jpeg" alt="" class="wp-image-6363" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-8.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-8-300x251.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p class="wp-block-paragraph"><br><strong>结论</strong>：综合感知能力和认知能力，BLIP2、mPLUG-Owl、InstructionBLIP、Mini-GPT4 总体表现更优。</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="325" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-16.jpeg" alt="" class="wp-image-6373" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-16.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-16-300x135.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="720" height="605" src="https://blog.deephour.com/wp-content/uploads/2024/04/image-9.jpeg" alt="" class="wp-image-6365" srcset="https://blog.deephour.com/wp-content/uploads/2024/04/image-9.jpeg 720w, https://blog.deephour.com/wp-content/uploads/2024/04/image-9-300x252.jpeg 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.deephour.com/2024/04/02/%e5%a4%9a%e6%a8%a1%e6%80%81%e5%a4%a7%e6%a8%a1%e5%9e%8b-clip-blip-blip2-llava-minigpt4-instructblip-%e7%b3%bb%e5%88%97%e8%a7%a3%e8%af%bb%e8%bd%ac%e8%bd%bd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
