数码小王|TinyML:下一轮人工智能革命( 四 )


数码小王|TinyML:下一轮人工智能革命
文章图片
图78位编码过程中的量化误差示意图 , 进而将用于重构32位浮点数 。 图片来源:《TinyML》一书
由于存在量化误差 , 可能会在量化过程中丢失某些信息 。 例如在基于整型的平台上 , 值为3.42的浮点表示形式可能会被截取为3 。 为了解决这个问题 , 有研究提出了量化可感知(quantization-aware , QA)训练作为替代方案 。 QA训练本质上是在训练过程中 , 限制网络仅使用量化设备可用的值(具体参见Tensorflow示例) 。
霍夫曼编码
编码是可选步骤 。 编码通过最有效的方式来存储数据 , 可进一步减小模型规模 。 通常使用著名的霍夫曼编码 。
编译
对模型量化和编码后 , 需将模型转换为可被轻量级网络解释器解释的格式 , 其中最广为使用的就是TFLite(约500KB大小)和TFLiteMicro(约20KB) 。 模型将编译为可被大多数微控制器使用并可有效利用内存的C或C++代码 , 由设备上的解释器运行 。
数码小王|TinyML:下一轮人工智能革命
文章图片
图8TinyML应用的工作流图 。 来源:PeteWarden和DanielSitunayake编写的《TinyML》一书
大多数TinyML技术 , 针对的是处理微控制器所导致的复杂性 。 TFLite和TFLiteMicro非常小 , 是因为其中删除了所有非必要的功能 。 不幸的是 , 它们同时也删除了一些有用的功能 , 例如调试和可视化 。 这意味着 , 如果在部署过程中出现错误 , 可能很难判别原因 。
另外 , 尽管模型必须存储在设备本地 , 但模型也必须要支持执行推理 。 这意味着微控制器必须具有足够大的内存去运行(1)操作系统和软件库;(2)神经网络解释器 , 例如TFLite);(3)存储的神经网络权重和架构;(4)推理过程中的中间结果 。 因此 , TinyML方向的研究论文在给出内存使用量、乘法累加单元(multiply-accumulateunits , MAC)数量 , 准确率等指标的同时 , 通常还需给出量化算法的峰值内存使用情况 。
为什么不在设备上训练?
在设备上进行训练会引入额外的复杂性 。 由于数值精度的降低 , 要确保网络训练所需的足够准确率是极为困难的 。 在标准台式计算机的精度下 , 自动微分方法是大体准确的 。 计算导数的精度可达令人难以置信的10^{-16} , 但是在8位数值上做自动微分 , 将给出精度较差的结果 。 在反向传播过程中 , 会组合使用求导并最终用于更新神经参数 。 在如此低的数值精度下 , 模型的准确率可能很差 。
尽管存在上述问题 , 一些神经网络还是使用了16位和8位浮点数做了训练 。
第一篇研究降低深度学习中的数值精度的论文 , 是SuyogGupta及其同事在2015年发表的“具有有限数值精度的深度学习”(DeepLearningwithLimitedNumericalPrecision) 。 该论文给出的结果非常有意思 , 即可在几乎不降低准确率的情况下 , 将32位浮点表示形式降至16位固定点表示 。 但该结果仅适用于使用随机舍入(stochasticrounding)的情况 , 因为其在均值上产生无偏结果 。
在NaigangWang及其同事2018年发表的论文“使用8位浮点数训练深度神经网络”(TrainingDeepNeuralNetworkswith8-bitFloatingPointNumbers)中 , 使用了8位浮点数训练神经网络 。 在训练中使用8位数值 , 相比在推理中要明显难以实现 , 因为需要在反向传播期间保持梯度计算的保真度(fidelity) , 使得在做自动微分时能够达到机器的精度 。
计算效率如何?
可以通过定制模型 , 提高模型的计算效率 。 一个很好的例子就是MobileNetV1和MobileNetV2 , 它们是已在移动设备上得到广泛部署的模型架构 , 本质上是一种通过重组(recast)实现更高计算效率卷积运算的卷积神经网络 。 这种更有效的卷积形式 , 称为深度可分离卷积结构(depthwiseseparableconvolution) 。 针对架构延迟的优化 , 还可以使用基于硬件的概要(hardware-basedprofiling)和神经架构搜索(neuralarchitecturesearch)等技术 , 对此本文将不做详述 。


推荐阅读