XNOR-NET技术详解:AI技术落地移动端新时代即将崛起
在这个时代,人类生活离不开智能设备。无论是随身携带的手机,还是腕上的智能手表,都与人工智能息息相关。同时,人类的生活方式也在不断化繁为简,现代人出行只需带上一只手机,便可以有效解决社交沟通、交易支付、出行交通等一系列问题。随着社会便携化、智能化的发展需求,在移动端实现人工智能也已经成为大势所趋。然而,人工智能的实现可能不仅需要在硬件配备方面进行大量投入,还需要大型数据中心的支撑。那么,如何在移动端建立可以遍布人类生活的 AI 技术力量呢?
2017 年 2 月 2 日,位于美国西雅图的 AI 创业公司 xnor.ai 宣布获得来自麦德罗纳风险投资集团(Madrona Venture Group)和艾伦人工智能研究所(Allen Institute for Artificial Intelligence)的 260 万美元的种子融资。这个平台致力于开发不依赖于数据中心或互联网连接的,可以直接有效地在移动端或嵌入式设备(例如手机、无人驾驶车辆等)上运行的深度学习模型。
Xnor.ai 平台的这项针对移动端部署深度学习研发技术,无论是从响应性、速度还是可靠性上来说,都可以达到前所未有的水平。而且,由于数据全部存储于移动端设备上,个人隐私可以得到高水平保障。例如,就物体检测的性能而言,业界完全可以把这项技术应用于手机上,实现物体的实时检测。
事实上,xnor.ai 团队就曾将 XNOR-Net 部署在价值 5 美元的 Raspberry Pi Zero 上,通过连接一个摄像头实现了实时视频分析,这段网站上的 demo 展示出的实时检测分析效果十分引人注意,给人很强的视觉冲击力。如果在类似于 Raspberry Pi Zero 这样的移动设备上都能进行对枪支和刀具的实时监测并及时报警,那么人们完全可以利用这项技术针对性地开发出更多 AI 安防产品,拓展 AI 安防领域,更不用说这项技术在其他领域中潜在的巨大商业价值。
众所周知,深度学习模型大量的矩阵运算使 GPU 加速成了必不可少的硬件支持,这使得深度网络难以在运算资源有限的移动设备上面实现。那么,xnor.ai 又是如何将深度网络部署于移动端的呢?在这里,不得不提到二值神经网络这个概念。
随着对神经网络研究深度不断推进,学界研究人员发现传统的神经网络对计算成本和内存容量要求较高,而二值化则可以有效地改善这些问题。二值化网络不仅有助于减小模型的存储大小,节省存储容量,而且能加快运算速度,降低计算成本。
2015 年 11 月,来自于 Yoshua Bengio 教授带领的加拿大蒙特利尔大学实验室团队的 Matthie Courbariaux 发表了关于二值神经网络 BinaryConnect 的相关论文(BinaryConnect:Training Deep Learing Neural Networks with binary weight during propagations),引起了广泛关注,开启了崭新的二值化网络时代。论文中提出了 BinaryConnect 算法的关键在于仅在前向传播和反向传播中对权重进行二值化 1 或-1,而在参数更新过程保持权重的全精度(即仍为浮点数),这样的做法可以省去接近三分之二的矩阵运算,训练时间和内存空间都得到了大幅度优化,同时,BinaryConnect 在 MNISIST,CIFAR-10 和 SVHN 图像分类数据集上的实验效果可以达到当时世界领先水平。
在此基础上,Matthieu 和 Itay 随后联合发表的论文(Binarized Neural Networks:Training Networks with Weights and Activations Constrained to +1 or -1)提出了更完善的网络模型——BinaryNet,将权值和隐藏层激活值同时进行二值化,并利用 xnorcount 和 popcount 运算操作代替网络中传统的算术运算。这个算法在常用图像数据集上的模型二值化实验也比较成功,可以减少约 60% 的计算复杂度,甚至可以在保证分类准确率的情况下,减少七倍的 GPU 运行时间。同时,实验团队也公开了在 CUDA、Theano 以及 Torch 上的代码,不过很可惜的是,这个算法并没有在如 ImageNet 的大数据集上证明精度是否可以维持。在尽可能减小模型准确率损失的情况下,BinaryNet 的出现通过缩减模型大小,简化运算难度对算法进行加速。这使得深度网络部署于移动端的前景初见曙光。
值得一提的是,随着神经网络技术的蓬勃发展,许多教授、学者投身工业界,像 Matthie Courbariaux 现已投身 Google,并负责在 TensorFlow 框架中实现对深度模型的量化任务。不同于 Matthie 在论文中的二值化概念 (即不丢失模型准确率,只压缩模型大小), 实际投入应用的量化更适合被理解为离散化。一般来说,在训练神经网络的时候,要对权重做一些微小的调整,而这些微小的调整需要浮点精度才能正常工作,而低精度计算会被网络当做一种噪声。深度网络的一个奇妙之处就在于它可以很好地应对输入噪音,因为网络可以把低精度计算当做一种噪声,这使得量化后的网络在具备较少信息的数值格式下,仍能产生精确的结果。
量化网络有两个动机,一是缩小尺寸,这是通过存储每层的最大和最小值,然后把每一个浮点值压缩成 8-bit 整数来表示。二是降低资源需求,这需要整个计算都用 8-bit 输入和输出来实现。量化压缩是存在风险的,目前的版本似乎还不是很成熟,Github 上面有很多开发人员认为利用这种方法量化后的模型效率较低。
2016 年 3 月,Mohammad Rastegari 等人在论文 (XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks) 中首次提出了 XNOR-Net 的概念。这篇论文旨在利用二值化操作寻找到最优的简化网络,并分别介绍了两种有效的网络:Binary-Weight-Networks 和 XNOR-Networks。Binary-Weight-Networks 是对 CNN 中所有的权重做近似二值化,可以节省 32 倍的存储空间。而且,由于权重被二值化,卷积过程只剩加减算法,不再包括乘法运算,可以提高约两倍的运算速度,这促使 CNN 可以在不牺牲准确率的情况下在小存储设备上使用,包括便携式设备。Binary-Weight-Networks 区别于 BinaryNet 的地方在于它进行二值化的方法和网络结构。
XNOR-Networks 算法则是对 CNN 中所有的权重和输入同时做近似二值化,如果卷积运算中的所有操作数都是二进制的,那么两个二进制向量的点乘就可以等同于同或运算和位运算。作者在这篇文章里主要有两个贡献:一是引入比例因子,大幅度提升精度;二是对典型常规的 CNN 构成进行改动。
XNOR-Net 算法的基本思路如下:
Step1:定义一个 L 层的 CNN 结构,使用三个元素 I,W,* 来表示,I 表示卷积输入,W 表示滤波器,*表示卷积算子;利用比例因子α帮助二值化滤波器去近似全精度滤波器权重,利用比例因子β帮助二值化的输入去近似全精度输入值。这有点类似于批规范化(Batch Normalization)中的仿射参数(Affine Parameters),但不同的是,这里不是通过为网络学习获得的,而是通过计算平均值得到的。在探索计算比例因子β的时候,要对每一次卷积产生的子张量都计算一个β,这一步骤会产生很多冗余的计算。为了降低计算量,作者把输入的所有 channels 计算一个绝对值的平均值矩阵 A,然后通过一个二维的滤波器 k 和 A 的卷积生成 K,那么 K 就包含了针对输入 I 在所有子张量上的比例因子。通过这样一系列数学推导,输入 I 与权重 W 的二值化卷积可以被近似为:
具体过程如下图:
图 1:XNOR-Net 近似二值化卷积过程(Mohammad Rastegari et al.)
Step2:一个典型的 CNN 具有卷积、批规范化、激活、池化这样的四层结构,其中,池化层可以对输入运用任何种类的池化方式。但在二值化的输入(-1,1)进入到池化过程时,会产生大量的信息丢失。例如,对二值化输入进行 max-pooling 时,会导致大部分输入只剩+1,使得消息消减,精度降低。为了解决这个问题,作者改善了网络结构,改变这几层的顺序,首先实行批规范化,保证 0 均值,然后进行二值化激活,使数据都是+1 和-1,再做二值化卷积,此时由于比例因子的作用输出的不再是-1 和+1,这会相对减少信息丢失。在这里,作者建议在二值化卷积后加一个非二值化激活步骤(如 ReLU),这可以帮助训练比较复杂的网络。
具体过程如下图:
图 2:典型的 CNN 与 XNOR-Net 结构(Mohammad Rastegari et al.)
XNOR-Net 团队在自主搭建的轻型神经网络框架 DarkNet 中实现了在 CPU 上 58 倍速度的提升,这意味着 XNOR-Net 可以在小内存设备上完成实时任务。事实上,在 2016 计算机视觉大会上,XNOR-Net 团队把 yolo object detection 算法的 xnor 版本在 iphone 上面做到了实时探测就成了一大亮点。XNOR-Net 的出现弥补了 BinaryNet 文章的缺失,首次让二值神经网络在 ImageNet 上面完了实验。
有趣的是,XNOR-Net 团队曾在 Github 上公开代码,甚至包括让其名声大噪的 Yolo network,但在公开发表的论文中却并没有公开 C/C++源代码而只是做了 Torch 的版本公开,曾经发布在 Github 的版本也昙花一下,不久便被撤回了。现在看来,这些举动都无疑都是为之后 XNOR-Net 的商业化做准备。
Xnor.ai 的一系列举措不禁让人联想到去年大火的 Prisma APP 离线版的上架以及新一代智能手表操作系统 Andriod Wear 2.0 的发布。这些都是在移动端实现深度学习的经典产品实例,而这些技术成果与研发产品都验证了 Facebook 对未来十年的重点研发战略领域的远见卓识——连接世界、普及网络;人工智能;虚拟现实和增强现实。
除此之外,去年年底 Facebook 发布的 Caffe2Go 也是可以嵌入、部署于移动设备的深度学习框架,具有规模小、训练速度快、对计算机性能要求低等性能。其精华在于 Facebook 硬件优化工程师和算法专家(以贾扬清为代表)做了大量的针对性能上的优化,才使 Caffe2Go 可以顺利部署于手机上。类似的还有 Google 发布于 Github 上的 TensorFlow android camera demo,在这里,Google 将较为复杂的 inception v3 图片分类网络模型进行量化压缩减小 4 倍左右,然后部署于安卓手机上,也可以完成手机端的物体识别、行人检测等任务。虽然这些优化似乎更多是工程意义上的,而不是算法本身具备创新性,但是这些互联网巨头公司的行动无疑会带给我们一些启示:将深度学习框架部署于移动端是未来的一个主流发展趋势。
目前,深度学习框架的开发及优化发展迅速,种类也不少,不过,可以支持移动端的框架还是相对少数的,到底哪种框架是部署于移动端的最佳选择,这还有待于考证。相较于 TensorFlow 这种比较复杂的主流深度学习框架,MXNET 作为一种十分灵活、对内存要求较少的深度开源框架也被业界看好,而且它本身就提供了对多种移动端的支持。
去年 6 月,国内 Face++推出了关于 DoReFa-Net 算法的文章 ( DoReFa-Net: Training Low Bitwidth Convolutional Neural Networks with Low Bitwidth Gradients)。DoReLa-Net 对比例因子的设计更为简单,这里并没有针对卷积层输出的每一个过滤映射计算比例因子,而是对卷积层的整体输出计算一个均值常量作为比例因子。这样的做法可以简化反向运算,因为在他们反向计算时也要实现量化。DoReLa-Net 的贡献在于提供了不同量化因子的实验结果,即 2,4,8,16,32 bit 的权重、激活函数量化,同时在后向反馈中也实现了梯度的量化。对于梯度二值化问题,XNOR-Net 中只提出了理论的计算方法,未实现 4~16 bit 的量化实验,也没有在反向梯度计算中使用二值运算。在 SVHN 和 ImageNet 上的实验都可以说明 DoReFa-Net 在有效地应用于 CPU,FPGA,ASIC 和 GPU 上,具有很大的潜力和可行性。但是 DoReLa-Net 并没有使用 xnor 和 popcount 运算,因此实验结果只具备精度参考价值,没有任何加速的效果。
人工智能现如今已渗透在医疗、安防、车辆交通、教育等方方面面的领域,将 AI 技术移植到普罗大众的便携式生活中成为必然,未来更多致力于实现神经网络嵌入于移动端的产品将会应运而生,例如,车辆上的导航设施、游戏的手机客户端以及各种各样的手机 APP。这一方面是源于,在移动端实现人工智能十分方便、便携,它可以随时随地满足人们的各种需求;另一方面,在离线的情况下,数据无需上传下传,降低了信息传递时间,同时还能增强用户隐私空间。人们有意愿、有需求直接把 AI 掌控在自己手中,从而达到进一步改善生活品质,甚至于改变生活方式的目的。
同时,从工业发展的角度,人工智能移动端的推行也势在必行。工业机器人、家居机器人等工业化产品也需要依托于具有可移植功能的嵌入式芯片。在硬件条件的发展限制了深度学习运行速度的时候,软件算法技术改进将会不断革新,在这个革新过程中,终端设备智能化已经初见曙光。