如何解释使用Huggingface Transformers和TensorFlow进行序列分类时BERT输出的结果?

5
简短总结: 我在使用BERT进行序列分类任务,但不了解输出结果。
这是我的第一篇帖子,请多多包涵: 我正在使用bert对具有3个标签的序列分类任务进行处理。为此,我使用huggingface transformers和tensorflow,更具体地说,我使用TFBertForSequenceClassification类及bert-base-german-cased模型(是的,使用德语句子)。
我绝不是NLP方面的专家,这就是为什么我基本上遵循了这里的方法:https://towardsdatascience.com/fine-tuning-hugging-face-model-with-custom-dataset-82b8092f5333(当然会进行一些修改)。
一切似乎都正常工作,但我从模型接收到的输出结果却让我感到困惑。 以下是一些相关的输出内容。
与该文章中的示例相比,我主要的区别在于标签数量。文章只有2个,而我有3个。
我使用sklearn.preprocessing中的LabelEncoder来处理我的标签。
label_encoder = LabelEncoder()
Y_integer_encoded = label_encoder.fit_transform(Y)

*这里的Y是一个字符串标签列表,类似于以下内容:

['e_3', 'e_1', 'e_2',]

然后变成这样:

array([0, 1, 2], dtype=int64)

接下来我使用BertTokenizer处理文本并创建输入数据集(训练和测试)。它们的形状如下:

 <TensorSliceDataset shapes: ({input_ids: (99,), token_type_ids: (99,), attention_mask: (99,)}, ()), types: ({input_ids: tf.int32, token_type_ids: tf.int32, attention_mask: tf.int32}, tf.int32)>

我按照Huggingface文档的要求训练了模型。

当训练模型时,最后一个轮次如下所示:

Epoch 3/3
108/108 [==============================] - 24s 223ms/step - loss: 25.8196 - accuracy: 0.7963 - val_loss: 24.5137 - val_accuracy: 0.7243

我在一个示例句子上运行了model.predict,并获得了以下输出(是的,我像其他文章一样对这个句子进行了标记化处理)。输出结果如下:

array([ 3.1293588, -5.280143 ,  2.4700692], dtype=float32)

最后,我应用softmax函数并输出结果:
tf_prediction = tf.nn.softmax(tf_output, axis=0).numpy()[0]

output: 0.6590041

这是我的问题: 我不太理解输出结果。准确率约为70%(验证准确率),我的模型应该可以正确预测标签。但是,直接输出的logits对我来说意义不大,softmax函数之后的输出似乎是线性的,就像来自一个sigmoid函数一样。我该如何解释它并将其转换为我要预测的标签?
还有,我不应该给我的BERT模型提供独热编码标签才能使其工作吗?我一直认为BERT需要这样做,但似乎并不需要。
非常感谢!

你的网络出了问题!丢包率非常高! - Minions
1个回答

2

您的输出意味着第一类的概率为65.9%。

您可以将标签作为整数或one-hot向量输入。您需要使用适当的损失函数(使用one-hot的分类交叉熵或使用整数的稀疏分类交叉熵)。


非常感谢您的输入,真的非常感激 :) - alxgal
@Andrey,@alxgal 这些数字是什么意思?[3.1293588,-5.280143, 2.4700692] - Minions
2
@user_007 这是神经网络的输出 - 是由包含转换器模型的大量数学运算得出的结果。对它们应用softmax函数可以给出各个类别的概率。 - Andrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接