社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

【深度学习】SimSiam:孪生网络表征学习的顶级理论解释

机器学习初学者 • 2 年前 • 144 次点击  
关注"Smarter",加"星标"置顶

及时获取最优质的CV内容

之前太菜了,SimSiam最精彩的理论解释没完全看懂,元旦重新读了一遍,太牛逼了,我原本以为SimSiam就是BYOL的一个简化版本,实则是孪生网络表征学习的顶级理论解释,剖析出带stop-gradient孪生网络表征学习的本质是EM算法


为了讲清楚SimSiam和EM算法以及k-means算法有什么内在联系,本文先简单阐述一下EM算法和k-means算法的思想,然后从EM算法出发推导出SimSiam的优化目标,并且通过推导结果解释predictor和momentum encoder(EMA)的作用。

EM

EM算法的全称是Expectation-Maximization,是机器学习中最为经典的算法之一。EM算法可以认为是一种算法思想,其实很多机器学习算法中都用到了EM思想,比如非常经典的k-means聚类算法,等下也会讲到k-means是如何应用EM的。

EM算法可以认为是极大似然估计的拓展,极大似然估计只估计一个变量,而EM算法需要同时估计两个变量。学过概率统计的都知道,直接估计两个变量是很困难的问题,所以EM算法实际上是为了解决多个变量估计困难提出来的算法思想,通过一个迭代的方式,先固定其中一个变量,估计另一个变量,然后交替迭代更新,循环往复直至收敛。一个迭代有两个步骤(分别估计两个变量),先E步,然后M步(M步其实就是极大似然估计)。


有关EM算法的详细解释可以看文章链接:

https://zhuanlan.zhihu.com/p/36331115

k-means

一个最直观了解 EM 算法思路的是 k-means 算法(一个变量是如何得到聚类中心,另一个变量是如何划分数据)。在 k-means 聚类时,每个聚类簇的中心是隐含数据。我们会假设 K 个初始化中心(初始化中心随机得到,后续迭代中心通过聚类平均进行更新),即 EM 算法的 E 步;然后计算得到每个样本最近的中心,并把样本聚类到最近的这个中心,即 EM 算法的 M 步。重复这个 E 步和 M 步,直到中心不再变化为止,这样就完成了 k-means 聚类。

SimSiam

图片来源:https://zhuanlan.zhihu.com/p/367290573

SimSiam也可以用EM算法解释。SimSiam实际上隐式的包含了两个变量,并且同时解决了两个潜在的子问题。实际上stop-gradient操作引入了其中一个变量。

我们可以把SimSiam的损失函数定义成以下形式(这里先不考虑SimSiam的predictor):


  


其中  表示前面的数据增强函数,  表示Encoder加Projector的网络函数。期望E是关于图像x和数据增强  的分布(也就是所有图片和数据增强的损失期望之和)。为了方便分析,用L2余弦相似度的等价形式MSE来表示相似度。  表示图片x的表征(也就是上图下面分支的输出)。那么优化目标就可以定义成:


  


这个优化目标的形式就类似于EM和k-means算法。其中变量  和聚类中心类似,是encoder和projector的可学习参数;变量  和采样点x的分配向量类似,是图片x的表征。那么SimSiam可以和k-means算法一样,通过一个EM迭代算法来解决,固定住一个变量,估计另一个变量。形式上可以写成以下两个子问题:


  


其中t表示迭代轮次,  表示赋值。

可以通过SGD来求解  ,从这个求解式子可知,stop-gradient是必须的操作,试想一下,如果没有stop-gradient,那么  就不是一个常数,也就是第一个子问题有两个变量,无法求解。

求解完  之后,第二个子问题就只剩下一个变量  。将  代入损失函数中,第二个子问题就变成了:


  


通过期望公式可得:


  


这个式子表示第t个迭代轮次的图片x表征由该图片所有数据增强期望计算得到。


One-step alternation

上述两个子问题的一次step可以近似为SimSiam。


1. 首先,可以用一次采样的数据增强  来对第二个子问题进行近似(一次数据增强的期望等于本身):


  


然后把上式代入第一个子问题中:


  


其中  是子问题中的一个常数,  和  表示两个不同的数据增强,于是上式就变成了一个孪生网络结构。


2. 如果上式用一个SGD来降低loss,那么就可以得到接近SimSiam的算法(这里没有考虑SimSiam的predictor,等下解释predictor的作用):一个使用stop-gradient的孪生网络。


Multi-step alternation

如果把上面一次step拓展到多次step,就可以得到多次step的SimSiam。

多次step的SimSiam可以设计成将t作为迭代的外循环次数,第一个子问题设计成一次迭代k个step SGD(k个step SGD的所有  表征预先计算缓存到内存中)。

上述实验中n-step表示SimSiam一次迭代的step数,1-epoch表示一个epoch中一次迭代总的step数。可以发现,适当的增加SimSiam的一次迭代的step数,可以提升精度(可以认为在一次迭代中变相的增加数据量,从k-means的角度考虑聚类效果会更好)。


Predictor

上述推导为了简便起见,省略了predictor h,如果增加一个predictor h,第二个子问题就变成了:


  


通过期望公式可得:


   


前面的一次step近似推导可以省略掉期望E,但是由于predictor h的存在,可以不进行一次step近似,predictor h可以弥补  和期望E的gap。实际上,直接计算出数据增强  的期望E是不现实的,但是可能直接通过predictor h来预测出期望E(因为多个epoch中数据增强  的采样是一个隐式分布,可以通过学习的方式记住)。


Symmetrization

上述推导没有考虑对称计算loss的情况,实际上,对称loss相当于一次SGD密集采样数据增强  ,也就是优化效率高一倍。

上述实验验证了这个结论,对称loss优化效率大大提高,非对称loss即使使用两倍训练时间,效果也不如单倍对称loss,猜测因为对称loss下数据量更多,从k-means的角度考虑聚类效果会更好。


EMA

SimSiam进一步发现predictor h用来预测期望E不是必须的,还有其他的替代方案。SimSiam又做了一个对比实验,去掉predictor h的SimSiam其实就是上面推导的一次step近似,使用momentum encoder(EMA)来得到  ,EMA相当于提供了更多数据增强  的views的近似期望E,在没有predictor h的时取得55.0%的精度;但是如果同时没有EMA和predictor,精度迅速掉到0.1%。这两个实验侧面证实了EMA和predictor都能起到预测期望E的作用。


并且EMA和predictor的实验同时说明了SimSiam和BYOL没有负样本对也能work的原因,因为SimSiam虽然没有EMA但是有predictor,BYOL既有predictor也有EMA。

总结

SimSiam的理论解释意味着所有带stop-gradient的孪生网络表征学习都可以用EM算法解释。stop-gradient起到至关重要的作用,并且需要一个预测期望E的方法进行辅助使用。但是SimSiam仍然无法解释模型坍塌现象,SimSiam以及它的变体不坍塌现象仍然是一个经验性的观察,模型坍塌仍然需要后续的工作进一步讨论。

看懂了SimSiam对孪生网络表征学习的解释,再看其他应用孪生网络的算法就清爽了许多,SimSiam值一个best paper(虽然只拿了2021 CVPR Best Paper Honorable Mention)。


Reference

[1] Exploring Simple Siamese Representation Learning

[2] https://zhuanlan.zhihu.com/p/36331115

[3] https://zhuanlan.zhihu.com/p/367290573





    
往期精彩回顾




站qq群955171419,加入 微信群请扫码:
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/125352
 
144 次点击