Author Archive

胶囊神经网络

背景

Geoffrey Hinton是深度学习的开创者之一,反向传播等神经网络经典算法发明人,他和他的团队提出了一种全新的神经网络,这种网络基于一种称为胶囊(capsule)的结构,并且还发表了用来训练胶囊网络的囊间动态路由算法。

研究问题

传统CNN存在着缺陷(下面会详细说明),如何解决CNN的不足,Hinton提出了一种对于图像处理更加有效的网络——胶囊网络,其综合了CNN的优点的同时,考虑了CNN缺失的相对位置、角度等其他信息,从而使得识别效果有所提升。

研究动机

CNN的缺陷

CNN着力于检测图像像素中的重要特征。考虑简单的人脸检测任务,一张脸是由代表脸型的椭圆、两只眼睛、一个鼻子和一个嘴巴组成。而基于CNN的原理,只要存在这些对象就有一个很强的刺激,因此这些对象空间关系反而没有那么重要。
如下图,右图不是人脸但都具备了人脸需要的对象,所以CNN有很大可能通过具有的对象激活了是人脸的判断,从而使得结果判断出错。
重新审视CNN的工作方式,高层特征是低层特征组合的加权和,前一层的激活与下一层神经元的权重相乘并且相加,接着通过非线性激活函数进行激活。在这么一个架构中,高层特征和低层特征之间的位置关系变得模糊(我认为还是有一些的只是没有很好的利用)。而CNN解决这个问题的方法是通过最大池化层或者或许的卷积层来扩大下续卷积核的视野(我认为最大池化层不管怎么说或多或少会丢掉信息甚至是重要信息)。

逆图形法

计算机图形学是基于几何数据内部的分层表示来构造可视图像,其结构考虑到了对象的相对位置,几何化的对象间的相对位置关系和朝向以矩阵表示,特定的软件接受这些表示作为输入并将它们转化为屏幕上的图像(渲染)。
Hinton受此启发,认为大脑所做的和渲染正好相反,称为逆图形,从眼睛接受的视觉信息中,大脑解析出其所在世界的分层表示,并尝试匹配学习到的模式和存储在大脑中的关系,从而有了辨识,注意到,大脑中的物体表示并不依赖视角。
因此,现在要考虑的是如何在神经网络中建模这些分层关系。在计算机图形学中,三维图形中的三维对象之间的关系可以用位姿表示,位姿的本质是平移和旋转。Hinton提出,保留对象部件之间的分层位姿关系对于正确分类和辨识对象来说很重要。胶囊网络结合了对象之间的相对关系,在数值上表示为4维位姿矩阵。当模型有了位姿信息之后,可以很容易地理解它看到的是以前看到的东西而只是改变了视角而已。如下图,人眼可以很容易分辨出是自由女神像,只是角度的不同,但CNN却很难做到,而把位姿信息集合进去的胶囊网络,也可以判别出是自由女神像的不同角度。

胶囊网络优点

  • 由于胶囊网络集合了位姿信息,因此其可以通过一小部分数据即学习出很好的表示效果,所以这一点也是相对于CNN的一大提升。举个例子,为了识别手写体数字,人脑需要几十个最多几百个例子,但是CNN却需要几万规模的数据集才能训练出好结果,这显然还是太暴力了!
  • 更加贴近人脑的思维方式,更好地建模神经网络中内部知识表示的分层关系,胶囊背后的直觉非常简单优雅。

胶囊网络缺点

  • 胶囊网络的当前实现比其他现代深度学习模型慢很多(我觉得是更新耦合系数以及卷积层叠加影响的),提高训练效率是一大挑战。

研究内容

胶囊是什么

摘抄Hinton等人的《Transforming Autoencoders》关于胶囊概念理解如下。

