GEARS 边类型感知的图卷积层
GEARSConvLayer
00 Remarks
实现 readme 第五节的「带边类型感知的消息传递」:
h_i^(l+1) = σ( W_self · h_i^(l) + Σ_{j ∈ N_in(i)} α_ji · sign(r_ji) · (W_{r_ji} · h_j^(l)) )
要点:
- 调控图中 TF → Target 是有向边,扰动信号沿调控方向向下游传播,
因此聚合的是入边邻居(即调控该基因的上游基因);
- 抑制边(EdgeRelationType.Repression)的消息符号为 -1,
使模型能够表达「上游下调导致下游上调」这样的反向效应;
- 默认使用稀疏入边聚合(复杂度 O(|E|·d)),因为先验调控网络非常稀疏
(350+ 基因仅约 350 条边),稠密邻接矩阵乘法会带来两个数量级的无用开销;
- 堆叠 L 层即可捕捉 L-hop 的间接调控效应;readme 建议 2~4 层以避免过平滑。
之所以不使用 GNN 模块自带的 GATLayer,是因为它的 Backward 直接抛出 InvalidOperationException,无法参与训练。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| .ctor | 1 | 创建 GEARS 图卷积层 |
| Forward | 2 | 前向传播:沿调控图的入边做边类型感知的稀疏(或稠密)聚合 |
| BuildTransformed | 1 | 按边关系类型对输入做线性变换;共享模式下所有类型复用同一个结果 |
| ForwardDense | 1 | 稠密模式下的前向传播(使用归一化邻接矩阵,含自环) |
| Backward | 2 | 反向传播:累积本层权重梯度并返回输入梯度 |
| BackwardDense | 1 | 稠密模式下的反向传播 |
| EnsureBuffers | 1 | 获取(并在必要时重新分配与清零)按边类型分组的反向传播缓冲区 |
| GetParameters | 1 | 获取本层可训练参数 |
| GetGradients | 1 | 获取本层参数梯度(顺序与 GEARSConvLayer.GetParameters() 严格一致) |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| InFeatures | 1 | 输入特征维度 |
| OutFeatures | 1 | 输出特征维度 |
| Activation | 1 | 激活函数类型 |
| UsePerRelationTransform | 1 | 是否为每种边关系类型分配独立的变换矩阵 |
| UseDense | 1 | 是否使用稠密邻接矩阵聚合(仅用于小图对照,默认关闭) |
04 Fields
| Name | Overloads | Summary |
|---|---|---|
| wSelf | 1 | 自身信息变换权重 [inFeatures, outFeatures] |
| bias | 1 | 偏置 [1, outFeatures] |
| relW | 1 | 每种边关系类型专属的邻居变换权重 |
| wSelfGrad | 1 | 自身变换权重梯度 |
| biasGrad | 1 | 偏置梯度 |
| relWGrad | 1 | 每种边关系类型的邻居变换权重梯度 |
| lastInput | 1 | 上一次前向传播的输入特征 |
| preActivation | 1 | 上一次前向传播的激活前输出(用于计算激活函数导数) |
| denseAdj | 1 | 稠密模式下的归一化邻接矩阵缓存 |
| dTransBuffers | 1 | 反向传播用的按边类型分组的梯度缓冲区 |
05 Members
Int32, Int32, ActivationType, Boolean, Boolean, Nullable(Of Int32), String)创建 GEARS 图卷积层
| Name | Type | Description |
|---|---|---|
inFeatures | Int32 | 输入特征维度 |
outFeatures | Int32 | 输出特征维度 |
activation | ActivationType | 激活函数类型,默认 |
usePerRelationTransform | Boolean | 为 True 时为每种边关系类型分配独立的变换矩阵(严格对应 readme §5.4); 为 False 时所有类型共享同一个变换矩阵,仅用符号区分激活/抑制,计算量更小 |
useDense | Boolean | 为 True 时使用稠密归一化邻接矩阵聚合 |
seed | Nullable(Of Int32) | 权重初始化随机种子;给定后初始化结果可复现 |
name | String | 层名称 |
Tensor, GeneRegulatoryGraph)前向传播:沿调控图的入边做边类型感知的稀疏(或稠密)聚合
| Name | Type | Description |
|---|---|---|
input | Tensor | 节点特征 [numGenes, inFeatures] |
graphData | GeneRegulatoryGraph | 基因调控图(提供稀疏入边缓存) |
更新后的节点特征 [numGenes, outFeatures]
Tensor)不支持的调用方式:本层需要图结构参数
| Name | Type | Description |
|---|---|---|
input | Tensor | 节点特征 |
永不返回
Tensor, GeneRegulatoryGraph)按边关系类型对输入做线性变换;共享模式下所有类型复用同一个结果
| Name | Type | Description |
|---|---|---|
input | Tensor | 节点特征 [numGenes, inFeatures] |
graphData | GeneRegulatoryGraph | 基因调控图,用于判断哪些关系类型实际存在 |
长度为关系类型数量的变换结果数组
Tensor, GeneRegulatoryGraph)稠密模式下的前向传播(使用归一化邻接矩阵,含自环)
| Name | Type | Description |
|---|---|---|
input | Tensor | 节点特征 [numGenes, inFeatures] |
graphData | GeneRegulatoryGraph | 基因调控图 |
更新后的节点特征 [numGenes, outFeatures]
Tensor, GeneRegulatoryGraph)反向传播:累积本层权重梯度并返回输入梯度
| Name | Type | Description |
|---|---|---|
gradient | Tensor | 上游梯度 [numGenes, outFeatures] |
graphData | GeneRegulatoryGraph | 基因调控图(提供稀疏入边缓存) |
输入梯度 [numGenes, inFeatures]
Tensor)不支持的调用方式:本层需要图结构参数
| Name | Type | Description |
|---|---|---|
gradient | Tensor | 上游梯度 |
永不返回
Tensor, GeneRegulatoryGraph)稠密模式下的反向传播
| Name | Type | Description |
|---|---|---|
gAct | Tensor | 经过激活函数导数修正的梯度 [numGenes, outFeatures] |
graphData | GeneRegulatoryGraph | 基因调控图 |
输入梯度 [numGenes, inFeatures]
获取(并在必要时重新分配与清零)按边类型分组的反向传播缓冲区
| Name | Type | Description |
|---|---|---|
graphData | GeneRegulatoryGraph | 基因调控图,用于判断哪些关系类型实际存在 |
rows | Int32 | 行数(基因数量) |
cols | Int32 | 列数(输出维度) |
缓冲区数组;图上不存在的关系类型对应位置为 Nothing
获取本层可训练参数
参数张量列表
获取本层参数梯度(顺序与 GEARSConvLayer.GetParameters() 严格一致)
梯度张量列表
输入特征维度
输入维度大小
输出特征维度
输出维度大小
激活函数类型
ActivationType 枚举值
是否为每种边关系类型分配独立的变换矩阵
独立变换则返回 True;所有类型共享同一个变换矩阵则返回 False
是否使用稠密邻接矩阵聚合(仅用于小图对照,默认关闭)
稠密模式则返回 True
自身信息变换权重 [inFeatures, outFeatures]
偏置 [1, outFeatures]
每种边关系类型专属的邻居变换权重
自身变换权重梯度
偏置梯度
每种边关系类型的邻居变换权重梯度
上一次前向传播的输入特征
上一次前向传播的激活前输出(用于计算激活函数导数)
稠密模式下的归一化邻接矩阵缓存
反向传播用的按边类型分组的梯度缓冲区