传统的计算机设计语言,例如C语言,是针对标量的,虽然也提供诸如数组、二维数组的数据结构,但这些结构的赋值、加法、数乘、转置、矩阵相乘还是要通过循环语句完成,十分麻烦,导致程序设计的复杂度也比较高。
mylist = [1,2,3,4,5] length = len(mylist) a = 10 for indx in xrange(length): mylist[indx] = a*mylist[indx] print mylist 输出结果: [10, 20, 30, 40, 50]
而基于矩阵的算法都是针对向量的,这里也称为矢量。为了简化程序的逻辑,就需要一种新的编程方法,处理基于矩阵的基本运算,这就是所谓的矢量化编程。
随着程序设计的发展,使用计算机实现矩阵运算越来越方便。最早实现矢量化编程的语言是Matlab的脚本语言,它极大的降低了数学领域程序设计的复杂度。因此大量的人工智能算法最早都是用Matlab语言写的。
Python自带的List结构,提供切片的功能可以部分实现矢量化编程。其扩展包Numpy提供了专门的矩阵数据结构和线性代数库,完全实现了矢量化编程。
import numpy as np mylist = [1,2,3,4,5] a = 10 mymatrix = np.mat(mylist) print a*mymatrix 输出结果: [[10 20 30 40 50]]
矢量化编程的一个重要特点就是可以直接将数学公式转换为相应的程序代码,极大方便了程序的阅读和调试,使复杂数学公式的实现变得简单和方便,本节和下一节所用的矢量化程序的代码一般只有一两行,即可完成复杂的数学运算。
无论是Matlab还是Python的矢量化编程都可以无缝的调用底层的C函数,还可以提高算法速度。为了提升特定数值运算操作,例如矩阵相乘、矩阵相加、矩阵-向量乘法、浮点运算的速度,数值计算和并行计算的研究人员已经努力了几十年。这个领域最出色的技术就是使用图形处理器的GPU运算。
英伟达(nVidia)公司在1999年发布GeForce256图形处理芯片时首先提出了GPU运算的概念。十几年的发展使单个GPU芯片在浮点运算、大规模并行计算方面,可以提供数十倍乃至上百倍于CPU的性能。GPU的流处理器也由几十个增加到最新的三千多个,浮点运算TFlops值也达到5以上。本书的第十章的深度学习部分专门讲解了GPU运算的Python框架 Theano。
对GPU运算比较熟悉的读者也可以将本书中较大规模的矩阵运算交由GPU完成。