You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

BERT多类别文本分类建模:输入数据构建疑问咨询

关于BERT在Keras/TensorFlow 2中做单类别文本分类的疑问解答

嘿,我来帮你理清这两个困惑点!

一、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单类别分类教程怎么找?

其实不用特意找“单类别”的教程——大多数多标签分类的教程,只需要改两处就能变成单类别分类的逻辑:

  1. 最后一层的激活函数:把sigmoid改成softmax(因为要输出45类的概率分布,总和为1)
  2. 损失函数:如果你的标签是整数形式(比如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

火山引擎 最新活动