神经网络的两个输出之间的一致性

机器算法验证 机器学习 神经网络 损失函数
2022-03-16 05:40:29

我正在尝试基于表格数据输入来拟合密集神经网络,其中输出是两个独立的分类向量,每个分类向量都有一个交叉熵损失函数。

示例:给定一些输入特征,对于访问旅游网站并打算购买火车票的客户,该模型将预测旅行目的地和客户可能的旅行等级(一等或二等)买。

问题:似乎在内部,网络在隐藏层的某个点被一分为二,每个子网络都专门预测一个输出向量,而忽略另一个。这导致每个输出的总体可接受精度,但两个输出之间的一致性仍有待改进。

神经网络图解

例如,对于给定的条目,网络将预测“伦敦”和“第一类”,因为独立地,每个输出根据输入特征是有意义的,但是没有一个训练点可以是伦敦和第一类一起发现,仅仅是因为去伦敦旅行时没有一等舱的选择。该网络似乎完全不关心两者之间的一致性。

例如,如果乘客是一名 35 岁的会计师并从布鲁塞尔出发,则训练集给出了一个明确的赢家destination: London,分别为 和 ,class: 1st因此这就是网络倾向于预测的结果,尽管这种组合完全不存在。

在此处输入图像描述

是否有任何方法可以修改网络和/或损失函数的组织,以便考虑两个输出之间的一致性,并且网络将避免在训练集中找不到的输出组合,并支持那些?

更一般地说,解决这个问题的一些好方法是什么?请注意,如果可能的话,我想避免使用手动规则。

3个回答

如果一致性是一个问题,我会将其作为单一分类任务,其中“伦敦一等”、“伦敦二等”、...、“罗马一等”和“罗马二等”是不同的类别,而不是让它成为两个不同的分类任务。您当前的网络架构给出了先验提示,即它们是完全不同的分类任务,但是如果例如某些目的地没有两个类,则两个子类之间存在依赖关系。将两个分类任务合二为一是将依赖关系放回模型中的最简单方法。

目前,我认为您的模型预测客户会选择头等舱机票(如果有的话),这不是一个不合理的答案 - 它只是概括了这样一种想法,即从事相对高薪职业的人(例如会计师)倾向于去头等舱旅行。您总是可以忽略不能选择的类输出。

网络真的需要这么多层吗?可能单个隐藏层可能足以解决这个问题,而上面的层实际上并没有做太多有用的处理,在这种情况下,网络的划分可能没有那么有意义。

另一种方法是建立两个神经网络。第一个神经网络被训练来预测目的地。对于第二个 NN,将第一个 NN 预测的目的地作为输入特征,并训练网络来预测类别。然后,第二个网络应该学会只预测作为预测目的地选项的类别。

针对@Jivan 的评论进行了编辑。

有更复杂的多标签分类方法,但如果可能的话,我会保持简单,并首先尝试@Dikran 或我的方法。它们都是实现多标签分类的标准方法(参见这篇 Medium 文章)。Dikran 的方法是 Label Powerset,我的方法是 Classifier Chain。正如您所指出的,这两种方法各有利弊。如果这些都没有产生足够好的结果,您可以尝试分类器链的变体,您可以在其中构建一个网络来从目的地和类的联合中预测一个标签。然后再训练两个网络,一个在给定预测类别的情况下预测目的地,另一个在给定预测目的地的情况下预测类别。在推理时,您将使用第一个网络来预测类别或目的地,然后适当的第二个网络预测另一个标签。

成本函数

您的神经网络以何种方式能够知道目的地伦敦的一等舱是不可行的?你是怎么把它教给网络的?在训练错误预测的过程中,你以什么方式“惩罚”网络?

重要的是训练阶段允许网络训练所需的特征。在您的问题中,您没有说明您用于训练模型的成本函数。

也不清楚您的模型创建了哪种类型的输出以及您希望从中获得什么。我猜对了输出只是一个单一的类预测吗?在这种情况下,您会在问题的示例中支持什么类别的预测。

“伦敦二等舱”比“伦敦一等舱”更好吗?

当这个成本函数只关心一个错误时,它就不太关心组合错误了。这可能会导致您的问题(我假设这是您的成本函数的创建方式,但尚不清楚)。

在 89302 个案例中,当真值为 Londen + 2nd class 时,预测 London + 1st class 将是错误的。但是,当真实值为巴黎/罗马/柏林/马德里/鹿特丹+一等时,在 48516 + 41411 + 38186 + 35247 + 28512 个案例中,选择预测一等而不是二等可能会得到回报(我不确定,但我猜你的成本函数正在这样做)。

当系统在伦敦时,你可以惩罚系统对一等的预测,但同时,当其他城市发生一等预测时,你会奖励它。因此,您将获得伦敦一等奖。

输出类型

我之前提到过,我猜你的模型只是给出了一个单一的类别预测。我是根据您的情况以及短语来猜测的

例如,对于给定条目,网络将预测“伦敦”和“第一类”

如果是这种情况,那么您可能会考虑使用不同类型的输出。除了预测单个类之外,您还可以将所有期望的目的地和类组合的概率向量作为输出(以及您的模型中可能具有的其他方面)。然后,您可以根据分类分布的似然函数评估预测并执行训练。

当您应用此模型(一些在线购物工具或对航空公司的一些帮助?)时,它不会给出单个类作为输出,而是会给出顶级目的地的排名。

网络结构

你有什么样的密集神经网络,你是如何训练它的?可以想象,在其中一些层中应该有一个节点经过训练专门处理 London + 2nd class 案例。但是,你有多少层,每层有多少个节点,你是如何进行交叉验证的?

可以想象,这种错误/错误预测可能会发生。但是如果没有细节,很难说它为什么以及如何发生。