Self-supervised Learning整理

本文深入探讨了自我监督学习(Self-supervised Learning, SSL)的概念,其中预训练(Pre-train)和微调(Fine-tune)是关键步骤。预训练在大规模无标签数据上构建有用的特征提取器,如Encoder,然后通过Projection Head得到嵌入向量。微调阶段则是在特定下游任务的小规模有标签数据集上进行,可以选择固定Encoder或对其进行微调。SSL通过对比学习和生成/预测方法寻找数据间的内在联系,以实现高效的学习。SimCLR等方法进一步优化了这一过程,使得在少量有标记数据下也能取得良好效果。
部署运行你感兴趣的模型镜像

Self-supervised Learning

Pre-train Fine-tune

Pre-train Fine-tune算是一种Transfer Learning。

首先,假设按照SimCLR中的设定,将一般的模型分为两部分,分别为EncoderProjection HeadEncoder结构类似于AutoEncoder中的Encoder部分,输出是一个低维的张量,可以称为输入数据的表征Projection Head可以认为是一个全连接层,将Encoder输出的张量映射为更低维的张量(或者称为嵌入向量)。
在这里插入图片描述

Pre-train就是预训练Encoder部分,得到一个有用的表征,通过Projection Head得到输出的嵌入向量,进行损失函数计算和模型更新。然后在不同的下游任务中,删掉Projection Head重新训练

预训练Encoder的过程就是Pre-train;删掉Projection Head重新训练的过程就叫做Fine-tune

此处的重新训练可以分为两种:

  1. ConvNet as fixed feature extractor:即删掉Projection Head后,重新训练一个Projection Head
  2. Fine-tuning the ConvNet:即对Encoder进行微调,同时重新训练一个Projection Head

对于Self-supervised Learning,要明确其严格意义上讲叫做无监督表示学习。和传统的无监督学习不同,SSL最终还是会用到有标记数据,只不过相对于监督训练,可以在极小的有标记数据下实现较高的正确率。

SSL一般将Pre-train和下游任务的fine-tune分开,不过也有很多文章尝试将二者结合起来。总而言之,四个词总结为:

Unsupervised Pre-train, Supervised Fine-tune.

Self-supervised Learning

Self-supervised Learning就是通过大量无标记数据,找寻数据之间的内在关系,建立一个能够提取泛化特征的Encoder,然后根据下游任务的需要,在下游任务的少量有标记数据集中进行Fine-tune。从生物的角度讲,可以理解为在无标记数据集中培育一个干细胞,然后在具体的下游任务中,利用少量资源,就可以将干细胞分化为红细胞、白细胞、上皮细胞;而不是每次都搞大量资源从头开始造不同结构的不同细胞。根据寻找这种内在关系的方式不同,可以将SSL分为两个大类(也有文章分为三个大类):

  1. 基于生成/预测的SSL
  2. 基于对比的SSL

基于生成/预测的SSL

image-20210828153720420

对于第一种,基于生成/预测的SSL,典型的有Context Encoders: Feature Learning by Inpainting,通过对图像的一部分扣除,将扣除后剩余部分进行Encoder,输出一个大小与扣除部分相同的张量,然后将扣除的部分和Encoder输出的部分做Loss,就可以让Encoder全面的知道输入的图片究竟是怎么样的。(当然也可以用来做一些图像补全工作)

image-20210828195036104

基于对比的SSL

这部分是目前研究的重点,有一些典型的文章:

DIM

原文:Learning Deep Representations By Mutual Information Estimation And Maximization
解读:to do …

CPC

原文:Representation Learning with Contrastive Predictive Coding
我的解读

CMC

原文:Contrastive Multiview Coding
解读:to do …

MoCo

原文:Momentum Contrast for Unsupervised Visual Representation Learning
解读:to do …

SimCLR(*****)

SimCLR及其改进版本SimCLR-v2,其完整过程请参考(大佬们已经总结得十分详细了,没有必要再整理了):

详细介绍

精简思路

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

Self-Supervised Learning(SSL,自监督学习)是一种强大的机器学习范式,旨在利用未标记数据进行训练。这种方法通过从数据本身生成伪标签,来创建监督信号,使得模型能够学习有效的数据表示。在深度学习领域,标记数据往往昂贵且难以获得,而未标记数据则大量存在,因此自监督学习受到了广泛关注[^1][^2]。 自监督学习不仅在NLP领域,在CV、语音领域也有很多经典的工作,它可以分成3类:Data Centric、Prediction(也叫Generative)和Contrastive[^3]。通过自监督学习,可以利用未标注数据来提取有效的特征,进而用于各种下游任务。在实际应用中,自监督学习具有能够充分利用大量未标记数据的优势,不过也可能存在一定的限制,在具体使用时需对其定义、主要技术方法、实现策略以及优势和限制进行深入分析[^1]。 ### 代码示例(示意性) 以下是一个简单的Python伪代码示例,示意自监督学习中预训练和微调的过程: ```python import torch import torch.nn as nn import torch.optim as optim # 定义一个简单的神经网络模型 class SimpleModel(nn.Module): def __init__(self): super(SimpleModel, self).__init__() self.fc1 = nn.Linear(10, 20) self.fc2 = nn.Linear(20, 1) def forward(self, x): x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # 初始化模型 model = SimpleModel() # 自监督预训练阶段 # 假设这里有未标记数据 unlabeled_data unlabeled_data = torch.randn(100, 10) criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=0.001) for epoch in range(10): outputs = model(unlabeled_data) # 这里简单假设生成的伪标签是输入数据的某种变换 pseudo_labels = unlabeled_data.sum(dim=1, keepdim=True) loss = criterion(outputs, pseudo_labels) optimizer.zero_grad() loss.backward() optimizer.step() # 微调阶段 # 假设这里有标记数据 labeled_data 和对应的标签 labels labeled_data = torch.randn(20, 10) labels = torch.randn(20, 1) for epoch in range(5): outputs = model(labeled_data) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值