背景
神经网络的计算基本上是以高维Tensor的形式存在的。高维Tensor如何利用各种稀疏性来计算,因此问题就归结成如何编码这些稀疏性。
稀疏性编码的方式
英伟达关于常见的稀疏性编码的方式
scipy的稀疏性编码的库
在英伟达的这个pdf中,我认为最重要的一个结论是:一个稀疏编码方式的效率(存储空间)和稀疏的分布是息息相关的。
COO
COO用三个(row, col, data)数组来存储稀疏矩阵。这个就很简单了。
对应的scipy的定义是
CSR
CSR使用三个(row, col,value),row数组的大小等于原矩阵的行+1.这有点像前缀和的感觉,也就是在row数组中row[i+1]-row[i]的数值是原矩阵matrix中第i行的non-zeros的数量。同时row[i+1]也是i+1行第一个非零元素在value数组中的偏移位置。
CSR对应的scipy的方式是:
COO和CSR这两种编码方式只有当稀疏度很大,也就是原matrix中的0值元素很多的时候,编码方式才是有效果的。对于比较有结构的,而且比较稠密的,存储真滴拉跨。例如我们数组里面存的是int8,然后我们用一个4*4数组为例,数组是这个样子的:
然后CSR的表示形式是
indptr = np.array([0, 3, 3, 6,