【问题标题】:Multi-label classification implementation多标签分类实现
【发布时间】:2020-12-19 08:09:08
【问题描述】:

到目前为止,我已经使用 Keras Tensorflow 对图像处理、NLP、时间序列预测进行建模。通常在标签具有多个条目的情况下,因此多个类别的任务总是只是预测样本属于哪个类别。例如,可能的类列表是[汽车、人类、飞机、花卉、建筑]。所以最终的预测是样本属于哪个类别——给出每个类别的概率。通常就非常自信的预测而言,一类的概率非常高,而其他类的概率非常低。

现在我遇到了这个 Kaggle 挑战:Toxic Comment Classification Challenge,特别是这个implementation。我认为这是一个多标签分类问题,因为一个样本可以属于不同的类别。事实上,当我检查最终预测时:

我可以看到第一个样本预测有毒和淫秽的概率非常高。以我目前的知识,当我应用标准模型来预测一个类别时,我会预测样本属于哪个类别的概率。因此,无论是 1 级还是 2 级或....所以我会有 - 在有信心的预测的情况下 - 毒性等级的概率很高,而其他等级的概率很低 - 或者在不自信的预测的情况下 - 有毒的 0.4 倍,0.4 倍其余为淫秽和小概率。

现在我对实施的完成方式感到惊讶。我不明白以下内容: 多标签分类是如何完成的(与“通常”模型相反)?

检查代码时,我看到以下模型:

inp = Input(shape=(maxlen,))
x = Embedding(max_features, embed_size, weights=[embedding_matrix])(inp)
x = Bidirectional(LSTM(50, return_sequences=True, dropout=0.1, recurrent_dropout=0.1))(x)
x = GlobalMaxPool1D()(x)
x = Dense(50, activation="relu")(x)
x = Dropout(0.1)(x)
x = Dense(6, activation="sigmoid")(x)
model = Model(inputs=inp, outputs=x)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

我知道x = Dense(6, activation="sigmoid") 是由于必须预测 6 个类而产生的。到目前为止,我的知识也是如此。但是,为什么会产生多标签分类的概率呢?多标签分类和只预测一个标签的不同选择在实现上的区别在哪里?

这是使用二元交叉熵而不是(稀疏)分类交叉熵以及 6 个类的简单区别吗?所以这说明我们对每个类都有一个二元问题,它分别处理这 6 个类,所以给每个类一个样本属于这个类的概率,因此它很有可能属于不同的类?

【问题讨论】:

    标签: python tensorflow keras nlp kaggle


    【解决方案1】:

    要使用的损失函数确实是带有sigmoid 激活的binary_crossentropy

    categorical_crossentropy 不适用于多标签问题,因为在多标签问题的情况下,标签不是互斥的。重复最后一句话:标签不是互斥的。

    这意味着[1,0,1,0,0,0] 形式的标签的存在是正确的。 categorical_crossentropysoftmax 总是倾向于支持一个特定的类,但事实并非如此;正如您所看到的,评论可能既有毒又淫秽。

    现在想象一下里面有猫和狗的照片。如果我们在一张照片中有 2 只狗和 2 只猫会怎样?这是狗的照片还是猫的照片?它实际上是一个“两者”的画面!我们肯定需要一种方法来指定多个标签与照片/标签相关/相关。

    使用 binary_crossentropy 和 sigmoid 进行多标签分类的基本原理在于数学属性,因为每个输出都需要被视为独立的Bernoulli distribution

    因此,唯一正确的解决方案是 BCE + 'sigmoid'。

    【讨论】:

    • 如果某些标签不相互独立会发生什么? (例如 label_1 独立于所有内容,但 label_3 在 label_2 ==1 时更可能 ==1)您仍然可以使用 binary_crossentropy 吗?
    • 如果标签不是相互独立的,我会亲自删除两个标签并只保留一列:值 1 表示两者都存在,值 0 表示不存在,前提是它们是永远存在。
    • 但是,如果它们并不总是独立的,我会保留两列并尝试收集尽可能多的数据集,以便网络了解照片中可能只有猫或例如,只有狗,不一定两个标签。
    • 它应该仍然有效。实际上,您没有 [0,1,0,0] 之类的情况,因为您只有 [1,1,0,0]。它仍然有效
    • 您提到的情况下的序数编码实际上限制了GT标签中组合的可能性,但不影响BCE + sigmoid的使用。
    【解决方案2】:

    正如您已经发现的,这不是一个“经典”分类问题。对于您在文中描述的分类问题,通常使用 softmax 激活来实现高置信度和低置信度总和为 1 的效果。

    如果您想预测二元问题,例如“信用卡欺诈”,您可以在结合 2 个输出神经元(欺诈非欺诈)的 softmax 激活和具有 1 个输出神经元的回归模型之间进行选择。在后者中,单个神经元将输出 [0,1] 范围内的值,并选择一个阈值,例如 0.5。所有输出 = 0.5 属于 1 类。

    如果您想构建一个能够为一个输入预测多个类别的模型,您应该使用回归方法(后一种)和 sigmoid 激活函数。这会启用与您图像中的输出类似的输出。

    说实话,我不确定“二元交叉熵”是否是此类问题的正确损失。

    【讨论】:

    • 你个人推荐什么损失函数?
    • 仅仅使用 sigmoid 就不同了?那么这使得实现成为多标签分类实现?例如,当我有 x = Dense(1, activation="sigmoid")(x) 时,这不会使其成为多标签分类,因为它仍然是属于 0 类或 1 类的二元问题。所以多label 将是它可以属于两个类,0 和 1。所以单独的 sigmoid 并不能使其成为多标签分类实现?
    • 使用 x = Dense(6, activation="sigmoid")(x) 我仍然可以实现它给我样本属于给定类之一的概率,但不是使其成为一个多标签分类,让我知道样本可以属于超过 1 个类别。
    猜你喜欢
    • 2019-12-29
    • 2020-10-26
    • 2019-04-01
    • 2019-07-10
    • 1970-01-01
    • 2017-01-03
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多