BERT多类别文本分类建模:输入数据构建疑问咨询
嘿,我来帮你理清这两个困惑点!
一、BERT输入参数:segment ids和attention mask是否必需?
先逐个说清楚:
Attention Mask(注意力掩码):必须要传
因为BERT要求输入序列是固定长度的,我们会对短段落做padding补0,对长段落做截断。Attention Mask的作用就是告诉模型哪些位置是真实的文本token(标记为1),哪些是padding出来的无效值(标记为0)。如果不传这个掩码,模型会把padding的0当成有效输入计算注意力,直接影响分类结果的准确性,所以这个参数是必不可少的。Segment IDs(Token Type IDs,分段掩码):可选,单段落任务完全可以不用特意处理
这个参数最初是为句子对任务设计的(比如文本蕴含、问答任务,需要区分两个输入句子),此时会用0标记第一个句子的token,1标记第二个句子的token。而你的任务是单段落分类,所有token都属于同一个“段落”,所以所有位置的segment ids都可以设为0。更方便的是,很多BERT的Keras实现(比如Hugging Face Transformers库的TF接口)如果不传这个参数,会自动生成全0的segment ids,完全不影响模型效果。所以你完全可以只传入input_ids和attention_mask,不用纠结segment ids。
二、Keras/TensorFlow 2下的BERT单类别分类教程怎么找?
其实不用特意找“单类别”的教程——大多数多标签分类的教程,只需要改两处就能变成单类别分类的逻辑:
- 最后一层的激活函数:把
sigmoid改成softmax(因为要输出45类的概率分布,总和为1) - 损失函数:如果你的标签是整数形式(比如0到44),用
sparse_categorical_crossentropy;如果是one-hot编码形式(比如长度为45的数组,只有对应类别为1),用categorical_crossentropy
这里给你一个极简的代码框架示例(用Hugging Face Transformers库,这是TF2/Keras里用BERT最便捷的工具):
import tensorflow as tf from transformers import BertTokenizer, TFBertModel # 1. 配置参数 MAX_LENGTH = 128 NUM_CLASSES = 45 BERT_MODEL_NAME = 'bert-base-chinese' # 英文任务用'bert-base-uncased' # 2. 加载预训练的BERT分词器和模型 tokenizer = BertTokenizer.from_pretrained(BERT_MODEL_NAME) bert_backbone = TFBertModel.from_pretrained(BERT_MODEL_NAME) # 3. 构建Keras模型 input_ids = tf.keras.layers.Input(shape=(MAX_LENGTH,), dtype=tf.int32, name='input_ids') attention_mask = tf.keras.layers.Input(shape=(MAX_LENGTH,), dtype=tf.int32, name='attention_mask') # 获取BERT的<[BOS_never_used_51bce0c785ca2f68081bfa7d91973934]>token输出(适合分类任务) bert_output = bert_backbone(input_ids, attention_mask=attention_mask)[1] # 分类头 classification_head = tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')(bert_output) # 定义完整模型 model = tf.keras.Model(inputs=[input_ids, attention_mask], outputs=classification_head) # 4. 编译模型(假设标签是整数形式) model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=2e-5), # BERT建议用小学习率 loss='sparse_categorical_crossentropy', metrics=['accuracy'] ) # 5. 数据处理示例(假设你的文本数据存在texts列表,标签存在labels列表) encoded_data = tokenizer.batch_encode_plus( texts, truncation=True, padding='max_length', max_length=MAX_LENGTH, return_tensors='tf' ) # 转换成TF Dataset train_dataset = tf.data.Dataset.from_tensor_slices( ( {'input_ids': encoded_data['input_ids'], 'attention_mask': encoded_data['attention_mask']}, labels ) ).shuffle(1000).batch(32)
你可以基于这个框架,结合自己的数据格式调整细节——比如数据加载、训练循环等。很多多标签教程里的数据处理部分(比如tokenizer的使用、TF Dataset的构建)都是通用的,只需要替换最后的分类头和编译参数就行。
内容的提问来源于stack exchange,提问作者ML_Engine




