论文不详细解读(二)——SimCLR系列

news2024/11/24 0:20:14

1. SimCLR v1

论文名称: A Simple Framework for Contrastive Learning of Visual Representations
开源地址:https://github.com/google-research/simclr
大佬论文解读:https://zhuanlan.zhihu.com/p/378953015

highlight更多的数据增强非线性映射层
用数据增强构造正样本,batch内的其余图片为负样本
在这里插入图片描述

假设现在有1张任意的图片x,叫做Original Image,先对它做数据增强,得到2张增强以后的图片x1和x2。注意数据增强的方式有以下3种:

  • 随机裁剪之后再resize成原来的大小 (Random cropping followed by resize back to the original size)。
  • 随机色彩失真 (Random color distortions)。
  • 随机高斯模糊 (Random Gaussian Deblur)。

SimCLR框架
在这里插入图片描述
使用 Projection head 计算loss,预测头是一个2层的MLP,将2048 维的visual representation向量进一步映射到 128 维隐空间中,得到新的representation。最终使用 z i z_i zi z j z_j zj去求loss 完成训练,训练完毕后扔掉预测头,保留 Encoder 用于获取 visual representation。

损失函数
NT-Xent loss (Normalized Temperature-Scaled Cross-Entropy Loss)的对比学习损失函数代码实现

import tensorflow as tf
import numpy as np

def contrastive_loss(out,out_aug,batch_size=128,hidden_norm=False,temperature=1.0):
    if hidden_norm:
        out=tf.nn.l2_normalize(out,-1)
        out_aug=tf.nn.l2_normalize(out_aug,-1)
    INF = np.inf
    labels = tf.one_hot(tf.range(batch_size), batch_size * 2) #[batch_size,2*batch_size]
    masks = tf.one_hot(tf.range(batch_size), batch_size) #[batch_size,batch_size]
    logits_aa = tf.matmul(out, out, transpose_b=True) / temperature #[batch_size,batch_size]
    logits_bb = tf.matmul(out_aug, out_aug, transpose_b=True) / temperature #[batch_size,batch_size]
    logits_aa = logits_aa - masks * INF # remove the same samples in out
    logits_bb = logits_bb - masks * INF # remove the same samples in out_aug
    logits_ab = tf.matmul(out, out_aug, transpose_b=True) / temperature
    logits_ba = tf.matmul(out_aug, out, transpose_b=True) / temperature
    loss_a = tf.losses.softmax_cross_entropy(
        labels, tf.concat([logits_ab, logits_aa], 1))
    loss_b = tf.losses.softmax_cross_entropy(
        labels, tf.concat([logits_ba, logits_bb], 1))
    loss=loss_a+loss_b
    return loss,logits_ab

'''
假设batch_size=3, out 和 out_aug 分别代码 原始数据和增强数据的representation
out : [a1,a2,a3] 
out_aug : [b1,b2,b3] 

labels:
[batch_size,2*batch_size] batch_size=3 
1 0 0 0 0 0 
0 1 0 0 0 0 
0 0 1 0 0 0 

mask:
 [batch_size,batch_size]
1 0 0
0 1 0
0 0 1

logits_aa [batch_size,batch_size]
a1*a1, a1*a2, a1*a3 
a2*a1, a2*a2, a2*a3  
a3*a1, a3*a2, a3*a3 

logits_bb [batch_size,batch_size]
b1*b1, b1*b2, b1*b3 
b2*b1, b2*b2, b2*b3 
b3*b1, b3*b2, b3*b3 

logits_aa - INF*mask # delete same samples
-INF,  a1*a2,  a1*a3 
a2*a1, -INF,  a2*a3 
a3*a1, a3*a2,  -INF 

logits_bb - INF*mask  # delete same samples
-INF,  b1*b2, b1*b3 
b2*b1, -INF,  b2*b3 
b3*b1, b3*b2, -INF 

logits_ab [batch_size,batch_size]
a1*b1, a1*b2, a1*b3 
a2*b1, a2*b2, a2*b3 
a3*b1, a3*b2, a3*b3

logtis_ba [batch_size,batch_size]
b1*a1, b1*a2,  b1*a3 
b2*a1, b2*a2, b2*a3
b3*a1, b3*a2, b3*a3

concat[logits_ab,logits_aa]:
a1*b1, a1*b2, a1*b3,  -INF,  a1*a2, a1*a3 
a2*b1, a2*b2, a2*b3, a2*a1, -INF, a2*a3
a3*b1, a3*b2, a3*b3, a3*a1, a3*a2, -INF
only a1*b1, a2*b2, a3*b3  are positives

concat [logits_ab,logits_bb]:
b1*a1, b1*a2,  b1*a3, -INF,  b1*b2, b1*b3 
b2*a1, b2*a2, b2*a3, b2*b1, -INF, b2*b3
b3*a1, b3*a2, b3*a3, b3*b1, b3*b2, -INF
only b1*a1, b2*a2, b3*a3  are positives, so calculate the softmax_cross_entropy with labels

'''

