朝向最可爱的神经网络

这是一篇关于在微控制器上使用神经网络估计物体姿态的技术文章,主要内容如下:

  • 背景:需要用微控制器根据六个传感器的读数估计物体姿态,由于读数是非线性且相互耦合,无法得到显式解析解,决定尝试用简单神经网络近似逆映射函数。
  • 过程

    • 用正向模拟在计算机上生成训练数据;
    • 训练一个小神经网络(几层密集层,数百个参数)来近似逆映射函数;
    • 将网络部署到微控制器(Cortex-M0,16kB RAM,32kB 闪存)进行推理。
  • 遇到的困难:发现大多数相关论文和软件库复杂、重量级,且有很多未说明的假设和背景要求,如想用整数推理的简单密集神经网络的端到端训练案例很罕见。
  • 具体技术细节

    • 神经网络概述:通过一系列方程(层)将输入数据映射到输出值,需要自由参数和非线性激活函数,通过调整参数使预测接近实际值。
    • 量化概述:神经网络的量化是指用较小的表示替换部分或全部通常的 32 位浮点数参数,有“假量化”和用整数算术计算激活函数等方法,还需考虑如何找到合适的量化权重。
    • 目前进展:能用 TensorFlow 进行量化感知训练,生成可在微控制器上运行的.tflite 文件,使用 microflow-rs 进行推理,但需要浮点运算,不太“可爱”。
  • 下一步计划:避免使用高级框架如 TensorFlow 和 PyTorch,用 JAX 实现量化感知训练,包括定义自定义梯度、训练找到网络参数等,然后手动编写 Rust 进行矩阵乘法和激活缩放,预计总代码不到 200 行。
  • 相关附录

    • TensorFlow 相关:介绍了 TensorFlow 及其相关项目的发展和使用中的一些问题,如依赖冲突、构建运行时等。
    • 其他考虑的替代方案:列举了 CMSIS-NN、IREE、MicroTVM、uTensor、TinyEngine 等库或框架,但都因各种原因无法使用,如代码复杂、运行时大小超标等。
阅读 28
0 条评论