BEIT

参考:链接
https://zhuanlan.zhihu.com/p/34998569

什么叫是分布

分布:计算“一堆数”中各个数具有的数量,并以这一堆数作为横坐标,数量作为纵坐标,这样就会画出条曲线,这条曲线对应的函数就叫做概率密度函数,概率密度函数就是分布的具体表达。
一幅图像可以认为是一个高维空间中的一个点,多幅图像就是多个点,在高维空间标出来后,会发现这多个点是按照一个分布(不妨假设是一个多维高斯分布)所存在的。一般的正常图像是这个高斯分布中随机采样出来的一个点,而一些噪声图像等非正常图像,它所对应的位置就很可能远离这个高斯分布,或者说计算出来的概率十分低。

分布:比如类A的图像的像素点的像素值和各种像素值在图像中的位置,都会有某种潜在的特征。如果将一个图像理解为高维空间的一个点,那么同一类图像肯定会集中在同一个范围,就像高斯分布中的中间高,两边低一样,即这类图像出现某个范围的可能性高(高斯分布的高处)。

比如你将一个图像的各个部分进行了胡乱重新拼凑,这就有可能导致图像在高维空间中已经不是原来的点了,当然就无法判断出此图片的类型。这就是常说的破坏了图像的分布。

变分自编码器 VAE

假设了Z服从某些常见的分布(比如正态分布或均匀分布),然后希望训练一个模型X=g(Z)
这里的Z就相当于高维空间下的横坐标上的一个点,不同范围内的点出现的概率不同。
在cv中Z代表的是一个图像,所以Z服从的是连续分布,所以只能说某个范围内的概率,不能说某一个点的概率。同一类图像肯定是在某个

通常我们会拿 VAE 跟 GAN 比较,的确,它们两个的目标基本是一致的——希望构建一个从隐变量 Z 生成目标数据 X 的模型,但是实现上有所不同。

【问题】文中提到了:这个模型能够将原来的概率分布映射到训练集的概率分布,“原来的概率分布”具体指的是什么东西?

首先我们会有一个训练集X,这个训练集代表了某种特别的图像,如狗等,我们的目标就是生成一张狗的图像。
所以VAE的作用应该和GAN一样是用于生成特定类型的图像,所以只要\(\widetilde X=g(Z)\)生成的\(\widetilde X\)组成的数据集的分布和训练集分布一样,那么就说明生成成功。


上图中,用\(X_i\)计算均值和方差,然后得到一个正态分布,然后从该正态分布中采样出\(Z_i\)用于生成\(\hat X_i\)。此时我们要计算生成的\(\hat X_i\)与实际样本的差距,但是\(\hat X_i\)应该与\(X_1\)\(X_6\)中的哪个样本进行比较呢?这是不清楚的,因为\(\hat X_i\)不一定对应\(X_i\)
【说明】\(X_i\)应该代表的是训练集中的图像,这里的均值应该指的是计算训练集中所有图像同一位置的像素点的均值,每个位置都对应一个均值和方差。

其实,在整个 VAE 模型中,我们并没有去使用 p(Z)(先验分布)是正态分布的假设,我们用的是假设 p(Z|X)(后验分布)是正态分布。
具体来说,给定一个真实样本 \(X_k\),我们假设存在一个专属于\(X_k\) 的分布 p(Z|\(X_k\))(学名叫后验分布),并进一步假设这个分布是(独立的、多元的)正态分布。
现在 p(Z|\(X_k\)) 专属于\(X_k\),我们有理由说从这个分布采样出来的 Z 应该要还原到\(X_k\) 中去。

那我怎么找出专属于 \(X_k\)的正态分布 p(Z|\(X_k\)) 的均值和方差呢?好像并没有什么直接的思路。
那好吧,我就用神经网络来拟合出来。这就是神经网络时代的哲学:难算的我们都用神经网络来拟合
构建两个神经网络分别用于计算均值和方差。

由于\(Z_i\)是从\(X_i\)专属的正态分布中采样出来的,所以\(\hat X_i\)一定对应\(X_i\)。然后计算\(\hat X_i\)\(X_i\)的差距,最后使用梯度下降更新网络

【问题】VAE中神经网络计算的均值和方差,然后让均值为零,方差为一是什么意思?这个正态分布到底是个啥?

BERT

patch:将一个图像分成很多个块,每个块称作为一个patch
token:每一个patch输入到卷积神经网络中得到一个特征向量,这个向量叫做token。

随机将部分token隐藏掉(具体是换成一个特殊的token),或者替换成一个随机的token。损失就是让输出与被隐藏掉的token越接近越好。

Beit预训练模型使用

【问题】beit预训练模型是在224x224分辨率上进行的,所以对于行人重识别的小图片会不会有影响?

其他

参考:https://www.bilibili.com/video/BV1Zq4y1h7Tu


编码器可作为特征提取器:当\(\hat x\)\(x\)之间的差距很小时,就说明编码器很好地对\(x\)进行了特征提取,此时可以直接使用提取到的\(z\)替代\(x\),即此时学习得到的编码器就是一个很好的特征提取器。
解码器可用于图像生成:输入\(z\),我们就可以生成对应的图片。但是解码器没有学习到所有z应该生成什么样的图像,解码器通常只是记录下看过的图像。


和自编码器的不同的是:这里的编码器不再直接生成\(z\),而是生成\(z\)的分布,而从分布中采样得到一个\(z\)
\(z=m+e*exp(\sigma)\),e用于随机采样,\(\sigma\)用于保证方差为正。上图中产生的z是三维的。


变分自编码器中,学习了如何从z分布中生成图像,所以就可以从未看到的点出生成图像。

看到58分钟。。。

moco

https://www.bilibili.com/video/BV1C3411s7t9/

常见的代理任务:
instance discrimination:对一张图片x做裁剪和数据增广,从而生成多张不同的图片,这些图片称为x的正样本,而数据集中的其他图片都是x的负样本。
裁剪和数据增广称为transformation。

这就非常灵活,因为你只要定义不同的代理任务,从而得到不同的正样本和负样本,就可以完成无监督训练。

摘要:
将对比学习看成字典查询的任务,
做了一个动态的字典,动态的字典包括两个部分——一个队列和一个移动平均的编码器

字典:就是正负样本经过编码器(一个神经网络)得到的特征向量,每个特征向量都称为key。
x经过编码器得到的特征向量称为query。
对比学习的目的就是学习得到一个编码器,使得query和正样本的key尽可能地接近,使得query和负样本的key尽可能地远离。

作者认为这个字典必须要大和在训练的时候必须要保持尽可能的一致性,
【问题】什么叫做一致性?

CLIP

多模态的方法

CLIP使用的是对比学习的方法进行无监督的预训练,而对比学习中就是要定义正样本和负样本是什么东西。

一个文本会和一个图片相对应,所以正样本就是对应的文本,负样本就是不对应的文本,也就是上图矩阵中对角线元素就是正样本,非对角线元素就是负样本。

作者收集了四个亿的图片和文本对应的数据集用于训练,得到一个预训练模型。

经过预训练以后的CLIP预训练模型可以用到各种任务中,如在分类任务中,只需要输入狗的图片和描述这是一只狗的句子,就可以识别出图片是狗。

CLIP可以做到输入文字,直接找到文字所描述的物体,
也可以做到输入操作,就对图片进行了某些操作,比如睁大眼睛,使脸变白等

posted @ 2022-12-19 21:44  好人~  阅读(343)  评论(0编辑  收藏  举报