深度监督预测头:挂在每一个隐藏层之后的 sigmoid 二分类输出节点
PredictionHead
00 Remarks
P-NET 在每一个隐藏层后面都挂一个 sigmoid 预测节点,最终预测为所有预测头输出的平均值:
ŷ = (1 / L) · Σ_l σ(z_l)
这样设计有三个作用:
- 正则化:迫使每一层的中间表示本身就要具备判别力,防止信息只在前几层"打包", 后面的层退化为恒等映射;
- 逐层可解释:每一个预测头都可以单独审视,从而判断哪一层抽象层级携带了主要的判别信号;
- 损失加权:越深的层节点数越少、参数越少、拟合更困难, 因此训练时给深层的预测头更高的损失权重以平衡梯度贡献(见 PredictionHead.LossWeight)。
01 Syntax
02 Methods
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| Name | 1 | 预测头的名称,通常采用其所挂载的隐藏层名称 |
| FanIn | 1 | 所挂载的隐藏层的节点数量 |
| Weights | 1 | 权重向量 w,形状为 [1, FanIn] |
| Bias | 1 | 偏置标量 b,形状为 [1] |
| WeightGrad | 1 | 累积的权重梯度,形状与 PredictionHead.Weights 相同 |
| BiasGrad | 1 | 累积的偏置梯度 |
| LossWeight | 1 | 该预测头在总损失之中的权重,越深的层取值越大 |
| LastZ | 1 | 最近一次前向传播所得到的 logits 值 z = a·w + b,形状为 [N, 1] |
| LastP | 1 | 最近一次前向传播所得到的概率值 σ(z),形状为 [N, 1] |
| LastInput | 1 | 最近一次前向传播所输入进来的隐藏层激活值,形状为 [N, FanIn] |
04 Members
Int32, String, Double, Nullable(Of Int32))创建深度监督预测头
| Name | Type | Description |
|---|---|---|
fanIn | Int32 | 所挂载的隐藏层的节点数量 |
name | String | 预测头名称 |
lossWeight | Double | 该预测头在总损失中的权重 |
seed | Nullable(Of Int32) | 权重初始化随机数种子 |
Tensor)前向传播:p = σ(a·w + b)
| Name | Type | Description |
|---|---|---|
a | Tensor | 隐藏层激活值矩阵,形状为 [N, FanIn] |
概率矩阵,形状为 [N, 1]
Tensor)反向传播:累积权重与偏置梯度,并返回传递给隐藏层激活值的梯度
记 dz = ∂L/∂p · p · (1 - p),则有 ∂L/∂w = Σ a · dz、∂L/∂b = Σ dz、∂L/∂a = dz ⊗ w。
| Name | Type | Description |
|---|---|---|
dLoss_dP | Tensor | 损失对预测概率的梯度,形状为 [N, 1] |
损失对隐藏层激活值的梯度 ∂L/∂a,形状为 [N, FanIn]
清零累积的权重与偏置梯度
List(Of Tensor), List(Of Tensor))把参数与梯度收集到给定的列表之中,供优化器使用
| Name | Type | Description |
|---|---|---|
parameters | List(Of Tensor) | 参数收集列表 |
gradients | List(Of Tensor) | 梯度收集列表 |
生成预测头的字符串描述
形如 head_Genes[48 -> 1, weight=1.000] 的描述文本
预测头的名称,通常采用其所挂载的隐藏层名称
名称字符串
所挂载的隐藏层的节点数量
输入维度
权重向量 w,形状为 [1, FanIn]
权重张量
偏置标量 b,形状为 [1]
偏置张量
累积的权重梯度,形状与 PredictionHead.Weights 相同
权重梯度张量
累积的偏置梯度
偏置梯度张量
该预测头在总损失之中的权重,越深的层取值越大
损失权重
最近一次前向传播所得到的 logits 值 z = a·w + b,形状为 [N, 1]
logits 张量,供 DeepLIFT 归因使用
最近一次前向传播所得到的概率值 σ(z),形状为 [N, 1]
概率张量
最近一次前向传播所输入进来的隐藏层激活值,形状为 [N, FanIn]
激活值张量