热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CapsNet(CapsuleNetwork)——胶囊网络原理

在讲胶囊网络之前,首先我们回顾一下我们熟悉的CNN。CNN做了什么事情呢?假设这里有一个卷积核(左图),除了曲线轨迹上的值很

在讲胶囊网络之前,首先我们回顾一下我们熟悉的CNN。



CNN做了什么事情呢? 假设这里有一个卷积核(左图),除了曲线轨迹上的值很大,其他的值都是零,所以这个卷积核对旁边这种曲线(右图)就有很高的输出,也就是说对这种曲线有很高的识别,而对其他的曲线类型输出就低。


所以比如图像分类中,一旦卷积核检测到了类似于眼睛啊、鼻子啊、嘴巴啊这种特征;从数学角度上说就,相关卷积核对鼻子、眼睛等卷积出来的值很大,那么与人脸相关的神经元就相当兴奋,最后将图像分类到人脸这一类。

所以这就导致了一个问题。如图,右边那张眼睛、鼻子、嘴巴都有了,当然我们的CNN也相当兴奋的将它归于人脸。




这就就暴露了CNN的一个问题:组件的朝向和空间上的相对关系对它来说不重要,它只在乎有没有特征。此外,CNN还有一个问题,那就是池化层。Hinton自己就说过:最大池化层表现的如此优异是一个巨大的错误,是一场灾难。诚然,从网络设计上来说,池化层不仅减少了参数,还可以避免过拟合。但是,它的确抛弃了一些信息,比如位置信息。


再比如说,下面这张图



尽管拍摄的角度不同,但你的大脑可以轻易的辨识这些都是同一对象,CNN却没有这样的能力。它不能举一反三,它只能通过扩大训练的数据量才能得到相似的能力。


所以,CapsNet应运而生。如图


上一列和下一列的图片属于同一类,仅仅视角不同。CapsNet和其他模型相比表现就要好很多。据说,最新的论文降低了45%的错误率,这是压倒性的优势。

 

那现在让我们来看一下CapsNet的具体架构。下面的图是论文里面设计的一个简单的CapsNet网络,只用到了一层胶囊,但是却也很好的展现了CapsNet是如何工作的。



从上图,我们可以看到,输入是一张手写字的图片。首先对这张图片做了常规的卷积操作,得到ReLU Conv1;然后再对ReLU Conv1做卷积操作,并将其调整成适用于CapsNet的向量神经元层PrimaryCaps(具体如何调整的,鄙人会结合自己对代码的理解在下周会议上讲解),而不是以往的标量神经元。

PrimaryCaps到DigitCaps层的传播也就是CapsNet和以往CNN操作的最大区别,本文的提出的算法:动态路由算法,也就运用在这一过程之中,具体计算会在下面讲到。

最后,DigitCaps中一共10个向量,每个向量中元素的个数为16。对这10个向量求模,求得模值最大的那个向量代表的就是图片概率最大的那个分类。因为胶囊网络中:用向量模的大小衡量某个实体出现的概率,模值越大,概率越大

 

现在,让我们来讲一下如何使用动态路由算法,完成从PrimaryCaps层到DigitCaps层的转变。

首先,先向大家解释一下鄙人对胶囊的理解:所谓胶囊,就是一个向量,它可包含任意个值,每个值代表了当前需要识别的物体(比如图片)的一个特征。结合之前对传统CNN的学习,我们知道,卷积层的每个值,都是上一层某一块区域和卷积核完成卷积操作,即线性加权求和的结果,它只有一个值,所以是标量。而我们的胶囊网络,它的每一个值都是向量,也就是说,这个向量不仅可表示物体的特征、还可以包括物体的方向、状态等等。

现在假设已经有三个低层的胶囊,然后需要传递到更高层的四个胶囊,如下图

这张图是我结合对动态路由算法的理解画的,每一个小方框都代表一个胶囊。胶囊网络的前向传播和全连接神经网络相似,所以我会从边对比边讲述胶囊网络的前向传播,以便大家有更好的理解。



网络连接方式

胶囊网络和全连接网络的连接方式一模一样。前一层每一个胶囊神经单元都会和后一层每一个胶囊神经单元相连,我想大家一看上图我画的一组连线应该就懂了,故不多做讲述。之所以只画一组连线,是为了大家能看的清楚,剩下没画的连线想必大家自己都能想象出来。



权重更新

和全连接神经网络一样,胶囊网络的每一个连接也有权重。在上面图中,W代表权重,大家需要注意:C不是权重,它叫耦合系数,我会在下面详细讲解,现在所指的权重只有W。在全连接神经网络中,每一个神经元都是标量,即都只有一个数字值,故每个权重也都只是一个标量,也是一个数字值。

但在胶囊网络中,每一个胶囊神经元都是向量,即包含多个值(如[x1, x2, x3, ..., xn], 具体个数n根据网络设计得到),所以每个胶囊神经元的权值W也应该是一个向量。W依旧根据反向传播来更新。



网络的输入

全连接神经网络的输入即线性加权求和,胶囊网络很类似,但是它在线性求和阶段上多加了一个耦合系数C。胶囊网络的输入S由下面公式得到:

       其中u是上一层胶囊网络的输出,W是每个输出要乘的权值,可以看作上一层每一个胶囊神经元以不同强弱的连接输出到后一层的某一个神经元。C根据下面公式计算:

