【深度学习】详解 SimCLR

news2024/11/16 3:19:57


目录

摘要

一、引言

二、方法

2.1 The Contrastive Learning Framework

2.2. Training with Large Batch Size 

2.3. Evaluation Protocol

三、用于对比表示学习的数据增广 

3.1 Composition of data augmentation operations is crucial for learning good representations 

3.2 Contrastive learning needs stronger data augmentation than supervised learning 

四、编码器和头部的架构 

4.1 Unsupervised contrastive learning benefits (more) from bigger models

4.2 A nonlinear projection head improves the representation quality of the layer before it 

五、损失函数和 Batch Size

5.1 Normalized cross entropy loss with adjustable temperature works better than alternatives

5.2 Contrastive learning benefits (more) from larger batch sizes and longer training

六、与 SOTA 方法的比较


  • Title:A Simple Framework for Contrastive Learning of Visual Representations
  • Paper:https://arxiv.org/pdf/2002.05709.pdf
  • Github:GitHub - google-research/simclr: SimCLRv2 - Big Self-Supervised Models are Strong Semi-Supervised Learners

摘要

        本文提出了 SimCLR:一个简单的视觉表示对比学习的框架。我们简化了近期被提出的对比自监督学习算法,而无需专门的架构或内存库 (memory bank)。为理解是什么使对比预测任务能够学习有用的表示,本文系统地研究了我们的框架的主要组件,表明:

  1. 数据增广组合 在定义有效的预测任务中扮演关键角色。
  2. 在 表示和对比损失之间 引入一个 可学习的非线性转换,大大提高了已学习到的表示的质量。
  3. 相比于有监督学习,对比学习受益于 更大的 batch sizes 和更多的训练 steps

        通过结合这些发现,我们能够大大超过以前在 ImageNet 上的自监督和半监督学习方法。由 SimCLR 学习到的自监督表示 训练的线性分类器 达到了 76.5% 的 top-1 acc,比先前 SOTA 提高了 7%,与有监督 ResNet-50 的性能相匹配。当只对 1% 的标签微调时,达到了 85.8% 的 top-5 acc,在少 100× 标签的条件下优于 AlexNet。


一、引言

        在没有人类监督的情况下学习有效的视觉表征是一个长期存在的问题 (long-standing problem)。大多数主流的方法可分为 (fall into) 两类:生成式 (generative) 判别式 (discriminative)生成式方法 学习在输入空间中生成或建模像素。然而,像素级生成的计算成本很昂贵 (computationally expensive),并且可能不是表示学习所必需的判别式方法 使用类似于有监督学习的 objective 函数来学习表示,但训练网络执行前置任务 (pretext task),前置任务的输入和标签都来自于一个未经标记的数据集。许多此类方法都依赖于启发式 (heuristics) 来设计前置任务,这可能会限制学习表征的通用性 (generality)。基于潜在 (latent) 空间对比学习的判别方法最近显示出了巨大的前景,取得了 SOTA 的结果。

        在本工作中,我们引入了一个简单的视觉表示的对比学习框架 SimCLR,它不仅比以前的工作表现更好 (图 1),而且也更简单,既不需要专门的架构,也不需要内存库。

        为理解是什么使对比表示学习变得良好,本文系统地研究了我们的框架的主要组成部分,并表明:

  • 多数据增强操作的组合在定义 产生有效表示的对比预测任务时至关重要。此外,相比有监督学习,无监督对比学习受益于更强的数据增广。
  • 在表示和对比损失之间引入一个可学习的非线性变换,大大提高了学习到的表示的质量。
  • 具有对比交叉熵损失的表示学习受益于经归一化嵌入和经适当调整的温度参数。
  • 相比有监督学习的竞争方法,对比学习受益于更大的 batch sizes 和更长的训练。与监督学习一样,对比学习也受益于更深和更宽的网络。

二、方法

