我有一个关于如何创建神经网络(或类似)架构的问题,以实现以下目标:
示例
假设我有一个使用特征1和特征2来预测目标的模型。由于可用的训练样本中特征1和特征2的数量有限,该模型表现不佳。
如果我有另一个使用特征3和特征4的神经网络,我的目标是预测相同的目标,我该如何将两个模型的学习结合起来,做出相同的目标预测?
这种情况在其他几个具有不同特征但共同目标的数据集上继续发生。
解释
我这样做是因为不是每个训练样本都包含特征1、2、3和4,因此无法将其纳入单一模型中。但唯一共同点是这些模型都在尝试预测相同的目标。
问题
对于这种问题,哪种机器学习策略(不仅仅是神经网络)最合适?
回答:
您描述的模型由两个核心子模型组成。
-
多个依赖于特征的编码器,每个特征集一个。特征1和2可以由模型的一部分结合成某种隐藏表示。特征3和4将被转换成相同的隐藏表示,但会使用不同的子模型和不同的参数集进行拟合。
-
一个独立于特征的解码器,位于隐藏表示之上,用于预测您的目标。
在拟合模型时,每个编码器只能使用具有所需特征集的数据。它正在为这些特征拟合一个表示,因此需要看到它们。但解码器可以用于您所有的数据。这将捕捉到目标的分布,因为您的目标是共同的。
当您认为存在有意义的隐藏表示时,这种模型是合适的。也就是说,您认为您的特征集是在以不同方式测量类似的东西。
这允许您保持编码器较小,因为它只是在进行从一种测量方式到另一种测量方式的小转换。从测量转换到目标可能仍然很困难,但因为这部分逻辑在公共解码器中,所以它可以从所有训练数据中受益。
为了具体说明,这种模型的一个很好的使用案例是如果您的特征是width
、height
、volume
和weight
。假设您的目标是运输cost
。
可以合理地说,中间表示可以通过size
的概念很好地描述。并且也可以合理地说,无论您最初是如何测量size
的,从size
到cost
的转换本身就是一个有趣的问题。
因此,模型的公式看起来像这样:
# Feature encoders.size ~ width + heightsize ~ volume + weight# Target decoder.cost ~ size
现在,我在描述模型设计时一直小心避免对模型类型的任何承诺。但您确实将这个问题标记为与神经网络特别相关,我认为这是一个好的选择。
对于您的简单示例,使用PyTorch,模型可能看起来像这样:
import torch.nn as nnimport torch.nn.functional as Fclass MultiEncoderSingleDecoder(torch.nn.Module): def __init__(self, hid_sz): super().__init__() self.using_encoder = 0 self.encoders = torch.nn.ModuleList([ torch.nn.Linear(2, hid_sz), torch.nn.Linear(2, hid_sz), ]) self.decoder = torch.nn.Linear(hid_sz, 1) def set_encoder(self, use_encoder): self.using_encoder = use_encoder def forward(self, inp): encoder = self.encoders[self.using_encoder] return self.decoder(F.relu(encoder(inp)))
然后使用可能如下所示:
model = MultiEncoderSingleDecoder()model.set_encoder(0)# 在第一个特征集上进行一些训练model.set_encoder(1)# 在第二个特征集上进行更多训练# ...