C叫做耦合系数。为了求C我们必须先求b,b根据下面公式计算:

b初始值为0。故在前向传播求S的过程中,我们把W设计成随机值,b初始化为0可以得到C,u就是上一层胶囊网络的输出,有了三这个值,我们就可以得到下一层的S。

 


激活函数

在全连接神经网络中,我们选择的激活函数通常为:sigmoid, tanh等。但在胶囊网络中,Hinton构造了新的激活函数Squashing,故输出V的计算如下图所示:

该激活函数前一部分是输入输入向量S的缩放尺度,后一部分是S的单位向量。该激活函数既保留了输入输入向量的方向,又将输入向量的模压缩到[0, 1)之间。这也符合了我们前面说的:用向量模的大小衡量某个实体出现的概率,模值越大,概率越大

 


动态路由更新b,来更新c

这一点是胶囊网络的精华了。前面我们的b初始化为0,得到的耦合系数C趋于一般化,并不能表现出前一层的胶囊和后一层胶囊的之间的关系。故我们需要更新b,通过b的更新来更新C,b更新公式就是:

本论文通过计算内积来改变b,来改变C。那为什么要这么做呢,网上有很多解释,我更欣赏下面的这种解释,也和我自己的理解相似:

点积运算接收两个向量,并输出一个标量。对于给定长度但方向不同的的两个向量而言,点积有下列几种情况:正值、零、负值。故当u_hat和v的相乘结果为正时,代表两个向量指向的方向相似,b更新结果变大,那么耦合系数就高,说明该u_hat和v十分匹配。相反,若是u_hat和v相乘结果为负,b更新结果变小,那么耦合系数就小,说明不匹配。通过迭代确定C,也就等于确定了一条路线,这条路线上胶囊神经元的模都特别大,路线的尽头就是那个正确预测的胶囊。

根据论文描述,b的迭代更新次数取值为3比较好。


整个动态路由算法如下图所示:

首先,将所有的b初始化为0,然后开始迭代。每次迭代先通过softmax求出C值,然后结合U,W,C,做线性求和得到S,再将S输入激活函数Squashing得到V,最后利用U_hat和V来完成b值的更新。一切计算结束后,开始下一步迭代,迭代次数设置3为佳。

 

除了耦合系数C是通过动态路由更新的,整个网络其他的卷积参数和Capusle内的W都需要根据损失函数进行更新。在原论文中,作者采用SVM中常用的Margin Loss,表达式如下:

具体参数含义PPT上有写。

 

重构的意思就是用预测的类别重新构建出该类别代表的实际图像。前面,我们说到Capsule的向量可以表征一个实例,那么将最后的那个正确预测类别的向量投入到后面的重构网络中,应该可以构建一个完整的图像。

故Hinton等人使用额外的重构损失来促进DigitCaps层对输入数字图片进行编码。重构网络架构如下:

上图表明,正确预测类别的向量,即模值最大的向量送入包含三个全连接层的网络解码。这一过程的损失函数通过计算FC Sigmoid层的输出像素商店与原始图像像素点的欧氏距离而构建。



这张图是拿MNIST做实验得到的结果。

L代表标签,p代表预测值,r重构出的图片。左边三列是正确的结果。大家可以看到重构出来的图像形状和位置和输入极其类似,这是说明胶囊网络起了作用,即一个Capsule的确包含了物体的多个信息:特征、位置、大小等等。而后面两列是预测失败的,通过重构出来的图我们可以得到原因:3和5太像了,我感觉Hinton的意思就是,这种图人也会犯错,不怪Capsule。

 



泛化能力对模型无比重要,故Hinton对原来的MNIST数据集做了改变(大小、粗细、位置,如上图)并传入一个训练过的,测试准确率为99.23%的Capsule模型做测试,得到准确率为79%。而一个训练过的准确度为99.22%的传统CNN模型只能达到66%的准确率。不得不说,Capsule模型的泛化能力的确惊人。



 

Hinton在论文中花了大量的笔墨来解释他们做的数字重叠分类实验,他们的模型错误率达到了5%。说实话,感觉Hinton做这个实验来验证Capsule的强大有些欠缺,有点强买强卖的感觉。


但是有值得一提的是,Capsule能重构两个数字虽然他们重叠在一起。进一步理解应该是,Capsule中的两个向量能完整表达两个数字的特征,虽然有些特征重叠在一起导致难以分辨。


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 程度|也就是_论文精读:Neural Architecture Search without Training
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了论文精读:NeuralArchitectureSearchwithoutTraining相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • cs231n Lecture 3 线性分类笔记(一)
    内容列表线性分类器简介线性评分函数阐明线性分类器损失函数多类SVMSoftmax分类器SVM和Softmax的比较基于Web的可交互线性分类器原型小结注:中文翻译 ... [详细]
  • OCR:用字符识别方法将形状翻译成计算机文字的过程Matlab:商业数学软件;CUDA:CUDA™是一种由NVIDIA推 ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
author-avatar
瓶子2502854683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有