【发布时间】:2018-04-10 02:54:58
【问题描述】:
大多数神经网络都使用浮点权重/偏差进行训练。
存在将权重从浮点数转换为整数的量化方法,以便部署在较小的平台上。
您能否从头开始构建神经网络来约束所有参数,并将其更新为整数算术?
这样的网络能否达到良好的准确性?
【问题讨论】:
标签: neural-network fixed-point
大多数神经网络都使用浮点权重/偏差进行训练。
存在将权重从浮点数转换为整数的量化方法,以便部署在较小的平台上。
您能否从头开始构建神经网络来约束所有参数,并将其更新为整数算术?
这样的网络能否达到良好的准确性?
【问题讨论】:
标签: neural-network fixed-point
(我对定点略知一二,并且从 90 年代开始只有一些生疏的 NN 经验,所以我要说的一点儿盐!)
一般的答案是肯定的,但这取决于许多因素。
请记住,浮点算术基本上是整数有效数与整数指数的组合,因此它在底层都是整数。真正的问题是:没有浮点数你能有效地做到这一点吗?
首先,“良好的准确性”高度依赖于许多因素。完全可以执行比浮点更高粒度的整数运算。例如,32 位整数有 31 位尾数,而 32 位浮点数实际上只有 24 位。因此,如果您不需要浮点数为您提供接近零的附加精度,那么这完全取决于您选择的类型。 16 位(甚至 8 位)值可能足以满足大部分处理。
其次,将输入累加到神经元的问题是,除非您知道节点的最大输入数量,否则您无法确定所累加值的上限是多少。因此,您必须在编译时指定此限制。
第三,在一个训练有素的网络执行过程中,最复杂的操作通常是激活函数。同样,您首先必须考虑您将在哪个值范围内操作。然后,您需要在没有 FPU 的帮助下使用它提供的所有高级数学函数来实现该函数。考虑这样做的一种方法是通过查找表。
最后,训练涉及测量值之间的误差,而且误差通常很小。这就是准确性值得关注的地方。如果您测量的差异太小,它们将四舍五入为零,这可能会阻碍进展。一种解决方案是通过提供更多小数位来提高值的分辨率。
这里整数相对于浮点的一个优势是它们的分布均匀。当浮点数随着幅度的增加而失去精度时,整数保持恒定的精度。这意味着,如果您尝试测量接近 1 的值的非常小的差异,则与这些值接近 0 时相比,您应该不会遇到更多麻烦。对于浮点数而言,情况并非如此。
如果训练时间不是瓶颈,则可以使用比用于运行网络的类型更高精度的类型来训练网络。您甚至可以使用浮点类型训练网络并使用较低精度的整数运行它,但您需要注意这些快捷方式将带来的行为差异。
简而言之,所涉及的问题绝不是不可克服的,但您需要承担一些通常可以通过使用浮点来节省的脑力劳动。但是,尤其是在您的硬件受到物理限制的情况下,这可能是一种非常有益的方法,因为浮点运算所需的芯片和功率是整数运算的 100 倍。
希望对您有所帮助。
【讨论】: