矩阵是什么意思通俗 抖音矩阵是什么意思( 三 )


【矩阵是什么意思通俗 抖音矩阵是什么意思】因为计算图的引入 , 开发者得以从宏观上俯瞰整个神经网络的内部结构 , 就好像编译器可以从整个代码的角度决定如何分配寄存器那样 , 计算图也可以从宏观上决定代码运行时的GPU内存分配 , 以及分布式环境中不同底层设备间的相互协作方式 。除此之外 , 现在也有许多深度学习框架将计算图应用于模型调试 , 可以实时输出当前某一操作类型的文本描述 。
4.4 自动微分(Automatic Differentiation)工具
计算图带来的另一个好处是让模型训练阶段的梯度计算变得模块化且更为便捷 , 也就是自动微分法 。
正如前面提到的 , 因为我们可以将神经网络视为由许多非线性过程组成的一个复杂的函数体 , 而计算图则以模块化的方式完整表征了这一函数体的内部逻辑关系 , 因此微分这一复杂函数体 , 即求取模型梯度的方法就变成了在计算图中简单地从输入到输出进行一次完整遍历的过程 。与自动微分对应 , 业内更传统的做法是符号微分 。
符号微分即常见的求导分析 。针对一些非线性过程(如修正线性单元ReLU)或者大规模的问题 , 使用符号微分法的成本往往非常高昂 , 有时甚至不可行(即不可微) 。因此 , 以上述迭代式的自动微分法求解模型梯度已经被广泛采用 。并且由于自动微分可以成功应对一些符号微分不适用的场景 , 目前许多计算图程序包(例如Computation Graph Toolkit)都已经预先实现了自动微分 。
另外 , 由于每个节点处的导数只能相对于其相邻节点计算 , 因此实现了自动微分的模块一般都可以直接加入任意的操作类中 , 当然也可以被上层的微分大模块直接调用 。
4.5 BLAS、cuBLAS、cuDNN等拓展包
现在 , 通过上述所有模块 , 我们已经可以搭建一个全功能的深度学习框架:将待处理数据转换为张量 , 针对张量施加各种需要的操作 , 通过自动微分对模型展开训练 , 然后得到输出结果开始测试 。这时还缺什么呢?答案是运算效率 。
由于此前的大部分实现都是基于高级语言的(如Java、Python、Lua等) , 而即使是执行最简单的操作 , 高级语言也会比低级语言消耗更多的CPU周期 , 更何况是结构复杂的深度神经网络 , 因此运算缓慢就成了高级语言的一个天然的缺陷 。
目前针对这一问题有两种解决方案 。
第一种方法是模拟传统的编译器 。就好像传统编译器会把高级语言编译成特定平台的汇编语言实现高效运行一样 , 这种方法将高级语言转换为C语言 , 然后在C语言基础上编译、执行 。为了实现这种转换 , 每一种张量操作的实现代码都会预先加入C语言的转换部分 , 然后由编译器在编译阶段将这些由C语言实现的张量操作综合在一起 。目前pyCUDA和Cython等编译器都已经实现了这一功能 。
第二种方法就是前文提到的 , 利用脚本语言实现前端建模 , 用低级语言如C++实现后端运行 , 这意味着高级语言和低级语言之间的交互都发生在框架内部 , 因此每次的后端变动都不需要修改前端 , 也不需要完整编译(只需要通过修改编译参数进行部分编译) , 因此整体速度也就更快 。
除此之外 , 由于低级语言的最优化编程难度很高 , 而且大部分的基础操作其实也都有公开的最优解决方案 , 因此另一个显著的加速手段就是利用现成的扩展包 。例如最初用Fortran实现的BLAS(基础线性代数子程序) , 就是一个非常优秀的基本矩阵(张量)运算库 , 此外还有英特尔的MKL(Math Kernel Library)等 , 开发者可以根据个人喜好灵活选择 。
值得一提的是 , 一般的BLAS库只是针对普通的CPU场景进行了优化 , 但目前大部分的深度学习模型都已经开始采用并行GPU的运算模式 , 因此利用诸如NVIDIA推出的针对GPU优化的cuBLAS和cuDNN等更据针对性的库可能是更好的选择 。
运算速度对于深度学习框架来说至关重要 , 例如同样训练一个神经网络 , 不加速需要4天的时间 , 加速的话可能只要4小时 。在快速发展的人工智能领域 , 特别是对那些成立不久的人工智能初创公司而言 , 这种差别可能就会决定谁是先驱者 , 而谁是追随者 。