胶囊网络在重塑 AI 格局:这里教你如何使用它
被誉为“深度学习之父”的科学家杰弗里·辛顿(Geoffrey Hinton)
如果你平时很关注AI,可能已听说过可能颇具革命性的胶囊网络(Capsule Networks)已问世。本文将介绍现在你如何可以使用它。
杰弗里·辛顿(Geoffrey Hinton)被誉为“深度学习之父”。早在20世纪50年代,深度神经网络这个概念就开始浮出水面,从理论上来说有望解决大量的问题。然而,当时没有人能够搞清楚如何训练它们,于是人们开始放弃。但辛顿并没有放弃,他在1986年证明了反向传播(backpropagation)这个概念可以训练这些深度网络。然而直到5年前的2012年,辛顿才得以演示其重大突破,那是由于当时缺乏所需的强大计算能力。这一突破为这十年来AI的发展奠定了基础。
现在即2017年10月26日,他发表了一篇论文来阐述一种开创性的新概念:胶囊网络。
注意:我不会过多地介绍细节,因为辛顿的论文已经非常详细深入地解释了所有的技术信息,可以在这里(胶囊网络(capsule network)为神经网络翻开了新篇章:旨在让机器更好地通过图像或视频来解读这个世界(附论文))找到。
传统神经网络存在的问题
就在不久前,卷积神经网络(CNN)还一直是最先进的图像分类方法。
CNN的工作原理如下,在每一层积累一组特征。它最初是寻找边缘,然后寻找形状,最后寻找实际对象。然而,所有这些特征的空间关系信息却丢失了。
这是过于简单化的过程,但是你可以把CNN想象成这样:
if (2 eyes && 1 nose && 1 mouth) {
It's a face!
}
你可能认为这听起来很不错,它有其合理性,而且确实如此。不过我们可能会遇到几个问题,比如以美国社交名媛金·卡戴珊(Kim Kardashian)的这张照片为例:
妈呀!照片上是有两只眼睛、一只鼻子和一张嘴巴,但是出了岔子,你难道没有发现吗?我们一眼就能看出,那只眼睛和那张嘴巴的位置不对,人不应该长这样子。然而,一个训练有素的CNN在这个概念上遇到了困难:
除了很容易被特征位置错误的图像迷惑或愚弄外,CNN在查看不同方向的图像时也很容易被搞糊涂。要解决这个问题,一个办法就是对所有可能的角度进行大量训练,但是这要花费很多时间,而且似乎反直观。只要将金的照片颠倒一下,我们在这里就能看到性能大幅下降:
最后,卷积神经网络可能很容易受到白盒对抗性攻击,这实质上是将一个秘密图案嵌入到一个对象中,让它看起来像别的东西。
https://v.qq.com/txp/iframe/player.html?vid=s13289kgfro&width=500&height=375&auto=0
用3D对抗对象愚弄现实世界中的神经网络(出处:http://www.labsix.org/physical-objects-that-fool-neural-nets/)。
胶囊网络应运而生!
胶囊网络(CapsNet)的体系结构
胶囊网络的引入让我们能够充分利用空间关系,那样我们就能开始看到情况更像这样:
if (2 adjacent eyes && nose under eyes && mouth under nose) {
It's a face!
}
你应该能够看到,有了这个定义后,我们的神经网络应该不会同样被形状怪异的卡戴姗轻易愚弄了。
这种新的体系结构面对下列数据集时也获得了高得多的准确度。该数据集经过了精心设计,是一项纯粹的形状识别任务,表明即便从不同的角度来看也能够识别对象。它击败了最先进的CNN,将错误数量整整减少了45%。
胶囊网络能够识别与对应的上一组图像属于同一个类别的下一组图像(动物、人类、飞机、汽车、卡车),其准确性远胜过CNN。
此外,在最近的论文中,研究人员发现胶囊网络在抵御白盒对抗性攻击方面比基准卷积神经网络要出色得多。
训练胶囊网络
我搞了一个代码库,采用了辛顿在论文中介绍的技术(非常感谢naturomics)。想使用胶囊网络模型,你先要训练它。
下列指南将为你提供针对MNIST数据集来训练的一个模型。有些读者可能还不了解,所以有必要说明一下,MNIST是手写数字组成的数据集,用这个基准来测试机器学习算法很合适。
先复制代码库(https://github.com/bourdakos1/capsule-networks):
git clone https://github.com/bourdakos1/capsule-networks.git
然后安装需求项:
pip install -r requirements.txt
开始训练!
python main.py
MNIST数据集有6万个训练图像。默认情况下,该模型将被训练50个迭代次数(epoch),批大小(batch size)是128。一个迭代次数对训练集来一次完整运行。由于批大小是128,所以每个迭代次数将处理大约468个批。
注意:要是你没有GPU,训练可能需要很长时间。你可以阅读这篇文章(https://medium.freecodecamp.org/tracking-the-millenium-falcon-with-tensorflow-c8c86419225e#6415),了解如何缩短训练时间。
做出推论
一旦模型经过了全面训练,我们可以运行下面这个命令来测试它:
python main.py --is_training False
结束语
胶囊网络似乎非常出色,但仍处于起步阶段。将来我们在训练庞大数据集时可能会看到问题,不过我对胶囊网络颇有信心。
补充:这是一段很棒的视频,建议您花点时间看一下。
https://v.qq.com/txp/iframe/player.html?vid=q0504c6ibgu&width=500&height=375&auto=0