查看原文
其他

【强基固本】记MoCo中一个关于CrossEntropyLoss的计算问题



“强基固本,行稳致远”,科学研究离不开理论基础,人工智能学科更是需要数学、物理、神经科学等基础学科提供有力支撑,为了紧扣时代脉搏,我们推出“强基固本”专栏,讲解AI领域的基础知识,为你的科研学习提供助力,夯实理论基础,提升原始创新能力,敬请关注。

来源:知乎—葱鸭Fighting
地址:https://zhuanlan.zhihu.com/p/490742250

编辑:人工智能前沿讲习

昨晚在看对比学习算法 MoCo[1] 的源代码时,中间有一个涉及Pytorch中CrossEntropyLoss的计算问题困扰了我较长时间,因此记录下来加深一下印象:
问题描述:
MoCo 中 contrastive loss 的组成是由query正样本对相似度(代码图中的 l_pos),以及query与一系列queue中的负样本相似度(代码图中的 l_neg)共同构成的:
MoCo contrastive loss
在经过拼接后,logits 为一个N*(1+K) 的矩阵,矩阵的第一列为正样本对间的相似度,而其他剩余K列为正负样本对之间的相似度,因此我会直观地认为,在对应到标签计算CrossEntropyLoss时,第一列的标签应该为1,而其余K列的标签都为0。但在算法实现的时候,可以明显地看到此处的labels为一个值全为0的张量,这是为什么?这个labels张量不应该是第一个元素为1,其他元素都为0吗?
MoCo 部分源码
我在反复品读GitHub issue中其他人关于这个问题的解答(链接如下),以及pytorch文档中CrossEntropyLoss的计算方法后,总算意识到自己之前理解的错误所在:labels中的0元素并不是指代正负样本对,而是告诉CrossEntropyLoss输入第一维的标签为1(ground truth),也就是第0维指代的是正样本对。
https://github.com/facebookresearch/moco/issues/24#issuecomment-625508418
举例说明
上面这句话理解起来可能仍然有点抽象,因此举个简单例子说明一下:
  • logits矩阵:
logits = [[0.5, 0.2, 0.2, 0.1]
[0.6, 0.1, 0.1, 0.2]]
矩阵的行表示不同的数据样本;第一列是正样本对间的相似度,其他列表示正样本与负样本之间的相似度。
  • labels 张量:
labels = [0, 0]
注意这里labels的长度,是与logits的第一维也就是样本数量是一致的。labels中的元素实际上意味着在进行CrossEntropyLoss计算时,标签为1的ground truth的索引是多少,以logits中第一个样本为例的话,此时0号元素为ground truth,即数值0.5对应的标签值为1,其他数值对应的标签值为0,在进行CrossEntropyLoss计算时,会由 logits [0.5, 0.2, 0.2, 0.1] 与 label [1, 0, 0, 0] 来计算loss的数值。
之前会有错误理解的原因在于对Pytorch中CrossEntropyLoss的计算方法理解还不够深,在弄明白它的计算方法后自然就不会产生这样的疑问啦。
[1] He, K., Fan, H., Wu, Y., Xie, S., & Girshick, R. (2020). Momentum contrast for unsupervised visual representation learning. InProceedings of the IEEE/CVF conference on computer vision and pattern recognition(pp. 9729-9738).

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。

“强基固本”历史文章


更多强基固本专栏文章,

请点击文章底部“阅读原文”查看



分享、点赞、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存