为什么使用Android的神经网络API有时2乘3有时等于7?

2021-01-24 04:18:41

三分之二等于六,或者至少是我天真的期望。

众所周知,浮点矩阵乘法可能会导致各种意外情况,但您是否知道量化神经网络也不是确定性的?量化神经网络使用整数将神经网络中的权重和激活值相乘。幼稚的逻辑说,两个和三个表示并乘以整数的乘积始终应得出完全相同的结果,即六个。

但是,根据Android NNAPI驱动程序验证文档,如果量化张量的乘法在正或负位之内,则驱动程序有效。

量化乘法的不确定性是针对最常见的神经网络部署用例进行优化的结果。由于神经网络所涉及的数学运算的性质,用于分类和检测的神经网络通常在少量的不确定性下工作良好。此外,这样的网络通常受益于带有一些噪声的训练(例如,批量归一化)。同样,许多神经网络的输入来自生成固有可变图像的摄像机。

与在电话上部署神经网络相关的主要挑战是创建足够快速,省电且磁盘空间较小的模型。量化神经网络有助于改善所有这些类别。量化权重占用磁盘上的空间更少,传递能量更少,并且可以在不同级别的内存之间更快地移动。

最后一个问题是,量化预训练模型要比从头开始训练一个已有的模型便宜得多(在计算成本和工程工作方面)。因此,此Integer Inference论文中开发的方法旨在量化现有模型。关键思想是,浮点值可以近似为比例乘以量化值减去零点后的值。 (也可以看一下Tensorflow量化规范)。例如,在许多代表输入上评估模型时,可以通过查看权重和激活范围来相对容易地选择比例和零点。

在许多实际使用案例中,由于量化导致的预测性能损失很小,这种抽象已被广泛实施并移植到硬件中,例如,通过Qualcomm的Snapdragon神经处理引擎SDK。[严格来说,可以更改此硬件的驱动程序以确保确定性,但可能会导致推理时速度显着损失。]开发了SNPE,随后,考虑到可用的加速器种类繁多,Android试图简化部署神经网络的过程。从硬件和驱动程序无法产生确定性的量化数学的芯片制造商推出后,对驱动程序测试的限制便放松了。

不幸的是,NN API最多减少1个(对于大型网络,最多减少3个)为有趣的业务留出了很大的空间,可以少量改变结果。硬件和驱动程序供应商希望在各种神经网络上产生快速,低能耗的数字网络基准测试,并且不太关注可重复性,这可能导致神经网络输出出现意想不到的变化,例如,由于某些原因,硬件可能会更改权重的零点或小数位数,然后重新计算量化值。可能发生的另一件事是,该范围可能会略微偏移以使零可以精确表示(请参阅案例3:在Snapdragon Neural Processing Engine SDK中输入既为负也为正)。在此基础上,较大的网络会产生累积误差。实际上,在NN API驱动程序验证测试中,移动网络的错误范围增加到三个。其他网络可能会产生更大的错误。

量化神经网络缺乏确定性,触及了跨平台可再现性和神经网络性能优化的广泛问题。随着神经网络的部署越来越广泛,这些问题的重要性将日益提高。

第一个主要问题是,如果您想在多个平台上部署神经网络,则无法保证将获得相同的结果。即使您设法组建了一支庞大的团队来在许多不同的平台上测试网络,问题没有解决。缺乏确定性意味着即使在每个平台上测试网络,驱动程序更新也可能会意外更改结果。这会产生持续的工程成本,超出了在现有硬件上验证部署的初始固定成本。

下一个主要问题是,某些应用领域在可重复性和可审核性方面具有更严格的标准。假设在发生事故的自动驾驶汽车中使用了神经网络。对于审核目的,重要的是能够准确重放由汽车控制系统做出的决策。在最佳情况下,这需要大量的工程工作来跟踪所有驱动程序版本和内部测试,以验证任何部署的可重复性。

最终的问题是,尽管分类和检测对输出的微小变化并不特别敏感,但是缺乏确定性使得部署更具深度或更敏感变化的神经网络模型更具挑战性。例如,想象一下一种语言模型,该语言模型会展开许多迭代以解析或生成一个句子。在这种情况下,累积错误可能会导致意外结果。

在过去的几年中,从软件框架到硬件加速器的实验性神经网络部署激增。随着该领域的成熟,有关最佳实践的问题将慢慢得到解答。训练一次,部署到任何地方的能力将变得越来越容易。在确定性的特定情况下,最合理的下一步是进行驱动程序测试,以确保确定性并发布实现确定性API的供应商列表。

确定性问题只是能够部署到任何地方的难题的一小部分。另一个微妙但重要的问题是,不同的操作将在不同的硬件上更快地运行。即使网络可以以可重现的方式部署到任何地方,一个更根本的问题是网络在任何平台上是否都将快速高效地运行。确实,尽管在神经网络部署领域已经取得了很大的进步,但是要使生态系统更易于使用和更加成熟,还有很多工作要做。

如果您想了解有关神经网络部署或如何成为一名更好的机器学习工程师的更多信息,请在LinkedIn上与我联系,以查看我将来的博客文章! 如果您认为我可以帮助您专业成长,请查看我的辅导页面。