课程介绍
本课程是由加州大学伯克利分校的 Sophia Shao 讲授,课程编号是 EE290 。本课程主要在硬件和机器学习之间搭建一个交互的桥梁,目的是构建一个加速机器学习应用的高效硬件。学生通过了解机器学习的关键特性,利用核心的硬件优化原则,以及学习前沿的工业界应用,以一种非常实际的方法来理解行业所面临的挑战。
课程内容
DNN Kernel Computation
很多时候,学术研究通常会稍稍领先于时代,我们研究者应该积极观察业界目前正在提供什么解决方案,并思考业界真正缺少的是什么。一些极具影响力的学术研究不仅可以孕育出引人入胜理念,更深刻地改变人们对于特定系统设计或硬件设计的思考方式,尤其是在系统研究领域,此外还存在着引领商业化机遇的可能性。通用 GPU(GPGPU)也源自学术研究项目,它思考的点在于 GPU 这种并行计算是否对其他除了图形计算的领域同样重要,我们如何使得 GPU 更加的灵活。本节课讨论的 内核计算(Kernel Computation) 更像是应用和硬件之间的边界,而不是直接描述如何将配置层映射到硬件上,实际上课中更多描述的映射指的是基础操作。硬件设计中的许多机制实际上并未完整执行整个应用程序,它实际上执行的是一个特定的基本操作。本节课,Shao 将探讨这些基本操作是什么。
Convolution
Shao 首先从 卷积(Convolution) 开始,鉴于它是一个非常重要的 内核(Kernel) ,并且全连接层(Fully Connected Layer) 和基础矩阵乘法(Matrix Multiplication) 可以被视为是卷积的一种特殊情况,所以 Shao 将卷积作为一个引入空间概念,一些通用的优化手段,和一些用于描述计算维度或者其他形态若干参数的引子进行授课。
如上图所示,一个经典的卷积神经网络(Convolutional Neural Nets, CNN)包含几个卷积层(Convolution Layers),一些池化层(Pooling),一些 Relu 激活函数,以及一些全连接层(Fully Connected Layer),最终用户可以根据物体是什么来进行分类。因此,卷积实际上是一种广泛应用的计算方法,特别是在计算机视觉领域。本节探讨一下卷积中的参数有哪些,以及是如何实际执行卷积操作的。
上图中的 Input Activations 用于描述输入数据或来自前一层的数据,Weight 用于描述在训练过程中学习到的参数,卷积运算过后的结果即提到的 Output Activations,将被传递到下一层。这就是图中三个操作数的含义。其中输入激活中的 H 代表图像的高度,W 则代表其宽度;权重的 R 和 S 表示其尺寸,例如图中的例子就是一个 3x3 的卷积;经过卷积运算后得到输出激活,P 代表高度,Q 代表宽度。图中一个标准的卷积操作就是: 。顺便一说,这里其实是根据输入激活来调整权重的。内核计算的实质上就是乘积累加。卷积的重要性在于特定的卷积核作为滤波器,对于某些特定的输入模式(比如边缘或特定纹理)有强烈的响应,并且 CNN 中卷积核大小有限(例如 3x3, 5x5),意味着它只对局部区域进行操作,而不会受远距离信号的直接影响。同时虽然卷积操作本身是线性的,但 CNN 中还引入了 Relu 非线性激活函数和池化操作,使得系统整体变成非线性不变系统,增强了 CNN 的表达能力,也就是能提供更复杂的不在数据集中的特征。
这里我们引入一个新的参数,我们称之为步幅(Strike) 或者步距(Striding)。这主要用来描述不同卷积之间或者每次卷积之间移动了多少行或多少列。步幅的数值一般为 1 或者大于 1 的整数。步幅的作用在于控制输出激活的大小,减少计算量,以及算是一种特征下采样,通过减少输出激活的大小,保留重要的高层特征,同时减少不必要的细节。我们总结一下上图参数之间的数学关系,通常输出激活比输入激活小,这种情况我们一般称为有效卷积(Valid Conv):
当我们描述卷积的时候,我们也会引入另外一个参数,即填充(padding)。填充的作用在于确保输入与输出的图像大小一致,而非仅利用有效数据,如有效卷积做的一样。这样做的好处主要在于控制输出激活的大小,由于有限卷积中每次输入激活经过卷积运算后,输出激活的尺寸都会变小,为了避免在多层卷积后过快缩小,所以需要填充操作。同时,有些模型层与层之间需要实现尺寸对齐,或者保留边缘信息,防止输入激活的边缘信息被忽略。虽然填充不是必须的,但是它在 CNN 中是一个非常常见的工具,能够显著提升网络的表现力和灵活性。此外,我们在采用填充技术的时候有一种高效的硬件使用方案,即并不真正的填进 0 值,而是只计算对应窗口的有效部分。这种情况下,我们就需要设计一个相对高效的位置索引机制。
这里说个题外话,早期的层级的输入激活大小按经验来说,至少也应该是 224 x 224 的大小,才能保证提取的特征足够明显。下图是在 2-D 卷积的基础上发展出的 3-D 卷积。
全连接层(Fully-Connected Layer)其实是一种特殊的卷积层。因此,它依然保留了许多先前讨论的卷积结构和参数数量,但其中明显不同的是,大部份参数都被简化为 1 或者 0。
关于卷积的硬件实现方法目前最流行的有四种:直接卷积(Direct Conv),也就是用的最广泛的方法,由于现在的硬件设计越发先进,如 Tensor Core,对张量计算的支持更好,现在大多采用直接卷积的方法进行计算;第二种方法就是矩阵乘法计算(GEMM),一般通过 im2col 函数将卷积运算转换为矩阵乘法运算,如下图所示;第三种是利用 FFT 进行高效的卷积运算,但是由于 FFT 自身的局限性,已经很少使用了;第四种是 Winograd 变换进行卷积运算,在理念上和 FFT 很类似,它在性能上表现优异,在小型的卷积核上也能很好运作。
以上是基于不同的卷积方式进行举例说明。本讲论述完毕!