You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何控制神经网络隐藏层神经元的输入特征?输入masking可行吗?

解决方案:控制神经网络隐藏层神经元的输入特征选择

一、最直接的方法:固定无关特征的权重为0

你提到的调整权重思路完全可行,具体操作是:

  • 给神经元1对应ft2、ft4的权重初始化为0,并且固定这些权重不参与训练;
  • 给神经元2对应ft1、ft3、ft5的权重初始化为0,同样固定不更新。

这样训练过程中,无关特征的权重始终为0,相当于完全不输入到对应神经元。以PyTorch为例,代码实现如下:

import torch
import torch.nn as nn

class CustomNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 输入层到隐藏层:5特征 → 2神经元
        self.hidden = nn.Linear(5, 2)
        # 手动初始化并固定无关权重
        with torch.no_grad():
            # 神经元1(权重矩阵第0行)屏蔽ft2(index1)、ft4(index3)
            self.hidden.weight[0, 1] = 0.0
            self.hidden.weight[0, 3] = 0.0
            # 神经元2(权重矩阵第1行)屏蔽ft1(index0)、ft3(index2)、ft5(index4)
            self.hidden.weight[1, 0] = 0.0
            self.hidden.weight[1, 2] = 0.0
            self.hidden.weight[1, 4] = 0.0
            # 禁止这些权重参与梯度更新
            self.hidden.weight[0, 1].requires_grad = False
            self.hidden.weight[0, 3].requires_grad = False
            self.hidden.weight[1, 0].requires_grad = False
            self.hidden.weight[1, 2].requires_grad = False
            self.hidden.weight[1, 4].requires_grad = False
        self.output = nn.Linear(2, 1)
        self.sigmoid = nn.Sigmoid()
    
    def forward(self, x):
        x = torch.relu(self.hidden(x))
        x = self.sigmoid(self.output(x))
        return x

二、更直观的方法:手动拆分特征输入

直接把输入特征分成两组,分别喂给两个独立的神经元,再拼接输出送入后续层。这种方式完全从结构上隔离了无关特征,不需要额外处理权重:

import torch
import torch.nn as nn

class SplitInputNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 神经元1仅接收ft1、ft3、ft5(3个特征)
        self.neuron1 = nn.Linear(3, 1)
        # 神经元2仅接收ft2、ft4(2个特征)
        self.neuron2 = nn.Linear(2, 1)
        self.output = nn.Linear(2, 1)
        self.sigmoid = nn.Sigmoid()
    
    def forward(self, x):
        # 按特征索引拆分输入(假设输入列顺序为ft1、ft2、ft3、ft4、ft5)
        x1 = x[:, [0, 2, 4]]  # 取ft1、ft3、ft5
        x2 = x[:, [1, 3]]     # 取ft2、ft4
        # 计算两个神经元的输出
        out1 = torch.relu(self.neuron1(x1))
        out2 = torch.relu(self.neuron2(x2))
        # 拼接后送入输出层
        combined = torch.cat([out1, out2], dim=1)
        return self.sigmoid(self.output(combined))

三、关于“神经元输入masking”的问题

常规的masking主要用于处理序列数据的缺失值或变长输入,直接用来屏蔽特征输入并不适配。不过可以通过构造特征掩码矩阵,提前将无关特征置0后再输入网络,但本质和固定权重为0的效果一致:

# 构造掩码矩阵,行对应神经元,列对应特征
mask = torch.tensor([[1, 0, 1, 0, 1],  # 神经元1保留ft1、ft3、ft5
                     [0, 1, 0, 1, 0]]) # 神经元2保留ft2、ft4
# 输入特征与掩码相乘,得到每个神经元的输入
x_masked = x @ mask.T  # 输出形状为(batch_size, 2)

这种方法不如前两种高效,因为会引入额外的矩阵运算,更推荐直接用前两种方案。

内容的提问来源于stack exchange,提问作者klklklkl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:15:22