首页 > 其他分享 >深度学习应用 - 大规模深度学习篇

深度学习应用 - 大规模深度学习篇

时间:2024-09-02 08:53:45浏览次数:13  
标签:text al 学习 大规模 神经网络 GPU 深度 et CPU

序言

在科技日新月异的今天,人工智能( AI \text{AI} AI)已成为推动社会进步与产业升级的关键力量。其中,深度学习作为AI领域的璀璨明珠,凭借其强大的数据处理能力和特征学习能力,正引领着一场前所未有的智能革命。大规模深度学习,作为深度学习技术的前沿阵地,更是将这一技术的潜力发挥到了极致。它不仅能够处理海量数据,还能在复杂场景中挖掘出更深层次的规律和知识,为科学研究、工业制造、医疗健康、智慧城市等众多领域带来了前所未有的变革机遇。

大规模深度学习

  • 深度学习的基本思想基于联结主义:尽管机器学习模型中单个生物性的神经元或者说是单个特征不是智能的,但是大量的神经元或者特征作用在一起往往能够表现出智能。
    • 我们必须着重强调神经元数量必须很大这个事实。
    • 相比 20 20 20 世纪 80 80 80 年代,如今神经网络的精度以及处理任务的复杂度都有一定提升,网络规模的巨大提升是一个关键的因素。
    • 在过去的三四十年中,网络规模是以指数级的速度递增的,尽管如今的人工神经网络的规模也仅仅和昆虫的神经系统差不多。
  • 大规模神经网络的必要性,所以深度学习需要高性能的硬件设施和软件实现。

快速的CPU实现

  • 传统的神经网络是用单台机器的 CPU \text{CPU} CPU 来训练的。如今,这种做法通常被视为是不可取的。现在,我们通常使用 GPU \text{GPU} GPU或者许多台机器的 CPU \text{CPU} CPU 连接在一起进行计算。
  • 在使用这种昂贵配置之前,为论证 CPU \text{CPU} CPU 无法承担神经网络所需的巨大计算量,研究者们付出了巨大的努力。
  • 描述如何实现高效的数值 CPU \text{CPU} CPU 代码已经超出了我们的讨论范围,但是我们在这里还是要强调通过设计一些特定的 CPU \text{CPU} CPU 上的操作可以大大提升效率。
    • 例如,在 2011 2011 2011年,最好的 CPU \text{CPU} CPU 在训练神经网络时使用定点运算能够比浮点运算跑的更快。
    • 通过调整定点运算的实现方式, Vanhoucke et al. (2011) \text{Vanhoucke et al. (2011)} Vanhoucke et al. (2011) 获得了相对一个很强的浮点运算系统 3 3 3 倍的加速。
    • 因为各个新型 CPU \text{CPU} CPU 都有各自不同的特性,所以有时候采用浮点运算实现会更快。
    • 一条重要的准则就是通过特殊设计的数值运算可以获得巨大的回报。
    • 除了选择定点运算或者浮点运算以外,还包括其他的策略,如通过优化数据结构避免高速缓存缺失、使用向量指令等。
    • 如果模型规模不会限制模型表现(不会影响模型精度)时,机器学习的研究者们一般忽略这些实现的细节。