2.1 The Contrastive Learning Framework

        受最近的对比学习算法的启发 (见第 7 节的概述),SimCLR 通过潜在空间 (latent space) 中的对比损失,以最大化同一数据示例的不同增广视图 (views) 之间的一致性来学习表示。如图 2 所示,该框架包括以下 4 个主要组件。

  • 一个随机数据增广模块,转换任意给定的数据示例,随机得到同一示例的 2 个相关视图 \widetilde{x}_i 和 \widetilde{x}_j,二者被视为一个 正对 (positive pair)。本工作中,依次应用 3 个简单的增广:随机 crop 后 resize 回原尺寸、随机颜色失真 (distortions)、随机高斯模糊。如第 3 节所示,随机 crop 和颜色失真的组合是实现良好性能的关键。
  • 一种基于神经网络的编码器 f( \cdot ),从经增广的数据示例中提取表示向量。本框架允许选择各种网络架构而没有任何约束。我们选择了 (opt for) 简单性并使用常用的 ResNet 获取 h_i = f( \widetilde{x}_i ) = \textrm{ResNet} ( \widetilde{x}_i ),其中 h_i \in \mathbb{R}^d 为 平均池化层后输出的表示向量
  • 一个小型神经网络投影头部 g ( \cdot ),将表示向量映射到对比损失空间。我们使用一个带单隐藏层的 MLP 获取 z_i = g(h_i) = W^{(2)}\sigma( W^{(1)} h_i),其中 \sigma 是 ReLU。如第 4 节所示,我们发现定义 z_i 而非 h_i 的对比损失是有益的 (find it beneficial to)。
  • 一个对比损失函数 —— 为一个对比预测任务而定义的。给定一个集合 \{ \widetilde{x}_k \},其中包含一个正对样例 \widetilde{x}_i 和 \widetilde{x}_j。对比预测任务旨在针对给定的 \widetilde{x}_i 识别 (identify)  \{ \widetilde{x}_k \}_{k \neq i} 中的 \widetilde{x}_j

        我们随机采样一个包含 N 个样本的 minibatch,并基于其中增广后的样本对 定义对比预测任务,得到 2N 个数据点 (每个样本增广一次)。我们没有显式地采样负样本 (negative exmples)。相反,给定一个正对,类似于 (On sampling strategies for neural network-based collaborative filtering),我们 将一个 minibatch 中的其他 2(N - 1) 个增广后的样本视为负样本。设 \textrm{sim} (u, v) = u^{\textrm{T}} v / \left \| u \right \| \left \| v \right \| 表示经 L_2 归一化的 u 和 v 之间的点积 (即 余弦相似度)。然后将正对样本 (i, j) 的损失函数定义为:

        其中 1_{[k \neq i]} \in \{ 0, 1 \} 是一个指示函数,当 k \neq i 值为 1,否则为 0,而 \tau 表示一个温度参数。最终的损失计算所有的正对,包括 (i, j) 和 (j, i)。这种损失已用于之前的工作;为方便起见,称其为 NT-Xent (the normalized temperature-scaled cross entropy loss)


2.2. Training with Large Batch Size 

        为保持简单 (to keep it simple),不使用内存库 (memory bank) 训练模型。相反,我们将使用 N 从 256 到 8192 的 batch size 训练。batch size = 8192 时每个正对有 16382 个负样本 (2(N - 1))。当使用具有线性学习率 scaling 的标准 SGD / Momentum 时,大 batch size 的训练可能不稳定。为稳定训练,我们对所有 batch sizes 都使用了 LARS 优化器。云 TPU 被用于训练模型,根据 batch size 使用 32 到 128 个核 (使用 128 个 TPU v3 核时,训练 100 个 epochs 的 batch size = 4096 的 ResNet-50 需要 ∼1.5 小时)。

        Global BN。标准 ResNets 使用 BN。在具有数据并行性 (parallelism) 的分布式训练中,BN 均值和方差通常局部地聚合在每个设备。在我们的对比学习中,由于 正对是在同一设备中计算的,模型由此可以利用 局部信息泄漏,在不改善表示形式的情况下 (错误地) 提高预测 acc。我们通过 在训练期间聚合所有设备的 BN 均值和方差 来解决该问题 (address this issue by)。其他方法包括 shuffling 跨设备的数据示例,或 LN 替换 BN


