P-NET 的核心算子:受二值掩码约束的稀疏全连接层
MaskedDenseLayer
00 Remarks
普通的稠密层为 y = f(W⃗x + b),而 P-NET 引入二值掩码矩阵 M ∈ {0,1}^(dx × dy) 之后,前向传播变为:
y = f[(M * W)⃗x + b]
其中 * 为 Hadamard 积(逐元素相乘)。掩码取值为 0 的位置表示 通路数据库中不存在"子节点 i → 父节点 j"的关系,对应权重被强制置零; 在反向传播时被掩码权重的梯度 M ⊙ ∂L/∂W 同样恒为 0, 因此这些权重永远不会被更新 —— 这等价于该条边根本不存在, 而不是"训练完成之后再剪掉"(即论文所强调的 de novo 稀疏)。
由于掩码在整个训练过程中保持不变,本类型在构建阶段就把 M 编译为 SparseConnectivity 边表,前向与反向均只遍历真实存在的连接, 复杂度为 O(N nnz) 而不是 O(N fanIn * fanOut)。
01 Syntax
02 Methods
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| Name | 1 | 层的名称 |
| FanIn | 1 | 输入维度(子节点数量) |
| FanOut | 1 | 输出维度(父节点数量) |
| Connectivity | 1 | 由生物层级编译出来的稀疏连接边表 |
| Mask | 1 | 二值掩码矩阵 M,形状为 [FanIn, FanOut] |
| Weights | 1 | 权重矩阵 W,形状为 [FanIn, FanOut] |
| Bias | 1 | 偏置向量 b,形状为 [1, FanOut] |
| WeightGrad | 1 | 累积的权重梯度,形状与 MaskedDenseLayer.Weights 相同 |
| BiasGrad | 1 | 累积的偏置梯度,形状与 MaskedDenseLayer.Bias 相同 |
| LastZ | 1 | 最近一次前向传播所得到的线性变换结果 z,形状为 [N, FanOut] |
| LastA | 1 | 最近一次前向传播所得到的激活值 tanh(z),形状为 [N, FanOut] |
| LastInput | 1 | 最近一次前向传播的输入,形状为 [N, FanIn] |
| ConnectionCount | 1 | 当前层中真实存在的连接数量 |
| TrainableCount | 1 | 当前层中可训练参数的实际数量(仅统计未被掩码屏蔽的连接与偏置) |
| DenseParameterCount | 1 | 若当前层为稠密连接时的参数数量,用于对比稀疏化带来的压缩比 |
04 Members
创建受掩码约束的稀疏全连接层
| Name | Type | Description |
|---|---|---|
connectivity | SparseConnectivity | 由生物层级编译出来的稀疏连接边表 |
name | String | 层名称 |
seed | Nullable(Of Int32) | 权重初始化随机数种子 |
weightInitStd | Nullable(Of Double) | 权重初始化的标准差;给出 Nothing 时使用 Xavier 初始化 |
把权重与权重梯度逐元素乘以掩码,强制被屏蔽的连接恒为零
由于前向与反向传播只遍历边表,未被掩码覆盖的位置本来就不会被读写; 这里额外做一次逐元素相乘,是为了保证 MaskedDenseLayer.Weights 对外可见的数值 与"该连接不存在"这一语义严格一致。
Tensor)前向传播:a = tanh[(M * W)⃗x + b]
| Name | Type | Description |
|---|---|---|
x | Tensor | 输入矩阵,形状为 [N, FanIn] |
激活值矩阵,形状为 [N, FanOut]
Tensor)反向传播:累积权重与偏置梯度,并返回传递给下一层的梯度
记 dZ = ∂L/∂a ⊙ (1 - a²),则有:
∂L/∂W = x⃗ · dZ(只累加边表上的元素)∂L/∂b = Σ dZ∂L/∂x = dZ · (M * W)
梯度会被累加到 MaskedDenseLayer.WeightGrad 与 MaskedDenseLayer.BiasGrad 之上, 需要在一个训练步开始之前调用 MaskedDenseLayer.ZeroGrad() 清零。
| Name | Type | Description |
|---|---|---|
upstream | Tensor | 损失对当前层激活值的梯度 |
损失对当前层输入的梯度 ∂L/∂x,形状为 [N, FanIn]
清零累积的权重与偏置梯度
List(Of Tensor), List(Of Tensor))把参数与梯度收集到给定的列表之中,供优化器使用
| Name | Type | Description |
|---|---|---|
parameters | List(Of Tensor) | 参数收集列表 |
gradients | List(Of Tensor) | 梯度收集列表 |
生成当前层的字符串描述
形如 Genes[144 -> 48, nnz=144, params=192, dense=6960] 的描述文本
层的名称
层名称字符串
输入维度(子节点数量)
输入维度
输出维度(父节点数量)
输出维度
由生物层级编译出来的稀疏连接边表
稀疏连接对象
二值掩码矩阵 M,形状为 [FanIn, FanOut]
掩码张量,元素取值为 0 或者 1
权重矩阵 W,形状为 [FanIn, FanOut]
权重张量
偏置向量 b,形状为 [1, FanOut]
偏置张量
累积的权重梯度,形状与 MaskedDenseLayer.Weights 相同
权重梯度张量
累积的偏置梯度,形状与 MaskedDenseLayer.Bias 相同
偏置梯度张量
最近一次前向传播所得到的线性变换结果 z,形状为 [N, FanOut]
激活前张量,供 DeepLIFT 归因使用
最近一次前向传播所得到的激活值 tanh(z),形状为 [N, FanOut]
激活值张量
最近一次前向传播的输入,形状为 [N, FanIn]
输入张量
当前层中真实存在的连接数量
连接边数量
当前层中可训练参数的实际数量(仅统计未被掩码屏蔽的连接与偏置)
可训练参数数量
若当前层为稠密连接时的参数数量,用于对比稀疏化带来的压缩比
稠密参数数量