GPU实现

  • 许多现代神经网络的实现基于图形处理器 ( Graphics Processing Unit, GPU \text{Graphics Processing Unit, GPU} Graphics Processing Unit, GPU)。
    • GPU \text{GPU} GPU是一种特殊设计的硬件,设计的原始目的是为了处理图形应用。
    • 视频游戏系统的消费市场刺激了图形处理硬件的发展。
    • 它为视频游戏所设计的特性也可以使神经网络的计算受益。
  • 视频游戏要求许多操作能够快速并行地实现。
    • 环境和角色模型通过一系列顶点的 3D \text{3D} 3D 坐标确定。
    • 为了将大量的 3D \text{3D} 3D 坐标转化为 2D \text{2D} 2D 显示器上的坐标,显卡必须快速实现矩阵乘法或者除法。
    • 之后,显卡必须并行地实现每个像素上的计算来确定每个像素点的颜色。
    • 在这两种情况下,计算都是非常简单的,并且不涉及 CPU \text{CPU} CPU 通常遇到的复杂的分支运算。
    • 例如,同一个刚体内的每个顶点都会乘上相同的矩阵;也就是说,不需要通过 if \text{if} if 判断确定顶点需要乘哪个矩阵。
    • 计算过程也是完全相互独立的,因此也能够并行操作。
    • 计算过程还涉及处理大量内存缓冲以及描述每一个对象的纹理(颜色模式)如何渲染的位图信息。
    • 总的来说,这使显卡设计为拥有高度并行特性以及很高的内存带宽,同时也付出了一些代价,如相比传统的 CPU \text{CPU} CPU 更慢的时钟速度以及更弱的处理分支运算的能力。
  • 与上述的实时图形算法相比,神经网络算法需要的是相同的性能特性。
    • 神经网络算法通常涉及大量参数、激活值、梯度值的缓冲区,其中每个值在每一次训练迭代中都要被完全更新。
    • 这些缓冲太大,会超出传统的桌面计算机的高速缓存 ( cache \text{cache} cache),所以内存带宽通常会成为主要瓶颈。
    • 相比 CPU \text{CPU} CPU, GPU \text{GPU} GPU极高的内存带宽成为了一个显著的优势。
    • 神经网络的训练算法通常并不涉及分支运算和复杂的控制指令,所以更适合在 GPU \text{GPU} GPU 硬件上训练。
    • 由于神经网络能够被分为多个单独的 ‘‘神经元’’,并且独立于同一层内其他神经元进行处理,所以神经网络可以从 GPU \text{GPU} GPU 的并行特性中受益匪浅。
  • GPU \text{GPU} GPU硬件最初专为图形任务而设计。
    • 随着时间的推移, GPU \text{GPU} GPU也变得更灵活,允许定制的子程序处理转化顶点坐标或者计算像素颜色的任务。
    • 原则上, GPU \text{GPU} GPU不要求这些像素值实际基于渲染任务。
    • 将计算的输出值作为像素值写入缓冲区, GPU \text{GPU} GPU可以用于科学计算。
    • Steinkrau et al. (2005) \text{Steinkrau et al. (2005)} Steinkrau et al. (2005) 在 GPU \text{GPU} GPU 上实现了一个两层全连接的神经网络,并获得了相对基于 GPU \text{GPU} GPU 的基准方法三倍的加速。
    • 不久以后, Chellapilla et al.(2006) \text{Chellapilla et al.(2006)} Chellapilla et al.(2006) 也论证了相同的技术可以用来加速训练监督卷积网络。
  • 使用显卡训练神经网络的热度在通用 GPU \text{GPU} GPU发布以后开始爆炸性增长。这种通用 GPU \text{GPU} GPU可以执行任意的代码,而并非仅仅渲染子程序。 NVIDIA \text{NVIDIA} NVIDIA 的 CUDA \text{CUDA} CUDA 编程语言使得我们可以用一种像 C \text{C} C 一样的语言实现任意代码。由于相对简便的编程语言,强大的并行能力以及巨大的内存带宽, 通用 GPU \text{GPU} GPU为我们提供了训练神经网络的理想平台。在它发布以后不久,这个平台就迅速被深度学习的研究者们接纳了:
    • Raina et al., 2009b \text{Raina et al., 2009b} Raina et al., 2009b
    • Ciresan et al., 2010 \text{Ciresan et al., 2010} Ciresan et al., 2010
  • 如何在通用 GPU \text{GPU} GPU上写高效的代码依然是一个难题。
    • 在 GPU \text{GPU} GPU上获得很好表现所需的技术与 CPU \text{CPU} CPU 上的技术非常不同。
    • 比如说,基于 CPU \text{CPU} CPU 的良好代码通常被设计为尽可能从高速缓存中读取更多的信息。
    • 然而在 GPU \text{GPU} GPU中,大多数可写内存位置并不会被高速缓存,所以计算某个值两次往往会比计算一次然后从内存中读取更快。
    • GPU ‾ \underline{\text{GPU}} GPU​代码是天生多线程的,不同线程之间必须仔细协调好
    • 例如,如果能够把数据级联 ( coalesced \text{coalesced} coalesced) 起来,那么涉及内存的操作一般会更快。
    • 当几个线程同时需要读/写一个值的时候,像这样的级联会作为一次内存操作出现。
    • 不同的 GPU \text{GPU} GPU可能采用不同的级联读/写数据的方式。
    • 通常来说,如果在 n n n 个线程中,线程 i i i 对应的是第 i + j i + j i+j处的内存,其中 j j j 是 2 2 2 的某个幂的倍数。
    • 具体的设定在不同的 GPU \text{GPU} GPU型号中有所区别。
    • GPU \text{GPU} GPU另一个常见的设定是使一个组中的所有线程都同时执行同一指令。
    • 这意味着 GPU \text{GPU} GPU上的分支操作是很困难的。
    • 线程被分为一个个称作warp ( warp \text{warp} warp) 的小组。
    • 在一个 warp \text{warp} warp中的每一个线程在每一个循环中执行同一指令,所以当同一个 warp \text{warp} warp中的不同线程需要执行不同的指令时,需要使用串行而非并行的方式。
  • 由于实现高效 GPU \text{GPU} GPU代码的困难性,研究人员应该构建他们的工作流程,避免对每一个新的模型或算法都编写新的 GPU \text{GPU} GPU代码。
    • 通常来讲,人们会选择建立一个包含高效操作(如卷积和矩阵乘法)的软件库解决这个问题,然后再从库中调用所需要的操作确定模型。
    • 例如,机器学习库 Pylearn2 \textbf{Pylearn2} Pylearn2 ( Goodfellow et al., 2013e \text{Goodfellow et al., 2013e} Goodfellow et al., 2013e) 通过调用 Theano \textbf{Theano} Theano ( Bergstra et al., 2010c; Bastien et al., 2012a \text{Bergstra et al., 2010c; Bastien et al., 2012a} Bergstra et al., 2010c; Bastien et al., 2012a) 和 cuda-convnet \textbf{cuda-convnet} cuda-convnet ( Krizhevsky, 2010 \text{Krizhevsky, 2010} Krizhevsky, 2010) 提供的高性能操作,囊括了许多机器学习算法。
    • 这种分解方法还可以简化对多种硬件的支持。
    • 例如,同一个 Theano \text{Theano} Theano 程序可以在 CPU \text{CPU} CPU 或者 GPU \text{GPU} GPU上运行,而不需要改变调用 Theano \text{Theano} Theano 的方式。
    • 其他库如 Tensorflow \textbf{Tensorflow} Tensorflow ( Abadi et al., 2015 \text{Abadi et al., 2015} Abadi et al., 2015) 和 Torch \textbf{Torch} Torch ( Collobert et al., 2011b \text{Collobert et al., 2011b} Collobert et al., 2011b) 也提供了类似的功能。