2.3. Evaluation Protocol

        在这里,我们制定了实证研究方案,旨在理解框架中不同的设计选择。

        Dataset and Metrics。我们对无监督预训练 (学习编码器网络 f 而无需标签) 的大部分研究都是使用 ImageNet ILSVRC-2012 数据集 完成的。一些关于 CIFAR-10 的额外预训练实验可以在附录 B.9 中找到。我们还在广泛的迁移学习数据集上测试了预训练的结果。为评估学习到的表示,我们遵循广泛使用的 线性评估协议 (linear evaluation protocol) —— 在已冻结的基础网络上训练一个线性分类器,并将 测试 acc 用作表示质量的代理 (proxy)。除了线性评估,我们还比较了 SOTA 的半监督和迁移学习。

        Default setting。除非另有说明 (unless otherwise specified),对于数据增广,我们使用随机 crop 和 resize (带随机 flip)、颜色 distortions 和高斯模糊 (详见附录 A)。我们使用 ResNet-50 作为基础编码器网络,并使用一个 2 层 MLP 投影头部来将表示投影到一个 128-d 的潜在空间。我们使用 NT-Xent 损失,使用 LARS 优化,学习率为 4.8 (= 0.3 × BatchSize / 256),权重衰减为 1e-6。我们以 batch size = 4096 训练了 100个 epochs (虽然在 100 个 epochs 没有达到最大性能,但取得了合理的结果,允许公平和有效的消融)。此外,我们在前 10 个 epochs 使用线性warmup,并通过余弦衰减策略来衰减学习率而无需重启 (restarts)。


三、用于对比表示学习的数据增广 

        Data augmentation defines predictive tasks。当数据增广已被广泛应用于有监督和无监督的表示学习时,它尚未被认为是 一种定义对比预测任务的 系统的方法。许多现有方法 通过改变架构 来定义对比预测任务。例如,有的通过约束网络架构中的感受野 实现 全局到局部的视图预测,而有的通过固定图像 splitting 过程和上下文聚合网络 实现 邻近视图预测。我们证明,这种复杂性可以通过执行简单的目标图像的随机 crop (带 resize) 来避免,这将创建一个包含上述两个任务的预测任务 family,如图 3 所示。这种简单的设计选择 可以方便地将预测任务与其他组件,如神经网络架构解耦。更广泛的对比预测任务 可以通过扩展增广的 family 及其随机组合 来定义。


3.1 Composition of data augmentation operations is crucial for learning good representations 

        为系统地研究数据增广的影响,我们考虑了几个常见的增广。一种类型的增广涉及数据的 空间/几何变换,如 crop 和 resize (带水平 flip)、rotation 和 cutout。另一种类型的增广涉及 外观变换,如颜色 distortion (包括颜色 dropping、亮度、对比度、饱和度、色调)、高斯模糊 和 Sobel 滤波。图 4 可视化了我们在这项工作中研究的增广。

        为理解 单个数据增广的影响增广组合的重要性,我们研究了本框架在单独或成对应用增广时的性能。由于 ImageNet 图像的大小不同,我们总是应用 crop 和 resize 的图像,这使得在没有 cropping 的情况下研究其他增广变得困难。为消除这种混淆 (to eliminate this confound),我们考虑了针对这种消融的非对称数据转换设置。具体来说,我们总是首先随机 crop 图像并将其 resize 为相同的分辨率,然后 只将目标转换应用于图 2 中框架的一个分支,而保留另一个分支不变作为 identity (即 t(x_i) = x_i)。注意,这种不对称 —— 图 5 展示了单个和组合转换下的线性评估结果。我们观察到,没有单个转换足以学习到好的表示,即使模型几乎可以完美地识别对比任务中的正对。当组合增广时,对比预测任务变得更加困难,但表示的质量显著提高。附录 B.2 提供了关于更广泛的增广集组合的进一步研究。

        增广的一个组成部分很突出 (stands out):随机 cropping 和随机的颜色 distortion。我们推测,当只使用随机 cropping 作为数据增广时,一个 严重的问题 是,图像中的大多数 patches 具有相似的颜色分布。图 6 显示,仅彩色直方图就足以 (suffice to) 区分图像。神经网络可以利用这一捷径来解决预测任务。因此,为学习可泛化的特征,用颜色 distortion 来组合 cropping 是至关重要的

