干货 | 带你理解对比学习损失函数的性质以及温度系数的作用

本文深入解析了对比学习中温度系数的作用,发现它控制困难样本的关注程度,影响了表示的均匀性和容忍性。通过实验验证,温度系数决定负样本的权重分布,揭示了Uniformity-Tolerance Dilemma。理解这个概念有助于提升自监督学习性能。
摘要由CSDN通过智能技术生成

作者 | Feng

整理 | 对白的算法屋

编者寄语:

很多小伙伴都了解对比学习,但要说温度系数的作用可能就不太清楚了。

卷友们好,我是对白。

对比学习中的温度系数是一个神秘的参数,大部分论文都默认采用小的温度系数来进行自监督对比学习(例如0.07,0.2)。然而并没有对采用小温度系数的解释,以及温度系数是如何影响学习过程的,即温度系数这个角色的意义。

今天给大家介绍一篇CVPR2021中研究对比损失(Contrastive Loss)温度系数的论文,由我校出品,解释了温度系数的具体作用,还借此探索了对比学习的学习机制,相信大伙看完以后,在内卷的道路上又可以领先别人一步了(真是太卷了QAQ)。

3ef2df52a3f4fad42fa594f0c74ac554.png

首先总结下本文的发现:

1.对比损失函数是一个具备困难负样本自发现性质的损失函数,这一性质对于学习高质量的自监督表示是至关重要的,不具备这个性质的损失函数会大大恶化自监督学习的性能。关注困难样本的作用就是:对于那些已经远离的样本,不需要继续让其远离,而主要聚焦在如何使没有远离的那些的样本远离,从而使得到的表示空间更均匀(uniformity)。

2.温度系数的作用是调节对困难样本的关注程度:越小的温度系数越关注于将本样本和最相似的其他样本分开)。作者对温度系数进行了深入的分析和实验,并利用温度系数来解释对比学习是如何学到有用表征的。

3.对比损失存在一个均匀性-容忍性Dilemma(Uniformity-Tolerance Dilemma)。小温度系数更关注于将与本样本相似的困难样本分开,因此往往可以得到更均匀的表示。然而困难样本往往是与本样本相似程度较高的,例如同一个类别的不同实例,即有很多困难负样本其实是潜在的正样本。过分强迫与困难样本分开会破坏学到的潜在语义结构。

论文对温度系数的作用进行了理论的分析和实验的验证。

一、对比损失更关注困难样本的特性

首先给出自监督学习广泛使用的对比损失(InfoNCE loss)的形式:

fdfb7221a917d18fdbaa8e19114f26bf.png

其中  是温度系数。直观来说,该损失函数要求第i个样本和它的另一个augmentation的副本(即正样本)之间的相似度  尽可能大,而与其他的实例(负样本)之间的相似度  尽可能小。然而,很多的损失可以达到这个要求,例如下面的最简单的形式   :

bdfee9bfdbf1e095b3222c09703ca0e5.png

然而实际训练过程,采用  作为损失函数效果非常不好,论文给出了使用contrastive loss(Eq1)和简单损失(Eq2)的性能对比,温度系数采用0.07:19a5bcf5a24445a4ea1224f4c3a61a67.png

上面的结果显示,在所有数据集上Contrastive Loss要远远好于Simple Loss。作者通过探究发现,不同于Simple Loss,Contrastive Loss是一个困难样本自发现的损失函数。我们可以通过公式(2)看到,Simple Loss对所有的负样本相似度给予了相同权重的惩罚(   ,损失函数对所有的负样本相似度的梯度都是相同的)。而Contrastive Loss则更会自动的给距离更近相似度更高的负样本更多的惩罚。这一点可以通过对比损失(Eq1 中)对不同负样本的相似度的惩罚梯度的简单计算来观察:

对正样本的梯度: 

5d1ef4f3a09996d082f33a7481cd22c2.png

对负样本的梯度: 

77d9596a2b89b0f294ffba847ee8ecc2.png

