自监督学习模型发展综述:Inst Disc、Inva Sread、MOCO、SimCLR、BYOL

文章目录

代理任务:个体判别,每一张图片都是自己的类,每一张图片都尽可能和其他图片分开。

对比学习:需要有正负样本,让正负样尽可能的分开,负样本越多对比学习效果更好

一、Inst Disc

研究意义价值

提出了个体判别的代理任务,提出使用memory bank数据结构存储大量负样本,是MoCo的前身。

个体判别(instance discrimination)

将每一张图片都看作是一个类别,希望模型可以学习图片的表征,从而把各种图片都区分出来。

特点

把每一张图片都看做一个类别,通过卷积神经网络学习每一张图片(每个实例)的特征,从而把每一张图片都分开。

实现方法

通过CNN给图片编码成一个128维的特征,然后在特征空间中将这些特征尽可能分开。

如何训练CNN

使用对比学习中的正负样本进行训练。

正样本:图像本身

负样本:数据集中除了正样本的其他图片。

大量负样本如何存储

数据结构:memory bank(字典),后文简称mb,把所有图片的特征向量都存储在一个memory bank中。

以ImageNet数据集为例,数据集中共有128万张图片,因此memory bank字典就需要有128万行,所以需要把图片的特征维度尽可能减小来降低内存。

在论文中选择了128维的向量。

前向传播过程

  • 图片特征向量大小:batchsize = 256, 256张图片进入编码器中,通过ResNet50生成一个2048维特征向量,再降维形成128维的向量。
  • 正样本:一批次为256个
  • 负样本:从mb中随机抽取的4096个图片的特征向量
  • loss function:NCE loss
  • 更新mb:利用NCE loss去更新CNN的参数。本次更新结束后,会将CNN编码得到的向量替换掉memory bank中原有的存储。就这样循环往复的更新CNN和memory bank,最后让模型收敛,就训练好一个CNN encoder了

Proximal Regularization

为模型的训练加一个约束,使得mb可以进行动量式的更新。

超参数设置

  • loss中温度的设置:0.07
  • epoch = 200
  • 负样本个数:4096
  • batchsize = 256
  • initial learning rate = 0.03

Moco中的超参数设置都与该设置相同。

二、Inva Sread

SimCLR前身

特点

  1. 不使用其他数据结构去存储大量负样本,正负样本均来源于一个mini-batch。
  2. 只使用一个编码器进行端到端的学习

原理

对比学习的思想。

  • 相似的图片通过编码器后生成的特征应该类似,保持特征不变性
  • 不相似的图片通过编码器后生成的特征应该有很大的差异,尽可能分散

代理任务:个体判别

如何选取正负样本

画图理解一下正负样本如何选取:

假设一个mini-batch为256张图片(x1-x256),经过数据增强后会再次得到256张图片(x1'-x256'),原图和其经过数据增强后的图片即成为一个正样本对(positive sample pair) ,即256对,除了正样本对之外的图片即为负样本,即(256-1)个负样本对(negetive sample pair)

为什么从一个batch中选择正负样本?

可以使用一个编码器进行端到端的学习。

前向传播过程

图像和增广后的图像分别经过CNN编码器输出2048维向量,两个编码器是权值共享的,所以相当于是一个编码器,然后经过降维输出128维向量,在embedding space中让正样本之间向量尽量靠近,让负样本之间向量尽量远离。

目标函数

NCE的变体。

模型效果不够好的原因

  1. 没有使用字典进行存储负样本,负样本数量不够大,导致对比学习的效果不够好。
  2. 没有足够强大的数据增广。
  3. 没有SimCLR中的projection head。

MoCo

动量对比学习方法做无监督表征学习。

具体讲解见:自监督学习之对比学习:MoCo模型超级详解解读+总结

SimCLR

模型

正负样本对的选取

把原图进行不同的数据增广后得到xi和xj,该两张图片互为正样本,一个batch中的其他图片均为其负样本。如一个batch中有n张图片,对每张图片都进行两次数据增广,经过数据增广后该batch中则会包含2N张图片,其中有N对互为正样本对,则有N-1对为其负样本对。

Proection Head

模型中的g(.)函数:全连接层(20482048)-> BN -> 激活函数 -> 全连接层(2048 128) -> BN

前向传播过程

注意:projection head只在训练的时候使用,在后续下游任务时去掉g函数那一层,使用h特征向量做下游任务。

和Inva Sread的区别

  1. 更多的数据增强: 多种数据增强的方法进行使用。
  2. 更大的batchsize进行训练。
  3. 加了一个projection head:加一个非线性变换。

BYOL

无需负样本就可以做对比自监督学习。

模型

目标函数

MSE loss

BYOL模型中的BN作用

模型进行隐式的负样本学习。

参考

Unsupervised Feature Learning via Non-Parametric Instance Discrimination
SimCLR知乎解读

相关推荐
Redamancy_Xun5 分钟前
软件老化分析
python·程序人生·安全威胁分析·可信计算技术·安全架构
geovindu7 分钟前
python: Oracle Stored Procedure query table
数据库·python·mysql·postgresql·oracle·sqlserver·mssql
神经网络的应用9 分钟前
C++程序设计例题——第三章程序控制结构
c++·学习·算法
南宫生21 分钟前
力扣-数据结构-3【算法学习day.74】
java·数据结构·学习·算法·leetcode
挥剑决浮云 -26 分钟前
STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器
c语言·经验分享·stm32·单片机·嵌入式硬件·学习
NiNg_1_23429 分钟前
Python中SKlearn的K-means使用详解
python·kmeans·sklearn
keep-learner39 分钟前
Unity Dots理论学习-2.ECS有关的模块(1)
学习·unity·游戏引擎
葡萄架子39 分钟前
Python中的logger作用(from loguru import logger)
java·前端·python
hakesashou43 分钟前
python怎么看矩阵维数
开发语言·python
A懿轩A1 小时前
C/C++ 数据结构与算法【树和二叉树】 树和二叉树,二叉树先中后序遍历详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·二叉树·