数据向量化

本篇文章给大家介绍向量化。向量化对于人工智能编程是非常重要的。因为要训练一个智能模型需要非常多的数据。也就是说计算量很大,需要很长的计算时间,向量化可以大大提升计算速度(可节约高达300倍时间哦)。

说向量化之前,要先给大家介绍几个必须知道的概念。

第一,矩阵。矩阵是指由多行多列元素组成的一个集合。一个m*n的矩阵就有m行n列个元素。下图就是个2*3的矩阵。

第三,向量。如果一个矩阵只有一列,那么这就是一个列向量。下图就是一个列向量。

如果只有一行,那么就是行向量。

从某个角度上来说,矩阵就是由多个向量组成的。
第三,矩阵相乘。假如有如下两个矩阵。

那么他们的乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列的元素的乘积之和。
上面那句话不好懂,看下面的例子就明白了。(图中我用颜色分出了每行每列帮助大家更容易理解)

向量的乘法就更容易理解了,如下图。

第四,python。人工智能常用的编程语言有python,prolog等等,前期课程中我们先使用python。如果你之前没有接触过python,不用怕,它是非常简单的一门语言。当遇到一门新的语言,不要一开始就做系统性的学习,这样会浪费你很多时间,因为很多东西都是和你之前学的语言一样的;
正确的方法是:直接使用(或仅仅花几天时间看看他的基础知识,然后就直接使用),使用中遇到不懂的点再查它的开发文档。
知道上面四个概念后,下面我用一个超级简单的例子来向大家说明什么是向量化。
假如我们要用python编程来计算下面这个求和公式。

上式等价于 ( A1*B1 + A2*B2 + A3*B3 )

如果我们用非向量化的方式来实现的话,代码如下(本篇文章中,你只需要大致看懂这些代码就可以了,后面的文章我再给大家介绍如何用python编程)

A = [1,2,3]
B = [1,2,3]
res = 0
for i in range(0,3):
res += A[i] * B[i]
#通过向量化实现 如下
import numpy as np
A = [1,2,3]
B = [1,2,3]
res = np.dot(A,B.T)

上面这段代码中最关键的一行是np.dot(A,B.T)。dot执行了一个向量乘法运算,套入上面我向大家介绍的向量相乘知识,并可知它等价于上面的循环代码。
向量化可节约高达几百倍时间,为什么呢?有人是这样解释的:由于python是由c语言实现的,所以python每次在循环调用时都会先将代码转换成C语言,如果循环次数太多那么这些转换消耗的总和就很大了。而向量化操作是把一堆计算一次性转换成c语言去实现,即消耗只有一次,所以快。
也有人解释说因为梯度下降过程中我们需要不断地调整参数的值来完成梯度下降,可是使用循环会很慢,因为我们现在的计算机大部分都是SIMD也就是单指令流多数据流。如果使用for循环的话,那么一条指令的数据流就是for循环里所规定的,并没有进行并行运算,没有充分运用计算机资源。然而,在深度学习(deep learning)里,我们常常需要进行很多的梯度下降等等之类需要循环的操作,使用显式的循环会让运算速度十分的缓慢。

无论如何,请切记在人工智能编程的过程中,要尽量尽量尽量用向量化取代循环代码。向量化是非常基础的去除代码中for循环的艺术,在深度学习实践中,你会经常发现自己要训练大数据集,所以你的代码运行速度非常重要,否则如果在大数据集上,你的代码可能花费很长时间去运行,你将要等待非常长的时间去得到结果。

评论留言