大规模的分布式实现

  • 在许多情况下,单个机器的计算资源是有限的。因此我们希望把训练或者推断的任务分摊到多个机器上进行。
  • 分布式的推断是容易实现的,因为每一个输入的样本都可以在单独的机器上运行。这也被称为数据并行 ( data parallelism \text{data parallelism} data parallelism)。
  • 同样的, 模型并行 ( model parallelism \text{model parallelism} model parallelism) 也是可行的,其中多个机器共同运行一个数据点,每一个机器负责模型的一个部分。对于推断和学习,这都是可行的。
  • 训练中, 数据并行在某种程度上说更难。对于随机梯度下降的单步来说,我们可以增加 minibatch \text{minibatch} minibatch的大小,但是从优化性能的角度来说,通常我们得到反馈少于线性的反馈。使用多个机器并行地计算多个梯度下降步是一个更好的选择。不幸的是,梯度下降的标准定义完全是一个串行的过程:第 t t t 步的梯度是第 t − 1 t − 1 t−1 步所得参数的函数。
  • 这个问题可以使用异步随机梯度下降 ( Asynchoronous Stochastic Gradient Descent \text{Asynchoronous Stochastic Gradient Descent} Asynchoronous Stochastic Gradient Descent) ( Bengio and Bengio, 1996; Recht et al., 2011 \text{Bengio and Bengio, 1996; Recht et al., 2011} Bengio and Bengio, 1996; Recht et al., 2011) 解决。
    • 在这个方法中,几个处理器的核共用存有参数的内存。
    • 每一个核在无锁情况下读取了这些参数,然后计算对应的梯度,然后在无锁状态下更新了这些参数。
    • 这种方法减少了每一个梯度下降所获得的平均提升,因为一些核把其他的核所更新的参数(写)覆盖了。
    • 但因为更新步数的速率增加,总体上还是加快了学习过程。
    • Dean et al. (2012) \text{Dean et al. (2012)} Dean et al. (2012) 率先提出了多机器无锁的梯度下降方法,其中参数是由参数服务器 ( parameter server \text{parameter server} parameter server) 管理而非存储在共用的内存中。
    • 分布式的异步梯度下降方法依然是训练深度神经网络的基本方法,被工业界很多机器学习组所使用 ( Chilimbi et al., 2014; Wu et al., 2015 \text{Chilimbi et al., 2014; Wu et al., 2015} Chilimbi et al., 2014; Wu et al., 2015)。
    • 学术界的深度学习研究者们通常无法负担那么大规模的分布式学习系统,但是一些研究关注于如何在校园环境中相对较廉价的硬件系统中构造分布式网络 ( Coates et al., 2013 \text{Coates et al., 2013} Coates et al., 2013)。

模型压缩

  • 在许多商业应用的机器学习模型中,一个时间和内存开销较小的推断算法一个时间和内存开销较小的训练算法要更为重要。
    • 对于那些不需要个性化设计的应用来说,我们只需要一次性的训练模型,然后它就可以被成千上万的用户使用。
    • 在许多情况下,相比开发者,终端用户的可用资源往往更有限。例如,研究者们可以使用巨大的计算机集群训练一个语音识别的网络,然后发布到移动手机上。
  • 减少推断所需开销的一个关键策略是模型压缩 ( model compression \text{model compression} model compression) ( Buciluˇa et al., 2006 \text{Buciluˇa et al., 2006} Buciluˇa et al., 2006)。 模型压缩的基本思想是用一个更小的模型取代替原始耗时的模型,只需更少内存和运行时间来存储和评估。
  • 原始模型的规模很大,且主要为了防止过拟合时,模型压缩可以起到作用。
    • 在许多情况下,拥有最小泛化误差的模型往往是多个独立训练而成的模型的集成。
    • 评估所有 n n n 个集成成员是昂贵的。
    • 有时候,当单个模型很大(例如,如果它使用 Dropout \text{Dropout} Dropout正则化)时,其泛化能力也会很好。
  • 这些巨大的模型学习某个函数 f ( x ) f(\boldsymbol{x}) f(x) 时,但选用的参数数量超过了任务所需的参数数量。
    • 仅仅训练样本数是有限的,所以网络的规模是受限的。
    • 只要我们拟合了这个函数 f ( x ) f(\boldsymbol{x}) f(x),我们就可以生成一个拥有了无穷多训练样本的训练集,只需将 f f f 作用于任意生成的 x \boldsymbol{x} x。
    • 然后,我们使用这些样本训练一个新的更小的模型,在这些点上拟合 f ( x ) f(\boldsymbol{x}) f(x)。
    • 为了更加充分地利用了这个新的小模型的容量,最好能够从一个类似于真实的测试数据(后面会用到)的分布中采样 x \boldsymbol{x} x。
    • 这个过程可以通过损坏训练样本或者从原始训练数据训练的生成模型中采样完成。
  • 此外,我们还可以仅在原始训练数据上训练一个更小的模型,但只是为了复制模型的其他特征,比如在不正确的类上的后验分布 ( Hinton et al., 2014, 2015 \text{Hinton et al., 2014, 2015} Hinton et al., 2014, 2015)。

