SCL(supervised contrastive learning)
讨论了监督对比学习(Supervised Contrastive Learning,简称 SCL)在长尾识别任务中的应用及其性能提升。通过近来的研究发现,监督对比学习及其变体能显著提升长尾识别任务的表现,并达到最新的最先进的性能(State of the Art, SOTA)。
-
监督对比学习(SCL):SCL的核心思想是通过最大化正实例(即来自同一类别的实例)的区分度来学习特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅)。给定训练数据 ( x i , y i ) (x_i, y_i) (xi,yi)和批次 B \mathcal{B} B,SCL的学习目标是:
L S C L = ∑ i = 1 N − 1 ∣ P ~ i ∣ ∑ z p ∈ P ~ i log exp ( z i ⋅ z p ⊤ / τ ) ∑ z a ∈ V ~ i exp ( z i ⋅ z a ⊤ / τ ) \mathcal{L}_{SCL} = \sum_{i=1}^{N} -\frac{1}{|\tilde{P}_i|} \sum_{z_p \in \tilde{P}_i} \log \frac{\exp(z_i \cdot z_p^{\top} / \tau)}{\sum_{z_a \in \tilde{V}_i} \exp(z_i \cdot z_a^{\top} / \tau)} LSCL=i=1∑N−∣P~i∣1zp∈P~i∑log∑za∈V~iexp(zi⋅za⊤/τ)exp(zi⋅zp⊤/τ)
其中, τ \tau τ是温度超参数, z i = f θ ( x i ) z_i = f_{\theta}(x_i) zi=fθ(xi)是从 x i x_i xi生成的特征, V i V_i Vi是当前批次中除去 z i z_i zi的所有特征。 P i P_i Pi是与 x i x_i xi类别相同的实例集合。通过添加数据增强生成的特征,我们得到 S ~ i \tilde{S}_i S~i。
-
长尾数据集问题:在长尾数据集中,特征空间通常会被头部类别主导,导致语义区分能力有限。
-
k-正样本对比学习(KCL):为了解决上述问题,k-正样本对比学习(KCL)方法尝试通过保持每个类别正实例的数量相等来平衡特征空间。KCL的损失函数如下:
L K C L = ∑ i = 1 N − 1 k + 1 ∑ z p ∈ P i k ~ log exp ( z i ⋅ z p ⊤ / τ ) ∑ z a ∈ V ~ i exp ( z i ⋅ z a ⊤ / τ ) \mathcal{L}_{KCL} = \sum_{i=1}^{N} -\frac{1}{k+1} \sum_{z_p \in \tilde{P_i^k}} \log \frac{\exp(z_i \cdot z_p^{\top} / \tau)}{\sum_{z_a \in \tilde{V}_i} \exp(z_i \cdot z_a^{\top} / \tau)} LKCL=i=1∑N−k+11zp∈Pik~∑log∑za∈V~iexp(zi⋅za⊤/τ)exp(zi⋅zp⊤/τ)
其中, P i k P_i^k Pik是从 P i P_i Pi中随机抽取的k个实例的子集。最终,经过这个过程学习到的特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅)会在后续阶段用来训练长尾识别的分类器。
总结起来,这段文字介绍了监督对比学习方法及其在长尾识别任务中的优势,同时引入了k-正样本对比学习方法,解决了特征空间被头部类别主导的问题。
下面详细讨论了“监督对比学习”(Supervised Contrastive Learning, SCL)在处理长尾分布数据集中的应用及其扩展方法“k-正样本对比学习”(k-Positive Contrastive Learning, KCL)的原理。以下是对每一部分的详细解释:
1. 监督对比学习(SCL)的基本概念
监督对比学习 是一种用于学习特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅) 的方法,其目标是通过最大化正样本(同一类别的样本)的区分度来提高模型的表现。具体来说,SCL的学习目标是使得来自同一类别的样本在特征空间中的距离更近,而不同类别的样本则距离更远。
2. SCL的损失函数
在SCL中,对于一批训练数据 B = { ( x i , y i ) } i ∈ [ N ] \mathcal{B} = \{(x_i, y_i)\}_{i \in [N]} B={(xi,yi)}i∈[N],SCL的损失函数 L S C L \mathcal{L}_{SCL} LSCL 表达如下:
L S C L = ∑ i = 1 N − 1 ∣ P ~ i ∣ ∑ z p ∈ P ~ i log exp ( z i ⋅ z p ⊤ / τ ) ∑ z a ∈ V ~ i exp ( z i ⋅ z a ⊤ / τ ) \mathcal{L}_{SCL} = \sum_{i=1}^{N} -\frac{1}{|\tilde{P}_i|} \sum_{z_p \in \tilde{P}_i} \log \frac{\exp(z_i \cdot z_p^{\top} / \tau)}{\sum_{z_a \in \tilde{V}_i} \exp(z_i \cdot z_a^{\top} / \tau)} LSCL=i=1∑N−∣P~i∣1zp∈P~i∑log∑za∈V~iexp(zi⋅za⊤/τ)exp(zi⋅zp⊤/τ)
这里解释一下各个符号的含义:
- z i = f θ ( x i ) z_i = f_{\theta}(x_i) zi=fθ(xi) 表示样本 x i x_i xi 通过特征提取器 f θ f_{\theta} fθ 生成的特征向量。
- τ \tau τ 是一个温度超参数,控制对比学习的敏感性。
- V i = { z i } i ∈ [ N ] \ { z i } V_i = \{z_i\}_{i \in [N]} \backslash \{z_i\} Vi={zi}i∈[N]\{zi} 表示当前批次中的所有特征向量,除了 z i z_i zi 自己。
- P i = { z j ∈ V i : y j = y i } P_i = \{z_j \in V_i: y_j = y_i\} Pi={zj∈Vi:yj=yi} 是与 x i x_i xi 属于同一类别的所有特征向量的集合。
- S ~ i \tilde{S}_i S~i 是 S i S_i Si 的扩展集合,包含原集合和其增强版本的特征向量。
在监督对比学习(SCL)的损失函数 L S C L \mathcal{L}_{SCL} LSCL 中, − 1 ∣ P ~ i ∣ -\frac{1}{|\tilde{P}_i|} −∣P~i∣1 这个项的作用是对每个正样本进行平均化处理。
具体来说, ∣ P ~ i ∣ |\tilde{P}_i| ∣P~i∣ 表示样本 x i x_i xi 所属类别的正样本数量。在计算损失时,损失函数中会对所有的正样本 P ~ i \tilde{P}_i P~i 求和。为了保证不同类别的样本对损失的贡献具有可比性,防止样本数量较多的类别在总损失中占据过大的权重,对每个正样本的损失值进行了归一化处理。
因此, − 1 ∣ P ~ i ∣ -\frac{1}{|\tilde{P}_i|} −∣P~i∣1 是用来对正样本的对数概率求平均,使得每个正样本对损失的贡献相等。这种平均化的做法能够防止某些样本数较多的类别在训练过程中对模型产生不公平的影响,同时确保每个样本的特征学习过程更加均衡。
损失函数中的负号的确是为了配合梯度下降算法,使得模型能够最大化正样本之间的相似度。
具体来说,
log
exp
(
z
i
⋅
z
p
⊤
/
τ
)
∑
z
a
∈
V
~
i
exp
(
z
i
⋅
z
a
⊤
/
τ
)
\log \frac{\exp(z_i \cdot z_p^{\top} / \tau)}{\sum_{z_a \in \tilde{V}_i} \exp(z_i \cdot z_a^{\top} / \tau)}
log∑za∈V~iexp(zi⋅za⊤/τ)exp(zi⋅zp⊤/τ) 这一项计算的是正样本对(即同一类别的样本)的相似度与所有样本对的相似度之比。我们希望正样本对的相似度尽可能大,分子越大,
log
\log
log 的值就越大。但由于我们使用的是梯度下降法来优化模型,目标是最小化损失函数,因此在损失函数前面加上了一个负号,把最大化的问题转换成了最小化的问题。
当正样本之间的相似度增大时,这个项的值会增加,但由于前面的负号,损失函数的值会减小,表示模型的性能在改善。因此,加上负号正是为了与梯度下降相适应,使得优化方向符合我们的预期。
简单来说,SCL的损失函数试图通过最大化相同类别样本的相似度(分子部分)并最小化不同类别样本的相似度(分母部分)来学习特征空间。
3. 长尾数据集的问题
在长尾分布的数据集中,头部类别(样本数较多的类别)通常会主导特征空间,这导致模型对尾部类别(样本数较少的类别)的语义区分能力较差。这种不平衡会限制模型在长尾数据集上的整体表现。
在长尾分布的数据集中,头部类别(样本数量较多的类别)通常会主导特征空间,从而导致模型对尾部类别(样本数量较少的类别)在语义上区分能力有限。
监督对比学习(SCL)会出现这个问题的原因在于,它的损失函数依赖于批次中的所有样本对。在长尾数据集中,头部类别的样本占据了大多数,因此在SCL的训练过程中,模型更容易学习到这些头部类别的特征,从而使得这些类别在特征空间中主导位置。这种主导性会导致尾部类别的样本在特征空间中被忽视或压缩,模型在处理这些类别时的表现较差,因此缺乏足够的语义区分能力。
4. k-正样本对比学习(KCL)的引入
为了应对长尾数据集带来的问题,研究者引入了 k-正样本对比学习(KCL)。KCL的核心思想是,通过在特征空间中保持每个类别的正样本数量相等,来平衡特征空间,减少头部类别的主导性。
KCL的损失函数 L K C L \mathcal{L}_{KCL} LKCL 表达如下:
L K C L = ∑ i = 1 N − 1 k + 1 ∑ z p ∈ P i k ~ log exp ( z i ⋅ z p ⊤ / τ ) ∑ z a ∈ V ~ i exp ( z i ⋅ z a ⊤ / τ ) \mathcal{L}_{KCL} = \sum_{i=1}^{N} -\frac{1}{k+1} \sum_{z_p \in \tilde{P_i^k}} \log \frac{\exp(z_i \cdot z_p^{\top} / \tau)}{\sum_{z_a \in \tilde{V}_i} \exp(z_i \cdot z_a^{\top} / \tau)} LKCL=i=1∑N−k+11zp∈Pik~∑log∑za∈V~iexp(zi⋅za⊤/τ)exp(zi⋅zp⊤/τ)
其中, P i k P_i^k Pik 是从 P i P_i Pi 中随机抽取的 k 个正样本。通过这个方法,KCL能够在特征空间中更好地平衡每个类别的影响,从而提升模型在长尾数据集上的表现。
这段介绍了k-positive对比学习(KCL)如何通过平衡特征空间来解决长尾数据集中头部类别主导性的问题。
-
问题描述:在长尾数据集中,头部类别(样本较多的类别)往往会主导特征空间。这导致模型在区分尾部类别(样本较少的类别)时表现不佳,因为特征空间更倾向于头部类别,使得尾部类别的样本在语义上难以有效区分。
-
KCL的解决方案:为了平衡特征空间,KCL方法引入了一个新的对比学习损失函数。这个损失函数的核心思想是,通过确保每个类别的正样本数量在计算损失时保持相等,来减少头部类别对特征空间的主导性。
- 具体做法:对于每个样本 x i x_i xi,从它的正样本集合 P i P_i Pi 中随机抽取 k k k 个正样本,形成一个子集 P i k P_{i}^{k} Pik。然后,在计算对比学习损失时,只使用这个子集中的 k k k 个正样本,而不是整个正样本集合。
- 损失函数:新的损失函数 L K C L \mathcal{L}_{KCL} LKCL 中使用 − 1 k + 1 -\frac{1}{k+1} −k+11 作为权重,这里 k + 1 k+1 k+1 代表了 k k k 个正样本加上原始样本 x i x_i xi 的增强版本。通过这种方式,每个类别在特征空间中的正样本贡献被平衡,不再被头部类别主导。
-
效果:这种平衡正样本数量的做法,使得模型在训练时能够更好地学习尾部类别的特征,从而提高这些类别的语义区分能力。最终,经过KCL学习得到的特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅) 会在后续的分类器训练阶段被使用,以提升模型在长尾识别任务中的表现。
简而言之,KCL通过控制每个类别的正样本数量,减弱了头部类别对特征空间的主导作用,从而改善了模型对尾部类别的识别能力。
举个例子:
在KCL方法中,如果尾部样本最少的类别只包含3个样本,那么为了保证所有类别的正样本数量一致, k k k 可以设置为3。这意味着对于每个类别,正样本集合中最多只选择3个正样本。对于头部类别,即使它们的样本数量很多,KCL也只会随机抽取3个正样本参与训练。这种做法可以有效控制每个类别在训练时的正样本数量一致,从而减少头部类别对特征空间的主导作用。
通过这种平衡策略,KCL能够更好地均衡长尾数据集中各类别的特征表示,提升模型对尾部类别的区分能力。
5. 总结
主要介绍了监督对比学习(SCL)的基本原理,以及它在处理长尾数据集问题时的局限性。为了克服这些局限性,研究者提出了 k-正样本对比学习(KCL),通过在特征空间中平衡正样本的数量来提高模型的表现。这些技术最终会在长尾识别任务中用于训练分类器。
下面讨论KCL方法的一种潜在问题,即在平衡各类别正样本数量的过程中,可能会引入“实例不平衡”(instance-imbalance)的问题。
-
KCL的平衡策略:KCL方法通过为每个类别选择相同数量的正样本(即 ∣ P i k ∣ = k |P_{i}^{k}| = k ∣Pik∣=k)来平衡SCL的学习目标,这样不论样本属于哪个类别,都会被挑选出相同数量的正样本参与训练。
-
实例不平衡的引入:虽然这种类别平衡的方法看似公平,但它可能会导致训练过程中“实例不平衡”的问题。具体来说,由于尾部类别的样本数量较少,它们在训练过程中被选中作为正样本的机会远高于头部类别的样本。
- 举例说明:假设每个类别至少有 k k k 个样本,那么某个类别 c c c 中一个样本被选为正样本的概率 p ( c ) p(c) p(c) 是 k n c \frac{k}{n_{c}} nck,其中 n c n_{c} nc 是类别 c c c 的样本数量。
- 头尾类别的对比:如果尾部类别 C C C 只有 k k k 个样本,而头部类别的样本数量与尾部类别相比差距很大(例如,头部类别的样本数量是尾部类别的100倍,即 n 1 n C = 100 \frac{n_{1}}{n_{C}} = 100 nCn1=100),那么尾部类别样本被选为正样本的概率是1(即 p ( C ) = 1 p(C) = 1 p(C)=1),而头部类别样本的概率仅为0.01(即 p ( 1 ) = k 100 k = 0.01 p(1) = \frac{k}{100k} = 0.01 p(1)=100kk=0.01)。也就是说,当头部类别的样本被选中一次时,尾部类别的样本可能已经被训练了100次。
-
训练偏向性和特征空间的不足:由于尾部类别样本被频繁使用,它们在训练中的影响会大大超过头部类别,这种不平衡会使得训练过程偏向尾部类别的少量样本。由于尾部类别的样本本来就很少且未必具有代表性,这样学习到的特征空间可能会不够理想,对这些尾部类别的训练数据过于敏感,进而导致模型表现不稳定或欠佳。
总结来说,这段话强调了KCL方法虽然试图通过平衡各类别的正样本数量来减轻头部类别的主导性问题,但却引入了实例不平衡的新问题,特别是对尾部类别样本的过度依赖可能会影响模型的整体表现。
所以,下面引出SBCL来解决上面KCL存在的问题
SBCL
一种新的处理类别不平衡问题的对比学习方法,称为子类平衡对比学习(SBCL)。核心思想是通过在对比学习中同时实现“实例平衡”和“子类平衡”来解决类别不平衡问题。具体内容如下:
-
现有方法的问题:现有的方法(如KCL)在追求类别平衡时,可能会导致实例不平衡,即尾部类别的少量样本会在训练中被过度使用,导致训练偏向这些样本。
-
新的视角:作者提出,与其为了类别平衡而牺牲实例平衡,不如同时实现实例平衡和子类平衡。他们认为,头部类别通常包含更多多样化的实例,这意味着在训练数据集中,这些类别具有更丰富的语义信息。因此,将头部类别划分为多个语义上连贯的子类是一个更明智的策略,每个子类的样本数量与尾部类别相当。
-
SBCL方法:基于这一思路,作者开发了一个新的对比学习框架,称为子类平衡对比学习(SBCL)。这个方法在长尾识别任务中,通过实现实例平衡和子类平衡来提高模型性能。
-
效果说明:作者在文章的第4.6节中举了一个具体的例子,展示了SBCL相较于以往方法的优越性。
下面介绍了一种新的对比学习方法,通过细分头部类别并与尾部类别进行平衡,来同时解决实例和子类的不平衡问题,以改善模型在长尾数据集上的表现。
SBCL将头部类别划分成多个较小的、语义上连贯的子类,每个子类的样本数量大致和尾部类别的样本数量相同。通过这样做,可以在训练过程中实现实例平衡和子类平衡,避免过度依赖尾部类别的少量样本,从而提升模型在长尾数据集上的表现。
“语义上连贯的子类”指的是将一个类别按照其内部语义或特征划分为更小的组,每个组内的实例在某种语义或特征上有相似性。以下是一个具体的例子来说明这种划分:
举例说明:狗的分类
假设我们有一个“狗”类别,这个类别是一个典型的头部类别,因为它包含大量不同品种的狗实例,如牧羊犬、拉布拉多、哈士奇等。这些品种在样本数量上非常丰富,因此需要划分为语义上连贯的子类。
-
原始类别:
- 类别:狗(总共有500个样本)
-
语义上连贯的子类划分:
- 子类1:牧羊犬(German Shepherd, Border Collie等,100个样本)
- 子类2:拉布拉多(Labrador Retriever等,100个样本)
- 子类3:哈士奇(Siberian Husky等,100个样本)
- 子类4:斗牛犬(Bulldog等,100个样本)
- 子类5:小型犬(如吉娃娃、博美犬等,100个样本)
通过这样的划分,每个子类的样本数量与尾部类别(例如某个稀有犬种,只有少量样本)更加接近。
关键点:
- 语义连贯性:每个子类内部的样本在某种特征或属性上是相似的,例如同属于同一种犬种或具有相似的外观和行为。
- 与尾部类别平衡:通过这种方式,头部类别(如“狗”)的多样性得到了合理分解,每个子类的样本数量与尾部类别接近,这样在训练过程中,每个子类的权重相对均衡,不会因为样本数量的差异而产生偏倚。
这种方法的好处是,模型不仅在类别级别上更平衡,还能更好地捕捉头部类别内部的细节和差异,提高对整个数据分布的表达能力。
划分为多个子类
指如何通过将一个类别划分为多个“子类”来应对数据不平衡问题。具体内容如下:
-
类别划分的目标:为了处理数据中的不平衡现象,作者提出将一个类别 c c c 划分为若干个子类。这个划分过程基于对该类别的样本集 D c \mathcal{D}_{c} Dc 进行聚类。
-
聚类算法的使用:作者使用了一种聚类算法,通过当前特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅) 提取的特征,将类别 c c c 对应的数据集 D c \mathcal{D}_{c} Dc 划分为 m c m_{c} mc 个子类(即簇)。对于类别 c c c 中的每个实例 x i x_{i} xi,其所属的簇标签用 Γ c ( x i ) \Gamma_{c}\left(x_{i}\right) Γc(xi) 表示。
Γ c ( x i ) \Gamma_{c}\left(x_{i}\right) Γc(xi) 代表的是更细粒度的聚类标签。对于“狗”这个类别,可以通过聚类算法将其细分为多个子类或簇,例如:吉娃娃、德牧(德国牧羊犬)、边牧(边境牧羊犬)、柴犬等。每个子类标签 Γ c ( x i ) \Gamma_{c}\left(x_{i}\right) Γc(xi) 对应于一个具体的犬种,这样可以在训练时实现子类平衡,同时保留原始类别中的丰富语义信息。 -
子类样本数量平衡:为了确保每个子类中的样本数量大致相同,作者提出了一种新的聚类算法。该算法对由特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅) 输出的特征向量进行单位长度归一化,然后在此基础上进行聚类。
-
算法描述:这个新的聚类算法在文中的“算法1”中进行了详细描述。
总的来说,这段介绍了通过聚类方法将头部类别划分为若干个样本数量相近的子类,以应对数据不平衡问题,并且还提出了一个新的聚类算法来实现这一目标。
描述算法1的具体操作步骤和它的改进目标,特别是在处理类别不平衡问题中的应用。以下是具体内容解析:
-
聚类中心初始化:在算法1中,初始化聚类中心时,采用一种策略,即优先选择那些与已有聚类中心最远的样本作为新的聚类中心。这种做法有助于确保聚类中心在特征空间中尽可能分散,从而提高聚类效果。
-
样本分配和大小阈值:在将样本分配到聚类中心的过程中,设置了一个阈值 M M M 作为每个簇的样本数量上限,以确保各个簇的大小是平衡的。具体来说,阈值 M M M 定义为:
M = max ( n C , δ ) M=\max \left(n_{C}, \delta\right) M=max(nC,δ)
其中, n C n_{C} nC 是尾部类别的样本数量, δ \delta δ 是一个超参数,用来控制簇中样本数量的下限,避免生成过小的簇。 -
尾部类别的处理:聚类算法只应用于包含多个实例的头部类别,而尾部类别则保持不变。因此,聚类后,每个簇的大小与尾部类别的大小 n C n_{C} nC 相似。
-
动态聚类分配:在训练过程中,作者提出了动态更新簇分配的方法,即根据当前特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅) 动态调整聚类,而不是仅在训练开始时进行一次聚类。实验证明,这种动态聚类方法比仅聚类一次的方法效果更好。
-
实例平衡和子类平衡:通过用更细粒度的聚类标签替换头部类别的类标签,确保了实例的平衡,即每个实例都有相似的被选择机会,而不依赖于其所属类别。此外,通过将头部类别(通常包含更多多样实例)划分为多个语义连贯的子类,达到了子类平衡,而非简单的类别平衡,同时还保留了训练数据集中头部类别的丰富语义信息。
-
补充说明:附录A.1中对算法1进行了详尽描述,并展示了在基准数据集上,聚类中样本数量的分布情况。
总结来说,这段文字详细阐述了算法1如何通过设置聚类中心的初始化策略、样本分配的大小阈值以及动态更新聚类分配,来实现头部类别的细分与平衡,最终达到实例平衡和子类平衡的目标。
Algorithm 1
算法1描述了一种称为**“子类平衡自适应聚类”**的方法,用于处理数据不平衡问题。以下是对这个算法的步骤解析:
-
输入和初始设定:
- 输入:样本集 S = { x i } i = 1 n \mathcal{S}=\left\{x_{i}\right\}_{i=1}^{n} S={xi}i=1n,阈值 M M M(控制每个簇的最大样本数),迭代次数 K K K。
- 输出:样本集 S \mathcal{S} S 的聚类分配。
-
迭代过程:
- 第0次迭代(即初始迭代):选择聚类中心 y j y_{j} yj,优先选择那些与之前选择的聚类中心距离最远的样本。这个步骤确保聚类中心在特征空间中尽可能分散。
- 后续迭代:在每次迭代中,更新聚类中心 y j y_{j} yj 为当前簇中所有样本的平均值(即质心)。其中, n j n_{j} nj 表示某个簇中的样本数量。
-
构建聚类中心集合:
- 在每次迭代中,构建当前的聚类中心集合 C = { y j } j = 1 m \mathcal{C}=\left\{y_{j}\right\}_{j=1}^{m} C={yj}j=1m,其中 m m m 是聚类中心的数量。
-
样本分配过程:
- 在样本集中还存在未分配样本时,执行以下操作:
- 选择样本与聚类中心中余弦相似度最高的配对 ( x i , y j ) \left(x_{i}, y_{j}\right) (xi,yj),并将样本 x i x_{i} xi 分配给聚类中心 y j y_{j} yj。
- 将分配后的样本 x i x_{i} xi 从样本集中删除。
- 如果某个簇的样本数 n j n_{j} nj 达到或超过阈值 M M M,则从聚类中心集合中删除对应的聚类中心 y j y_{j} yj,防止该簇继续增加样本。
- 在样本集中还存在未分配样本时,执行以下操作:
-
迭代结束:
- 重复上述过程 K K K 次,直到达到设定的迭代次数,完成最终的聚类分配。
总结:这个算法通过自适应地选择和更新聚类中心,并控制每个簇中的样本数量,使得生成的子类在样本数量上更加平衡,从而应对数据集中存在的类别不平衡问题。这种方法有助于在训练时平衡不同子类的实例,避免某些子类占据过多的训练资源。
为什么更细粒度的标签可以实现instance&subclass balance?
使用更细粒度的聚类标签可以实现**实例平衡(instance-balanced)和子类平衡(subclass-balanced)**的原因在于以下几点:
-
细化类别标签,打破头部类别的垄断:
- 在数据集中,头部类别通常包含更多的样本,并且这些样本可能来自于多种不同的子类别或细粒度实例。当我们将这些头部类别进一步细分为多个更小的聚类(即细粒度的聚类标签),这些子类会更加同质化,即每个子类包含的样本在特征上更加相似。
- 通过这种细分,每个子类中的样本数量会减少,这就避免了头部类别中某些样本因其所属类别过大而频繁地被选中进行训练。
-
实例平衡的实现:
- 在模型训练中,细粒度聚类标签取代了原本的头部类别标签,这意味着在选择训练样本时,模型关注的是细粒度子类而非原始的宽泛类别。
- 由于每个子类的规模较小且均衡,因此在训练过程中,每个实例被选中的机会变得更加均等,不再受限于其所属的原始大类。这就实现了实例平衡,即每个实例都有相似的被选中机会。
-
子类平衡的实现:
- 通过将头部类别分解为多个语义上连贯的子类(即细粒度聚类),我们在模型训练时可以保证各个子类之间的样本数量是平衡的,而不是简单地在大类之间进行平衡。
- 这种子类平衡(subclass-balanced)的方式不仅保留了头部类别的语义丰富性,还能够让模型更细致地理解和学习这些子类的特征,从而提升分类的效果。
总结:通过使用更细粒度的聚类标签,算法能够避免数据集中头部类别对训练过程的过度影响,实现对每个实例的公平对待(实例平衡)和子类别之间的均衡(子类平衡),从而提高模型在数据不平衡条件下的性能。
公式4的解释
L S B C L = − ∑ i = 1 N ( 1 ∣ M ~ i ∣ ∑ z p ∈ M ~ i log exp ( z i ⋅ z p ⊤ / τ 1 ) ∑ z a ∈ V ~ i exp ( z i ⋅ z a ⊤ / τ 1 ) + β 1 ∣ P ~ i ∣ − ∣ M i ∣ ∑ z p ∈ P ~ i / M i log exp ( z i ⋅ z p ⊤ / τ 2 ) ∑ z a ∈ V ~ i / M i exp ( z i ⋅ z a ⊤ / τ 2 ) ) \begin{align*} & \mathcal{L}_{S B C L}=-\sum_{i=1}^{N}\left(\frac{1}{\left|\tilde{M}_{i}\right|} \sum_{z_{p} \in \tilde{M}_{i}} \log \frac{\exp \left(z_{i} \cdot z_{p}^{\top} / \tau_{1}\right)}{\sum_{z_{a} \in \tilde{V}_{i}} \exp \left(z_{i} \cdot z_{a}^{\top} / \tau_{1}\right)}\right. \\ & \left.+\beta \frac{1}{\left|\tilde{P}_{i}\right|-\left|M_{i}\right|} \sum_{z_{p} \in \tilde{P}_{i} / M_{i}} \log \frac{\exp \left(z_{i} \cdot z_{p}^{\top} / \tau_{2}\right)}{\sum_{z_{a} \in \tilde{V}_{i} / M_{i}} \exp \left(z_{i} \cdot z_{a}^{\top} / \tau_{2}\right)}\right) \tag{4} \end{align*} LSBCL=−i=1∑N M~i 1zp∈M~i∑log∑za∈V~iexp(zi⋅za⊤/τ1)exp(zi⋅zp⊤/τ1)+β P~i −∣Mi∣1zp∈P~i/Mi∑log∑za∈V~i/Miexp(zi⋅za⊤/τ2)exp(zi⋅zp⊤/τ2) (4)
这段话讨论的是在使用对比学习(contrastive learning)方法时,为了避免因替换粗粒度类别标签为细粒度聚类标签而导致类边界模糊的问题,提出的一种解决方案。
背景
- 头部类别的标签替换:原本在对比学习(如SCL/KCL)中使用的是粗粒度的类别标签(class label)。现在,由于使用了更细粒度的聚类标签(cluster label),我们不再区分来自不同头部类别的实例,这可能导致不同类别的边界变得模糊,进而导致特征空间的表示不够优化。
边界模糊问题出现的原因在于,当我们将粗粒度的类别标签替换为细粒度的聚类标签时,可能会导致模型在学习过程中无法准确区分不同类别的实例,进而导致类别之间的界限变得不清晰。下面通过一个例子来解释这个问题。
举例说明:比如你的意思是,猫狗分类中,比如灰色的猫和灰色的狗,灰色的狗可能被分类到灰色的猫这个聚类里面去,但是大类上,是分为猫和狗的两类的,也就是不同类别的实例可能被错误地归为同一聚类。
假设我们在一个图像分类任务中,有两个头部类别:猫和狗。原本,这两个类别是粗粒度的标签,即所有的猫都被归为“猫”类,所有的狗都被归为“狗”类。
- 粗粒度标签(Class Label)
- 类别1(猫):包含各种不同种类的猫,例如狮子、老虎、家猫等。
- 类别2(狗):包含各种不同种类的狗,例如金毛、哈士奇、柴犬等。
在这种情况下,模型学到的特征可以比较清楚地区分猫和狗,即类别边界很明确。
- 细粒度聚类标签(Cluster Label)
现在,我们将这些粗粒度的类别进一步细分为多个细粒度的聚类。例如:
- 猫类被细分为:狮子、老虎、家猫等不同的聚类。
- 狗类被细分为:金毛、哈士奇、柴犬等不同的聚类。
- 边界模糊问题
如果我们在训练模型时,仅使用这些细粒度的聚类标签,而不考虑粗粒度的类别标签,那么模型可能会遇到以下问题:
- 不同类别的实例被混淆:例如,狮子(猫的一种)和哈士奇(狗的一种)虽然在视觉上有一些相似之处(都具有毛茸茸的外观和四条腿),它们可能在特征空间中被误认为是同一类。这是因为模型在细粒度聚类标签的指导下,可能会将它们拉得更近。
- 同一类别的实例被错误分类:如果仅使用细粒度聚类标签,模型可能无法识别出“狮子”和“家猫”属于同一个更大的类别(猫类)。从而当它遇到一张新的猫的照片时,它可能无法正确地将其归为猫,而是将其归为某个错误的细粒度聚类。
- 结果
这些现象会导致边界模糊:猫和狗之间的区分变得不清晰,因为模型在学习时没有充分利用粗粒度的类别信息,仅依赖于细粒度的聚类信息。这会使得模型在区分不同的头部类别(如猫和狗)时表现较差,从而导致特征空间的表示不理想。
总结
为了避免这种边界模糊的问题,解决方案是结合使用粗粒度的类别标签和细粒度的聚类标签,通过对比学习来同时优化类内的一致性和类间的区分性,从而确保模型能够在保持类别边界清晰的同时,学习到更加精细的特征表示。
问题
- 类别边界模糊:当我们仅使用细粒度的聚类标签来进行对比学习时,同一类别的实例可能被分配到不同的聚类中,而不同类别的实例又可能被错误地归为同一聚类。这会导致类别之间的界限变得不清晰,影响模型的学习效果。
解决方案
- 结合两种标签的对比损失:为了解决这一问题,提出了一种新的损失函数,即子类平衡对比损失(SBCL),它结合了粗粒度的类别标签和细粒度的聚类标签的对比损失。
损失函数的具体形式
L S B C L = − ∑ i = 1 N ( 1 ∣ M ~ i ∣ ∑ z p ∈ M ~ i log exp ( z i ⋅ z p ⊤ / τ 1 ) ∑ z a ∈ V ~ i exp ( z i ⋅ z a ⊤ / τ 1 ) + β 1 ∣ P ~ i ∣ − ∣ M i ∣ ∑ z p ∈ P ~ i / M i log exp ( z i ⋅ z p ⊤ / τ 2 ) ∑ z a ∈ V ~ i / M i exp ( z i ⋅ z a ⊤ / τ 2 ) ) \begin{align*} & \mathcal{L}_{S B C L}=-\sum_{i=1}^{N}\left(\frac{1}{\left|\tilde{M}_{i}\right|} \sum_{z_{p} \in \tilde{M}_{i}} \log \frac{\exp \left(z_{i} \cdot z_{p}^{\top} / \tau_{1}\right)}{\sum_{z_{a} \in \tilde{V}_{i}} \exp \left(z_{i} \cdot z_{a}^{\top} / \tau_{1}\right)}\right. \\ & \left.+\beta \frac{1}{\left|\tilde{P}_{i}\right|-\left|M_{i}\right|} \sum_{z_{p} \in \tilde{P}_{i} / M_{i}} \log \frac{\exp \left(z_{i} \cdot z_{p}^{\top} / \tau_{2}\right)}{\sum_{z_{a} \in \tilde{V}_{i} / M_{i}} \exp \left(z_{i} \cdot z_{a}^{\top} / \tau_{2}\right)}\right) \tag{4} \end{align*} LSBCL=−i=1∑N M~i 1zp∈M~i∑log∑za∈V~iexp(zi⋅za⊤/τ1)exp(zi⋅zp⊤/τ1)+β P~i −∣Mi∣1zp∈P~i/Mi∑log∑za∈V~i/Miexp(zi⋅za⊤/τ2)exp(zi⋅zp⊤/τ2) (4)
-
第一项(SCL损失的改进版本):
- 这部分仍然基于细粒度的聚类标签计算对比损失,目标是将属于同一聚类的实例拉近,并将不同聚类的实例推远。
- 数学表达式中, M i M_i Mi 表示与当前样本 x i x_i xi 属于同一聚类的所有样本集合。
-
第二项(结合类标签的对比损失):
- 这部分利用了粗粒度的类别标签来计算对比损失,但有一个不同:同一聚类内的样本被移除(即 M i M_i Mi 内的样本被移除),这样只考虑同一类别中但属于不同聚类的样本。
- 这意味着,第二项损失是为了保证模型能够正确地区分同一类别下不同聚类的样本,进而保持类别的整体一致性。
-
超参数 β \beta β:这个参数用于平衡两部分损失之间的权重。通过调整 β \beta β,可以控制粗粒度类别信息和细粒度聚类信息在损失函数中的重要性。
结论
通过这种结合粗粒度类别标签和细粒度聚类标签的对比损失函数设计,能够在保持类内实例一致性的同时,避免类别边界的模糊,从而优化模型的特征空间表示。
ϕ
(
c
)
=
∑
i
=
1
n
c
∥
z
i
−
t
c
∥
2
n
c
log
(
n
c
+
α
)
\begin{equation*} \phi(c)=\frac{\sum_{i=1}^{n_{c}}\left\|z_{i}-t_{c}\right\|_{2}}{n_{c} \log \left(n_{c}+\alpha\right)} \tag{5} \end{equation*}
ϕ(c)=nclog(nc+α)∑i=1nc∥zi−tc∥2(5)
τ
2
(
c
)
=
τ
1
⋅
exp
(
ϕ
(
c
)
1
C
∑
i
=
1
C
ϕ
(
i
)
)
\begin{equation*} \tau_{2}(c)=\tau_{1} \cdot \exp \left(\frac{\phi(c)}{\frac{1}{C} \sum_{i=1}^{C} \phi(i)}\right) \tag{6} \end{equation*}
τ2(c)=τ1⋅exp(C1∑i=1Cϕ(i)ϕ(c))(6)
这段文字讨论了对比学习(contrastive learning)中的温度参数 τ \tau τ 对特征分布的影响,特别是在监督式对比学习中的作用。具体来说,温度 τ \tau τ 的大小会影响特征的局部分离度和全局均匀度。
主要内容总结
-
温度 τ \tau τ 的影响:
- 较低的温度 τ \tau τ 会对特征分布施加更高的相对惩罚,导致特征在特征空间中更加集中。
- 随着温度的升高,惩罚变得更为均匀,特征分布也趋向于更加均匀化。
-
类与聚类标签的区别:
- 尽管文中的目标同时考虑了来自不同粒度的两种标签(类标签和聚类标签),但传统方法对待这两种标签时没有明显的区别。
- 直观上,我们希望同一子类的实例在特征空间中形成比同一类的实例更紧密的聚类,因为子类表示更细粒度的语义一致性。
-
动态调整温度 τ 2 \tau_2 τ2:
- 为了实现这一目标,文中建议确保温度 τ 2 \tau_2 τ2(用于类标签)始终大于温度 τ 1 \tau_1 τ1(用于聚类标签),并根据每个类别的当前特征集中度动态调整 τ 2 \tau_2 τ2。
- 为了度量类 c c c 的集中度,定义了一个函数 ϕ ( c ) \phi(c) ϕ(c),它考虑了类内实例到类中心点的平均距离以及类中实例的数量。
- 然后,使用 ϕ ( c ) \phi(c) ϕ(c) 动态调整温度 τ 2 ( c ) \tau_2(c) τ2(c),确保其比 τ 1 \tau_1 τ1 更大,从而使得类标签下的实例分布比聚类标签下的实例分布更为松散,但不过于松散或密集。
公式解释
- 公式 (5) 中的 ϕ ( c ) \phi(c) ϕ(c) 计算类 c c c 中实例到类中心点的平均距离,并通过对数项和超参数 α \alpha α 调整以避免过大。 ϕ ( c ) \phi(c) ϕ(c)是用来衡量类别 c c c内实例与类别中心点之间的平均距离的度量。具体来说, ϕ ( c ) \phi(c) ϕ(c)的计算方式是将类别内每个实例与类别中心点的欧氏距离求和,然后除以类别中实例数量 n c n_c nc和一个对数项,以此来表示平均距离。在公式中, t c t_c tc代表类别 c c c的中心点, z i z_i zi代表类别 c c c的实例, α \alpha α是一个超参数用于调节公式的缩放,确保 ϕ ( c ) \phi(c) ϕ(c)不会过大。
- 公式 (6) 用来定义每个类 c c c 的温度 τ 2 ( c ) \tau_2(c) τ2(c),使其动态反映当前类内实例特征的集中度。
总的来说,这段文字在讨论如何通过调整温度参数 τ \tau τ,使得模型能更好地处理来自不同粒度标签(类和子类)之间的特征分布差异,从而增强对比学习的效果。
公式 (5) 中使用 ϕ ( c ) = ∑ i = 1 n c ∥ z i − t c ∥ 2 n c log ( n c + α ) \phi(c) = \frac{\sum_{i=1}^{n_{c}}\left\|z_{i}-t_{c}\right\|_{2}}{n_{c} \log \left(n_{c}+\alpha\right)} ϕ(c)=nclog(nc+α)∑i=1nc∥zi−tc∥2 来衡量一个类 c c c 的集中度。公式中分母的 n c n_c nc 和对数项 log ( n c + α ) \log(n_c + \alpha) log(nc+α) 的引入是为了调节集中度的计算,防止某些极端情况影响温度调整。以下是它们存在的原因:
-
平均距离的计算( n c n_c nc):
- n c n_c nc 是类 c c c 中的实例数量。分子中的项 ∑ i = 1 n c ∥ z i − t c ∥ 2 \sum_{i=1}^{n_{c}}\left\|z_{i}-t_{c}\right\|_{2} ∑i=1nc∥zi−tc∥2 表示类内所有实例到类中心点 t c t_c tc 的欧氏距离之和。将这个总和除以 n c n_c nc 可以得到类内平均的距离。
- 如果不除以 n c n_c nc,那么 ϕ ( c ) \phi(c) ϕ(c) 的值会直接与类的大小(实例数量)相关,大类(实例数量多的类)会比小类(实例数量少的类)具有更大的值,这不是我们想要的,因为我们想衡量的是集中度而非数量。因此,除以 n c n_c nc 有助于标准化,消除类大小对集中度度量的影响。
-
对数项的引入( log ( n c + α ) \log(n_c + \alpha) log(nc+α)):
- 对数项
log
(
n
c
+
α
)
\log(n_c + \alpha)
log(nc+α) 的引入主要有两个作用:
- 防止小类影响过大:当 n c n_c nc 较小时, ϕ ( c ) \phi(c) ϕ(c) 可能会变得非常大,因为少量实例的集中度可能会被高估。对数函数在输入值小的时候增长较快,输入值大的时候增长变慢,因此 log ( n c + α ) \log(n_c + \alpha) log(nc+α) 可以有效地限制 ϕ ( c ) \phi(c) ϕ(c) 在 n c n_c nc 很小时的增长。
- 调整缩放:对数项 log ( n c + α ) \log(n_c + \alpha) log(nc+α) 使得 ϕ ( c ) \phi(c) ϕ(c) 更加平滑,避免过度放大小类的集中度。这样,即使对于样本数量较少的类,温度的调整也不会由于距离较大而导致过大的温度变化。
- 对数项
log
(
n
c
+
α
)
\log(n_c + \alpha)
log(nc+α) 的引入主要有两个作用:
综上,分母的 n c n_c nc 是为了计算类内实例的平均距离,而对数项 log ( n c + α ) \log(n_c + \alpha) log(nc+α) 则是为了防止少量样本的类集中度被过度放大,同时也能平滑调整不同类的集中度,使得温度 τ 2 ( c ) \tau_2(c) τ2(c) 的设定更加合理。
设计公式 (6) 为 τ 2 ( c ) = τ 1 ⋅ exp ( ϕ ( c ) 1 C ∑ i = 1 C ϕ ( i ) ) \tau_{2}(c) = \tau_{1} \cdot \exp \left(\frac{\phi(c)}{\frac{1}{C} \sum_{i=1}^{C} \phi(i)}\right) τ2(c)=τ1⋅exp(C1∑i=1Cϕ(i)ϕ(c)) 这种形式的原因,主要考虑到了以下几个方面:
1. 相对性和自适应性:
- 这个公式的核心在于将 ϕ ( c ) \phi(c) ϕ(c) 与所有类的平均集中度 1 C ∑ i = 1 C ϕ ( i ) \frac{1}{C} \sum_{i=1}^{C} \phi(i) C1∑i=1Cϕ(i) 进行对比。通过这种相对度量,可以确保温度 τ 2 ( c ) \tau_2(c) τ2(c) 是针对每个类的实际特征分布情况自适应地调整,而不是简单地使用一个固定的值。
- 这种相对性确保了对于集中度高的类(即 ϕ ( c ) \phi(c) ϕ(c) 比平均值小的类),温度 τ 2 ( c ) \tau_2(c) τ2(c) 不会过于增大,反之,对于集中度低的类,温度 τ 2 ( c ) \tau_2(c) τ2(c) 会更大,以避免形成过度紧密的特征簇。
2. 指数函数的特点:
- 使用指数函数 exp ( ⋅ ) \exp \left(\cdot\right) exp(⋅) 确保 τ 2 ( c ) \tau_2(c) τ2(c) 总是大于 τ 1 \tau_1 τ1 。由于指数函数的值总是正数且大于1,当 ϕ ( c ) \phi(c) ϕ(c) 较大时,指数函数的输出将显著大于1,从而使得 τ 2 ( c ) \tau_2(c) τ2(c) 显著大于 τ 1 \tau_1 τ1。这种设计确保了温度能够随着集中度的变化进行灵活且非线性地调整。
- 这种非线性调整方式在特征分布较为稀疏时(即 ϕ ( c ) \phi(c) ϕ(c) 较大时)提供了更大的灵活性,从而避免过度紧密的特征分布。此外,即便 ϕ ( c ) \phi(c) ϕ(c) 仅略大于平均值,指数函数的输出仍然可以保证 τ 2 ( c ) \tau_2(c) τ2(c) 大于 τ 1 \tau_1 τ1,从而满足设计要求。
3. 保持相对关系:
- 通过公式 (6),不仅能确保 τ 2 ( c ) > τ 1 \tau_2(c) > \tau_1 τ2(c)>τ1,还能根据每个类的特定特征分布动态调整 τ 2 ( c ) \tau_2(c) τ2(c) 的值,确保其适应不同类的具体情况。这种方式比简单的加法或其他线性方式更灵活,且能更好地反映类内特征分布的变化。
4. 一致性和稳定性:
- 公式 (6) 中的设计还考虑了整体模型的稳定性。通过基于平均值的标准化,相对差异不会过度放大,从而避免了温度 τ 2 ( c ) \tau_2(c) τ2(c) 在不同类之间出现过大的波动,这有助于维持模型训练的稳定性和一致性。
总结来说,公式 (6) 采用指数形式,是为了在保证 τ 2 > τ 1 \tau_2 > \tau_1 τ2>τ1 的前提下,实现温度的自适应性调整,使其能够更好地反映类内实例的分布特征,同时确保模型训练的稳定性和一致性。这种设计比其他简单方式更为灵活且符合对比学习的要求。
这段文字描述了一个用于子类平衡对比学习的训练过程,并简要介绍了算法2的工作流程。算法2的主要任务是通过一个包含多个阶段的过程来训练特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅),以确保模型能够有效地学习子类之间的对比特征。以下是关键点的解释:
1. 预热阶段 (Warm-up Stage):
- 目的:由于在训练初期,自适应聚类可能会产生噪声,导致不准确的聚类结果。为了避免这一问题,算法在一开始先用普通的对比学习损失函数(例如SCL或KCL)训练特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅) 若干个epoch,这个阶段被称为“预热”阶段。通过这样做,特征提取器能够先学习到一些初步的、有用的特征,以减少后续自适应聚类带来的噪声。
2. 自适应调整部分:
- 自适应调整内容:算法中有两个部分需要自适应调整:
- 聚类分配:根据当前学习到的特征 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅) 对数据进行聚类。
- 温度 τ 2 ( c ) \tau_{2}(c) τ2(c):为每个主类 c c c 自适应调整温度参数,基于公式5和公式6进行更新。
- 更新间隔:为了避免每个epoch都进行这些计算密集型操作,算法引入了一个超参数 K K K 来作为更新间隔,即每隔 K K K 个epoch才更新一次聚类分配和温度参数。
3. 子类平衡对比学习阶段:
- 在每次更新聚类和温度参数之后,算法会使用更新后的参数继续训练特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅) ,这一步使用的是子类平衡对比学习的损失函数(文中的公式4)。
Algorithm 2 的整体流程:
- 初始化:设置模型参数和超参数。
- 预热:用SCL或KCL训练特征提取器若干个epoch。
- 主训练循环:在主训练阶段,每个 K K K 个epoch进行一次聚类分配和温度参数更新,然后用更新后的参数继续训练特征提取器,直到训练结束。
总结来说,这段文字和Algorithm 2的主要目的是确保特征提取器在训练过程中能够自适应地调整聚类和温度参数,以实现子类的平衡对比学习,从而提高模型在处理不同子类数据时的性能。
这段文字详细描述了子类平衡对比学习(subclass-balancing contrastive learning)的整体训练过程,并概述了算法2(Algorithm 2)的具体步骤。以下是主要内容和算法2执行的任务的解释:
主要内容
-
预热阶段(Warm-up Stage):
- 原因:在训练初期,自适应聚类(adaptive clustering)可能会引入噪声,使得聚类结果不准确。因此,为了减少这种噪声的影响,需要进行预热训练。
- 方法:在训练的前几个epoch中,使用普通的对比学习损失函数(例如标准对比学习 SCL 或扩展对比学习 KCL)来训练特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅)。
-
自适应调整部分(Adaptively-Adjusting Parts):
- 内容:主要有两个部分需要自适应调整:
- 聚类分配(Cluster Assignment):根据当前学习到的特征 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅) 对数据进行重新聚类。
- 温度 τ 2 ( c ) \tau_{2}(c) τ2(c):为每个主类 c c c 自适应地调整温度参数,通过公式5和公式6来更新。
- 更新间隔:不是在每个epoch都进行更新,而是使用一个超参数 K K K 作为更新间隔。即每隔 K K K 个epoch 更新一次聚类分配和温度参数。
- 内容:主要有两个部分需要自适应调整:
算法2:训练算法
大致步骤如下:
-
初始化(Initialization):
- 设定模型参数 θ \theta θ 和所需的超参数。
- 需要的数据集 D = { x i , y i } i ∈ [ n ] \mathcal{D}=\left\{x_{i}, y_{i}\right\}_{i \in [n]} D={xi,yi}i∈[n]。
-
预热阶段(Warm-up Stage):
- 使用SCL或KCL对特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅) 进行初步训练 T 0 T_{0} T0 个epoch。
-
主训练循环(Main Training Loop):
- 从第 T 0 T_{0} T0 个epoch开始到第 T T T 个epoch。
- 在每个
K
K
K 个epoch 更新聚类分配和温度参数:
- 更新聚类分配:基于当前特征提取器 f θ ( x ) f_{\theta}(x) fθ(x) 的输出。
- 更新温度 τ 2 ( c ) \tau_{2}(c) τ2(c):按照公式5和公式6进行调整。
- 使用更新后的聚类分配和温度参数继续训练特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅),采用的是子类平衡对比学习的损失函数(文中的公式4)。
算法2操作步骤
-
要求:
- 输入的数据集 D \mathcal{D} D。
- 聚类分配更新间隔 K K K。
- 预热阶段的epoch数 T 0 T_{0} T0。
- 总的epoch数 T T T。
- 超参数 β \beta β 和 δ \delta δ。
-
确保:
- 训练好的特征提取器 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅)。
-
步骤:
- 初始化模型参数 θ \theta θ。
- 使用SCL/KCL训练 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅) T 0 T_{0} T0个epoch,进行预热。
- 从
t
=
T
0
t=T_{0}
t=T0 到
T
T
T 进行主要训练循环:
- 如果
t
%
K
=
=
0
t \% K == 0
t%K==0,进行聚类分配和温度更新:
- 更新聚类分配。
- 更新温度 τ 2 \tau_{2} τ2(每个主类)的参数。
- 使用子类平衡对比学习的损失函数(公式4)进一步训练 f θ ( ⋅ ) f_{\theta}(\cdot) fθ(⋅)。
- 如果
t
%
K
=
=
0
t \% K == 0
t%K==0,进行聚类分配和温度更新:
通过上述的算法步骤,确保特征提取器能够自适应地调整,以有效地进行子类间的对比学习,从而提升模型在不平衡数据集上的表现。