|边缘AI新方法TinyML,超低功耗,在边缘设备进行机器学习( 四 )



为模型的知识表示蒸馏进行的剪枝 。
量化
经过蒸馏后 , 模型在训练后被量化成一种与嵌入式设备架构兼容的格式 。
为什么需要量化?想象一下 , 一个使用 ATmega328P 微控制器的 Arduino Uno , 它使用 8 位运算 。 要想在 Uno 上运行一个模型 , 理想情况下模型权重必须存储为 8 位整数(而许多台式计算机和笔记本电脑使用 32 位或 64 位浮点表示) 。 通过量化模型 , 权重的存储大小减少为原来的 4 分之一(如 32 位到 8 位值的量化) , 而对准确度的影响可以忽略(通常约为 1–3%) 。
|边缘AI新方法TinyML,超低功耗,在边缘设备进行机器学习
本文插图

8 位编码过程中量化误差的示意图(图源:https://tinymlbook.com/)
此外 , 在量化过程中 , 由于量化误差 , 一些信息可能会丢失 。 为了解决这个问题 , 量化感知(QA)训练被提出并作为一种替代方案 。
哈夫曼编码
哈夫曼编码是可变字长编码 (VLC) 的一种 , 该方法完全依据字符出现概率来构造异字头的平均长度最短的码字 。
编译
一旦模型被量化和编码 , 它就被转换成一种格式 , 该格式可以被某种形式的小型神经网络解释器解释 , 其中最流行的可能是 TF Lite(大小约 500kb)和 TF Lite Micro(大小约 20kb) 。 然后将该模型被编译成 C 或 C++(大多数微控制器都能有效地使用内存) , 并由设备上的解释器运行 。
|边缘AI新方法TinyML,超低功耗,在边缘设备进行机器学习
本文插图
TinyML 应用程序工作流(图源:https://tinymlbook.com/)
TinyML 大部分技巧来自于处理复杂的微控制器世界 。 TF Lite 以及 TF Lite Micro 之所以这么小是因为所有不必要的功能都被删除了 。 不幸的是 , 一些有用的功能也被删除了 , 如调试和可视化 。 这意味着 , 如果在部署期间出现错误 , 就很难判断发生了什么 。
此外 , 当模型存储在设备上时 , 还能进行推理 。 这意味着微控制器必须有足够大的内存来运行(1)操作系统和库;(2)神经网络解释器 , 如 TF Lite;(3)存储的神经权重和神经结构;(4)推理过程中的中间结果 。 因此 , 量化算法的峰值内存使用率 , 以及内存使用量、乘法累加单元(mac)的数量、精度等经常在 TinyML 研究论文中引用 。
为什么不在设备上训练
在设备上进行训练会带来更多的「并发症」 。 由于数值精度降低 , 很难保证充分训练网络所需的准确率水平 。 标准台式计算机上的自动区分方法对于机器精度大约是准确的 。 以 10^-16 的精度计算导数令人难以置信 , 但是对 8 位值使用自动微分将会导致较差的结果 。 在反向传播过程中 , 这些导数会组合并最终用于更新神经参数 。 在如此低的数值精度下 , 模型的准确度可能很差 。
话虽如此 , 神经网络已经使用 16 位和 8 位浮点数进行了训练 。
2015 年 , Suyog Gupta 及其同事发表的第一篇有关降低深度学习中的数值精度的论文是《Deep Learning with Limited Numerical Precision》 。 论文结果表明 , 32 位浮点表示形式可以减少为 16 位定点表示形式 , 而准确度几乎没有降低 。 但这是使用 stochastic rounding 算法的唯一情况 ,因为通常来说 , 它会产生无偏结果 。
2018 年 , Naigang Wang 及其同事在其论文《Training Deep Neural Networks with 8-bit Floating Point Numbers》中使用 8 位浮点数训练了神经网络 。 由于需要在反向传播期间保持梯度计算的保真度(在使用自动微分时能够实现机器精度) , 因此使用 8 位数字来训练神经网络要比使用推理更有挑战性 。
计算效率如何?
模型还可以进行裁剪 , 以提高计算效率 。 广泛部署在移动设备上的模型架构如 MobileNetV1 以及 MobileNetV2 就是很好的例子 。 这些本质上是卷积神经网络 , 它们重新定义了卷积运算 , 使其计算效率更高 。 这种更有效的卷积形式被称为深度可分离卷积 。 此外还可以使用基于硬件的配置以及神经架构搜索来优化架构延迟 , 但这些在本文中没有涉及 。


推荐阅读