可能是因为logK诅咒,其中K是batch size。softmax后的交叉熵损失函数可以写成:
其中, 是正样本的分数, 是负样本的分数。
因为对比学习的正负样本差别是挺大的, 的分数很快就会趋近于0,此时损失函数的数值将趋近于 ,其中 可以简单理解为所有负样本 分数的平均值。当batch size比较小的时候,可以理解为 的值也会比较小,接近于0,这个时候浮点误差就会对计算结果造成比较大的影响,最后使得梯度变成随机噪音,使得模型无法进一步收敛。
以上分析来自于下面这篇FlatNCE的论文,详细地分析可以自己看下。
所以避免这个问题,最简单的解法就是使用比较大的batch size。或者改造一下损失函数,这也是FlatNCE的目的和贡献。
supervised training的batch size不能简单地从字面上理解,最后一层fc的weight可以理解为每一类的template,它们代表了大量的负样本。
而contrastive learning的样本都是要过一整个网络的,负样本多少直接取决于batch size大小。
TL,DR:Batch越大,负例越多,可以缓解表示坍塌。补充 @Gordon Lee
资料来源于:
我的理解是这样的,不对的地方请指正:
对比学习一般是自监督学习的方式,相比于supervised方法,它的监督信号是自己构造的,也就是自己和自己的augmentation被认为是正例,负例是in batch的其他样本。
1.相比supervised使用来自数据集的监督信号,对比学习用自监督的方式需要更多的训练steps来收敛。
2.对比学习的一般做法就是拉齐正样本,排开负样本,实际上正样本很好拉齐,你可以用mse,或者cross entropy都可以。关键在于,怎么保证拉齐的同时,保持一个好的uniform。这时候负样本的采样就成了关键。之所以要更大的batch size,就是因为in batch的其他样本作为负样本,充当了防止表征崩塌的角色,batch size越大,用于对比的负样本越多,效果就越好。
3.也可以想象一个极端的场景。对比学习最终理想状态是,数据集里的每个样本都和它自己的augmentation接近,和其他所有样本都远离。要实现和其他所有样本都远离的话,那么batch size就要等于数据集的大小。但实际情况并不能做到这点,那只有尽量越大越好了。
女王:求求题主放过我,我可不敢有什么政绩。。。