人工神经网络不应当追求“神经元”活动中的视角不变性(使用单一的标量输出来总结一个局部池中的重复特征检测器的活动),而应当使用局部的“胶囊”,这些胶囊对其输入执行一些相当复杂的内部计算,然后将这些计算的结果封装成一个包含信息丰富的输出的小向量。每个胶囊学习辨识一个有限的观察条件和变形范围内隐式定义的视觉实体,并输出实体在有限范围内存在的概率及一组“实例参数”,实例参数可能包括相对这个视觉实体的隐式定义的典型版本的精确的位姿、照明条件和变形信息。当胶囊工作正常时,视觉实体存在的概率具有局部不变性——当实体在胶囊覆盖的有限范围内的外观流形上移动时,概率不会改变。实例参数却是“等变的”——随着观察条件的变化,实体在外观流形上移动时,实例参数也会相应地变化,因为实例参数表示实体在外观流形上的内在坐标。

简单来说,可以理解成:
  • 人造神经元输出单个标量。卷积网络运用了卷积核从而使得将同个卷积核对于二维矩阵的各个区域计算出来的结果堆叠在一起形成了卷积层的输出。
  • 通过最大池化方法来实现视角不变性,因为最大池持续搜寻二维矩阵的区域,选取区域中最大的数字,所以满足了我们想要的活动不变性(即我们略微调整输入,输出仍然一样),换句话说,在输入图像上我们稍微变换一下我们想要检测的对象,模型仍然能够检测到对象
  • 池化层损失了有价值的信息,同时也没有考虑到编码特征间的相对空间关系,因此我们应该使用胶囊,所有胶囊检测中的特征的状态的重要信息,都将以向量形式被胶囊封装(神经元是标量)
胶囊和人工神经元对比如下:

囊间动态路由算法

低层胶囊需要决定如何将其输出向量发送给高层胶囊。低层胶囊改变标量权重cij ,输出向量乘以该权重后,发送给高层胶囊,作为高层胶囊的输入。关于权重cij ,需要知道有:
  • 权重均为非负标量
  • 对每个低层胶囊而言,所有权重cij 的总和等于1
  • 对每个低层胶囊而言,权重的数量等于高层胶囊的数量
  • 这些权重由迭代动态路由算法确定
低层胶囊将其输出发送给对此表示“同意”的高层胶囊,算法伪码如下:
权重更新可以用如下图来直观理解。
其中两个高层胶囊的输出用紫色向量 v1 和 v2 表示,橙色向量表示接受自某个低层胶囊的输入,其他黑色向量表示接受其他低层胶囊的输入。左边的紫色输出 v1 和橙色输入 u1|1 指向相反的方向,所以它们并不相似,这意味着它们点积是负数,更新路由系数的时候将会减少 c11 。右边的紫色输出 v2 和橙色输入 u2|1 指向相同方向,它们是相似的,因此更新参数的时候路由系数 c12 会增加。在所有高层胶囊及其所有输入上重复应用该过程,得到一个路由参数集合,达到来自低层胶囊的输出和高层胶囊输出的最佳匹配。
采用多少次路由迭代?论文在MNIST和CIFAR数据集上检测了一定范围内的数值,得到以下结论:
  • 更多的迭代往往会导致过拟合
  • 实践中建议使用3次迭代

整体框架

CapsNet由两部分组成:编码器和解码器。前3层是编码器,后3层是解码器:
  • 第一层:卷积层
  • 第二层:PrimaryCaps(主胶囊)层
  • 第三层:DigitCaps(数字胶囊)层
  • 第四层:第一个全连接层
  • 第五层:第二个全连接层
  • 第六层:第三个全连接层

编码器

编码器接受一张28×28的MNIST数字图像作为输入,将它编码为实例参数构成的16维向量。

卷积层

  • 输入:28×28图像(单色)
  • 输出:20×20×256张量
  • 卷积核:256个步长为1的9×9×1的核
  • 激活函数:ReLU
