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