当前位置: 首页 > news >正文

【机器学习】--- 自监督学习

在这里插入图片描述

1. 引言

机器学习近年来的发展迅猛,许多领域都在不断产生新的突破。在监督学习和无监督学习之外,自监督学习(Self-Supervised Learning, SSL)作为一种新兴的学习范式,逐渐成为机器学习研究的热门话题之一。自监督学习通过从数据中自动生成标签,避免了手工标注的代价高昂,进而使得模型能够更好地学习到有用的表示。

自监督学习的应用领域广泛,涵盖了图像处理、自然语言处理、音频分析等多个方向。本篇博客将详细介绍自监督学习的核心思想、常见的自监督学习方法及其在实际任务中的应用。我们还将通过具体的代码示例来加深对自监督学习的理解。

2. 自监督学习的核心思想

自监督学习的基本理念是让模型通过从数据本身生成监督信号进行训练,而无需人工标注。常见的方法包括生成对比任务、预测数据中的某些属性或部分等。自监督学习的关键在于设计出有效的预训练任务,使模型在完成这些任务的过程中能够学习到数据的有效表示。

2.1 自监督学习与监督学习的区别

在监督学习中,模型的训练需要依赖大量的人工标注数据,而无监督学习则没有明确的标签。自监督学习介于两者之间,它通过从未标注的数据中创建监督信号,完成预训练任务。通常,自监督学习的流程可以分为两步:

  1. 预训练:利用自监督任务对模型进行预训练,使模型学习到数据的有效表示。
  2. 微调:将预训练的模型应用到具体任务中,通常需要进行一些监督学习的微调。
2.2 常见的自监督学习任务

常见的自监督任务包括:

  • 对比学习(Contrastive Learning):从数据中生成正样本和负样本对,模型需要学会区分正负样本。
  • 预文本任务(Pretext Tasks):如图像块预测、顺序预测、旋转预测等任务。
2.3 自监督学习的优点

自监督学习具备以下优势:

  • 减少对人工标注的依赖:通过生成任务标签,大大降低了数据标注的成本。
  • 更强的泛化能力:在大量未标注的数据上进行预训练,使模型能够学习到通用的数据表示,提升模型在多个任务上的泛化能力。

3. 自监督学习的常见方法

在自监督学习中,研究者设计了多种预训练任务来提升模型的学习效果。以下是几种常见的自监督学习方法。

3.1 对比学习(Contrastive Learning)

对比学习是目前自监督学习中最受关注的一个方向。其基本思想是通过构造正样本对(相似样本)和负样本对(不同样本),让模型学习区分样本之间的相似性。典型的方法包括SimCLR、MoCo等。