# color distortion - TensorFlow 

import tensorflow as tf

def color_distortion(image, s=1.0):
    # image is a tensor with value range in [0, 1].
    # s is the strength of color distortion.

    def color_jitter(x):
        # one can also shuffle the order of following augmentations
        # each time they are applied.
        x = tf.image.random_brightness(x, max_delta=0.8*s)
        x = tf.image.random_contrast(x, lower=1-0.8*s, upper=1+0.8*s)
        x = tf.image.random_saturation(x, lower=1-0.8*s, upper=1+0.8*s)
        x = tf.image.random_hue(x, max_delta=0.2*s)
        x = tf.clip_by_value(x, 0, 1)
        return x

    def color_drop(x):
        image = tf.image.rgb_to_grayscale(image)
        image = tf.tile(image, [1, 1, 3])

    # randomly apply transformation with probability p.
    image = random_apply(color_jitter, image, p=0.8)
    image = random_apply(color_drop, image, p=0.2)
    return image

3.2 Contrastive learning needs stronger data augmentation than supervised learning 

        为了进一步证明颜色增广的重要性,我们调整了颜色增广的强度,如表 1 所示。更强的颜色增广大大提高了 (substantially improves) 学习到的无监督模型的线性评估。在这种情况下,AutoAugment,一种使用监督学习发现的复杂增广策略,并不比简单的 cropping + (更强的) 颜色 distortion 好当使用相同的增广集合训练有监督模型时,我们观察到更强的颜色增广不会改善、甚至还会损害它们的表现。因此,我们的实验表明,相比于有监督学习,无监督对比学习受益于更强的 (颜色) 数据增广。尽管之前的研究报告称,数据增广对自监督学习很有用,我们表明,不能为有监督学习产生 acc 收益的数据增广仍可极大地帮助 (help considerably) 对比学习


四、编码器和头部的架构 

4.1 Unsupervised contrastive learning benefits (more) from bigger models

        图 7 显示了增加深度和宽度都能不出意外地提高性能。虽然类似的发现也适用于有监督学习,但我们发现 有监督模型和无监督模型训练的线性分类器之间的差距 随着模型尺寸的增加而缩小,这表明 无监督学习在模型尺寸扩大时比有监督学习收益更多


4.2 A nonlinear projection head improves the representation quality of the layer before it 

        然后,我们研究了包括一个投影头部的重要性,即 g(h)。图 8 显示了使用 3 种不同架构的头部线性评估结果:(1) 恒等映射;(2) 线性投影;(3) 带有一个隐藏层的默认非线性投影 (和 ReLU 激活)。我们观察到,非线性投影 比 线性投影 (+3%) 和没有投影 (>10%) 更好。当使用投影头部时,无论输出尺寸如何,都会观察到类似的结果。此外,即使使用非线性投影,投影头部前的层 h 仍然比投影头部后的层 z = g (h) 好得多 (>10%),这表明 投影头部前的隐藏层 比 投影头部后的层 有更好的表示

        我们推测,在非线性投影之前使用表示的重要性 是由于对比损失引起的信息损失。特别地,z = g (h) 被训练为 对数据变换具有不变性。因此,g 可以删除可能对下游任务有用的信息,例如 objects 的颜色或方向。通过利用非线性变换 g ( \cdot ),可以在 h 中构成并保持更多的信息。为验证该假设,我们进行了实验,使用 h 或 g (h) 来学习预测 在预训练过程中应用的变换。此处设置 g(h) = W^{(2)} \sigma ( W^{(1)} h),输入和输出维数一致(即 2048)。表 3 显示了 h 包含了更多关于所应用的转换的信息,而 g (h) 丢失了这些信息。更深入的分析详见附录 B.4。


五、损失函数和 Batch Size

