AI和大模型——稀疏矩阵 一、矩阵有过线性代数知识学习的同学都知道矩阵Matrix是一个按照长方阵列排列的数据复数或实数集合。这里不再给出更严谨的数学定义。毕竟不是专门讲数学的。矩阵对于大多数人来说都是一个复杂的知识点。对于纯粹编程的开发人员来说用到矩阵的方向并不多一般是在游戏或图形处理中。但对于搞信号和电子的则可能用到的非常多。不过随着AI和大模型的发展矩阵的应用变得更广泛起来。二、稀疏矩阵在前面的AI和大模型的学习过程中反复提到过稀疏矩阵和其相关的LoRA等。从这一方面也可以想到稀疏矩阵在AI和大模型中应该是一个很普遍的应用。那么什么是稀疏矩阵呢说的直白一些它就是矩阵中的零元素太多一般如果非零元素低于百分之五则可以认为矩阵是一个稀疏矩阵。相反的则叫稠密矩阵。也可以理解为矩阵中描述有用信息的数据太少。在数学中稀疏矩阵可以分成两类即非结构化稀疏非零元素在矩阵中的分布是随机的没有规律可言结构化稀疏非零元素有着特定的数学模式或几何结构如带状矩阵、对角矩阵或块稀疏矩阵等更多的关于稀疏矩阵的数学知识可查阅相关的数学教科书或相关资料。此处不再展开说明。三、稀疏矩阵的特点既然会把稀疏矩阵从矩阵的应用中专门拿出来那么它就有自己的特点。比较适合于那些应用场景那么它有哪些特点呢数据分布这个从定义上就可以看出来稀疏矩阵的零元互占用绝大多数的位置非零元素极少存储空间由于有效数据太少所以不能使用传统的数组等方式来存储稀疏矩阵那会造成巨大的资源浪费。所以稀疏矩阵的存储必须有极高的空间压缩率即不必为零元互分配空间计算复杂度由于计算时可以忽略大量的零元素的计算在采用适当的算法时可以大幅降低计算的时间复杂度。这种时间复杂度的降低往往可能是量级的算法与数据由于稀疏矩阵的数据特点这就需要对其进行存储和计算时必须采用专门的算法。并且由于其有效数据很少意味着数据独立性较高非常适合引入并行计算及相关的算法在明白了稀疏矩阵的特点后就可以顺理成章的引入相关的应用了。四、计算机算法中的表示对于传统的矩阵一般是使用多维数组进行表示。而稀疏矩阵可以使用以下几种方式进行存储COO(Coordinate List坐标列表格式)三元组来进行表示非零的元素即使用长度相同的数组分别存储每个非零元素的行、列索引和值。如0 0 ab 0 0 矩阵可以表示为{0,0,a},{1,0,b},{2,1,c}0 c 0它的优势在于创建和插入灵活易理解缺点是不利于高速计算并引入了额外的索引内存占用。它比较适合于从文件读取构建稀疏矩阵的场景CSR (Compressed Sparse Row压缩稀疏行格式)是一种常见的通用格式对于行访问和矩阵与向量的乘法非常适合。它的存储机制是使用三个数组来分别存储相关的属性。即data数组用来存储所有的非零元素indices数组存储data中每个元素对应的列索引indptr用来存储行偏移的指针即表示每行中非零元素的个数确定数据数组data的读取索引及indices数组中的列读取索引。其优点是计算效率高存储占用空间小缺点是修改数据困难。非常适合于AI大模型和科学计算等领域CSC (Compressed Sparse Column压缩稀疏列格式)它也叫做CCS它与CSR有些类似。只不过它的indptr数组存储的是列的偏移地址indices存储的是行索引与CSR反过来了。它适合于矩阵转置或频繁操作列的情况下比如求解稀疏线性方程组。缺点是对行的操作效率低LIL (List of Lists列表格式)它是一种动态创建稀疏矩阵的方式可以理解为在多二维数组中每一行代表着矩阵的一行。这一行中存储的是非零元素的列索引和值的键值对。它的优点在于快速构建稀疏矩阵方便的添加新元素。缺点是存储占用空间较大。它适合于动态的、逐步创建稀疏矩阵的情况。一般来说在创建成功后会转为CSR或CCS其它还有一些其它的稀疏矩阵的存储方法如针对分块压缩的BCRS以及针对字典格式的DOK方法。可以根据实际情况进行相关的选择五、AI和大模型中的应用稀疏矩阵在用来处理海量数据时优势非常明显。而AI和大模型恰恰也是对海量的数据进行处理。而在实际情况中很多都是有大量的无效数据存在如图像和视频中这样就给稀疏矩阵的应用提供了广阔的空间。在AI和大模型的应用中稀疏矩阵的应用往往有以下几种图像及信号的处理在计算机视觉中图像的特征往往是高维稀疏的。数据的表示在自然语言NLP及一些图数据结构分析中大量的数组都是可以用稀疏矩阵进行表示的。如社交网络的邻接矩阵等等模型的运算在大模型中可以通过LoRA进行降维处理在引过程中其反向传播的参数是稀疏的。当然要分清林低秩和稀疏的关系六、代码示例在实际的工程开发中可以使用COO的方式来实现对稀疏矩阵的定义和应用看下面的代码#includeiostream#includevectorclass SparseMatrix{public:structEntry{introw;intcol;doublevalue;};SparseMatrix(introws,intcols):rows_(rows),cols_(cols){if(rows0||cols0){std::coutThe matrix size must be greater than zerostd::endl;}}voidadd(introw,intcol,doublevalue){checkIndex(row,col);if(value0.0){return;}entries_.push_back({row,col,value});}doubleget(introw,intcol)const{checkIndex(row,col);for(constautoentry:entries_){if(entry.rowrowentry.colcol){returnentry.value;}}return0.0;}voiddisplayAll()const{for(inti0;irows_;i){for(intj0;jcols_;j){std::coutget(i,j) ;}std::coutstd::endl;}}voiddisplay()const{std::coutrow col value\n;for(constautoentry:entries_){std::coutentry.row entry.col entry.valuestd::endl;}}SparseMatrixtranspose()const{SparseMatrixresult(cols_,rows_);for(constautoentry:entries_){result.add(entry.col,entry.row,entry.value);}returnresult;}SparseMatrixaddMatrix(constSparseMatrixother)const{if(rows_!other.rows_||cols_!other.cols_){std::coutmatrix size error!std::endl;}SparseMatrixresult(rows_,cols_);for(constautoentry:entries_){result.add(entry.row,entry.col,entry.value);}for(constautoentry:other.entries_){bool foundfalse;for(autoresultEntry:result.entries_){if(resultEntry.rowentry.rowresultEntry.colentry.col){resultEntry.valueentry.value;foundtrue;break;}}if(!found){result.add(entry.row,entry.col,entry.value);}}returnresult;}private:introws_;intcols_;std::vectorEntryentries_;voidcheckIndex(introw,intcol)const{if(row0||rowrows_||col0||colcols_){std::coutindex out of range!std::endl;}}};intmain(){SparseMatrixmatrix(3,4);matrix.add(0,1,6);matrix.add(1,2,5);matrix.add(2,3,9);matrix.add(2,0,7);std::coutCOO format:\n;matrix.display();std::cout\n matrix All:\n;matrix.displayAll();std::cout\nValue at (2, 3): matrix.get(2,3)\n;autotransposedmatrix.transpose();std::cout\nTransposed all matrix:\n;transposed.displayAll();SparseMatrixother(3,4);other.add(0,1,9);other.add(1,3,7);autosummatrix.addMatrix(other);std::cout\nSum all matrix:\n;sum.displayAll();return0;}上面的代码实现了一个稀疏矩阵的三元组表示的打印稀疏矩阵完整的显示以及矩阵转置后的求合。七、总结矩阵是数的矩形阵列的严格代数对象而稀疏矩阵是描述该阵列中零元素占绝对多数这一统计特性的概念其核心数学意义在于利用零元素的结构来降低计算复杂度从O(n2)或O(n3)降至接近O(n)或O(nnz)和存储开销。