nuget server logo nuget api documents
↑

API Docs / SMRUCC.genomics.Analysis.HTS.P-NET / MaskedDenseLayer

MaskedDenseLayer

Full name SMRUCC.genomics.Analysis.HTS.P_NET.MaskedDenseLayer Assembly SMRUCC.genomics.Analysis.HTS.P-NET Members 22

P-NET 的核心算子:受二值掩码约束的稀疏全连接层

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

SMRUCC.genomics.Analysis.HTS.P_NET.MaskedDenseLayer

02 Methods

NameOverloadsSummary
.ctor 1 创建受掩码约束的稀疏全连接层
ApplyMask 1 把权重与权重梯度逐元素乘以掩码,强制被屏蔽的连接恒为零
Forward 1 前向传播:a = tanh[(M * W)⃗x + b]
Backward 1 反向传播:累积权重与偏置梯度,并返回传递给下一层的梯度
ZeroGrad 1 清零累积的权重与偏置梯度
CollectParameters 1 把参数与梯度收集到给定的列表之中,供优化器使用
ToString 1 生成当前层的字符串描述

03 Properties

NameOverloadsSummary
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

method .ctor #
#ctor(SparseConnectivity, String, Nullable(Of Int32), Nullable(Of Double))

创建受掩码约束的稀疏全连接层

Parameters
NameTypeDescription
connectivitySparseConnectivity

由生物层级编译出来的稀疏连接边表

nameString

层名称

seedNullable(Of Int32)

权重初始化随机数种子

weightInitStdNullable(Of Double)

权重初始化的标准差;给出 Nothing 时使用 Xavier 初始化 sqrt(2 / (fanIn + fanOut))

method ApplyMask #
ApplyMask

把权重与权重梯度逐元素乘以掩码,强制被屏蔽的连接恒为零

Remarks

由于前向与反向传播只遍历边表,未被掩码覆盖的位置本来就不会被读写; 这里额外做一次逐元素相乘,是为了保证 MaskedDenseLayer.Weights 对外可见的数值 与"该连接不存在"这一语义严格一致。

method Forward #
Forward(Tensor)

前向传播:a = tanh[(M * W)⃗x + b]

Parameters
NameTypeDescription
xTensor

输入矩阵,形状为 [N, FanIn]

Returns

激活值矩阵,形状为 [N, FanOut]

method Backward #
Backward(Tensor)

反向传播:累积权重与偏置梯度,并返回传递给下一层的梯度

Remarks

记 dZ = ∂L/∂a ⊙ (1 - a²),则有:

  • ∂L/∂W = x⃗ · dZ(只累加边表上的元素)
  • ∂L/∂b = Σ dZ
  • ∂L/∂x = dZ · (M * W)

梯度会被累加到 MaskedDenseLayer.WeightGrad 与 MaskedDenseLayer.BiasGrad 之上, 需要在一个训练步开始之前调用 MaskedDenseLayer.ZeroGrad() 清零。

Parameters
NameTypeDescription
upstreamTensor

损失对当前层激活值的梯度 ∂L/∂a,形状为 [N, FanOut]

Returns

损失对当前层输入的梯度 ∂L/∂x,形状为 [N, FanIn]

method ZeroGrad #
ZeroGrad

清零累积的权重与偏置梯度

method CollectParameters #
CollectParameters(List(Of Tensor), List(Of Tensor))

把参数与梯度收集到给定的列表之中,供优化器使用

Parameters
NameTypeDescription
parametersList(Of Tensor)

参数收集列表

gradientsList(Of Tensor)

梯度收集列表

method ToString #
ToString

生成当前层的字符串描述

Returns

形如 Genes[144 -> 48, nnz=144, params=192, dense=6960] 的描述文本

property Name #
Name

层的名称

Returns

层名称字符串

property FanIn #
FanIn

输入维度(子节点数量)

Returns

输入维度

property FanOut #
FanOut

输出维度(父节点数量)

Returns

输出维度

property Connectivity #
Connectivity

由生物层级编译出来的稀疏连接边表

Returns

稀疏连接对象

property Mask #
Mask

二值掩码矩阵 M,形状为 [FanIn, FanOut]

Returns

掩码张量,元素取值为 0 或者 1

property Weights #
Weights

权重矩阵 W,形状为 [FanIn, FanOut]

Returns

权重张量

property Bias #
Bias

偏置向量 b,形状为 [1, FanOut]

Returns

偏置张量

property WeightGrad #
WeightGrad

累积的权重梯度,形状与 MaskedDenseLayer.Weights 相同

Returns

权重梯度张量

property BiasGrad #
BiasGrad

累积的偏置梯度,形状与 MaskedDenseLayer.Bias 相同

Returns

偏置梯度张量

property LastZ #
LastZ

最近一次前向传播所得到的线性变换结果 z,形状为 [N, FanOut]

Returns

激活前张量,供 DeepLIFT 归因使用

property LastA #
LastA

最近一次前向传播所得到的激活值 tanh(z),形状为 [N, FanOut]

Returns

激活值张量

property LastInput #
LastInput

最近一次前向传播的输入,形状为 [N, FanIn]

Returns

输入张量

property ConnectionCount #
ConnectionCount

当前层中真实存在的连接数量

Returns

连接边数量

property TrainableCount #
TrainableCount

当前层中可训练参数的实际数量(仅统计未被掩码屏蔽的连接与偏置)

Returns

可训练参数数量

property DenseParameterCount #
DenseParameterCount

若当前层为稠密连接时的参数数量,用于对比稀疏化带来的压缩比

Returns

稠密参数数量