孪生神经网络_探索孪生神经网络:请停止你的梯度传递!

关于写东西,因年中比较大变动,荒废了。人一懒下来就没个头,想着不能一直这样下去,决定从简单做起,真正阻拦写东西的是,每次一想到写完之后,排版润色一下几个小时就出去了,头疼。

那就先从写开始,慢慢先习惯写点东西,就像康复训练,也不管有没有人读。于是乎,也写了有一俩月了。

最近和朋友聊到,写东西不要追求量,要追求质,一个爆款就能吸很多粉,虽然自己很佛系,但想想也是这么个道理。

于是,开始改变风格,慢慢写。

...数日后...

于是就忙到像这次,中间空一天,周末再出去滑个雪,就好几天过去。

前段时间,都在读 EMNLP 一些论文,虽然也有很多不错论文,但都没有一篇能比上这篇 CV 领域论文带给我的喜悦。

6d81f8d80638a3118f853a0ef845fb1b.png

这篇论文最开始吸引我的点,当然就是作者栏,正是恺明大神(膜拜),而一作陈鑫磊, CMU 毕业的博士大佬。此外,这是篇来自 FAIR (Facebook AI 研究院)的论文,而 FAIR 论文,总给我一种朴实无华但又干货满满的感觉。

首先这篇论文,标题说研究孪生网络,但其实和最近很火的对比学习(Contrastive Learning)息息相关。因此比较的方法模型也都是对比学习中的前辈们,比如顶顶大名的出自 Hinton 的 SimCLR,还有非常神奇如同自己给自己提起来的 BYOL 模型,然后就是前段时间同样出自 FAIR 的 SwAV.

读这篇论文,也可以同时参考上面提到的三个模型,都是非常有意思的论文,尤其 BYOL.

[SimCLR] A Simple Framework for Contrastive Learning of Visual Representations: https://arxiv.org/abs/2002.05709v1

[BYOL] Bootstrap Your Own Latent: A New Approach to Self-Supervised Learning: http://arxiv.org/abs/2006.07733

[SwAV] Unsupervised Learning of Visual Features by Contrasting Cluster Assignments: http://arxiv.org/abs/2006.09882

这些论文总体来说都是在解决一个问题,怎么用孪生网络来进行自监督对比学习,保证训练不会出现崩塌(collapsing)情况下,获得比较好的表示。所谓崩塌,也就是模型为了偷懒,无论什么图片都会输出同样表示,这样结果 loss 很小,然后却没学到任何东西。

怎么做?停止梯度就好了,So Easy!

这篇论文提出的模型叫做 SimSiam(Simple Siamese)网络,事实上正如其名,真的蛮 Simple 的。

模型整体架构很简单,如下图

afa3e242f67ef6620e7db97deaaa004e.png

几句话也就能解释完,

  1. 首先一张图片 x,如一般对比学习的套路,用图片增强的算法获得两张增强过后的图 x1x2
  2. 接着,朴实无华地直接将两张图片输入编码器 f,如孪生网络一般设置,两个编码器共享参数,拿到两个表示 z1z2
  3. 之后将 z1 过一个 预测 (prediction) 头,就是个双层的 MLP 网络,拿到 p1
  4. 最后用这个表示 p1 和之前获得的 z2 计算一个余弦相似度(Cosine Similarity)
  5. 优化时,最大化该相似度就行,等同于最小化负余弦相似度
c48f5dbf902d4eac075ab384d98fcd00.png
  1. 于是我们就完成一半了,将上面的损失作为 L1
  2. 接着从第 3 步,将 z1 换成 z2 过预测头,同样过程获得 p2,接着如第 4 步 p2z1 计算余弦相似度,获得损失 L2。就是个对称过程
  3. 最后,总损失为 

即论文中的

ab5e31dbf6702b837a50ff051b9effba.png

到目前为止还只是个前向过程,还不是最关键的点,最关键点是在反向过程。该篇论文中最关键的 idea:对右端的模型停止梯度传播(Stop-Gradient)

就如结构图里表示的一样,而反应在公式则会成为

43759161d9f9500f216f3590dc8f26ba.png

这就是 SimSiam 的大致结构和整个过程了。

非常简单明了是吧。

模型细节:平凡产生不平凡

关于一些实现细节。

编码器 f 是由一个 backbone(主干) 网络加一个 Projection(投影) MLP 头组成,而 backbone 由 ResNet-50 来担当。而 MLP 头则是三层 MLP,每层都有 BN (Batch Normalization),前两层有 ReLU,输出层没 ReLU.

最后还有将特征 z 转换成 p 的 预测 MLP 头,有两层,中间隐层维度小些,第一层有 BN 和 ReLU,输出层没有 BN.

之后实验有对 MLP 层为什么如此设置做对比实验,可以暂且按下好奇心。

So—,Why it works?

至此,基本结构以及细节就介绍完了,看上去平平无奇。它既没用到 SimCLR 的负样本对,也没 SwAV 的聚类算法,也没 BYOL 的 momentum encoder。只是在孪生网络的一边不传递梯度。

但事实上,它又是很 work 的。

不光让训练变得稳定了,而且和其他方法也能有得一比,同时对各种参数的要求也更少。

73e61e0f908497d9f26e15481e2390d6.png

看到只有 BYOL 比它好很多,从之后的实验看,可以认为 BYOL 是它的一个改进版本。

首先说模型的原理,以及从中推导出的 Stop-Gradient 为什么是 work 的

先考虑如下形式的损失函数

739ccbdcda806a4d28229522dcc11990.png