SimCLR 的实现
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
import torchvision.models as models
from torch.utils.data import DataLoader, Dataset
import numpy as np# SimCLR数据增强
class SimCLRTransform:def __init__(self, size):self.transform = transforms.Compose([transforms.RandomResizedCrop(size=size),transforms.RandomHorizontalFlip(),transforms.ColorJitter(0.4, 0.4, 0.4, 0.4),transforms.RandomGrayscale(p=0.2),transforms.GaussianBlur(kernel_size=(3, 3)),transforms.ToTensor()])def __call__(self, x):return self.transform(x), self.transform(x)# 定义对比损失
class NTXentLoss(nn.Module):def __init__(self, temperature):super(NTXentLoss, self).__init__()self.temperature = temperaturedef forward(self, z_i, z_j):batch_size = z_i.size(0)z = torch.cat([z_i, z_j], dim=0)sim_matrix = torch.mm(z, z.t()) / self.temperaturemask = torch.eye(2 * batch_size, dtype=torch.bool).to(sim_matrix.device)sim_matrix.masked_fill_(mask, -float('inf'))positives = torch.cat([torch.diag(sim_matrix, batch_size), torch.diag(sim_matrix, -batch_size)], dim=0)negatives = sim_matrix[~mask].view(2 * batch_size, -1)logits = torch.cat([positives.unsqueeze(1), negatives], dim=1)labels = torch.zeros(2 * batch_size).long().to(logits.device)loss = nn.CrossEntropyLoss()(logits, labels)return loss# 定义模型架构
class SimCLR(nn.Module):def __init__(self, base_model, projection_dim=128):super(SimCLR, self).__init__()self.backbone = base_modelself.projector = nn.Sequential(nn.Linear(self.backbone.fc.in_features, 512),nn.ReLU(),nn.Linear(512, projection_dim))def forward(self, x):h = self.backbone(x)z = self.projector(h)return z# 模型训练
def train_simclr(model, train_loader, epochs=100, lr=1e-3, temperature=0.5):optimizer = optim.Adam(model.parameters(), lr=lr)criterion = NTXentLoss(temperature)for epoch in range(epochs):model.train()total_loss = 0for x_i, x_j in train_loader:optimizer.zero_grad()z_i = model(x_i)z_j = model(x_j)loss = criterion(z_i, z_j)loss.backward()optimizer.step()total_loss += loss.item()print(f'Epoch [{epoch+1}/{epochs}], Loss: {total_loss/len(train_loader)}')# 示例:在CIFAR-10上进行SimCLR训练
from torchvision.datasets import CIFAR10train_dataset = CIFAR10(root='./data', train=True, transform=SimCLRTransform(32), download=True)
train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True, num_workers=4)resnet_model = models.resnet18(pretrained=False)
simclr_model = SimCLR(base_model=resnet_model)train_simclr(simclr_model, train_loader)

以上代码展示了如何实现SimCLR对比学习模型。通过数据增强生成正样本对,使用NT-Xent损失函数来区分正负样本对,进而让模型学习到有效的数据表示。

3.2 预文本任务(Pretext Tasks)

除了对比学习,预文本任务也是自监督学习中的一种重要方法。常见的预文本任务包括图像块预测、旋转预测、Jigsaw拼图任务等。我们以Jigsaw拼图任务为例,展示如何通过打乱图像块顺序,让模型进行重新排序来学习图像表示。

Jigsaw任务的实现
import random# 定义Jigsaw数据预处理
class JigsawTransform:def __init__(self, size, grid_size=3):self.size = sizeself.grid_size = grid_sizeself.transform = transforms.Compose([transforms.Resize((size, size)),transforms.ToTensor()])def __call__(self, x):x = self.transform(x)blocks = self.split_into_blocks(x)random.shuffle(blocks)return torch.cat(blocks, dim=1), torch.tensor([i for i in range(self.grid_size ** 2)])def split_into_blocks(self, img):c, h, w = img.size()block_h, block_w = h // self.grid_size, w // self.grid_sizeblocks = []for i in range(self.grid_size):for j in range(self.grid_size):block = img[:, i*block_h:(i+1)*block_h, j*block_w:(j+1)*block_w]blocks.append(block.unsqueeze(0))return blocks# 定义Jigsaw任务模型
class JigsawModel(nn.Module):def __init__(self, base_model):super(JigsawModel, self).__init__()self.backbone = base_modelself.classifier = nn.Linear(base_model.fc.in_features, 9)def forward(self, x):features = self.backbone(x)out = self.classifier(features)return out# 示例:在CIFAR-10上进行Jigsaw任务训练
train_dataset = CIFAR10(root='./data', train=True, transform=JigsawTransform(32), download=True)
train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True, num_workers=4)jigsaw_model = JigsawModel(base_model=resnet_model)# 训练过程同样可以采用类似SimCLR的方式进行

Jigsaw任务通过打乱图像块并要求模型恢复原始顺序来学习图像的表示,训练方式与

普通的监督学习任务相似,核心是构建预训练任务并生成标签。

4. 自监督学习的应用场景

自监督学习目前在多个领域得到了成功的应用,包括但不限于:

  • 图像处理:通过预训练任务学习到丰富的图像表示,进而提升在图像分类、目标检测等任务上的表现。
  • 自然语言处理:BERT等模型的成功应用展示了自监督学习在文本任务中的巨大潜力。
  • 时序数据分析:例如在视频处理、音频分析等领域,自监督学习也展示出了强大的能力。

5. 结论

自监督学习作为机器学习中的一个新兴热点,极大地推动了无标注数据的利用效率。通过设计合理的预训练任务,模型能够学习到更加通用的数据表示,进而提升下游任务的性能。在未来,自监督学习有望在更多实际应用中发挥重要作用,帮助解决数据标注昂贵、难以获取的难题。

在这篇文章中,我们不仅阐述了自监督学习的基本原理,还通过代码示例展示了如何实现对比学习和Jigsaw任务等具体方法。通过深入理解这些技术,读者可以尝试将其应用到实际任务中,从而提高模型的表现。

参考文献

  1. Chen, Ting, et al. “A simple framework for contrastive learning of visual representations.” International conference on machine learning. PMLR, 2020.
  2. Gidaris, Spyros, and Nikos Komodakis. “Unsupervised representation learning by predicting image rotations.” International Conference on Learning Representations. 2018.

相关文章:

【机器学习】--- 自监督学习

1. 引言 机器学习近年来的发展迅猛,许多领域都在不断产生新的突破。在监督学习和无监督学习之外,自监督学习(Self-Supervised Learning, SSL)作为一种新兴的学习范式,逐渐成为机器学习研究的热门话题之一。自监督学习…...

【Linux修行路】网络套接字编程——UDP

目录 ⛳️推荐 前言 六、Udp Server 端代码 6.1 socket——创建套接字 6.2 bind——将套接字与一个 IP 和端口号进行绑定 6.3 recvfrom——从服务器的套接字里读取数据 6.4 sendto——向指定套接字中发送数据 6.5 绑定 ip 和端口号时的注意事项 6.5.1 云服务器禁止直接…...

哈希表数据结构学习