动态结构

  • 一般来说,加速数据处理系统的一种策略是构造一个系统,这个系统用动态结构 ( dynamic structure \text{dynamic structure} dynamic structure) 描述图中处理输入的所需计算过程。
    • 在给定一个输入的情况中,数据处理系统可以动态地决定运行神经网络系统的哪一部分。
    • 单个神经网络内部同样也存在动态结构,给定输入信息,决定特征( 隐藏单元)哪一部分用于计算。
    • 这种神经网络中的动态结构有时被称为条件计算 ( conditional computation \text{conditional computation} conditional computation) ( Bengio et al., 2013b,c \text{Bengio et al., 2013b,c} Bengio et al., 2013b,c)。
    • 由于模型结构许多部分可能只跟输入的一小部分有关,只计算那些需要的特征可以起到加速的目的。
  • 动态结构计算是一种基础的计算机科学方法,广泛应用于软件工程项目。应用于神经网络的最简单的动态结构基于决定神经网络(或者其他机器学习模型)中的哪些子集需要应用于特定的输入。
  • 在分类器中加速推断的可行策略是使用级联 ( cascade \text{cascade} cascade) 的分类器。
    • 当目标是检测罕见对象(或事件)的是否存在,可以应用级联策略。
    • 要确定对象是否存在,我们必须使用具有高容量、运行昂贵的复杂分类器。
    • 然而,因为对象是罕见的,我们通常可以使用更少的计算拒绝不包含对象的输入。
    • 在这些情况下,我们可以训练一序列分类器。
    • 序列中的第一分类器具有低容量,训练为具有高召回率。
    • 换句话说,他们被训练为确保对象存在时,我们不会错误地拒绝输入。
    • 最终的分类器训练为具有高精度。
    • 在测试时,我们按照顺序运行分类器进行推断,一旦级联中的任何一个拒绝它,就选择抛弃。
    • 总的来说,这允许我们使用高容量模型以较高的置信度验证对象的存在,而不是强制我们为每个样本付出完全推断的成本。
    • 有两种不同的方式可以使得级联实现高容量。
      • 一种方法是使级联中靠后的成员单独具有高容量。在这种情况下,系统作为一个整体显然具有高容量,因为它的一些个体成员是高容量的。
      • 还可以使用另一种级联,其中每个单独的模型具有低容量,但是由于许多小型模型的组合,整个系统具有高容量。 Viola and Jones (2001) \text{Viola and Jones (2001)} Viola and Jones (2001) 使用级联的增强决策树实现适合在手持数字相机中使用的快速并且鲁棒的面部检测器。
      • 本质上,它们的分类器使用滑动窗口方法来定位面部,许多窗口会被检查,如果它们不包含面部则被拒绝。
    • 级联的另一个版本使用早期模型来实现一种硬性的注意机制:级联的早期成员定位对象,并且级联的后续成员在给定对象位置的情况下执行进一步处理。
    • 例如, Google \text{Google} Google使用两步级联从街景视图图像中转换地址编号,首先使用一个机器学习模型查找地址编号,然后使用另一个机器学习模型将其转录 ( Goodfellow et al., 2014d \text{Goodfellow et al., 2014d} Goodfellow et al., 2014d)。
  • 决策树本身是动态结构的一个例子,因为树中的每个节点决定应该使用哪个子树来评估输入。
    • 一个结合深度学习和动态结构的简单方法是训练一个决策树,其中每个节点使用神经网络做出决策 (Guo and Gelfand, 1992),虽然这种方法没有实现加速推断计算的目标。
  • 类似的,我们可以使用称为选通器 ( gater \text{gater} gater) 的神经网络来选择在给定当前输入的情况下将使用几个专家网络 ( expert network \text{expert network} expert network) 中的哪一个来计算输出。
    • 这个想法的第一个版本被称为专家混合体 ( mixture of experts \text{mixture of experts} mixture of experts) ( Nowlan, 1990; Jacobs et al., 1991 \text{Nowlan, 1990; Jacobs et al., 1991} Nowlan, 1990; Jacobs et al., 1991),其中选通器为每个专家输出一个概率或权重(通过非线性的 softmax \text{softmax} softmax 函数获得),并且最终输出由各个专家输出的加权组合获得。
    • 在这种情况下,使用选通器不会降低计算成本,但如果每个样本的选通器选择单个专家,我们就会获得一个特殊的硬专家混合体 ( hard mixture of experts \text{hard mixture of experts} hard mixture of experts) ( Collobert et al., 2001, 2002 \text{Collobert et al., 2001, 2002} Collobert et al., 2001, 2002),这可以加速推断和训练的时间。
    • 当选通器决策的数量很小的时候,这个策略效果会很好,因为它不是组合的。
    • 但是当我们想要选择不同的单元或参数子集时,不可能使用 ‘‘软开关’’,因为它需要枚举(和计算输出)所有的选通器配置。
    • 为了解决这个问题,许多工作探索了几种方法来训练组合的选通器。 Bengio et al. (2013c) \text{Bengio et al. (2013c)} Bengio et al. (2013c) 提出使用选通器概率梯度的若干估计器,而 Bacon et al. (2015) \text{Bacon et al. (2015)} Bacon et al. (2015); Bengio et al. (2015a) \text{Bengio et al. (2015a)} Bengio et al. (2015a) 使用强化学习技术( 策略梯度 ( policy gradient \text{policy gradient} policy gradient))来学习一种形式的隐藏单元的条件 Dropout \text{Dropout} Dropout,减少了实际的计算成本,而不会对近似的质量产生负面影响。
  • 另一种动态结构是开关,其中隐藏单元可以根据具体情况从不同单元接收输入。
    • 这种动态路由方法可以理解为注意机制 ( attention mechanism \text{attention mechanism} attention mechanism) ( Olshausen et al., 1993 \text{Olshausen et al., 1993} Olshausen et al., 1993)。
    • 目前为止,硬性开关的使用在大规模应用中还没有被证明是有效的。
    • 较为先进的方法一般采用对许多可能的输入使用加权平均,因此不能收获动态结构所有可能的计算益处。
    • 先进的注意机制在后续篇章:深度学习应用之自然语言处理中描述。
  • 使用动态结构化系统的主要障碍是由于系统针对不同输入的不同代码分支导致的并行度降低。
    • 这意味着网络中只有很少的操作可以被描述为对样本 minibatch \text{minibatch} minibatch的矩阵乘法或批量卷积。
    • 我们可以写更多的专用子程序,用不同的核对样本做卷积,或者通过不同的权重列来乘以设计矩阵的每一行。
    • 不幸的是,这些专用的子程序难以高效地实现。
    • 由于缺乏高速缓存的一致性, CPU \text{CPU} CPU 实现将是缓慢的。
    • GPU \text{GPU} GPU的实现也将是缓慢的,因为缺乏级联的内存操作以及 warp \text{warp} warp成员使用不同分支时需要串行化操作。
    • 在一些情况下,可以将样本分成组缓解这些问题,这些组都采用相同的分支并且同时处理这些样本组。
    • 在离线环境中,这是最小化处理固定量样本所需时间的一项可接受的策略。
    • 在实时系统中,样本必须连续处理,对工作负载进行分区可能会导致负载均衡问题。
    • 例如,如果我们分配一台机器处理级联中的第一步,另一台机器处理级联中的最后一步,那么第一台机器将倾向于过载,最后一个机器倾向于欠载。
    • 如果每个机器被分配以实现神经决策树的不同节点,也会出现类似的问题。

