稀疏连接内核:由生物层级父子关系编译出来的边表
SparseConnectivity
00 Remarks
P-NET 的每一个网络层都由一个二值掩码矩阵 M 约束其连接拓扑, 前向传播为 y = f[(M * W)⃗x + b]。由于掩码在整个训练过程中保持不变, 因此可以在网络构建阶段就将 M 编译为一个按父节点分组的边表, 在运行期用 O(N nnz) 的 scatter/gather 内核代替 O(N fanIn * fanOut) 的稠密矩阵乘法。 这正是论文 Extended Data Fig. 1c 所描述的 "patterned sparse matrix" 优化。
边表的存储布局为:
ChildIdx按照父节点分组连续存放,父节点j的所有子节点索引位于区间[ParentStart(j), ParentStop(j))之内;Weights矩阵中的数据布局为行优先,即W(i, j) = Data(i * FanOut + j), 与Tensor的内存布局保持一致,方便直接对Tensor.Data做下标运算。
01 Syntax
02 Methods
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| FanIn | 1 | 输入维度(子节点数量,即掩码矩阵的行数) |
| FanOut | 1 | 输出维度(父节点数量,即掩码矩阵的列数) |
| EdgeCount | 1 | 掩码矩阵中非零元素的数量,即真实存在的生物学父子关系数量 |
| ChildIdx | 1 | 按父节点分组的子节点索引表,长度为 SparseConnectivity.EdgeCount |
| ParentStart | 1 | 每一个父节点在 SparseConnectivity.ChildIdx 中的起始偏移,长度为 SparseConnectivity.FanOut + 1 |
04 Members
Int32, Int32)创建一个空的稀疏连接对象(对应于全零掩码)
| Name | Type | Description |
|---|---|---|
fanIn | Int32 | 输入维度 |
fanOut | Int32 | 输出维度 |
Int32, Int32, Int32()())由父子成员关系编译得到稀疏连接边表
| Name | Type | Description |
|---|---|---|
fanIn | Int32 | 输入维度(下一层的节点数量) |
fanOut | Int32 | 输出维度(当前层的节点数量) |
members | Int32()() | 每一个父节点所包含的子节点索引,长度必须等于 fanOut |
Int32)获取指定父节点的子节点索引在 SparseConnectivity.ChildIdx 中的起始位置
| Name | Type | Description |
|---|---|---|
parentIndex | Int32 | 父节点索引 |
起始偏移
Int32)获取指定父节点的子节点索引在 SparseConnectivity.ChildIdx 中的结束位置(不含)
| Name | Type | Description |
|---|---|---|
parentIndex | Int32 | 父节点索引 |
结束偏移
Int32)获取指定父节点的入度(子节点数量,即 fan-in)
| Name | Type | Description |
|---|---|---|
parentIndex | Int32 | 父节点索引 |
入度
构建二值掩码矩阵 M,形状为 [FanIn, FanOut]
掩码矩阵仅在需要检视或者落盘的时候才会被创建,运行期的计算完全走 SparseConnectivity.ChildIdx 边表,不会使用这个矩阵。
元素取值为 0 或者 1 的 Tensor 掩码矩阵
Int32, Int32)声明一个连接是否存在
| Name | Type | Description |
|---|---|---|
child | Int32 | 子节点索引 |
parent | Int32 | 父节点索引 |
存在则返回 True,否则返回 False
生成稀疏连接的字符串描述
形如 Sparse[180 -> 60, nnz=180, density=1.67%] 的描述文本
输入维度(子节点数量,即掩码矩阵的行数)
子节点数量
输出维度(父节点数量,即掩码矩阵的列数)
父节点数量
掩码矩阵中非零元素的数量,即真实存在的生物学父子关系数量
连接边数量
按父节点分组的子节点索引表,长度为 SparseConnectivity.EdgeCount
子节点索引数组
每一个父节点在 SparseConnectivity.ChildIdx 中的起始偏移,长度为 SparseConnectivity.FanOut + 1
偏移数组,ParentStart(FanOut) 即为 SparseConnectivity.EdgeCount