资讯详情

MXNet 稀疏 NDArray 实战指南:CSRNDArray、RowSparseNDArray 与稀疏梯度训练

📅 2026/9/21 16:17:37 | 华诺云谱 👁 阅读
MXNet 稀疏 NDArray 实战指南:CSRNDArray、RowSparseNDArray 与稀疏梯度训练
深度学习机器学习人工智能【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址https://gitcode.com/gh_mirrors/mxnet1/mxnet点击查看免费下载导读本指南以 docs/python_docs/python/tutorials/packages/ndarray/sparse/index.rst 所索引的 MXNet 稀疏 NDArray 教程套件为核心系统讲解两大数据结构——压缩稀疏行格式的CSRNDArray与面向稀疏梯度的RowSparseNDArray——的存储原理、创建方式、存储类型转换与稀疏算子推断机制并延伸到基于稀疏符号Sparse Symbol Module API 以及 Gluon API 的完整稀疏训练流程。读完本文你将掌握稀疏数据从生成、落盘LibSVM 格式、批量加载、模型定义到稀疏优化器lazy_update的端到端实战能力并理解stypestorage type在 MXNet 中如何贯穿张量、符号与优化器三个层次。该教程套件由index.rst中的toctree聚合了五个文档csr.md、row_sparse.md、train.md与train_gluon.md含符号训练等本文逐一展开并辅以仓库源码佐证。一、为什么需要稀疏 NDArray从高维稀疏特征说起推荐系统、文本分类等真实场景常常面对百万量级的类别与用户维度例如每个用户只购买过极少量商品导致数据矩阵中绝大多数元素为零密度常低至 1% 甚至更低。用默认稠密结构存储和计算这类矩阵内存与算力都被大量零值浪费。MXNet 为此提供了两种专用稀疏张量二者均继承自NDArray存储类型stype类名适用场景特点csrCSRNDArray二维矩阵、列数巨大、每行仅少量非零压缩稀疏行格式显著降低内存、加速矩阵向量乘法row_sparseRowSparseNDArray多维数组、绝大多数行切片全为零典型如稀疏梯度只存非零行切片配合稀疏优化器实现懒更新defaultNDArray普通稠密数组默认存储类型从源码结构看二者均定义在 python/mxnet/ndarray/sparse.pyclass CSRNDArray(BaseSparseNDArray)、class RowSparseNDArray(BaseSparseNDArray)是NDArray的稀疏子类。与 SciPy 的 CSR 实现相比CSRNDArray继承了NDArray的非阻塞异步求值与自动并行化能力详见仓库 NDArray 基础教程并且所有NDArray都新增了stype属性用于标识存储类型稠密数组为defaultCSR 数组为csr行稀疏数组为row_sparse。二、CSRNDArray压缩稀疏行CSR格式详解2.1 存储结构data / indices / indptr一个CSRNDArray将二维矩阵拆成三个一维数组data按行主序存储所有非零元素indices记录data中每个非零元素的列索引每行内升序排列同一行不允许出现重复列索引indptr行指针数组indptr[i]表示第i行第一个非零元素在data中的偏移行i的元素位于data[indptr[i]:indptr[i1]]对应列索引为indices[indptr[i]:indptr[i1]]。indptr恒以 0 开头长度恒为“行数 1”。以文档中的 3×4 矩阵为例[[7, 0, 8, 0] [0, 0, 0, 0] [0, 9, 0, 0]]按行主序去掉零值得到data [7, 8, 9]对应列索引为indices [0, 2, 1]indptr累计每行非零个数首行 2 个 →indptr[1]2全零行不增长 →indptr[2]2末行 1 个 →indptr[3]3即indptr [0, 2, 2, 3]。重建稠密矩阵时第 0 行取data[0:2]/indices[0:2]第 1 行取data[2:2]空区间全零行第 2 行取data[2:3]/indices[2:3]。2.2 创建 CSRNDArray文档提供了四种主要创建路径构造函数mx.nd.sparse.csr_matrix在 python/mxnet/ndarray/sparse.py 中支持csr_matrix(D)、csr_matrix(S)、csr_matrix((M, N))、csr_matrix((data, indices, indptr))、csr_matrix((data, (row, col)))等多种签名import mxnet as mx import numpy as np # 1) 用 Python 列表 (data, indices, indptr) 三元组创建 shape (3, 4) a mx.nd.sparse.csr_matrix(([7, 8, 9], [0, 2, 1], [0, 2, 2, 3]), shapeshape) a.asnumpy() # array([[ 7., 0., 8., 0.], # [ 0., 0., 0., 0.], # [ 0., 9., 0., 0.]], dtypefloat32) # 2) 用 NumPy 数组创建 b mx.nd.sparse.csr_matrix((np.array([7, 8, 9]), np.array([0, 2, 1]), np.array([0, 2, 2, 3])), shapeshape) # 3) 从 SciPy 稀疏矩阵转换需安装 scipy否则报 ImportError import scipy.sparse as spsp c spsp.csr.csr_matrix((np.array([7, 8, 9]), np.array([0, 2, 1]), np.array([0, 2, 2, 3])), shapeshape) d mx.nd.sparse.array(c) # mx.nd.sparse.array 支持 scipy.sparse.csr.csr_matrix 输入 # 4) 从稠密数组直接转换tostype(csr) 自动推导 data/indices/indptr big_array mx.nd.round(mx.nd.random.uniform(low0, high1, shape(1000, 100))) big_array_csr big_array.tostype(csr) big_array_csr.data # 访问 data 数组 big_array_csr.indices # 访问列索引数组 big_array_csr.indptr # 访问行指针数组dtype参数接受 NumPy 类型默认float32mx.nd.sparse.array(a)得到float32mx.nd.array(a, dtypenp.float16)得到float16。2.3 检查与属性.asnumpy()把稀疏内容填充到稠密numpy.ndarray以便查看.data/.indices/.indptr直接查看内部三个分量均为NDArray.stype返回csr。2.4 存储类型转换两种等价方式在default与csr之间互转ones mx.nd.ones((2, 2)) csr ones.tostype(csr) # 方法形式 dense mx.nd.sparse.cast_storage(ones, csr) # 算子形式2.5 复制与切片a.copy()深拷贝返回新数组c[:] a与a.copyto(d)拷贝到已有数组若源与目标stype不一致目标stype保持不变源会被临时转换。文档中的验证显示e.stype、f.stype保持csr而g.stype为default。切片a[1:2]沿第 0 轴切片并返回新的CSRNDArray多维索引或沿其他轴切片目前不支持。2.6 稀疏算子与存储类型推断专为稀疏实现的算子位于mx.nd.sparse命名空间如mx.nd.sparse.dot、mx.nd.sparse.cast_storage、mx.nd.sparse.zeros等均定义于 python/mxnet/ndarray/sparse.py。以dot(csr, dense)为例a mx.nd.sparse.csr_matrix(([7, 8, 9], [0, 2, 1], [0, 2, 2, 3]), shape(3, 4)) rhs mx.nd.ones((4, 1)) out mx.nd.sparse.dot(a, rhs) # [[15.], [0.], [9.]] NDArray 3x1 cpu(0)存储类型推断稀疏算子的输出stype由输入推导。例如b a * 2输出仍为csr零乘 2 还是零而c a mx.nd.ones((3, 4))输出为稠密default。可读算子文档或直接查看输出.stype确认。存储类型回退Fallback不支持稀疏的稠密算子仍可接收稀疏输入但会临时转为稠密计算若提供稀疏输出则把稠密结果再转回稀疏格式并打印警告Jupyter 中警告输出到终端控制台。示例mx.nd.log(a)输出stypedefault而mx.nd.log(a, oute)中e保持csr。2.7 稀疏数据加载mx.io.NDArrayIter可直接从CSRNDArray分批读取batch.data[0]返回CSRNDArray批次mx.io.LibSVMIter读取 LibSVM 格式文件格式为label col_idx1:value1 col_idx2:value2 ...每行记录标签与非零项的“列索引:值”。注意列索引按行升序且为0-based而非 LibSVM 传统 1-based。data_path data.t with open(data_path, w) as fout: fout.write(1.0 0:1 2:2\n) fout.write(1.0 0:3 5:4\n) fout.write(-1 0:0.5 9:1.5\n) # ...更多行 data_train mx.io.LibSVMIter(data_libsvmdata_path, data_shape(10,), label_shape(1,), batch_size3) for batch in data_train: print(data_train.getdata()) # CSRNDArray 3x10 cpu(0) print(data_train.getlabel())2.8 GPU 支持默认所有CSRNDArray算子在 CPU 执行在 GPU 上创建需显式指定ctxmx.nd.sparse.zeros(csr, (100, 100), ctxmx.gpu())。无 GPU 时将报错可改用mx.cpu()。三、RowSparseNDArray为稀疏梯度而生3.1 动机为什么梯度会是“行稀疏”的设X为 1×2 矩阵[[1, 0]]W为 2×3 矩阵Y XW。计算dY/dW即grad_W时grad_W X.T · ones_like(Y) # [[1, 1, 1], # [0, 0, 0]]由于X的第 1 列全为零grad_W的第 1 行全为零。真实场景中与稀疏输入交互的参数其梯度常常有大量行切片完全为零。稠密存储与计算浪费在零行上而 SGD、AdaGrad、Adam 等基于梯度的优化方法可以充分利用稀疏梯度提高效率。RowSparseNDArray正是为“大部分行切片全为零”的数组设计的。3.2 格式定义RowSparseNDArray用两个一维数组表示形状为[LARGE0, D1, ..., Dn]的多维数组data任意 dtype、形状[D0, D1, ..., Dn]保存所有非零行切片indicesint64 一维数组、形状[D0]值升序排列记录非零行切片的行号。对应稠密关系为dense[rsp.indices[i], :, :, ...] rsp.data[i, :, :, ...]。例如 5×3 矩阵中非零行在第 0、2 行则data [[1, 2, 3], [4, 0, 5]]、indices [0, 2]它也支持三维及以上张量。查询其stype返回row_sparse。3.3 创建与检查shape (6, 2) a mx.nd.sparse.row_sparse_array(([[1, 2], [3, 4]], [1, 4]), shapeshape) # 列表 b mx.nd.sparse.row_sparse_array((np.array([[1, 2], [3, 4]]), np.array([1, 4])), shapeshape) # NumPy a.asnumpy() # array([[0., 0.], [1., 2.], [0., 0.], [0., 0.], [3., 4.], [0., 0.]]) a.data # [[1, 2], [3, 4]] a.indices # [1, 4]row_sparse_array构造函数同样定义于 python/mxnet/ndarray/sparse.py支持row_sparse_array(D)、row_sparse_array(S)、row_sparse_array((D0, D1, ...))、row_sparse_array((data, indices))等签名。其常用方法与CSRNDArray一致.dtype、.asnumpy、.data、.indices、.tostype、.cast_storage、.copy、.copytodtype默认float32。3.4 保留行切片retainmx.nd.sparse.retain(rsp, rows)可从RowSparseNDArray中按行号保留指定子集rsp mx.nd.sparse.row_sparse_array(([[1, 2], [3, 4], [5, 6]], [0, 2, 3]), shape(5, 2)) rsp_retained mx.nd.sparse.retain(rsp, mx.nd.array([0, 1])) # 仅保留第 0、1 行[[1, 2], [0, 0], [0, 0], [0, 0], [0, 0]]3.5 稀疏算子与存储类型推断mx.nd.sparse.dot(lhs, rhs, transpose_aTrue)在输入为csr与稠密时输出被推断为row_sparse行稀疏点积结果lhs mx.nd.sparse.csr_matrix(([7, 8, 9], [0, 2, 1], [0, 2, 2, 3]), shape(3, 5)) rhs mx.nd.ones((3, 2)) transpose_dot mx.nd.sparse.dot(lhs, rhs, transpose_aTrue) # RowSparseNDArray 5x2与 CSR 相同a * 2保持row_sparsea mx.nd.ones(...)回退为稠密不支持稀疏的稠密算子会触发存储类型回退并打印警告。3.6 稀疏优化器与懒更新lazy_updateMXNet 中当梯度为row_sparse存储且优化器以lazy_updateTrue创建时应用稀疏梯度懒更新只更新gradient.indices中出现过的行切片对应的权重与状态。以 SGD 为例稠密更新规则为rescaled_grad learning_rate * rescale_grad * clip(grad, clip_gradient) weight_decay * weight state momentum * state rescaled_grad weight weight - state而稀疏梯度下的默认懒更新为for row in grad.indices: rescaled_grad[row] learning_rate * rescale_grad * clip(grad[row], clip_gradient) weight_decay * weight[row] state[row] momentum * state[row] rescaled_grad[row] weight[row] weight[row] - state[row]注意当weight_decay或momentum非零时懒更新与稠密更新的结果会不同如需关闭可在创建优化器时设置lazy_updateFalse。从 python/mxnet/optimizer/optimizer.py 源码可见SGD、Adam、AdaGrad三个优化器的__init__均接收lazy_updateTrue参数并在update内部调用sgd_update(weight, grad, outweight, lazy_updateself.lazy_update, ...)等底层算子这也是文档明确说明的仅 SGD、Adam、AdaGrad 支持稀疏更新的实现依据。文档给出的更新示例权重为 4×2 的row_sparse全 1 矩阵梯度row_sparse_array(([[1, 2], [4, 5]], [1, 2]))SGD(learning_rate0.01, momentum0.01)调用sgd.update(0, weight, grad, momentum)后只有第 1、2 行的权重与动量被更新第 0、3 行保持原值验证了“只更新梯度索引涉及的行”。3.7 GPU 支持与 CSR 相同默认 CPU 执行创建时需显式指定ctx如mx.nd.sparse.zeros(row_sparse, (100, 100), ctxmx.gpu())无 GPU 时改用mx.cpu()。四、用稀疏符号Sparse Symbol训练线性回归4.1 变量的存储类型mx.sym.Variable的stype属性声明其持有数组的存储格式默认default可设为csr或row_sparsea mx.sym.Variable(a) # 稠密 b mx.sym.Variable(b, stypecsr) # CSRNDArray c mx.sym.Variable(c, styperow_sparse)# RowSparseNDArray4.2 绑定与求值simple_bind用simple_bind(ctx, **shape_dict)实例化执行器它会按各变量的存储类型分配零数组executor.forward()求值executor.outputs取结果executor.arg_dict可更新变量持有的数组b_exec b.simple_bind(ctxmx.cpu(), b(2, 2)) b_exec.forward() # 输出 CSRNDArray 2x2 cpu(0)零数组 b_exec.arg_dict[b][:] mx.nd.ones((2, 2)).tostype(csr) b_exec.forward() # 输出更新为全 14.3 符号组合与存储类型推断稀疏符号位于mx.sym.sparse包。输出存储类型由输入推导d mx.sym.elemwise_add(a, a) # default e mx.sym.sparse.negative(b) # csr f mx.sym.sparse.elemwise_add(c, c) # row_sparse add_exec mx.sym.Group([d, e, f]).simple_bind(ctxmx.cpu(), a(2,2), b(2,2), c(2,2))运行后dense_add.stypedefault、csr_add.stypecsr、rsp_add.styperow_sparse。不支持某稀疏组合的算子如elemwise_add(csr, row_sparse)、log(csr)会回退到稠密实现并打印警告。调试时可将环境变量MXNET_INFER_STORAGE_TYPE_VERBOSE_LOGGING设为1让 MXNet 在计算图中记录各算子输入输出的存储类型信息文档示例data为csr、weight为row_sparse、sparse.dot输出的线性分类网络。4.4 端到端线性回归Module API目标函数为y x1 2x2 ... 100x100。完整流程# 1) 准备数据生成 1000 个样本、100 维特征、密度 1% 的 CSR 训练数据 feature_dimension 100 train_data mx.test_utils.rand_ndarray((1000, feature_dimension), csr, 0.01) target_weight mx.nd.arange(1, feature_dimension 1).reshape((feature_dimension, 1)) train_label mx.nd.dot(train_data, target_weight) train_iter mx.io.NDArrayIter(train_data, train_label, batch_size1, last_batch_handlediscard, label_namelabel) # 2) 定义模型变量显式声明存储类型 initializer mx.initializer.Normal(sigma0.01) X mx.sym.Variable(data, stypecsr) Y mx.symbol.Variable(label) weight mx.symbol.Variable(weight, styperow_sparse, shape(feature_dimension, 1), initinitializer) bias mx.symbol.Variable(bias, shape(1,)) pred mx.sym.broadcast_add(mx.sym.sparse.dot(X, weight), bias) lro mx.sym.LinearRegressionOutput(datapred, labelY, namelro) # 3) 创建 Module 并初始化 mod mx.mod.Module(symbollro, data_names[data], label_names[label]) mod.bind(data_shapestrain_iter.provide_data, label_shapestrain_iter.provide_label) mod.init_params(initializerinitializer) sgd mx.optimizer.SGD(learning_rate0.05, rescale_grad1.0/1, momentum0.9) mod.init_optimizer(optimizersgd) # 4) 训练 10 轮 metric mx.metric.create(MSE) for epoch in range(10): train_iter.reset(); metric.reset() for batch in train_iter: mod.forward(batch, is_trainTrue) mod.update_metric(metric, batch.label) mod.backward() mod.update() print(Epoch %d, Metric %s % (epoch, metric.get())) assert metric.get()[1] 1.0 # 文档中的训练收敛到 MSE ≈ 0.36其中weight声明为row_sparse的意义在于权重被初始化为RowSparseNDArray且优化器会对其执行稀疏更新规则sparse.dot针对csr输入与row_sparse权重调用稀疏实现。4.5 多机 / 多设备分布式训练MXNet 支持带row_sparse权重与梯度的分布式训练可显著降低大模型的通信开销。多机训练时需在forward或save_checkpoint之前调用prepare具体可参考仓库 example/sparse/linear_classification 目录下的示例。五、Gluon 与稀疏数据从 LibSVM 落盘到稀疏梯度训练5.1 生成稀疏数据与内存对比用mx.test_utils.rand_ndarray生成 1000 个样本、每样本 1,000,000 维特征、密度 0.001%每样本约 10 个非零特征的 CSR 数据num_samples, num_features 1000, 1000000 data mx.test_utils.rand_ndarray((num_samples, num_features), stypecsr, density0.00001) label data.sum(axis1) data.sum(axis1).mean() # 行和高于均值记为 1按data、indices、indptr分量统计字节数get_nbytes同一份数据稠密版约4000 MBCSR 版仅约0.128 MB——高稀疏场景下约 3 万倍的内存节省。文档同时提醒当非零比例升高差距会缩小当非零占比超过约 1/3 时稀疏存储反而比稠密更占内存需按密度谨慎选择。5.2 写入 LibSVM 格式自定义save_as_libsvm函数将CSRNDArray逐行写出每行以标签开头后接列索引:值的空格分隔对def save_as_libsvm(filepath, data, label): with open(filepath, w) as openfile: for row_idx in range(data.shape[0]): data_sample, label_sample data[row_idx], label[row_idx] col_idxs data_sample.indices.asnumpy().tolist() values data_sample.data.asnumpy().tolist() value_strs [{}:{}.format(idx, v) for idx, v in zip(col_idxs, values)] openfile.write({} {}\n.format(label_sample.asscalar(), .join(value_strs)))落盘文件示例行0.0 35454:0.22486 80954:0.39130 81941:0.19885 ...。序列化为字符会引入少量开销示例中 250 KB 文件 vs 原始 132 KB但与 4 GB 稠密数组相比微不足道。5.3 用 LibSVMIter 读取稀疏批次Gluon 的DataLoader目前会在组批前把每个样本转成稠密因此推荐用mx.io.LibSVMIter直接加载稀疏批次返回DataBatch而非tupledata_iter mx.io.LibSVMIter(data_libsvmfilepath, data_shape(num_features,), label_shape(1,), batch_size10) for batch in data_iter: print(batch.data[0].stype) # csr print(batch.label[0].stype) # default此外稀疏数据从 CPU 迁移到 GPU 也显著更快文档测得单批稀疏数据约 0.0013 MB、传输约 192 µs而稠密版约 40 MB、传输约 4 ms约 25 倍差距具体数值随硬件与稀疏度变化。5.4 自定义稀疏全连接层FullyConnectedSparseGluon 的nn.Dense底层使用FullyConnected算子并未针对CSRNDArray输入优化。文档实现了一个利用mx.nd.sparse.dot的替代HybridBlock把权重形状设为(in_units, units)以避免前向中的转置这是后续获得行稀疏梯度的关键前提class FullyConnectedSparse(mx.gluon.HybridBlock): def __init__(self, in_units, units, weight_grad_stypedefault): super(FullyConnectedSparse, self).__init__() with self.name_scope(): self._units units self.weight self.params.get(weight, shape(in_units, units), initNone, allow_deferred_initTrue, dtypefloat32, stypedefault, grad_stypeweight_grad_stype) self.bias self.params.get(bias, shape(units), initzeros, allow_deferred_initTrue, dtypefloat32, stypedefault, grad_stypedefault) def hybrid_forward(self, F, x, weight, bias): return F.sparse.dot(x, weight) bias三层网络128 → 8 → 1sigmoid 激活对比实验结果均为文档在特定软硬件环境下的实测值仅供理解趋势方案每轮迭代耗时timeit 均值第一层权重内存第一层梯度内存nn.DenseFullyConnected~532 ms512 MB99.999%512 MB99.999%FullyConnectedSparse前向用 sparse.dot~528 ms512 MB99.999%512 MB99.999%FullyConnectedSparseweight_grad_styperow_sparse~334 ms512 MB0.059 MB93.49%第一层把 1,000,000 维压到 128 维其权重矩阵占用绝大部分内存改用sparse.dot后前向显著变快文档中 Profiler 显示dotadd约 0.26 ms vs 1.54 ms但反向与参数更新仍处理稠密梯度。将第一层weight的grad_stype设为row_sparse后梯度内存从 512 MB 骤降至约 0.06 MB参数更新大幅加速整体迭代从约 532 ms 降至约 334 ms。5.5 进阶稀疏 weight若任务合适还可进一步把权重本身的stype设为row_sparse是否合理取决于具体任务仓库 python/mxnet/gluon/contrib/nn/basic_layers.py 中的contrib.SparseEmbedding即此类示例。注意并非所有优化器都支持稀疏梯度使用前请查阅对应优化器文档。六、仓库源码速查主题仓库路径稀疏 NDArray 教程索引toctreedocs/python_docs/python/tutorials/packages/ndarray/sparse/index.rstCSRNDArray 教程docs/python_docs/python/tutorials/packages/ndarray/sparse/csr.mdRowSparseNDArray 教程docs/python_docs/python/tutorials/packages/ndarray/sparse/row_sparse.md稀疏符号 Module 训练教程docs/python_docs/python/tutorials/packages/ndarray/sparse/train.mdGluon 稀疏训练教程docs/python_docs/python/tutorials/packages/ndarray/sparse/train_gluon.md稀疏张量实现csr_matrix、row_sparse_array、zeros、array、retain、tostypepython/mxnet/ndarray/sparse.py稀疏优化器与lazy_update实现SGD/Adam/AdaGradpython/mxnet/optimizer/optimizer.py分布式稀疏训练示例example/sparse/linear_classification七、总结与选型建议围绕stype这一贯穿始终的存储类型标识MXNet 的稀疏能力可分为三层张量层CSRNDArray用 data/indices/indptr 压缩二维稀疏矩阵RowSparseNDArray用 data/indices 压缩全零行切片、符号层mx.sym.sparse中的稀疏算子自动推断输出存储类型不支持时回退稠密并告警、优化器层lazy_update只更新梯度索引涉及的行由 SGD/Adam/AdaGrad 支持。实操中建议数据密度很低如 1%且每行仅少量非零时优先csr权重或梯度存在大量全零行切片时使用row_sparse使用LibSVMIter/NDArrayIter保持数据端到端稀疏避免DataLoader的稠密化对稀疏输入的前向计算用mx.nd.sparse.dot替代FullyConnected并把权重形状设计为(in_units, units)以获得行稀疏梯度再结合grad_styperow_sparse与lazy_update优化器显著降低内存与更新开销借助MXNET_INFER_STORAGE_TYPE_VERBOSE_LOGGING1排查计算图中的存储类型推断与回退情况。赞分享深度学习机器学习人工智能【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址https://gitcode.com/gh_mirrors/mxnet1/mxnet点击查看免费下载相关推荐MXNet RowSparseNDArray 实战行稀疏格式与稀疏梯度更新指南MXNet RowSparseNDArray 实战行稀疏格式与稀疏梯度更新指南 本指南以 MXNet 官方教程 row_sparse.md https://l深度学习机器学习人工智能MXNet RowSparseNDArray 实战指南面向稀疏梯度更新的行稀疏存储MXNet RowSparseNDArray 实战指南面向稀疏梯度更新的行稀疏存储 导读 在推荐系统、自然语言处理等真实场景中高维稀疏特征向量无处不在模型深度学习人工智能机器学习分布式训练MXNet 稀疏 NDArray 完全指南CSRNDArray 与 RowSparseNDArray 的构造、算子与底层实现MXNet 稀疏 NDArray 完全指南CSRNDArray 与 RowSparseNDArray 的构造、算子与底层实现 MXNet 的 mxnet.nd深度学习人工智能机器学习分布式训练创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。