Press "Enter" to skip to content

使用深度神经网络为什幺8位足够?

​ 深度学习是一种非常奇怪的技术。几十年来,它的发展轨迹与人工智能的主流完全不同,在少数信徒的努力下得以生存。几年前当我开始使用它时,它让我想起了第一次玩iPhone——感觉我得到了未来送回我们的东西,或者外星人的技术。

 

其结果之一是,我对它的工程直觉往往是错误的。当我遇到im2col时,根据我对图像处理的经验,内存冗余似乎很疯狂,但事实证明这是解决这个问题的一种有效方法。虽然有更复杂的方法可以产生更好的结果,但它们不是我的图形背景所预测的。

 

另一个似乎让很多人困惑的关键领域是你需要神经网络内的计算精度。在我职业生涯的大部分时间里,精确损失是相当容易估计的。我几乎从来不需要超过32位的浮点数,如果我这样做了,那肯定是因为用了一个脆弱的算法,即使是64位,很快也会出错。16位浮点数适合许多图形操作,只要它们不被太紧密地连接在一起。我可以使用8位值来显示最终输出,或者在算法的结尾,但它们对其他方面没有什幺用处。

 

结果证明,神经网络是不同的。您可以使用8位参数和中间缓冲区运行它们,并且在最终结果中不会遭受明显的损失。这让我感到惊讶,但它被一遍又一遍地重新发现。我发现的唯一一篇关于这个结果的论文中(在段末),它在我尝试过的每个应用程序中都是正确的。我还必须说服几乎所有我说的工程师我不是疯,看着他们通过自己的测试来证明这一点,所以这篇文章试图短路其中一些!

 

关注公众号CV技术指南,及时获取更多计算机视觉的内容

 

论文名称:

 

Improving the speed of neural networks on CPUs

 

论文地址:

 

http://static.googleusercontent.com/media/research.google.com/en/us/pubs/archive/37631.pdf

 

在公众号中回复“0001”即可获取此论文

 

它是如何工作的?

 

您可以在Jetpac移动框架中看到一个低精度方法的例子,但是为了保持简单,我将中间计算保持浮动,只使用8位来压缩权重。Nervana的NEON库也支持fp16,尽管它还不是8位的。只要在执行长点产品是完全连接和卷积操作的核心(占用绝大多数时间),您就不需要浮动,就可以将所有输入和输出保持为8位。我甚至看到证据表明你可以在8以下下降一两个而不会损失!池化层在8位上也很好,我通常已经看到过以更高的精度完成的偏置添加和激活函数(除了简单的relu),但即使对于这些精度来说,16位似乎也很好。

 

我通常使用经过全浮点训练的网络,然后再向下转换,因为我专注于推理,但训练也可以以低精度完成。通过对激活层的范围进行限制,可以实现用浮点数训练的情况下,仍然可以做到低精度的部署。

 

为什幺可以工作?

 

我看不出任何基本的数学原因为什幺结果能如此精确地保持,所以我开始相信这是一个成功训练过程的副作用。当我们试图教授一个网络时,其目的是让它理解作为有用证据的模式,并抛弃这些毫无意义的变化和不相关的细节。这意味着我们期望这个网络在噪声很大的情况下还是能够产生良好的结果。Dropout 是一个很好的例子,所以即使有非常不利的数据,最终的网络也可以运行。

 

从这个过程中产生的网络在数值上必须非常鲁棒,在计算中有大量的冗余,因此输入样本中的小差异不会影响结果。与姿态、位置和方向的差异相比,图像中的噪声实际上是一个相对较小的问题。所有的层在一定程度上都受到这些微小的输入变化的影响,所以它们都发展了对微小变化的容忍性。这意味着低精度计算引入的差异完全在网络学会处理的公差范围之内。直观上看,它们感觉就像哭泣者,无论你推了多少它们,它们都不会倒塌。

 

我是一名工程师,所以我很高兴看到它在实践中工作,而不用太担心为什幺,因为我不想看满嘴跑火车!有研究人员对这点做了研究。下面是论文。

 

论文名称:

 

Training deep neural networks with low precision multiplications

 

论文地址:

 

https://arxiv.org/abs/1412.7024

 

在公众号中回复“0001”即可获取此论文

 

这 意味着什幺 ?

 

这对任何试图优化深度神经网络的人来说都是一个非常好消息。在一般CPU方面,现代SIMD指令集通常面向浮动的,因此8位计算在最近的x86或ARM芯片上没有提供巨大的计算优势。但是DRAM访问需要很多的电力,而且也很慢,所以仅仅减少75%的带宽就可以是一个很大的帮助。能够将更多的值压缩到快速、低功耗的SRAM缓存和寄存器中也是一个胜利。

 

GPU最初的设计目的是取8位纹理值,以更高的精度进行计算,然后再以8位重新写入,所以它们非常适合我们的需要。它们通常有非常宽的管道到DRAM,所以收益并不那幺直接地实现,但可以通过一些工作来利用。我也学会了欣赏DSP是低功耗解决方案,它们的指令集面向我们所需要的固定点操作。像 Movidius’ Myriad这样的定制视觉芯片也很适合使用。

 

深度网络的鲁棒性意味着它们可以在非常广泛的硬件上有效地实现。结合这种灵活性和它们在许多几十年来一直看不到的人工智能任务上几乎神奇的效果,你可以明白为什幺我对它们将在未来几年改变我们的世界感到如此兴奋!

 

原文链接:

 

Why are Eight Bits Enough for Deep Neural Networks?

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注