(个人理解)损失函数的实现上也可以写成两个特征concate然后相乘变成一个2N*2N的大矩阵,按行计算交叉熵


与moco的对比

  1. 数据增强方法
    simclr新增了高斯模糊
  2. 网络框架
    moco两个encoder参数不共享,正样本encoder采用动量更新;simclr两个encoder参数共享
    (同一个网络两次前向?)并且新增了非线性映射头
  3. 损失函数
    均为infoNCE
    moco中的分母为正样本和queue中的负样本
    共k+1项(k为队列长度),正样本仅计算了增强前后的相似度,没有计算batch内其余样本;
    simclr中的分母为两个batch(原始batch+增强batch)样本,负样本数量为(2N-2)

2. SimCLR v2

论文名称:Big Self-Supervised Models are Strong Semi-Supervised Learners

2个关键点

  1. 在使用无标签数据集做 Pre-train 的这一步中,模型的尺寸很重要,用 deep and wide 的模型可以帮助提升性能。
  2. 使用无标签数据集做 Pre-train 完以后,现在要拿着有标签的数据集 Fine-tune 了。之后再把这个 deep and wide 的模型 蒸馏成一个更小的网络。

简单概括:Unsupervised Pre-train, Supervised Fine-tune,Distillation Using Unlabeled Data.

contribution

  1. 对于半监督学习来讲,在标签量极少的情况下,模型越大,获益就越多。这很不符合直觉,常识是标签这么少了,模型变大会过拟合。
  2. 即使模型越大能够学到越 general 的 representations,但是这是在不涉及下游任务的task-agnostic 的情况下。一旦确定了下游任务,就不再需要大模型了,可以蒸馏成一个小模型。
  3. Projection head 很重要,更深的 Projection head 可以学习到更好的representation,在下游任务做 Fine-tune 之后也更好。

具体步骤

  1. Unsupervised Pre-train:使用无标签数据以一种 Task-agnostic 的方式预训练Encoder,得到比较 general 的 Representations。
  2. Supervised Fine-tune:使用有标签数据以一种 Task-specific 的方式 Fine-tune Encoder。
  3. Distillation Using Unlabeled Data:使用无标签数据以一种 Task-specific 的方式蒸馏 Encoder,得到更小的Encoder。

⭐ 预训练中SimCLR v2 相比于v1的不同:
1)Encoder 变长变大:SimCLR v2 用了更大的ResNet架构,把原来的 ResNet-50 (4×) 拓展成了 ResNet-152 (3×) 和 selective kernels (SK),记为 ResNet-152 (3×+SK),变成这样以后,把这个预训练模型用 1%的 ImageNet的标签给 Fine-tune 一下,借助这一点点的有监督信息,获得了29个点的提升。
2)Projection head 变深:原来的结构是2个FC层+一个激活函数构成。现在是3个FC层,并且在Fine-tune的时候要从第1层开始。变成这样以后,把这个预训练模型用 1%的 ImageNet的标签给 Fine-tune 一下,借助这一点点的有监督信息,获得了14个点的提升。
3)加入了MoCo 的内存机制:因为 SimCLR 本身就能通过数据增强得到很多的负样本,所以说这步只获得了1个点的提升。