这里  是参数为  的神经网络,可以理解为上面讲的编码器模型,而 T 则是一个图片增强操作。至于  则是图片 x 的表示,不一定需要是神经网络输出。所以上式中,MSE 的两个部分,前面可理解为之前孪生网络的左边,而后面的  可理解为模型右边。

式中的两个参数就是  和 ,而优化损失函数的过程就是优化这俩参数。

ac2be4307f4fd726b31f122937edfe96.png

于是可以将这个优化过程类比成 k-means 聚类一样的优化过程,利用的是类似 EM (Expectation-Maximization) 的优化过程。

给优化看出两个阶段,E 阶段和 M 阶段,而简单说就是将整体优化分成

  • 先优化 
4dbb9e33141a48276c8c9ebef74e55cc.png
  • 再优化 
a7666022bafacad50face4a3eff6cb3f.png

对前一步,因为  是神经网络模型的参数,所以自然直接用梯度下降就能优化。而对于后一步,因为是损失函数是 MSE,所以也好解,直接求导最小值

85841d71c89c4d3ceac24bd80a82a9ff.png

所以  的最优值是图片 x 增强之后,再过模型获得表示的一个平均表示

但因为这个平均表示并不好拿到,所以这里是直接用单步的结果来进行估算,其实也就是上面模型介绍里面的过程,对图片增强一次,直接过模型拿到表示

43e59eea5e3a491a54f2e2428f2cc7cd.png

这样就大致获得了 SimSiam 的形式。而此时再理解模型右端为啥要用 Stop-gradient 就自然而然了,因为在是优化过程中,它并不需要反向传播的信息,优化  的时候  是被看成是常数的

当然还有一些地方没有进行解释,比如预测头。

下面就来分析一下,预测头,以及其他一些因素,比如对称的影响。

分析实验:预测头?批大小?BN?相似函数?对称?

预测头

关于预测头的分析是模型中各部分分析最有意思的地方了。其实在对比学习中,很多模型都发现额外加一个简单的 MLP 头能对性能提升很大。

这里怎么解释预测头为什么 work 呢?

首先,先对模型做经验实验,分别用没有预测头的,和有预测头但固定随机初始化参数的,和原有进行对比。

c796ed2b0e68ec58a623dfa2ac097912.png

结果发现,仅仅只是少了个 MLP 预测头,结果就天差地别,根本就不能收敛。

于是重新回顾上一小节的推导过程,到底是什么地方出错了呢,扫过来,发现只有一个地方是有明显问题的,按照推导  理当是

17bee425c6d2fbb69c05ab9ce046bb12.png

但为了方便计算我们是直接用了

8a0d3471e140b1555dcf242f25803739.png

来估算的。所以只可能是这个地方出的问题,用单张图片的结果来估算整体平均导致的训练不稳定。因此可以提出如下假说

假说:预测头主要是学习一个函数,而这个函数可以大致理解为是一个从单次增强 x 的表示预测整体期望的函数。

真的是这样吗,作者们又做了如下实验来侧面验证,也就是用滑动平均来估算  期望

96f048f1a6d22f2eba94e71907b22546.png

发现用上式,即使没有预测头也能获得 55% 的准确率,而如果没用滑动平均也没用预测头的时候就完全训练不起来。所以可以认为,预测头一定程度上是有承担这个计算期望的过程

批大小

通过经验实验,作者们发现当前方法对批大小不怎么挑,不像之前一些方法会要求用大的批大小。

775362588b3ac989738e607765ed887a.png

而且对优化器也没有特殊要求,比如要用 LARS 这样,这里直接用最 vanilla 的 SGD 就行,当然也发现 SGD 用大 batch 会表现有些不好。

Batch Normalization

相比在看模型架构的时候,有心的童鞋,也会和我看的时候一样,比较疑惑为什么两个 MLP 头里面 BN 和激活要这样设置。

于是作者也贴心的做了对比实验

6844d13fbda2762b9478ac3b24407609.png

如表,发现就默认设置是最好的,至于为什么,经验实验嘛。

相似函数

对比学习中计算损失函数的时候因为要使用相似函数,所以这一块也可以稍微探索一下,比如说不用余弦相似,而用如 SwAV 一样的交叉熵相似。

21f982c86e6f9cc0426ce893ba636ef8.png

结果发现也能行,但是效果并没余弦相似好

ed47325ba64b970438640ac0cc3a6516.png

当然这也说明 Stop-gradient 策略和计算损失的相似函数没有什么关系

对称

SimSiam 中计算损失的时候有一个对称过程,那这个对称是不是必要的呢。根据之前的分析推导,其实并没有说到对称嘛。

通过实验发现

4af07a1b08498dbd2ff926b83f4cf5e6.png

对称确实不是必要的,不对称并不是不能训练,只是性能低了些。

作者的解释是,对称过程其实就像是一个密集采样,可以让估算期望的时候更精确。而上表中最右边的实验就是不用对称形式,而是不对称形式进行两次采样,然后平均计算损失,性能只是差了些。

模型对比:胡乱的亲属关系

和之前对比学习模型的比较,其实看下图就行了

6015d79cd14b7646071c85971d43531d.png

和 SimCLR 的不同主要就在于

  • 首先当然是有 Stop-gradient
  • 其次没有负例对,也就是不计算 dissimilarity

和 SwAV 的不同主要在于

  • SwAV 在右端是用的 Sinkhorn-Knopp (SK) 变换便于聚类运算,而这里用的 stop-gradient

而和 BYOL 的不同感觉其实最小

  • BYOL 默认就是 stop-gradient,而右端的 encoder 用的是左边的滑动平均,其实也能理解为计算了一个更平滑的 

2a1f6458917ff795987d5cfee983acf8.gif

d50ee03b3e8b41b3a696729a430a77c6.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值