目录
大规模神经网络的实现
由于规模的大小对于神经网络来说至关重要,因此深度学习需要高性能的硬件设施和软件实现。
GPU 实现
GPU 原本是作为图像专用的显卡使用的,为了将大量的 3D 坐标转化为 2D 显示器上的坐标,显卡必须并行地对许多顶点执行矩阵乘法与除法。之后,显卡必须并行地在每个像素上执行诸多计算,来确定每个像素点的颜色。在这两种情况下,计算都是非常简单的,并且不涉及 CPU 通常遇到的复杂的分支运算。例如,同一个刚体内的每个顶点都会乘上相同的矩阵;也就是说,不需要通过 if 语句来判断确定每个顶点需要乘哪个矩阵。各个计算过程之间也是完全相互独立的,因此能够实现并行操作。总的来说,这使显卡设计为拥有高度并行特性以及很高的内存带宽,同时也付出了一些代价,如相比传统的 CPU 更慢的时钟速度以及更弱的处理分支运算的能力。
与上述的实时图形算法相比, 神经网络算法所需要的性能特性是相同的。关于内存容量,需要考虑将大量的权重参数或中间数据放在内存中。关于总线带宽,当流经 GPU(或者 CPU)总线的数据超过某个限制时,就会成为瓶颈。神经网络算法通常涉及大量参数、激活值、梯度值的缓冲区,其中每个值在每一次训练迭代中都要被完全更新。这些缓冲太大,会超出传统的桌面计算机的高速缓存 (cache),所以内存带宽通常会成为主要瓶颈。相比 CPU, GPU 一个显著的优势是其极高的内存带宽。 神经网络的训练算法通常并不涉及大量的分支运算与复杂的控制指令,所以更适合在 GPU 硬件上训练。由于神经网络能够被分为多个单独的“神经元”,并且独立于同一层内其他神经元进行处理,所以神经网络可以从 GPU 的并行特性中受益匪浅。
由于相对简便的编程模型,强大的并行能力以及巨大的内存带宽, 通用 GPU 为我们提供了训练神经网络的理想平台。
在 GPU 上获得良好表现所需的技术与 CPU 上的技术非常不同。比如说,基于 CPU 的良好代码通常被设计为尽可能从高速缓存中读取更多的信息。然而在 GPU 中,大多数可写内存位置并不会被高速缓存,所以计算某个值两次往往会比计算一次然后从内存中读取更快。 GPU 代码是天生多线程的,不同线程之间必须仔细协调好。GPU 另一个常见的设定是使一个组中的所有线程都同时执行同一指令。这意味着 GPU 难以执行分支操作。线程被分为一个个称作 warp 的小组,在