【问题标题】:How does tensorflow handle quantized networkstensorflow如何处理量化网络
【发布时间】:2019-06-14 04:40:02
【问题描述】:

我一直在阅读有关 TensorFlow 将神经网络从浮点数转换为 8 位值的信息。阅读他们存储库中的矩阵乘法代码似乎表明他们使用的是 8 位整数,而不是他们的文档可能指出的固定浮点数。

我想了解它是如何执行转换的。根据我的阅读,我猜测它将权重从 0 缩放到 255。例如,如果我们谈论的是输入图像上的卷积,其范围为 0 到 255。卷积的结果将是 32位整数,然后使用输出的最小值和最大值的统计信息将其缩小到 0 到 255。那是对的吗 ?

如果是这样,为什么会这样?

我检查了他们的代码的存储库 https://github.com/google/gemmlowp/blob/master/standalone/neon-gemm-kernel-benchmark.cc#L573

【问题讨论】:

  • tensorflow.org/performance/quantization 这让我相信 tensorflow 使用的是定点
  • tensorflow.org/performance/quantization 的最小/最大方案的“为什么会这样”似乎太模糊而无法回答。我想从根本上说,浮点格式中经常使用的额外位是不必要的,并且修复指数似乎不会损害实践中的性能。你认为它不应该工作有什么原因吗?

标签: tensorflow


【解决方案1】:

我知道我迟到了一年才回答这个问题,但这个答案可能对其他人有所帮助

量化

首先,量化是将连续范围的值(浮点数)转换为有限范围的离散值(量化整数qint)的过程。量化数据类型在嵌入式系统中非常常见,因为大多数嵌入式系统资源有限,并且无法在微控制器上加载经过训练的网络(可能超过 200 MB)。因此,我们必须找到一种方法来减小这些经过训练的网络的规模。

几乎所有经过训练的神经网络的大小都被权重占用。因为所有的权重都是浮点数,像 zip 这样的简单压缩格式不能很好地压缩它们。所以,我们必须找到另一种方式,即“量化”。

怎么做的?

量化是通过存储每个层权重的最小值和最大值,然后将每个浮点值压缩为代表最接近实数的八位整数来完成的。

例如,假设我们的神经网络中某一层的权重在 -4.85 到 2.35 之间变化,分别代表最小值和最大值。然后使用以下公式进行量化:

那么,例如,数字 1.3 和 0 将是:

这个简单的公式可以让大小缩小 75%,如您所见,如果我们想在加载后将其转换回浮点数,那么它是可逆的,这样您现有的浮点代码就可以在不做任何更改的情况下工作。将计算转移到 8 位将使经过训练的模型运行得更快,并且使用更少的功率,这对于嵌入式系统和移动设备至关重要。

量化与精度

这不会影响模型的精度吗?显然,它的影响并没有那么大,在这个article 我们可以看到原因。但简而言之,当我们试图教网络时,目的是让它理解模式并丢弃噪声。这意味着我们希望网络能够产生良好的结果,尽管有很多噪音。从这个过程中产生的网络必须在数值上非常健壮,在计算中具有大量冗余,以便输入样本的微小差异不会影响结果。这就是使神经网络在噪声方面具有鲁棒性的原因。因此,我们可以将量化误差视为训练有素的神经网络可以处理的某种噪声。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2015-10-22
    相关资源
    最近更新 更多