⭐ 预训练模型finetune
在 SimCLR 中,Projection head 在预训练完以后会被扔掉,不做Fine-tune,只保留Encoder 加一个FC层去做Fine-tune。
而在 SimCLR v2 中,Projection head 在预训练完以后不会被完全扔掉,而是扔掉一半,保留一半做Fine-tune。注意如果只保留一层,那就和 SimCLR 加一个FC层的做法实质上一样了。

⭐蒸馏
teacher net 输出数据的类别概率,student net 也输出类别概率,两个概率之间计算loss
在这里插入图片描述
如果使用有标签的数据,也可以再添加一项有标签的损失函数
在这里插入图片描述



其实主要还是机子够多,batchsize够大,batch内除了positive以外的都当negatives就已经足够了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/708585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习10:正则化-Regularization

目录 1.什么是正则化? 2.简化正则化:Lambda 3.两个练习 3.1 问题一 3.2 问题二 4.参考文献 1.什么是正则化? 考虑以下泛化曲线,它显示了训练集和验证集相对于训练迭代次数的损失。 图 1. 训练集和验证集的损失 图 1 显示了…

Docker数据卷与容器的挂载

什么是Docker数据卷: 数据卷(Volumes)是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步。一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。简单来说数据卷本质其实是…

面试之谈谈你对SpringMVC的理解:

1.把传统的MVC架构里面的Controller控制器进行了拆分。分成了前端控制器的DispatcherServlteth和后端控制器的Controoler. 2.吧Model模型拆分成了业务层Service和数据访问层Repository 3.在试图层,可以支持不同的试图,比图Freemakr,volocity,JSP等等。 所…

【多维Dij+DP】牛客小白月赛75 D

D-矩阵_牛客小白月赛75 (nowcoder.com) 题意: 思路: 首先,对于这种类似于多维BFS的东西,我们一定需要判断是否必要加上新的一维,即我们需要判断新的一维对决策有没有影响 在这道题中,如果把某一个位置取…

MySql脚本 asc 排序字段空值条目靠后的写法

场景: mysql中如果使用正序 asc 排序,那么默认是把排序字段值为空的条目数据,优先排到前面,这明显不符合需求,解决如下 一、重现问题 -- 按排序号-正序 select shop_id,sort_num,update_time from t_shop_trend_conte…

详解c++---哈希闭散列

目录标题 一道题了解哈希哈希的实现原理方法一方法二 准备工作insertfind函数erase函数检测代码 一道题了解哈希 点击此处来尝试做这道题 首先题目告诉我们这个字符串中只含有小写的英文字母而小写的英文字母只有26个,所以我们可以创建一个大小为26的字符数组用来记…

【python爬虫应用03】csdn个人所有文章质量分查询

🛠️ 环境准备 在开始编写代码之前,我们需要进行一些环境准备。以下是所需的环境和库: 操作系统:Windows编程语言:Python 3编辑器:VSCode(可选) 安装所需的库: reque…

2023年最新IDEA中 Java程序 | Java+Kotlin混合开发的程序如何打包成jar包和exe文件(gradle版本)

文章内容: 一. JAVA | JAVA和Kotlin混开开发的程序打包成jar方法 1.1 方法一 :IDEA中手动打包 1.2 方法二 :build.gradle中配置后编译时打包 二. JAVA | JAVA和Kotlin混合开发的程序打包成exe的方法 一. JAVA | JAVA和Kotlin混开开发的程序…

Javalin:一个轻量的 Web Framework

说起 Java 语言下的 Web 框架那就非 Spring Framework 不可了,但是今天在和别人在聊天的过程中发现了一个新奇的项目 Javalin。Javalin 是一个轻量的 Web 框架。支持 WebSocket, HTTP2 和异步请求。简单的看了一下官方的说明文档,确实非常轻量&#xff0…

【ISO26262】汽车功能安全第5部分:硬件层面

对于每种方法,应用相关方法的推荐等级取决于 ASIL等级,分类如下: ———“”表示对于指定的 ASIL等级,高度推荐该方法; ———“”表示对于指定的 ASIL等级,推荐该方法; ———“o”表示对于指定的 ASIL等级,不推荐也不反对该方法。 表2 硬件设计的安全分析 单点故障度量 图 C.…

共享平台用户行为研究

