深度学习课程笔记(十一)初探 Capsule Network
深度学习课程笔记(十一)初探 Capsule Network
2018-02-01 15:58:52
一、先列出几个不错的 reference:
3. 原始文章:Dynamic Routing Between Capsules Link:https://arxiv.org/pdf/1710.09829.pdf
4. 李宏毅老师的 YouTube 视频教程:https://www.youtube.com/watch?v=UhGWH3hb3Hk
5. Code Pytorch 实现:https://github.com/timomernick/pytorch-capsule
5.1 其他版本:https://mp.weixin.qq.com/s/FZQ3KgW8ZdC4NbramgeNuw
5.2 Hinton胶囊网络代码正式开源,5天GitHub fork超1.4万
6. Jonathan Hui blog :
6.1 、“Understanding Dynamic Routing between Capsules (Capsule Networks)”
6.2、“Understanding Matrix capsules with EM Routing (Based on Hinton's Capsule Networks)”
7. Video Tutorials:
7.1、Capsule networks: overview
7.2、
二、初探 Capsule Networks(胶囊网络):
Hinton 最近提出一种新的神经网络结构,称为“胶囊网络”,作为深度学习的大牛,其影响力可想而知。有可能引起新一波的 follow 和 各种 interesting 的应用。
首先,我们先回顾下传统的 CNNs 有什么缺点:
CNNs 有多吊就不用说了吧,各种 amazing 的事情都可以做,而这些事情是远远超乎人类想象的。但是,它还是有根本性的缺点:

我们可以看到,对于 CNNs 来说,当图像中出现,眼睛,鼻子,嘴巴等部件时,CNNs 会认为这是一张 face,不管这些部件出现在什么位置,都是这样子。CNNs 是怎么工作的呢?我们知道,卷积层是 CNN 的重要组成部分,它会尽可能的去检测出重要的模式,然后逐渐的形成 high level 的 feature,然后将这些 feature 继续编辑成更加 high level 的 feature。然后用 fc layer 输出最终的分类结果。
一个重要的信息是:高层的 feature 是在底层特征基础上 加权求和得到的:activations of a precedings layers are multiplied by the following layer neuron's weights and added, before being passed to acitivation nonlinearity. 在这个过程中,无处不在的是 pose realtionship (translational and rotational),并将底层特征,构建成更加高低的高层特征。CNN 的方法来解决这个问题的方式,是利用 max pooling 或者 连续的卷积层,来降低数据的尺寸,所以增加了高层神经元的“感受野”,所以,允许他们可以在输入图像上的更大的区域内检测到更高层的feature。Max pooling 是使得 CNN 能够工作的非常好的重要原因。但是也别被其良好的结果所欺骗了:while CNNs work better than any model before them, max pooling nonetheless is losing valuable information.
就连老爷子自己都说, max pooling layer 能够如此的 work,这是个大问题:

当然了,你可以继续使用 max pooling,他依然可以得到很好的结果。但是,他依然不能够解决关键的问题(key problems):

在上面的例子当中,仅仅出现face 的各个部件,并不意味着,这张图就是一个 face 的图像,我们也需要知道这些部件之间是如何构建起来的。
Hardcoding 3D world into a neural net: Inverse Graphics Approach
计算机图形学尝试解决的问题是 从一些间隔的几何数据上来构建出一张 visual image。注意到,这样的表示,需要将物体的相对位置考虑进去。而存储在计算机内存中的 中间的表示(internal representation)是作为几何物体的数组,矩阵来表示相对位置以及这些物体的方向。然后,用特殊的软件将其凑成一个图像,这个过程称之为:rendering 。

受到这个idea的启发,Hinton argues that:大脑,也是这样子,做了和 rendering 相反的事情。他称之为:inverse graphics:from visual information received by eyes, they demonstrate a hierarchical representation of the world around us and try to match it with already learned patterns and relationships stored in the brain. 这就是 recognition 发生的过程。And the key idea is that representation of objects in the brain does not depend on view angle.
所以,现在问题变成了:我们如何将这些 hierarchical relationships 建模到 NN 当中呢? 答案来自于 计算机图形学,在 3D图形学当中,3D 物体之间的关系可以表达为所谓的 pose, 就是: translation + rotation。
Hiton 说,为了更好的进行分类和物体的识别,保留物体部件之间的关系是非常重要的。这就是为什么 胶囊理论 如此重要的原因了。他将物体之间的相对关系,表达成了 4D pose matrix。
当这些关系表示到数据的 internal representation 时,这就可以让 NN 理解到:他现在所看到的东西,就是之前看到的东西,只不过就是不同的角度而已。考虑下面的图像,你可以轻易地发现:
自由女神像:无论从那个角度,你都会发现,哦,这都是女神像。
这是因为,internal representation 在你的脑子中,不依赖于 the view angle。你可能从来没有看到过具体角度的图像,但是你可能立刻就知道,哦,这就是那个图。

而对于 CNN 来说,这个 task 看似很简单,但是他却很难理解。而对于 胶囊网络来说,却非常容易了,因为他们显示的进行建模。这个文章利用这种方法,将识别的错误率降低到了 45%,跟其他方法相比,这已经是一个巨大的提升了。
Capsule 的方法另一个好处就是: 能够仅仅利用 CNN 耗费的少量数据就可以达到顶尖的效果(见 Hinton 的 talk:https://www.youtube.com/watch?v=rTawFwUvnLE&feature=youtu.be)。在这个程度上来说, capsule network 更加接近人类大脑的识别方法。In order to learn to tell digits apart, the human brain needs to see only a couple of dozens of examples, hundreds at most. CNNs, on the other hand, need tens of thousands of examples to achieve very good performance, which seems like a brute force approach that is clearly inferior to what we do with our brains。
这个 idea 看起来很简单,但是为什么花费了那么长时间才搞出来呢???
Hinton 想这个idea将近 10年了。一直未能发表的原因是:之前没有那么好的计算力,能够使他work。另一个原因是:没有好的算法来执行这个事情,并且成功的学习一个 capsule network(直到 1980s 当 BP算法被提出来,并且成功应用于训练神经网络的时候)。
同样的道理, capsule 的想法本身并不是非常的新,Hinton之前也提到过,但是并没有好的算法出现,使其能够很好的 work。这个算法就称为:“dynamic routing between capsules”。这个算法允许 capsule 能够相互交流,并且创造出类似于 计算机图形学中 scene graphs 的表示方法。

小结:
Capsules introduce a new building block that can be used in deep learning to better model hierarchical relationships inside of internal knowledge representation of a neural network. Intuition behind them is very simple and elegant. Nonetheless, there are challenges. Current implementations are much slower than other modern deep learning models. Time will show if capsule networks can be trained quickly and efficiently. In addition, we need to see if they work well on more difficult data sets and in different domains. In any case, the capsule network is a very interesting and already working model which will definitely get more developed over time and contribute to further expansion of deep learning application domain.
三、深入理解 胶囊网络:
1. what is a Capsule ???

太长了,不想看,说人话,简而言之,就是:
神经元输出的是 a single scalar。另外, CNN 利用 卷积层,对于每一个 kernel 来说,然后复制同一个 kernel 的权重,然后输出一个 2D 的matrix,每一个值的输出是:那个卷积核与局部图像的点乘加和。我们可以将这个 2D matrix 看做是 复制的 feature detector 的输出。然后所有的卷积核的 2D 矩阵依次堆叠起来,来产生一个卷积层的输出。然后,我们利用 max pooling 来达到旋转不变性的目标。
但是上述的机制,并不是非常完美。因为在达到这个目标,而做 max pooling 的同时,我们丢失了非常重要的信息:物体之间的关联。我们应该用 capsule 来替换,因为他们将所有的重要信息,都编码到输出的 vector 当中,而不是传统 CNN 输出的单个 value。


2. How does a capsule work ???
我们首先来对比一下,这个 胶囊网络 和 传统神经元之间的差异:

我们知道,传统的 CNN 的计算方式如下:
- scalar weighting of input scalars
- sum of weighted input scalars
- scalar-to-scalar nonlinearity
而新提出的 capsule 则大致是一样的,但是稍有不同:


我们一步步的来看这四个步骤:
1. Matrix Multiplication of Input Vectors :
具体细节这里不在赘述,请看原文 。。。

2. Scalar weighting of input vectors:

3. 加权输入向量的求和:
并无特殊之处,就是向量的求和。
4. “Squash”:Novel Vector-to-Vector Nonlinearity :
这里引入的一个函数,是 CapsNet 重要的创新之一,即:将一个向量,“Squashes” 成长度不超过 1,但是不改变其方向。

公式的右侧(蓝色框):将输入向量进行归一化,使其包含具有 单元长度;
公式的左侧(红色框): 进行了额外的 scaling。
记住:输出向量的长度,可以表示为:一个给定特征被 capsule 检测到概率。

3. Conclusion:

四、李宏毅老师的教程:
1. 直观的来看待 capsule:
Neuron 的输出是一个 value,而 Capsule 的输出是一个 vector ;
一个神经元负责检测特定的模式(specific pattern),如:Neuron A 负责检测向左的鸟嘴,Neuron B 负责检测向右的鸟嘴。而 capsule 负责检测某一个种类的 pattern,输出 V 的长度代表某一 pattern 是否存在,再用其中的某一些细节来表示是哪一种类的 pattern。如:是否有鸟嘴,以及 该鸟嘴是向左的,还是向右的。


例如:该 capsule 输出的向量,长度都是 1,但是,1.0 用来表示向左的鸟嘴,-1.0 来表示向右的鸟嘴。
2. 更细节的来看待 capsule:

Capsule 的输入是向量 v1,v2,乘以需要利用 BP 算法来更新的权重 w1,w2,再乘以 C1,C2,相加得到 S,然后用一个 Squash 函数来将其进行缩放,当S的长度很长的时候,V 中第一项趋近于1,当S的长度很短的时候,V 中第一项趋近于0。需要注意的是:C1 和 C2 不是用 BP 算法求出来的,而是 testing的时候,动态决定的,这两个系数称为:coupling coefficients,这个决定C1,C2取值的过程,称为:dynamic routing。这里,类似于 pooling 操作,动态决定选择哪一个 Neuron 进行选择,这里也是 online 决定这个参数的。
3. 目标转向 Dynamic Routing:
我们假设有 三个输入,u1, u2, u3:
初始化三组动态的 coupling coefficients,b1, b2, b3 = 0;
然后定义,我们这里确定要跑几个 epoch,假设为 T次;
然后,将 b1, b2, b3 输入到 softmax 函数,这三个 value 的和 为 1,得到 c1, c2, c3;
然后将这三个 value 和输入向量,进行点乘,得到 S,
将 S 进行 squash,得到输出向量 a;
再用 a 更新 b;

迭代结束之后,我们得到这三个 value,分别乘以输入向量即可。

用图示的方法来表达这个过程:

有了得到的 a1, 我们可以用于更新 c1, c2;当 a1 和 哪一个 vector 比较像,就会使得对应的权重,得到增加;
然后,更新后的 c1, c2 再次和 u1, u2 进行相乘,得到新的 s2,然后再得到 a2,再更新 c1, c2;
依次迭代;

这个东西和 RNN 非常的类似,也是利用 BP 进行训练。
那么,在 mnist 手写体识别数据集上,我们利用,

capsule 可以替换掉 filter,以 mnist 手写体识别为例,我们可以用一个 capsule 来表示一类数字,那么,10个数字,就需要10个 capsule 来表达,假设输入的图像是 1,那么,对应 1 的 vector 置信度就要尽可能的高。作者在 paper 中也引入了 reconstruction loss,用这两个损失函数来学习 feature 以及 后续的分类。



讨论:
Invariance v.s. Equivariance

CNN 的 max-pooling 只能做到 invariance,而 capsule 可以做到 invariance 以及 Equivariance。


CapsNet architecture:
我们利用 capsule 结构来构建一个CapsNet 来分类 MNist 数据集。


深度学习课程笔记(十一)初探 Capsule Network的更多相关文章
- 深度学习课程笔记(十二) Matrix Capsule
深度学习课程笔记(十二) Matrix Capsule with EM Routing 2018-02-02 21:21:09 Paper: https://openreview.net/pdf ...
- 深度学习课程笔记(十六)Recursive Neural Network
深度学习课程笔记(十六)Recursive Neural Network 2018-08-07 22:47:14 This video tutorial is adopted from: Youtu ...
- 深度学习课程笔记(十五)Recurrent Neural Network
深度学习课程笔记(十五)Recurrent Neural Network 2018-08-07 18:55:12 This video tutorial can be found from: Yout ...
- 深度学习课程笔记(十八)Deep Reinforcement Learning - Part 1 (17/11/27) Lectured by Yun-Nung Chen @ NTU CSIE
深度学习课程笔记(十八)Deep Reinforcement Learning - Part 1 (17/11/27) Lectured by Yun-Nung Chen @ NTU CSIE 201 ...
- 深度学习课程笔记(十七)Meta-learning (Model Agnostic Meta Learning)
深度学习课程笔记(十七)Meta-learning (Model Agnostic Meta Learning) 2018-08-09 12:21:33 The video tutorial can ...
- 深度学习课程笔记(十四)深度强化学习 --- Proximal Policy Optimization (PPO)
深度学习课程笔记(十四)深度强化学习 --- Proximal Policy Optimization (PPO) 2018-07-17 16:54:51 Reference: https://b ...
- 深度学习课程笔记(十三)深度强化学习 --- 策略梯度方法(Policy Gradient Methods)
深度学习课程笔记(十三)深度强化学习 --- 策略梯度方法(Policy Gradient Methods) 2018-07-17 16:50:12 Reference:https://www.you ...
- 深度学习课程笔记(十)Q-learning (Continuous Action)
深度学习课程笔记(十)Q-learning (Continuous Action) 2018-07-10 22:40:28 reference:https://www.youtube.com/watc ...
- 深度学习课程笔记(九)VAE 相关推导和应用
深度学习课程笔记(九)VAE 相关推导和应用 2018-07-10 22:18:03 Reference: 1. TensorFlow code: https://jmetzen.github.io/ ...
随机推荐
- html5-fieldset和legend和keygen元素的用法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 【2017-04-20】Sql字符串注入式攻击与防御,实体类,数据访问类
字符串攻击 所谓sql字符串注入式攻击就是在用户输入界面输入通过精心编制的含有某种指令的字符串,来改变C#中连接数据库要执行的sql语句,从而对数据库进行攻击性操作 在用户输入界面输入 a');up ...
- MySQL超时配置
connect_timeout:连接响应超时时间.服务器端在这个时间内如未连接成功,则会返回连接失败. wait_timeout:连接空闲超时时间.与服务器端无交互状态的连接,直到被服务器端强制关闭而 ...
- Redis 的 5 个常见应用场景
前言Redis 是一个强大的内存型存储,具有丰富的数据结构,使其可以应用于很多方面,包括作为数据库.缓存.消息队列等等. 如果你的印象中Redis只是一个 key-value 存储,那就错过了Redi ...
- android studio 添加get,set方法快捷方式
android studio 添加get,set方法快捷方式
- bzoj1594 Pku3764 The xor-longest Path
题目链接 先求每个点到根的异或和 然后就要找出两个点,使dis[a]^dis[b]最大 注意异或的性质,我们可以用trie树,沿着与当前数字每位的相反方向走 #include<algorithm ...
- [转载]window.location.href的用法(动态输出跳转)
无论在静态页面还是动态输出页面中window.location.href都是不错的用了跳转的实现方案 javascript中的location.href有很多种用法,主要如下. self.loca ...
- 用Intellij IDEA建mybatis案例
用IDEA建mybatis案例 环境准备: 首先,建库建表(最好用navicat或sqlpro直接导) 然后打开IDEA, 1. java--->javaEE---> java app-- ...
- if语法
语法一: if 条件: 条件成立时执行的子代码块 age_of_girl=31 if age_of_girl > 30: print('阿姨好') 语法二:if + else if 条件 ...
- Golang并发编程进程通信channel了解及简单使用
概念及作用 channel是一个数据类型,用于实现同步,用于两个协程之间交换数据.goroutine奉行通过通信来共享内存,而不是共享内存来通信.引用类型channel是CSP模式的具体实现,用于多个 ...