哈希表数据结构学习 哈希表基本概念哈希方法单值哈希与多值哈希哈希冲突1. 开放寻址法(Open Addressing)2. 链地址法(Chaining)3. 再哈希法(Rehashing)4. 建立公共溢出区(Overflow Area&#xf…...

数据结构——“二叉搜索树”

二叉搜索树是一个很重要的数据结构,它的特殊结构可以在很短的时间复杂度找到我们想要的数据。最坏情况下的时间复杂度是O(n),最好是O(logn)。接下来看一看它的接口函数的实现。 为了使用方便,这里采用模版的方式: 一、节点 temp…...

Java零基础-Java对象详解

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…...

从Prompt到创造:解锁AI的无限潜能

文章目录 🍊AI内容创作核心:提示词Prompt1 什么是提示词工程?1.1 提示词的原理是什么?1.2 提示词工程师:百万年薪的职业?1.3 谁都能成为提示词工程师吗? 2 提示词书写的基本技巧3 常见的提示词框架3.1 CO-…...

sqlgun靶场攻略

打开界面 1.输入框测试回显点 -1union select 1,2,3#出现回显点 2.查看数据库名 -1union select 1,2,database()# 3.查看表名 -1union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasqlgunnews# 4.查看admin表中列名 -1union se…...

《网络协议 - HTTP传输协议及状态码解析》

文章目录 一、HTTP协议结构图二、HTTP状态码解读1xx: 信息响应类2xx: 成功响应类3xx: 重定向类4xx: 客户端错误类5xx: 服务器错误类 一、HTTP协议结构图 二、HTTP状态码解读 HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传…...

9.11 QT ( Day 4)

一、作业 1.Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //定时器类 #include <QTime> #include <QtTextToSpeech> //文本转语音类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEcl…...

利用AI驱动智能BI数据可视化-深度评测Amazon Quicksight(四)

简介 随着生成式人工智能的兴起&#xff0c;传统的 BI 报表功能已经无法满足用户对于自动化和智能化的需求&#xff0c;今天我们将介绍亚马逊云科技平台上的AI驱动数据可视化神器 – Quicksight&#xff0c;利用生成式AI的能力来加速业务决策&#xff0c;从而提高业务生产力。…...

2024.9最新:CUDA安装,pytorch库安装

目录 一、CUDA安装 1.查看自己电脑适配的CUDA的最高版本 2.安装CUDA 3.检查环境变量是否配置&#xff0c;安装是否成功 二、pytorch库安装 1.pytorch库下载 2.选择合适的版本 3.查看版本 一、CUDA安装 1.查看自己电脑适配的CUDA的最高版本 在命令提示符里输入nvidia-…...

Vue3.0组合式API:setup()函数

1、什么是组合式API Vue 3.0 中新增了组合式 API 的功能&#xff0c;它是一组附加的、基于函数的 API&#xff0c;可以更加灵活地组织组件代码。通过组合式 API 可以使用函数而不是声明选项的方式来编写 Vue 组件。因此&#xff0c;使用组合式 API 可以将组件代码编写为多个函…...

利用AI驱动智能BI数据可视化-深度评测Amazon Quicksight(三)

简介 随着生成式人工智能的兴起&#xff0c;传统的 BI 报表功能已经无法满足用户对于自动化和智能化的需求&#xff0c;今天我们将介绍亚马逊云科技平台上的AI驱动数据可视化神器 – Quicksight&#xff0c;利用生成式AI的能力来加速业务决策&#xff0c;从而提高业务生产力。…...

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码演示

目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验绘图堆积条形图分组条形图分类模型Logistic回归随机森林import matplotlib…...

Qt QSerialPort数据发送和接收DataComm

文章目录 Qt QSerialPort数据发送和接收DataComm2.添加 Qt Serial Port 模块3.实例源码 Qt QSerialPort数据发送和接收DataComm Qt 框架的Qt Serial Port 模块提供了访问串口的基本功能&#xff0c;包括串口通信参数配置和数据读写&#xff0c;使用 Qt Serial Port 模块就可以…...

macOS上谷歌浏览器的十大隐藏功能

谷歌浏览器&#xff08;Google Chrome&#xff09;在macOS上拥有一系列强大而隐蔽的特性&#xff0c;这些功能能显著提高您的浏览体验。从多设备同步到提升安全性和效率&#xff0c;这些被低估的功能等待着被发掘。我们将逐步探索这些功能&#xff0c;帮助您最大化利用谷歌浏览…...

【C++篇】C++类与对象深度解析(二):类的默认成员函数详解

文章目录 【C篇】C类与对象深度解析&#xff08;二&#xff09;前言1. 类的默认成员函数2. 构造函数2.1 函数名与类名相同2.2 无返回值2.3 对象实例化时系统会自动调用2.4 构造函数可以重载2.5 默认构造函数的生成规则2.6 无参构造函数与全缺省构造函数的关系2.7 内置类型与自定…...

Linux2-mkdir,touch,cat,more

1.相对路径和绝对路径 cd用于切换目录&#xff0c;对于路径可以用相对路径和绝对路径 例如&#xff1a;cd /home/user/public和cd public效果一样&#xff0c;都是将目录切换到HOME文件夹下的public文件夹 2.特殊路径符 .表示当前目录 ..表示上级目录 ~表示HOME目录 3.m…...

AI 时代程序员的应变之道

一、AI 浪潮来袭&#xff0c;编程界风云变幻 随着 AIGC 大语言模型如 ChatGPT、Midjourney、Claude 等的涌现&#xff0c;AI 辅助编程工具日益普及&#xff0c;程序员的工作方式正经历着深刻的变革。 分析公司 OReilly 日前发布的《2023 Generative AI in the Enterprise》报告…...

SQL编程题复习(24/9/16)

练习题 x40 10-74 获取商品表中商品名称含有“pad”的商品10-75 获取指定商品的商品分类名称&#xff08;多表查询&#xff09;10-76 为sh_goods表添加一行记录10-77 检索出sh_goods表中每项keyword对应的商品数量&#xff0c;查询结果显示字段依据输出样例设置10-78 查询sh_go…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...