多标签分类实现
Multi-label classification implementation
到目前为止,我已经使用Keras Tensorflow 对图像处理、NLP、时间序列预测进行建模。通常在标签有多个条目的情况下,所以多个类别的任务总是只是预测样本属于哪个class。因此,例如可能的 classes 列表是 [car, human, airplane, flower, building]。所以最终的预测是 class 样本属于哪个 - 给出每个 class 的概率。通常就非常有把握的预测而言,一个 class 的概率非常高,而其他的概率非常低。
现在我遇到了这个 Kaggle 挑战:Toxic Comment Classification Challenge and in specific this implementation。我认为这是一个多标签 class 化问题,因为一个样本可以属于不同的 classes。事实上,当我检查最终预测时:
我可以看到第一个样本预测有毒和淫秽的概率非常高。据我所知,到目前为止,当我应用标准模型来预测 class 时,我会预测样本属于这个 class 的概率。所以要么 class 1 或 2 要么 .... 所以我会有 - 在有信心的预测的情况下 - class 有毒的可能性很高而对其他人来说很低 - 或者在不自信的预测的情况下- 有毒 0.4x,淫秽 0.4x,其余概率小。
现在我对实现的方式感到惊讶。我不明白以下内容:
多标签 class 化是如何完成的(与“常规”模型相反)?
检查代码时,我看到以下模型:
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 class 个结果。到目前为止,我的知识也是如此。但是,为什么多标签class化的概率会产生?多标签class化与仅根据不同选择预测单标签之间的实现差异在哪里?
这是使用二元交叉熵和不使用(稀疏)分类交叉熵以及 6 classes 的简单区别吗?所以这告诉我们每个 classes 都有一个二元问题,它分别处理这 6 个 classes,所以给每个 class 样本属于这个 class 因此它很可能属于不同的 classes?
您已经发现,这不是“classic”class化问题。对于您在文中描述的class化问题,通常使用softmax激活来实现高置信度和低置信度总和为1的效果。
如果您想预测一个二元问题,例如“信用卡欺诈”,您可以在 softmax 激活结合 2 个输出神经元(欺诈 <-> 非欺诈)和具有 1 个输出的回归模型之间进行选择神经元。在后者中,单个神经元将输出 [0,1] 范围内的值,并选择一个阈值,例如 0.5。所有输出 <0.5 属于 class 0,所有 >= 0.5 属于 class 1.
如果你想构建一个能够为一个输入预测多个 classes 的模型,你应该使用回归方法(后一个)和 sigmoid 激活函数。这样可以实现类似于图像中的输出。
老实说,对于这样的问题,我不确定“binary-crossentropy”是否是正确的损失。
要使用的损失函数确实是具有sigmoid
激活的binary_crossentropy
。
categorical_crossentropy
不适用于 multi-label 问题,因为在 multi-label 问题的情况下,标签不是互斥的。重复上一句:标签不互斥
这意味着 [1,0,1,0,0,0]
形式的标签是正确的。 categorical_crossentropy
和 softmax
总是倾向于偏爱一个特定的 class,但事实并非如此;正如您所见,评论可能既有毒又下流。
现在想象一下里面有猫和狗的照片。如果我们在一张照片中有 2 只狗和 2 只猫会怎样?是狗图还是猫图?它实际上是一个“两者”的图片!我们肯定需要一种方法来指定多个标签是 pertained/related 到 photo/label.
使用 binary_crossentropy 和 sigmoid 进行 multi-label class化的基本原理在于数学属性,因为每个输出都需要被视为独立的 Bernoulli distribution.
因此,唯一正确的解是BCE + 'sigmoid'.
到目前为止,我已经使用Keras Tensorflow 对图像处理、NLP、时间序列预测进行建模。通常在标签有多个条目的情况下,所以多个类别的任务总是只是预测样本属于哪个class。因此,例如可能的 classes 列表是 [car, human, airplane, flower, building]。所以最终的预测是 class 样本属于哪个 - 给出每个 class 的概率。通常就非常有把握的预测而言,一个 class 的概率非常高,而其他的概率非常低。
现在我遇到了这个 Kaggle 挑战:Toxic Comment Classification Challenge and in specific this implementation。我认为这是一个多标签 class 化问题,因为一个样本可以属于不同的 classes。事实上,当我检查最终预测时:
我可以看到第一个样本预测有毒和淫秽的概率非常高。据我所知,到目前为止,当我应用标准模型来预测 class 时,我会预测样本属于这个 class 的概率。所以要么 class 1 或 2 要么 .... 所以我会有 - 在有信心的预测的情况下 - class 有毒的可能性很高而对其他人来说很低 - 或者在不自信的预测的情况下- 有毒 0.4x,淫秽 0.4x,其余概率小。
现在我对实现的方式感到惊讶。我不明白以下内容: 多标签 class 化是如何完成的(与“常规”模型相反)?
检查代码时,我看到以下模型:
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 class 个结果。到目前为止,我的知识也是如此。但是,为什么多标签class化的概率会产生?多标签class化与仅根据不同选择预测单标签之间的实现差异在哪里?
这是使用二元交叉熵和不使用(稀疏)分类交叉熵以及 6 classes 的简单区别吗?所以这告诉我们每个 classes 都有一个二元问题,它分别处理这 6 个 classes,所以给每个 class 样本属于这个 class 因此它很可能属于不同的 classes?
您已经发现,这不是“classic”class化问题。对于您在文中描述的class化问题,通常使用softmax激活来实现高置信度和低置信度总和为1的效果。
如果您想预测一个二元问题,例如“信用卡欺诈”,您可以在 softmax 激活结合 2 个输出神经元(欺诈 <-> 非欺诈)和具有 1 个输出的回归模型之间进行选择神经元。在后者中,单个神经元将输出 [0,1] 范围内的值,并选择一个阈值,例如 0.5。所有输出 <0.5 属于 class 0,所有 >= 0.5 属于 class 1.
如果你想构建一个能够为一个输入预测多个 classes 的模型,你应该使用回归方法(后一个)和 sigmoid 激活函数。这样可以实现类似于图像中的输出。
老实说,对于这样的问题,我不确定“binary-crossentropy”是否是正确的损失。
要使用的损失函数确实是具有sigmoid
激活的binary_crossentropy
。
categorical_crossentropy
不适用于 multi-label 问题,因为在 multi-label 问题的情况下,标签不是互斥的。重复上一句:标签不互斥
这意味着 [1,0,1,0,0,0]
形式的标签是正确的。 categorical_crossentropy
和 softmax
总是倾向于偏爱一个特定的 class,但事实并非如此;正如您所见,评论可能既有毒又下流。
现在想象一下里面有猫和狗的照片。如果我们在一张照片中有 2 只狗和 2 只猫会怎样?是狗图还是猫图?它实际上是一个“两者”的图片!我们肯定需要一种方法来指定多个标签是 pertained/related 到 photo/label.
使用 binary_crossentropy 和 sigmoid 进行 multi-label class化的基本原理在于数学属性,因为每个输出都需要被视为独立的 Bernoulli distribution.
因此,唯一正确的解是BCE + 'sigmoid'.