5.1 Normalized cross entropy loss with adjustable temperature works better than alternatives

        我们将 NT-Xent 损失与其他常用的对比损失函数进行了比较,如 logistic 损失 和 margin 损失。表 2 显示了 objective 函数以及损失函数对于输入的梯度。从梯度中我们观察到:

  1. L_2 归一化 (即余弦相似度) 及温度有效地加权不同的样本,适当的温度可以帮助模型从难负样本中学习;
  2. 与交叉熵不同,其他 objective 函数不通过相对困难度来衡量负样本。

        因此,必须对这些损失函数应用半难负挖掘 (semi-hard negative mining, SHNM):而不是在所有损失项计算梯度,可以使用半难负项 (semi-hard negative terms) (即那些在损失 margin 内距离最近,但比正样本更远的) 计算梯度 。

        为了使比较公平,我们对所有损失函数使用相同的 L_2 归一化,并调整超参数,报告它们的最佳结果。表 4 显示 (详情见附录 B.10。为简单起见,我们只考虑从一个增广视图中得到负样本),虽然 (半难) 负挖掘有帮助,但最好的结果仍然比我们默认的 NT-Xent 损失要差得多。

        接下来,我们测试了 L_2 归一化 (即余弦相似度与点积) 和温度 \tau 在我们默认的 NT-Xent 损失中的重要性。从表 5 可以看出,如果没有归一化和适当的温度尺度,性能明显较差。在没有 L_2 归一化的情况下,对比任务 acc 更高,但线性评价下的表示更差


5.2 Contrastive learning benefits (more) from larger batch sizes and longer training

        图 9 显示了当模型针对不同 epoch 数训练时,batch size 的影响。我们发现,当训练 epochs 数较小时 (如 100),较大的 batch size 比较小的 batch size 具有更显著的优势。随着训练 steps/epochs 的增加,不同 batch size 大小之间的差距会减小或消失 (只要 batches 是随机重采样的)。相比于有监督学习,在对比学习中,更大的 batch size 提供了更多的负样本,促进了收敛 (即在给定 acc 下耗费更少的 steps/epochs)。更长时间的训练也提供了更多负样本,改善了结果。在附录 B.1 中,提供了具有更长的训练 steps 的结果。


六、与 SOTA 方法的比较

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

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

相关文章

5-2中央处理器-指令周期的数据流

文章目录一.指令周期二.数据流向1.取指周期2.间址周期3.执行周期4.中断周期三.指令执行方案1.单指令周期2.多指令周期3.流水线方案一.指令周期 指令周期:CPU从主存中每取出并执行一条指令所需的全部时间。 此处:取指周期取指令指令译码 指令周期常用若…

SSM整合(Spring + SpringMVC + MyBatis)

SSM Spring SpringMVC MyBatis 准备数据库 SET FOREIGN_KEY_CHECKS0; DROP TABLE IF EXISTS user; CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(20) NOT NULL COMMENT 用户名,password varchar(255) NOT NULL COMMENT 密码,real_name varchar(…

Linux常用命令——startx命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) startx 用来启动X Window 补充说明 startx命令用来启动X Window,实际上启动X Window的程序为xinit。 语法 startx(参数)参数 客户端及选项:X客户端及选项;服务器及选项&a…

[LeetCode周赛复盘] 第 329 场周赛20230122

[LeetCode周赛复盘] 第 329 场周赛20230122 一、本周周赛总结二、 [Easy] 6296. 交替数字和1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6297. 根据第 K 场考试的分数排序1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6298. 执行逐位运算使字符串相等1. 题目描述2. 思路…

深入理解 OpenMP 线程同步机制

深入理解 OpenMP 线程同步机制 前言 在本篇文章当中主要给大家介绍 OpenMP 当中线程的同步和互斥机制,在 OpenMP 当中主要有三种不同的线程之间的互斥方式: 使用 critical 子句,使用这个子句主要是用于创建临界区和 OpenMP 提供的运行时库…

连续系统的数字PID控制仿真-1

被控对象为一电机模型传递函数:式中,J 0.0067;B0.10。采用M函数的形式,利用ODE45的方法求解连续对象方程,输入指令信号为yd(k)0.50sin(2*3.14*t),采用PID控制方法设计控制器,其中kp20.0 ,kd0.50。PID正弦跟…

12个开源的后台管理系统

1. D2admin 开源地址:https://github.com/d2-projects/d2-admin 文档地址:https://d2.pub/zh/doc/d2-admin/ 效果预览:https://d2.pub/d2-admin/preview/#/index 开源协议:MIT 2. vue-element-admin 开源地址:htt…

