前几天看了一篇公众号的文章,,也是关于自学习,无监督方面的,闪光点非常明确,就是在对比学习选取负样本时避免选择同类样本,很有启发价值,就写了这篇读书笔记。
- 论文地址: https://arxiv.org/abs/2202.00455
- 项目地址: https://github.com/gyfastas/HCSC
提出问题
该文认为类别的预计是有层级的,如ImageNet的类别是基于WordNet层级形成的,如拉布拉多犬 -> 犬类 -> 哺乳动物的层级关系。
目前地位显赫的自监督预训练模型:NPID, SimCLR, MoCo, 都基于对比学习实现,在表征空间中最大化正样本对的相似度,最小化负样本对的相似度,达到同类相吸,异类相斥的目的。训练时,将同一图像经过不同推及数据增强后作为正样本对,将不同图像作为负样本对。这种训练框架存在2个问题:
- 缺乏对层级层级语义结构的建模
- 随机选择的两张图像可能属于相同类别,这样定义负样本对将引入噪声
解决办法
构建层级语义
本文想通过对图像特征聚类的方式获得潜在语义类别,聚类中心被认为是代表某种语义的原型(prototypes)向量,对这些原型再进行聚类得到的新的聚类中心代表更高层级的潜在语义类别,这些语义信息可以指导负样本的选择,避免负样本和query来自同一语义。在每一epoch前,使用下列算法构建层级原型。先对样本特征做一波聚类,类簇中心为第1层级(树型层级的叶子节点)的原型,再对这些原型聚类,得到第2层级的原型,并记录该类簇的每个样本的Parent为2层原型,知道L层(预设)构建完成。
使用层级语义对比学习
样本间(实例间)的对比学习
对于query样本 z, 它所属于的类簇中心就是与它最相近的原型。
c
l
(
z
)
=
arg max
c
∈
{
c
i
l
}
i
M
l
s
(
z
,
c
)
c^l(z)=\argmax_{c\in \{c^l_i\}^{M_l}_i}s(z, c)
cl(z)=c∈{cil}iMlargmaxs(z,c)
其他样本
z
j
z_j
zj被选为负样本的概率定义为
p
s
e
l
e
c
t
l
(
z
j
;
z
)
=
1
−
e
x
p
[
s
(
z
j
,
c
l
(
z
)
]
∑
i
=
1
M
l
e
x
p
[
s
(
z
j
,
c
i
l
)
]
p^l_{select}(z_j;z)=1-\frac{exp[s(z_j, c^l(z)]}{\sum^{M_l}_{i=1}exp[s(z_j, c^l_i)]}
pselectl(zj;z)=1−∑i=1Mlexp[s(zj,cil)]exp[s(zj,cl(z)]
这里的s为余弦相似度,
c
i
l
c_i^l
cil是l层级的原型向量,该层级工
M
l
M_l
Ml个向量,
c
l
(
z
)
c^l(z)
cl(z)是query样本z所属类簇的原型,想表达的是,样本zj被选为z的负样本的概率是zj属于z所属类簇以外其他类簇的概率。每一层实例对比学习的loss采用InfoNEC损失,正样本为z的增强图像,负样本按以上概率选取z所属类簇之外的样本,总的实例对比学习损失
L
I
C
S
C
L_{ICSC}
LICSC是各层loss的平均
原型间的对比学习
负样本来自其他类簇,但仍然可能来自相近的类簇,如萨摩耶的负样本选择了拉布拉多也不是一个好的选择。该文希望描述某原型属于目标原型父类簇以外的概率,如属于萨摩耶类簇的负样本尽量从犬类以外的类簇中选取。
p
s
e
l
e
c
t
l
(
c
j
;
c
l
(
z
)
)
=
1
−
e
x
p
[
s
(
c
j
,
P
a
r
e
n
t
(
c
l
(
z
)
)
]
∑
i
=
1
M
l
e
x
p
[
s
(
c
j
,
c
i
l
+
1
)
]
p^l_{select}(c_j; c^l(z))=1-\frac{exp[s(c_j, Parent(c^l(z))]}{\sum^{M_l}_{i=1}exp[s(c_j, c^{l+1}_i)]}
pselectl(cj;cl(z))=1−∑i=1Mlexp[s(cj,cil+1)]exp[s(cj,Parent(cl(z))]
原型对比学习的loss也采用InfoNEC的计算方式,对于l层,z的正样本为z所属l层类簇的原型,负样本按以上概率选择自该类簇以外的样本。多层的损失再平均为
L
P
C
S
C
L_{PCSC}
LPCSC.总损失是实例对比损失和原型对比损失之和。
实验结果
看样子,在小batchsize时优势比较明显,当其他算法的batchsize增大以后,该文所说的选择到同类图像做负样本的问题就会被减轻,因此该方法的精度没有太多优势,但是在训练资源有限的情况下,可以使用小batchsize这也是一个相当大的优势。都使用multi-crop augmentation时,该方法优势也不明显。
再看下游任务,总得来说,精度比MoCo v2高,和AdCo相当。
对我的帮助
- 考虑到每epoch前要做一次聚类,猜测时间不会短,这就让人不想用了,如果有人用过觉得时间可以接受可以说一下
- 证实了负样本噪声的影响,实际做自学习的任务时应当多注意负样本的噪声
- 聚类精度有限,相比于增大batch size和multi-crop augmentation,通过聚类精心选取的层级结构优势并不明显
- 看完实验对比,反倒更想用MoCo, SwAV, AdCo