背景 “促进平台经济、共享经济健康发展”是我国第十四个五年规划和二〇三五年远景目标中的重要内容。 研究工作概述 围绕共享平台和双边用户价值创造一般理论和实践,本研究综合多种方法(LDA、社会网络分析、计量经济模型等)和多种数据源交…

chatgpt赋能python:用Python编写SEO文章的技巧

用Python编写SEO文章的技巧 SEO(Search Engine Optimization)是优化网站以在搜索引擎中获得更高排名的过程。编写有趣、有价值且SEO友好的内容是重要的一环。在这篇文章中,我们将探讨使用Python编写SEO文章的技巧。 着重标记加粗的标题 搜…

[Eigen中文文档] 在 BLAS/LAPACK 、英特尔® MKL 和 CUDA 中使用 Eigen

文档总目录 本文目录 在BLAS/LAPACK使用 Eigen在英特尔 MKL使用 Eigen链接 在 CUDA 内核中使用 Eigen 在BLAS/LAPACK使用 Eigen 英文原文(Using BLAS/LAPACK from Eigen) 自Eigen 3.3版本以及以后,任何F77兼容的BLAS或LAPACK库都可以用作稠密矩阵乘积和稠密矩阵分…

第九十四天学习记录:C++核心:类和对象Ⅲ(五星重要)

深拷贝与浅拷贝 深浅拷贝是面试经典问题&#xff0c;也是常见的一个坑 浅拷贝&#xff1a;简单的赋值拷贝操作 深拷贝&#xff1a;在堆区重新申请空间&#xff0c;进行拷贝操作 #define _CRT_SECURE_NO_WARNINGS 1#include<iostream> using namespace std;class Perso…

简述环保用电监管云平台

1、概述 推进打赢蓝天保卫战&#xff0c;打好碧水保卫战&#xff0c;打胜净土保卫战&#xff0c;加快生态环境保护、建设美丽中国&#xff0c;各省市结合物联网和大数据政策&#xff0c;也相继颁布有关污染治理设施用电监管平台等相关政策。针对企业内的环保设施、设备运行状况…

Spring Boot中Elasticsearch的连接配置、原理与使用

Spring Boot中Elasticsearch的连接配置、原理与使用 引言 Elasticsearch是一种开源的分布式搜索和数据分析引擎&#xff0c;它可用于全文搜索、结构化搜索、分析等应用场景。在Spring Boot中&#xff0c;我们可以通过Elasticsearch实现对数据的搜索和分析。本文将介绍Spring …

力扣 -- 62.不同路径、63.不同路径2

题目链接&#xff1a;64. 最小路径和 - 力扣&#xff08;LeetCode&#xff09; 63. 不同路径 II - 力扣&#xff08;LeetCode&#xff09; 以下是用动态规划的思想来解决这两道类似的动规的题目&#xff0c;相信各位老铁都是能够学会并且掌握这两道经典的题目的。 参考代码&am…

mac上使用brew安装mysql5.7

使用Homebrew进行MySQL数据库的安装需要MacOS系统中已经安装了相关环境 1.查询软件信息 首先使用search命令搜索MySQL数据库完整名称&#xff1a; brew search mysql可以看到5.7版本的MySQL数据库完整名称是mysql5.7 2. 执行安装命令 使用install命令进行软件安装&#xf…

Proxy vs Object.defineProperty:哪种对象拦截机制更适合你?

文章目录 简述版详解版相同点不同点1. 功能不同2. 语法和使用方式不同3. 支持程度不同4. 性能差异 简述版 Proxy 和 Object.defineProperty 是 JavaScript 中用于实现对象拦截和代理的两种不同机制。 Object.defineProperty 是一种在对象上定义新属性或修改现有属性的方式。 …

eNSP-DHCP全局配置和接口配置

eNSP-DHCP全局配置和接口配置 文章目录 eNSP-DHCP全局配置和接口配置一、题目要求二、题目分析三、拓扑结构搭建四、基本配置五、测试验证 一、题目要求 要求 &#xff1a; 1 、GE0/0/0 口所在广播域使用全局配置模式 2 、 GE0/0/1 口所在广播域使用接口配置模式 3 、 租期时间…