PrimaryCaps层(32个胶囊)
  • 输入:20×20×256张量
  • 输出:6×6×8×32张量(共有32个胶囊)
  • 卷积核:8个步长为1的9×9×256的核/胶囊
DigitCaps层(10个胶囊)
  • 输入:
    6×6×8×32张量
  • 输出:
    16×10矩阵

损失函数

 解码器

解码器从正确的DigitCap中接受一个16维向量,并学习将其编码为数字图像(注意,训练时候只采用正确的DigitCap向量,而忽略不正确的DigitCap)。解码器用来作为正则子,它接受正确的DigitCap的输出作为输入,重建一张28×28像素的图像,损失函数为重建图像和输入图像之间的欧式距离。解码器强制胶囊学习对重建原始图像有用的特征,重建图像越接近输入图像越好,下面展示重建图像的例子。
第一个全连接层
  • 输入:16×10矩阵
  • 输出:512向量
第二个全连接层
  • 输入:512向量
  • 输出:1024向量
第三个全连接层
  • 输入:1024向量
  • 输出:784向量

参考资料 

https://mp.weixin.qq.com/s?__biz=MzI3ODkxODU3Mg==&mid=2247484099&idx=1&sn=97e209f1a9860c8d8c51e81d98fc8a0a&chksm=eb4ee600dc396f16624a33cdfc0ead905e62ae9447b49b20146020e6cbd7d71f089101512a40&scene=21#wechat_redirect
https://mp.weixin.qq.com/s?__biz=MzI3ODkxODU3Mg==&mid=2247484165&idx=1&sn=0ca679e3a5f499f8d8addb405fe3df83&chksm=eb4ee7c6dc396ed0a330fcac12690110bcaf9a8a10794dbc5e1a326c69ecbb140140f55fd6ba&scene=21#wechat_redirect
https://mp.weixin.qq.com/s?__biz=MzI3ODkxODU3Mg==&mid=2247484433&idx=1&sn=3afe4605bc2501eebbc41c6dd1af9572&chksm=eb4ee0d2dc3969c4619d6c1097d5c949c76c6c854e60d36eba4388da2c3855747818d062c90a&scene=21#wechat_redirect
https://mp.weixin.qq.com/s/6CRSen8P6zKaMGtX8IRfqw
原文链接:
https://www.cnblogs.com/CZiFan/p/9803067.html

人工智能技术在防疫抗疫工作中大有用武之地

近期,新型冠状病毒肺炎(NCP)的疫情突如其来,让人们有些措手不及。但是为了实现更好的防疫抗疫效果,不少科研人员纷纷应用诸多技术手段来抗击疫情。其中人工智能技术已成为这场防疫抗疫攻坚战的有力武器之一;它在疫情防控、图像分析、辅助诊断、疫苗研发等方面助力防疫抗疫工作。

训练集、验证集、测试集(附:分割方法+交叉验证)

一文看懂 AI 数据集:训练集、验证集、测试集

数据在人工智能技术里是非常重要的!本篇文章将详细给大家介绍3种数据集:训练集、验证集、测试集。

同时还会介绍如何更合理的讲数据划分为3种数据集。最后给大家介绍一种充分利用有限数据的方式:交叉验证法。

 

先用一个不恰当的比喻来说明3种数据集之间的关系:

  • 训练集相当于上课学知识
  • 验证集相当于课后的的练习题,用来纠正和强化学到的知识
  • 测试集相当于期末考试,用来最终评估学习效果

3种数据集之间的关系

 

什么是训练集?

训练集(Training Dataset)是用来训练模型使用的。

在《一文看懂机器学习》里我们介绍了机器学习的7个步骤,训练集(Training Dataset)主要在训练阶段使用。

训练集使用阶段

 

什么是验证集?

当我们的模型训练好之后,我们并不知道他的表现如何。这个时候就可以使用验证集(Validation Dataset)来看看模型在新数据(验证集和测试集是不同的数据)上的表现如何。同时通过调整超参数,让模型处于最好的状态