Kettle(3):快速入门

1 需求 有一个txt文件,内容如下: id,name,age,gender,province,city,region,phone,birthday,hobby,register_date 392456197008193000,张三,20,0,北京市,昌平区,回龙观,18589407692,1970-8-19,美食;篮球;足球,2018-8-6 9:44 267456198006210000,李四,2…

Vue3 – Composition API

1、认识CompositionAPI 1.1、Options API的弊端 在Vue2中,我们编写组件的方式是Options API: Options API的一大特点就是在对应的属性中编写对应的功能模块;比如data定义数据、methods中定义方法、computed中定义计算属性、watch中监听属性…

【快速简单登录认证】SpringBoot使用Sa-Token-Quick-Login插件快速登录认证

一、解决的问题 Sa-Token-Quick-Login 可以为一个系统快速的、零代码 注入一个登录页面 试想一下,假如我们开发了一个非常简单的小系统,比如说:服务器性能监控页面, 我们将它部署在服务器上,通过访问这个页面&#xf…

学习字符串函数和内存函数必看

字符串函数 1.strlen函数 strlen库函数 #include<stdio.h> #include<string.h> int main() {char arr[] "abc";char arr1[] { a,b,c };int len strlen(arr);int len1 strlen(arr1);//没有\0就无法停止printf("%d\n",len);printf("%…

VUE中的provide和inject用法

一、Vue中 常见的组件通信方式可分为三类 父子通信 父向子传递数据是通过 props&#xff0c;子向父是通过 events&#xff08;$emit&#xff09;&#xff1b; 通过父链 / 子链也可以通信&#xff08;$parent / $children&#xff09;&#xff1b; ref 也可以访问组件实例&…

XLSReadWriteII 写了一个DBGrdiEh创建EXCEL表的函数

XLSReadWriteII 写了一个DBGrdiEh创建EXCEL表的函数 自己通过XLSReadWriteII&#xff0c;写了一个由DBGridEh数据集&#xff0c;通过参数调用&#xff0c;创建EXCEL表格的函数&#xff0c;通过调用的参数设置&#xff0c;可以较为方便地&#xff0c;创建指定数据集的常用EXCEL表…

自动化和Selenium

作者&#xff1a;~小明学编程 文章专栏&#xff1a;测试开发 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 什么是自动化&#xff0c;我们为什么需要自动化的测试&#xff1f; 为什么选择selenium来作为我们的web自动化测试的工具&#xff1f; 定位元素…

【C进阶】找单身狗

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C语言进阶 ⭐代码仓库&#xff1a;C Advanced 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们…

Spring事务(事务的实现、隔离级别、传播机制)

目录 一、事务的定义和意义 二、事务的实现 1、MySQL事务的回顾 2、Spring声明式事务&#xff08;利⽤注解⾃动开启和提交事务&#xff09; 前置知识及概念 实例分析&#xff1a;事务的回滚 &#x1f514;特殊情况&#xff08;无自动回滚&#xff09; &#x1f514;事务…

VueJs中如何使用provide与inject

前言在vue2.0里面provide与inject是以选项式(配置)API的方式在组件中进行使用的,解决的是跨组件(祖孙)间通信的一种方式也就是父子组件间的通信,父组件上通过自定义属性,而子组件间通过props这种方式接收,如果想要一层一层的传递,这种方式就会比较麻烦,不灵活provide与inject就…

Linux下的进程信号

目录 信号背景&#xff1a; 信号产生前 Core Dump 信号产生中 信号产生后 其他概念 不可重入函数 volatile关键字 SIGCHLD 17号信号 信号背景&#xff1a; 在生活中处处都存在的信号&#xff0c;比如信号灯&#xff0c;要想处理信号&#xff0c;我们就必须具备两种…

day26-XML/枚举/注解

1.xml 1.1概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为…

AWS - IAM

AWS IAM 自用笔记。 Terms IAM - Identity and Access Management, a global service it gives: Centralized control of AWS accountShared access to AWS accountGranular permissionsIdentity Federation, i.e., Facebook, LinkedIn etc. it allows: Multi-Factor Authe…