一。
得益于各种媒体的各种吹捧,Capsule 被冠以了各种神秘的色彩,诸如“抛弃了梯度下降”、“推倒深度学习重来”等字眼层出不穷,但也有人觉得 Capsule 不外乎是一个新的炒作概念。
本文试图揭开让人迷惘的云雾,领悟 Capsule 背后的原理和魅力,品尝这一顿 Capsule 盛宴。同时,笔者补做了一个自己设计的实验,这个实验能比原论文的实验更有力说明 Capsule 的确产生效果了。
菜谱一览:
Capsule 是什么?
Capsule 为什么要这样做?
Capsule 真的好吗?
我觉得 Capsule 怎样?
若干小菜
前言
Capsule 的论文已经放出几个月了,网上已经有很多大佬进行解读,也有大佬开源实现了 CapsuleNet,这些内容都加速了我对 Capsule 的理解。然而,我觉得美中不足的是,网上多数的解读,都只是在论文的翻译上粉饰了一点文字,并没有对 Capsule 的原理进行解读。
比如“动态路由”那部分,基本上就是照搬论文的算法,然后说一下迭代3次就收敛了。但收敛出什么来?论文没有说,解读也没有说,这显然是不能让人满意的。也难怪知乎上有读者评论说:
所谓的 Capsule 为 DL 又贡献了一个花里胡哨的 trick 概念。说它是 trick,因为 Hinton 没有说为什么 routing 算法为什么需要那么几步,循环套着循环,有什么理论依据吗?还是就是凑出来的?
这个评论虽然过激,然而也是很中肯的:凭啥 Hinton 摆出来一套算法又不解释,我们就要稀里糊涂的跟着玩?
Capsule 盛宴
宴会特色
这次 Capsule 盛宴的特色是“vector in vector out”,取代了以往的“scaler in scaler out”,也就是神经元的输入输出都变成了向量,从而算是对神经网络理论的一次革命。
然而真的是这样子吗?难道我们以往就没有做过“vector in vector out”的任务了吗?
有,而且多的是!NLP 中,一个词向量序列的输入,不就可以看成“vector in”了吗?这个词向量序列经过 RNN/CNN/Attention 的编码,输出一个新序列,不就是“vector out”了吗?
在目前的深度学习中,从来不缺乏“vector in vector out”的案例,因此显然这不能算是 Capsule 的革命。
Capsule 的革命在于:它提出了一种新的“vector in vector out”的传递方案,并且这种方案在很大程度上是可解释的。
如果问深度学习(神经网络)为什么有效,我一般会这样回答:神经网络通过层层叠加完成了对输入的层层抽象,这个过程某种程度上模拟了人的层次分类做法,从而完成对最终目标的输出,并且具有比较好的泛化能力。
的确,神经网络应该是这样做的,然而它并不能告诉我们它确确实实是这样做的,这就是神经网络的难解释性,也就是很多人会将深度学习视为黑箱的原因之一。
让我们来看 Hinton 是怎么来通过 Capsule 突破这一点的。
大盆菜
如果要用一道菜来比喻 Capsule,我想到了“大盆菜”:
盆菜作为客家菜的菜式出现由来以久,一般也称为大盘菜,大盘菜源于客家人传统的“发财大盘菜”,顾名思义就是用一个大大的盘子,将食物都放到里面,融汇出一种特有滋味。丰富的材料一层层叠进大盘之中,最易吸收肴汁的材料通常放在下面。吃的时候每桌一盘,一层一层吃下去,汁液交融,味道馥郁而香浓,令人大有渐入佳景之快。
Capsule 就是针对着这个“层层递进”的目标来设计的,但坦白说,Capsule 论文的文笔真的不敢恭维,因此本文尽量不与论文中的符号相同,以免读者再次云里雾里。让我们来看个图。
如图所示,底层的胶囊和高层的胶囊构成一些连接关系。等等,什么是“胶囊”?其实,只要把一个向量当作一个整体来看,它就是一个“胶囊”,是的,你没看错,你可以这样理解:神经元就是标量,胶囊就是向量,就这么粗暴。
Hinton 的理解是:每一个胶囊表示一个属性,而胶囊的向量则表示这个属性的“标架”。
也就是说,我们以前只是用一个标量表示有没有这个特征(比如有没有羽毛),现在我们用一个向量来表示,不仅仅表示有没有,还表示“有什么样的”(比如有什么颜色、什么纹理的羽毛),如果这样理解,就是说在对单个特征的表达上更丰富了。
说到这里,我感觉有点像 NLP 中的词向量,以前我们只是用 one hot 来表示一个词,也就是表示有没有这个词而已。现在我们用词向量来表示一个词,显然词向量表达的特征更丰富,不仅可以表示有没有,还可以表示哪些词有相近含义。词向量就是NLP中的“胶囊”?这个类比可能有点牵强,但我觉得意思已经对了。
阅读原文