如何解释用于序列分类和张量流的 Huggingface Transformers 的 BERT 输出?

How do I interpret my BERT output from Huggingface Transformers for Sequence Classification and tensorflow?

简短 TL;DR: 我正在使用 BERT 执行序列 classification 任务,但不理解我得到的输出。

这是我的第一个post,所以请多多包涵: 我正在将 bert 用于具有 3 个标签的序列 classification 任务。为此,我将 huggingface transformers 与 tensorflow 一起使用,更具体地说是 TFBertForSequenceClassification class 与 bert-base-german-cased 模型(是的,使用德语句子)。

我绝不是 NLP 方面的专家,这就是为什么我在这里几乎遵循了这个方法:https://towardsdatascience.com/fine-tuning-hugging-face-model-with-custom-dataset-82b8092f5333(当然有一些调整)

一切似乎都运行良好,但我从模型中收到的输出却让我失望。 这只是上下文的一些输出。

我与文章中的示例的主要区别在于标签的数量。我有 3 个,而文章只有 2 个。

我使用来自 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 如下所示:

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 需要它,但似乎不需要。

非常感谢!

你的输出意味着第一个 class 的概率是 65.9%。

您可以将标签作为整数或单热向量提供。您必须使用适当的损失函数(categorical_crossentropy 与 one-hot 或 sparse_categorical_crossentropy 与整数)。