在神经网络中,为什么通常将神经元数设置为2 ^ n?

问题描述

例如,在堆积Dense layers时,通常,我们总是将神经元数设置为256个神经元,128个神经元,64个神经元,等等。

我的问题是:

常规使用2^n神经元的原因是什么?这种实现是否会使代码运行更快?节省内存?还是还有其他原因?

解决方法

这是历史。用于GPU计算的早期神经网络实现(以CUDA,OpenCL等编写)必须考虑有效的内存管理以实现数据并行性。

通常来说,您必须在物理处理器上对齐N个计算。物理处理器的数量通常是2的幂。因此,如果计算的数量不是2的幂,则不能将计算以1:1的方式映射,而必须四处移动,这需要附加的内存管理(进一步阅读) here)。这仅与并行批处理有关,即,批大小为2的幂可以为您带来更好的性能。有趣的是,使用其他超参数(例如,隐藏单位的数量为2的幂)永远不会带来可衡量的收益-我认为,随着神经网络越来越流行,人们只是在不了解原因并将其推广到其他超参数的情况下就开始采用这种做法。>

如今,某些低级实现仍可能会从该约定中受益,但是如果您在2020年将CUDA与Tensorflow或Pytorch一起使用现代GPU架构,则批量大小为128之间的差异是不太可能的和129,因为这些系统针对非常有效的数据并行性进行了高度优化。