其中:

8f1a9a06c9e58ff2286ec725c71ca950.png

对于所有的负样本比较来说,  的分母项都是相同的。那么   越大,则  的分子项越大,梯度项也越大。也就是说,对比损失给予了更相似(困难)的负样本更大的远离该样本的梯度。可以把不同的负样本想像成同极点电荷在不同距离处的受力情况,距离越近的点电荷受到的库伦斥力更大,而距离越远的点电荷受到的斥力越小。对比损失也是这样的。这种性质更有利于形成在超球面均匀分布的特征。

为了验证上面表格中对比损失和简单损失的差距确实是因为对比损失具有困难样本自发现的特性,作者还用了一种显式的困难样本挖掘算法用于简单损失上。即选取最相似的4096个样本作为负样本,并用Eq2的简单损失作为损失函数,采用显式困难样本挖掘算法的简单损失函数效果大大提升,远远超过了温度系数取0.07时的对比损失。结果如下表所示:

612c65b7911cae4b85fc9f9aa6632531.png

二、温度系数的作用

除了上面介绍的困难样本自发现的性质之外,观察Eq3和Eq4,我们可以容易地发现,损失函数对正样本的梯度绝对值等于所有对负样本的梯度值绝对值的和,即

84206f0e8c6eac9064d1f1805db95cf1.png

给予这个观察,作者定义了对第j个负样本的一个相对惩罚强度:

eb88171c6de7e8885a6fd6cd9b92ef94.png

则对于所有的  ,  形成了一个玻尔兹曼概率分布,该分布的熵随着温度系数的增大严格增大,即  是随着  单调递增的(只需要满足所有的   不相等即可)。至此作者们发现,温度系数决定了此分布的熵。如果我们将  由大到小排序,形成一个顺序统计量,那么熵的大小将决定了分布的陡峭程度,如下图所示,下图是作者演示的负样本惩罚梯度在不同温度系数下与相似度的关系。当温度系数很小时,例如蓝色线0.07,随着  的增大将惩罚梯度剧烈的增大。而当温度系数逐渐增大,相对梯度的熵逐渐也增大,概率分布逐渐接近均匀分布,例如途中的绿色线。那么对相似度大的负样本的关注度逐渐减小。

5cd7fc7a9dc283e518b021a4d3145810.png

上面论证了温度系数的作用,即温度系数决定了对比损失对困难负样本的关注程度,越大的温度系数,往往一视同仁,不会太过关注更困难的负样本;而温度系数越小,则越关注与该样本相似度非常大的困难负样本,给予困难负样本更大的梯度与正样本分离。

作者为了更具体的解释温度系数的作用,计算了两种极端情况,即温度系数趋向于0和无穷大。

当温度系数趋向于0时:

5ab9baeca997842d53eceb87cb31cb3b.png

可以看出,此时对比损失退化为只关注最困难的负样本的损失函数。而当温度系数趋向于无穷大时:

0ea7d55db38bdd93285af1b6e1a0ca33.png

此时对比损失对所有负样本的权重都相同,都为  ,即对比损失失去了困难样本关注的特性。有趣的是,当温度系数趋向于无穷时,该损失便变成了之前介绍的简单损失  。

作者通过上面的两个极限情况也分析出了对比损失随着温度系数的增大而倾向于“一视同仁”,随着温度系数的减少而只关注最困难的负样本,这样的一种调节负样本关注度的作用

三、均匀性-容忍性困境

基于对温度系数作用的探索,作者进而指出了对比学习存在的潜在问题,即均匀性-容忍性的困境

对于温度系数来说,更小的温度系数更加关注困难样本,因此更容易形成均匀的表示空间,均匀的特征对于表示学习是十分重要的,具体可以见ICML2020的论文 <<Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere>> 。但是另一方面,由于无监督学习中没有真正的类别标签,对比学习普遍将除本样本以外的所有其他样本作为负样本。


在这种情况下,与正样本相似度极高的负样本往往很可能是潜在的正样本。例如,与当前的苹果图片相似度最高的图片往往是另一个苹果,此时如果太注重困难负样本则会破坏网络经过一定训练后已经学到的语义信息,这种情况在训练后期尤其明显。随着训练的进行,网络获取到的信息越来越接近真实语义特性,那么此时的负样本更有可能是潜在的正样本,因此一个启示是可以随着迭代的次数增多而增大温度系数,这可能是作者以后的工作。于是作者认为,一个好的温度系数,应该是均匀性和容忍性的折衷。

50d38c7872abedb03ce39d19e22f8da3.png

作者对不同温度系数下的均匀性-容忍性进行了量化并可视化如上图。

四、实验验证

下图是实验对温度系数的验证,红色的box是正样本的相似度,而横坐标往右依次是与相似度最大的10个样本的相似度分布。可以发现,温度系数越小,正样本和最困难的负样本之间的相似度gap越大,这说明了越小的温度系数越倾向于把最困难的负样本分开。该实验支撑了之前的理论分析。

5bebb4d01b293a567661494ba8ccf24b.png

另一方面,作者也对不同的数据集的最优温度系数进行了验证,下图绿色的柱子为对比损失随着温度系数的性能表现。此外,作者也验证了采取显式困难样本发现的对比损失,采取了显示的困难样本挖掘算法后,性能表现与温度系数的关联弱化,当温度系数高于一个合适的值时,该损失产生的模型性能基本保持稳定。

784cb85d0cd66fc81a79f72877f9a3b4.png

五、总结

在本文中,作者试图了解无监督对比损失的一些具体的性质和行为。作者们首先分析出了对比损失是一种困难样本感知的损失函数。并且验证了困难样本感知的性质是对比损失的不可或缺的性质。不具备这种性质的损失函数,即使负样本非常多,性能还是会退化严重。此外作者们也深入研究了温度系数的作用,发现温度系数控制着对负样本感知程度。并接着提出了Uniformity-Tolerance Dilemma。总体来说,论文揭示了一些对比学习有用的性质和现象,相信本文会启发更多的研究者设计更好的损失以及算法。


投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

ae9e33228183c1d8a2095c9d3e95729d.png

记得备注呦