深度网络的专用硬件实现

  • 自从早期的神经网络研究以来,硬件设计者已经致力于可以加速神经网络算法的训练和/或推断的专用硬件实现。
  • 读者可以查看早期和更近的专用硬件深度网络的评论 ( Lindsey and Lindblad, 1994; Beiu et al., 2003; Misra and Saha, 2010 \text{Lindsey and Lindblad, 1994; Beiu et al., 2003; Misra and Saha, 2010} Lindsey and Lindblad, 1994; Beiu et al., 2003; Misra and Saha, 2010)。
  • 不同形式的专用硬件 ( Graf and Jackel, 1989; Mead and Ismail, 2012; Kim et al.,2009; Pham et al., 2012; Chen et al., 2014b,a \text{Graf and Jackel, 1989; Mead and Ismail, 2012; Kim et al.,2009; Pham et al., 2012; Chen et al., 2014b,a} Graf and Jackel, 1989; Mead and Ismail, 2012; Kim et al.,2009; Pham et al., 2012; Chen et al., 2014b,a) 的研究已经持续了好几十年。比如:
    • 专用集成电路 ( application-specific integrated circuit, ASIC \text{application-specific integrated circuit, ASIC} application-specific integrated circuit, ASIC) 的数字(基于数字的二进制表示),
    • 模拟 ( Graf and Jackel, 1989; Mead and Ismail, 2012 \text{Graf and Jackel, 1989; Mead and Ismail, 2012} Graf and Jackel, 1989; Mead and Ismail, 2012)(基于作为电压或电流连续值的物理实现)和混合实现(组合数字和模拟组件)。
    • 近年来更灵活的可编程门阵列 ( field programmable gated array, FPGA \text{field programmable gated array, FPGA} field programmable gated array, FPGA) 实现(其中电路的具体细节可以建立后写入芯片)也得到了长足发展。
  • 虽然 CPU \text{CPU} CPU 和 GPU \text{GPU} GPU上的软件实现通常使用 32 32 32 或 64 64 64 位的精度来表示浮点数,但是长期以来使用较低的精度在更短的时间内完成推断也是可行的 ( Holt and Baker,1991; Holi and Hwang, 1993; Presley and Haggard, 1994; Simard and Graf, 1994; Wawrzynek et al., 1996; Savich et al., 2007 \text{Holt and Baker,1991; Holi and Hwang, 1993; Presley and Haggard, 1994; Simard and Graf, 1994; Wawrzynek et al., 1996; Savich et al., 2007} Holt and Baker,1991; Holi and Hwang, 1993; Presley and Haggard, 1994; Simard and Graf, 1994; Wawrzynek et al., 1996; Savich et al., 2007)。
  • 这已成为近年来更迫切的问题,因为深度学习在工业产品中越来越受欢迎,并且由于更快的硬件产生的巨大影响已经通过 GPU \text{GPU} GPU的使用得到了证明。
  • 激励当前对深度网络专用硬件研究的另一个因素是单个 CPU \text{CPU} CPU 或 GPU \text{GPU} GPU核心的进展速度已经减慢,并且最近计算速度的改进来自于核心的并行化(无论 CPU \text{CPU} CPU 还是 GPU \text{GPU} GPU)。
  • 这与 20 20 20 世纪 90 90 90 年代的情况(前面的神经网络时代)非常不同,其中神经网络的硬件实现(从开始到芯片的可用性可能需要两年)不能跟上快速进展和价格低廉的通用 CPU \text{CPU} CPU 的脚步。
  • 因此,在针对诸如手机等低功率设备开发新的硬件设计时,研究专用硬件是进一步推动其发展的方式,旨在用于深度学习的一般公众应用(例如,具有语音、 计算机视觉或自然语言功能的设施)。
  • 最近对基于反向传播神经网络的低精度实现的工作 ( Vanhoucke et al., 2011; Courbariaux et al., 2015; Gupta et al., 2015 \text{Vanhoucke et al., 2011; Courbariaux et al., 2015; Gupta et al., 2015} Vanhoucke et al., 2011; Courbariaux et al., 2015; Gupta et al., 2015) 表明, 8 8 8 和 16 16 16 位之间的精度足以满足使用或训练基于反向传播的深度神经网络的要求。
    • 显而易见的是,在训练期间需要比在推断时更高的精度,并且数字某些形式的动态定点表示可以用于减少每个数需要的存储空间。
    • 传统的定点数限制为固定范围(其对应于浮点表示中的给定指数)。
    • 动态定点表示在一组数字(例如一个层中的所有权重)之间共享该范围。
    • 使用定点代替浮点表示并且每个数使用较少的比特能够减少执行乘法所需的硬件表面积、功率需求和计算时间,并且乘法是使用或训练反向传播的现代深度网络中要求最高的操作。