验证集使用阶段

验证集有2个主要的作用:

  1. 评估模型效果,为了调整超参数而服务
  2. 调整超参数,使得模型在验证集上的效果最好

说明:

  1. 验证集不像训练集和测试集,它是非必需的。如果不需要调整超参数,就可以不使用验证集,直接用测试集来评估效果。
  2. 验证集评估出来的效果并非模型的最终效果,主要是用来调整超参数的,模型最终效果以测试集的评估结果为准。

 

什么是测试集?

当我们调好超参数后,就要开始「最终考试」了。我们通过测试集(Test Dataset)来做最终的评估。

测试集使用阶段

通过测试集的评估,我们会得到一些最终的评估指标,例如:准确率、精确率、召回率、F1等。

扩展阅读:《分类模型评估指标——准确率、精准率、召回率、F1、ROC曲线、AUC曲线

 

如何合理的划分数据集?

如何合理的划分数据集

下面的数据集划分方式主要针对「留出法」的验证方式,除此之外还有其他的交叉验证法,详情见下文——交叉验证法。

数据划分的方法并没有明确的规定,不过可以参考3个原则:

  1. 对于小规模样本集(几万量级),常用的分配比例是 60% 训练集、20% 验证集、20% 测试集。
  2. 对于大规模样本集(百万级以上),只要验证集和测试集的数量足够即可,例如有 100w 条数据,那么留 1w 验证集,1w 测试集即可。1000w 的数据,同样留 1w 验证集和 1w 测试集。
  3. 超参数越少,或者超参数很容易调整,那么可以减少验证集的比例,更多的分配给训练集。

 

交叉验证法

为什么要用交叉验证法?

假如我们教小朋友学加法:1个苹果+1个苹果=2个苹果

当我们再测试的时候,会问:1个香蕉+1个香蕉=几个香蕉?

如果小朋友知道「2个香蕉」,并且换成其他东西也没有问题,那么我们认为小朋友学习会了「1+1=2」这个知识点。

如果小朋友只知道「1个苹果+1个苹果=2个苹果」,但是换成其他东西就不会了,那么我们就不能说小朋友学会了「1+1=2」这个知识点。

评估模型是否学会了「某项技能」时,也需要用新的数据来评估,而不是用训练集里的数据来评估。这种「训练集」和「测试集」完全不同的验证方法就是交叉验证法。

 

3 种主流的交叉验证法

3 种主流的交叉验证法

留出法(Holdout cross validation)

上文提到的,按照固定比例将数据集静态的划分为训练集、验证集、测试集。的方式就是留出法。

留一法(Leave one out cross validation)

每次的测试集都只有一个样本,要进行 m 次训练和预测。 这个方法用于训练的数据只比整体数据集少了一个样本,因此最接近原始样本的分布。但是训练复杂度增加了,因为模型的数量与原始数据样本数量相同。 一般在数据缺乏时使用。

k 折交叉验证(k-fold cross validation)

静态的「留出法」对数据的划分方式比较敏感,有可能不同的划分方式得到了不同的模型。「k 折交叉验证」是一种动态验证的方式,这种方式可以降低数据划分带来的影响。具体步骤如下:

  1. 将数据集分为训练集和测试集,将测试集放在一边
  2. 将训练集分为 k 份
  3. 每次使用 k 份中的 1 份作为验证集,其他全部作为训练集。
  4. 通过 k 次训练后,我们得到了 k 个不同的模型。
  5. 评估 k 个模型的效果,从中挑选效果最好的超参数
  6. 使用最优的超参数,然后将 k 份数据全部作为训练集重新训练模型,得到最终模型。

k 折交叉验证

k 一般取 10 数据量小的时候,k 可以设大一点,这样训练集占整体比例就比较大,不过同时训练的模型个数也增多。 数据量大的时候,k 可以设小一点。

Chinese (Simplified) ZH-CN English EN