整理不易,还望给个在看!
### 回答1: Spark Streaming 和 Flink 都是流处理框架,但在一些方面有所不同。 1. 数据处理模型 Spark Streaming 基于批处理模型,将流数据分成一批批进行处理。而 Flink 则是基于流处理模型,可以实时处理数据流。 2. 窗口处理 Spark Streaming 的窗口处理是基于时间的,即将一段时间内的数据作为一个窗口进行处理。而 Flink 的窗口处理可以基于时间和数据量,可以更加灵活地进行窗口处理。 3. 状态管理 Spark Streaming 的状态管理是基于 RDD 的,需要将状态存储在内存中。而 Flink 的状态管理是基于内存和磁盘的,可以更加灵活地管理状态。 4. 容错性 Flink 的容错性比 Spark Streaming 更加强大,可以在节点故障时快速恢复,而 Spark Streaming 则需要重新计算整个批次的数据。 总的来说,Flink 在流处理方面更加强大和灵活,而 Spark Streaming 则更适合批处理和数据仓库等场景。 ### 回答2: Spark Streaming 和 Flink 都是流处理框架,它们都支持低延迟的流处理和高吞吐量的批处理。但是,它们在处理数据流的方式和性能上有许多不同之处。下面是它们的详细比较: 1. 处理模型 Spark Streaming 采用离散化流处理模型(DPM),将长周期的数据流划分为离散化的小批量,每个批次的数据被存储在 RDD 中进行处理,因此 Spark Streaming 具有较好的容错性和可靠性。而 Flink 采用连续流处理模型(CPM),能够在其流处理过程中进行事件时间处理和状态管理,因此 Flink 更适合处理需要精确时间戳和状态管理的应用场景。 2. 数据延迟 Spark Streaming 在处理数据流时会有一定的延迟,主要是由于对数据进行缓存和离散化处理的原因。而 Flink 的数据延迟比 Spark Streaming 更低,因为 Flink 的数据处理和计算过程是实时进行的,不需要缓存和离散化处理。 3. 机器资源和负载均衡 Spark Streaming 采用了 Spark 的机器资源调度和负载均衡机制,它们之间具有相同的容错和资源管理特性。而 Flink 使用 Yarn 和 Mesos 等分布式计算框架进行机器资源调度和负载均衡,因此 Flink 在大规模集群上的性能表现更好。 4. 数据窗口处理 Spark Streaming 提供了滑动、翻转和窗口操作等灵活的数据窗口处理功能,可以使用户更好地控制数据处理的逻辑。而 Flink 也提供了滚动窗口和滑动窗口处理功能,但相对于 Spark Streaming 更加灵活,可以在事件时间和处理时间上进行窗口处理,并且支持增量聚合和全量聚合两种方式。 5. 集成生态系统 Spark Streaming 作为 Apache Spark 的一部分,可以充分利用 Spark 的分布式计算和批处理生态系统,并且支持许多不同类型的数据源,包括Kafka、Flume和HDFS等。而 Flink 提供了完整的流处理生态系统,包括流SQL查询、流机器学习和流图形处理等功能,能够灵活地适应不同的业务场景。 总之,Spark Streaming 和 Flink 都是出色的流处理框架,在不同的场景下都能够发挥出很好的性能。选择哪种框架取决于实际需求和业务场景。 ### 回答3: Spark Streaming和Flink都是流处理引擎,但它们的设计和实现方式有所不同。在下面的对比中,我们将比较这两种流处理引擎的主要特点和差异。 1. 处理模型 Spark Streaming采用离散流处理模型,即将数据按时间间隔分割成一批一批数据进行处理。这种方式可以使得Spark Streaming具有高吞吐量和低延迟,但也会导致数据处理的粒度比较粗,难以应对大量实时事件的高吞吐量。 相比之下,Flink采用连续流处理模型,即数据的处理是连续的、实时的。与Spark Streaming不同,Flink的流处理引擎能够应对各种不同的实时场景。Flink的实时流处理能力更强,因此在某些特定的场景下,它的性能可能比Spark Streaming更好。 2. 窗口计算 Spark Streaming内置了许多的窗口计算支持,如滑动窗口、滚动窗口,但支持的窗口计算的灵活性较低,只适合于一些简单的窗口计算。而Flink的窗口计算支持非常灵活,可以支持任意窗口大小或滑动跨度。 3. 数据库支持 在处理大数据时,存储和读取数据是非常重要的。Spark Streaming通常使用HDFS作为其数据存储底层的系统。而Flink支持许多不同的数据存储形式,包括HDFS,以及许多其他开源和商业的数据存储,如Kafka、Cassandra和Elasticsearch等。 4. 处理性能 Spark Streaming的性能比Flink慢一些,尤其是在特定的情况下,例如在处理高吞吐量的数据时,在某些情况下可能受制于分批处理的架构。Flink通过其流处理模型和不同的调度器和优化器来支持更高效的实时数据处理。 5. 生态系统 Spark有着庞大的生态系统,具有成熟的ML库、图处理库、SQL框架等等。而Flink的生态系统相对较小,但它正在不断地发展壮大。 6. 规模性 Spark Streaming适用于规模小且不太复杂的项目。而Flink可扩展性更好,适用于更大、更复杂的项目。Flink也可以处理无限制的数据流。 综上所述,Spark Streaming和Flink都是流处理引擎,它们有各自的优缺点。在选择使用哪一个流处理引擎时,需要根据实际业务场景和需求进行选择。如果你的业务场景较为复杂,需要处理海量数据并且需要比较灵活的窗口计算支持,那么Flink可能是更好的选择;如果你只需要简单的流处理和一些通用的窗口计算,Spark Streaming是更为简单的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值