总结

  • 回顾大规模深度学习的应用历程,我们见证了它从理论探索到实践应用的飞速跨越。从自然语言处理中的大规模语言模型,到计算机视觉中的超大规模图像识别系统,再到推荐系统中的个性化内容推送,大规模深度学习以其卓越的性能和广泛的应用前景,成为了连接现实世界与智能未来的桥梁。
  • 未来,随着算力的不断提升、算法的持续优化以及数据的海量增长,大规模深度学习将在更多领域展现其独特魅力,推动人类社会向更加智能化、高效化的方向发展。我们有理由相信,在不久的将来,大规模深度学习将成为推动社会进步的重要引擎,为我们的生活带来更加便捷、智能的体验。

往期内容回顾

深度学习的历史趋势概括

标签:text,al,学习,大规模,神经网络,GPU,深度,et,CPU
From: https://blog.csdn.net/benny_zhou2004/article/details/141756335

相关文章

  • Day12_0.1基础学习MATLAB学习小技巧总结(12)——程序流程控制3-switch结构
    利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。素材来源“数学建模清风”特此说明:本博客的内容只在于总结在使用matlab中的一些小技巧,并非教程,若想系统的学习MATLAB,也可以移步......
  • SPI驱动学习二(驱动框架)
    目录一、回顾平台总线设备驱动模型二、SPI设备驱动1.数据结构1.1SPI控制器数据结构1.2SPI设备数据结构1.3SPI设备驱动2.SPI驱动框架2.1SPI控制器驱动程序2.2SPI设备驱动程序三、SPI设备树处理过程1.SPIMaster2.SPIDevice3.设备树示例4.设备树实例4.1使......
  • 【机器学习】8. 逻辑斯蒂回归 Logistic function(sigmoid),cross-entropy error,Log-l
    Logisticfunction线性分类器Logisticfunction(sigmoid)极大似然估计Log-likelihoodloss线性分类器Logisticregression是一个线性分类器。如图,1为蓝色,0为红色。这条直线叫做直线边界Logisticfunction(sigmoid)......
  • Salt Function Flow:深度研发经验的沉淀,打造轻量级高效流程编排框架
    在开发者的世界里,业务流程编排是一个既复杂又关键的环节。如何高效地管理和编排这些流程,直接影响着系统的性能和可维护性。本次介绍一款基于大量研发实践经验而打造的流程编排框架——SaltFunctionFlow。它不仅轻量、强大,更是将多年实践中的最佳经验沉淀于其中,为开发者提......
  • 机器学习之——决策树条件熵计算[附加计算程序]
    0前言本文主要介绍决策树条件熵的计算并给出若干例子帮助理解。读者需要具备信息熵计算知识,若不了解请看:信息熵1条件熵2数据集游玩数据集,请看:数据集1.1节3条件熵的计算使用所给游玩数据集。计算H(play|outlook)的条件熵(在Y随机变量为outlook条件下,X随机变量为pla......
  • unity学习笔记(二)
    2D渲染Camera相机设置Projection(投影方式):修改为Orthographic(正交)Size:改变相机的视野大小Sprite“精灵图”一词首次作为图形术语出现,是在德州仪器的9918(A)视频显示处理器上。使用“精灵图”作为术语,是因为精灵图并不是帧缓冲中位图数据的一部分,而是“悬浮”于帧缓冲中数据之......
  • c#学习笔记(一)
    基础语法文档注释&代码块 ///<summary> ///待机 ///</summary> #region物体移动sq.transform.Translate(newVector3(5,0,0)); #endregion字符串格式化输出使用$可进行格式化输出C#string字符串的前面可以加@(称作"逐字字符串")将转义字符(\)当作普通字符......
  • unity学习笔记(一)
    组件的概念组件:一个或多个功能的容器,类似模块,插上去就有这个功能,不查没有存在意义:如果太依赖继承,继承树将会特别复杂组件化设计思想有利于维护拓展unity内任何游戏物体必须有Transform组件unity中大多数情况下,我们写的c#脚本就是一个组件从代码角度认识GameObject任何......
  • 【Java学习】静态static&继承
    一、静态static(一)定义static是静态的意思,static可以修饰成员变量或者修饰方法。static关键字的使用,它可以用来修饰的成员变量和成员方法,被static修饰的成员是属于类的,放在静态区中,没有static修饰的成员变量和方法则是属于对象的。static关键字在Java开发非常的重要,对于理......
  • 【Java学习】内部类&泛型
    一、内部类内部类是类中的五大成分之一(成员变量、方法、构造器、代码块、内部类);如果一个类定义在另一个类的内部,这个类就是内部类;场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。内部类分为四种成员内部类:位于一个类......