文本分类

文本分类


一、文本分类任务建模

1.1 任务类型

类型 说明 典型赛题
二分类 正/负情感、有害/无害 有害评论检测
多分类 多个互斥类别 新闻分类、意图识别
多标签 一个样本可属多个类别 推文多标签分类
层次分类 类别存在层级关系 商品分类

1.2 分类头设计

方法 说明 适用场景
CLS + Linear 取[CLS]向量接全连接层 最简单,通用基线
CLS + MLP 取[CLS]向量接多层感知机 需要更强表达能力
多路池化拼接 CLS + MaxPool + AvgPool + Self-Attention拼接 追求极致性能
胶囊网络 用动态路由提取胶囊特征 序列空间特征丰富

1.3 多标签分类

维度 说明
损失函数 BCEWithLogitsLoss,每个标签独立计算二元交叉熵
阈值优化 默认0.5不一定最优,需在验证集上搜索最优阈值
标签相关性 可用Classifier Chain或Label Powerset建模标签间依赖

二、样本不均衡处理(NLP专项)

2.1 文本分类中的不均衡

维度 说明
常见场景 推文分类中,部分标签出现频率极低
分层K折 使用StratifiedKFold确保每折中各类别比例一致
类别权重 在CrossEntropyLoss中设置weight参数,小类权重更高
Focal Loss 自动关注难分样本,对小类样本给予更多关注

2.2 验证集构造(NLP专项)

维度 说明
分层划分 按标签比例划分,确保验证集类别分布与训练集一致
多标签场景 使用IterativeStratification处理多标签分层划分
固定种子 固定随机种子确保实验可复现

三、模型选择实践

3.1 模型对比基准

模型 推文分类F1 训练时间 显存占用
BERT Base 基线 1x 1x
RoBERTa Base +1~2% 1x 1x
DeBERTa Base +2~3% 1.2x 1.2x
DeBERTa Large +3~5% 3x 3x
DeBERTa XLarge +4~6% 8x 8x

3.2 模型选型天花板

维度 说明
核心结论 直接选用在结构上更具优势的DeBERTa V2/V3模型替代原生BERT
注意力解耦 DeBERTa的Disentangled Attention特性在文本语境捕捉上更优
延迟位置编码 绝对位置编码延迟添加,对位置敏感任务更有效
实践建议 先用Base快速验证,确认有效后切换Large/XLarge

四、QA输入顺序调换

维度 说明
问题背景 BERT等预训练模型对输入顺序敏感,Question-Answer和Answer-Question的表征不同
核心方法 将原始QA对调换顺序(Q-A → A-Q),构造第二份训练数据
融合策略 将原始顺序和调换顺序的预测概率取平均
核心优势 等价于免费的数据增强,不增加模型参数
适用场景 问答匹配、文本相似度等成对文本任务

五、USE冻结式迁移学习

维度 说明
核心方法 使用Universal Sentence Encoder(USE)提取句子向量,冻结不训练,直接接分类器
实现方式 hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
优势 无需GPU即可训练,推理速度快,适合快速出结果
对比 在小数据集上,USE冻结式迁移往往性价比最高
局限 性能天花板低于BERT微调

六、社交媒体特征融合

维度 说明
文本统计特征 text_len、word_count、avg_word_len
社交媒体特征 hashtag_count、mention_count、url_count
语义辅助特征 digit_count、uppercase_ratio
缺失值二值化 has_keyword、has_location
融合方式 与BERT/DeBERTa的CLS向量拼接后送入分类器
标准化 使用StandardScaler对非文本特征标准化

七、混合池化策略(文本分类专项)

7.1 多路池化拼接

维度 说明
实现方式 同时声明BERT-Pooler、Max Pooling、Average Pooling、Self-Attention Pooling以及Dynamic Routing等多种池化操作
融合策略 将这些结果进行汇总和加总后再送入分类器
核心优势 多维度提取特征能让分类结果更加稳定全面

7.2 弃用Flatten()改用降维Pooling

维度 说明
问题背景 官方Baseline在提取序列特征后直接使用Flatten()操作,导致分类器参数量暴增
导致后果 庞大的分类器极易在小数据或不平衡数据上严重过拟合
解决方案 通过各类Pooling将变长的序列维度压缩为1维
最终效果 模型更容易被有效训练

八、脱敏ID还原与词频映射

维度 说明
问题背景 部分竞赛(如医疗NER)将原始文本脱敏为数字ID,如"患者 123 456 789"
词频映射原理 统计脱敏ID在训练集+测试集中的出现频率,与开源BERT词表中各Token的出现频率进行排序匹配
映射逻辑 出现频率第1高的脱敏ID → 映射为BERT词表中频率第1高的Token
映射成功率 高频词(标点、停用词)映射成功率高;低频词(专有名词)映射成功率低
失败处理 映射失败的ID使用Word2Vec向量进行兜底初始化
核心优势 让脱敏语料也能利用开源预训练模型的强大初始权重

九、长文本截断策略

策略 说明 适用场景
Head截断 保留前512个Token 文本开头信息最关键
Tail截断 保留后512个Token 文本结尾信息最关键
Head+Tail截断 前128 + 后384个Token 兼顾首尾信息
滑动窗口 多次截取,结果融合 长文本信息均匀分布
动态截断 按实体位置截取 NER任务

十、分类任务实战流程

1. EDA → 分析类别分布、文本长度、数据质量
2. 基线模型 → BERT Base + CLS + Linear
3. 模型升级 → RoBERTa / DeBERTa
4. 池化优化 → 多路池化拼接替代单一CLS
5. 训练优化 → 对抗训练 + SWA + Multi-Dropout
6. 数据优化 → 数据增强 + 伪标签
7. 融合冲刺 → 多模型 + 多折 + 多种子融合
8. 后处理 → 阈值优化 + 规则修正

十一、对比学习在分类中的应用

维度 说明
核心思想 拉近相似样本的表征,推远不相似样本的表征
SimCSE 同一句子两次Dropout过模型,作为正样本对,其他句子作为负样本
ConSERT 多种数据增强(shuffle/ cutoff/ dropout)构造正样本对
训练方式 先对比学习预训练表征,再在分类任务上微调
适用场景 标注数据少、无标注数据多时,改善表征质量
竞赛经验 医疗/法律等特定领域,对比学习预训练可提升0.5~1个百分点

十二、课程学习(Curriculum Learning)

维度 说明
核心思想 按照从易到难的顺序训练模型,先学简单样本再学困难样本
难度衡量 用预训练模型的预测置信度、句子长度、标注一致性等衡量
实现方式 按置信度排序,先训练高置信度(简单)样本,逐步加入低置信度样本
效果 训练更稳定,收敛更快,最终精度略有提升
与伪标签关系 课程学习可辅助伪标签筛选,先学高置信度伪标签样本

十三、少样本/零样本分类

方法 说明 适用场景
Prompt-based分类 将分类任务转化为填空任务,利用预训练模型的MLM能力 每类仅几个样本
PET (Pattern-Exploiting Training) 设计Prompt模板 + MLM预测,少样本下超越标准微调 极少标注数据
LM-BFF 自动搜索Prompt模板 + 少样本微调 自动化Prompt设计
零样本分类 用NLI模型做零样本推理:前提="这是一篇关于{label}的文章" 无标注数据
外部数据迁移 在大规模外部数据集预训练后迁移到目标任务 数据量不足

Prompt分类示例

模板: "这篇评论的情感是[MASK]。"
标签映射: [MASK]="积极" → 正面, [MASK]="消极" → 负面
优势: 将分类问题转化为预训练模型擅长的MLM任务

十四、多任务学习在分类中的应用

维度 说明
核心思想 同时训练多个相关任务,共享底层表征,互相正则化
共享方式 共享编码器(BERT),各自独立的分类头
Loss权重 不同任务Loss权重需平衡,通常按任务重要性或梯度大小调整
竞赛应用 多标签分类中,同时训练主标签和辅助标签
与多标签区别 多任务是显式不同任务,多标签是同一任务多输出

十五、文本分类常见踩坑点

坑点 原因 解决方案
验证集分数虚高 验证集与训练集分布不一致 对抗验证 + 分层K折
模型训飞Loss为0 学习率过大或未设Warmup lr降至1e-5 + Warmup 0.1
多标签阈值不对 默认0.5非最优 验证集搜索每标签最优阈值
长文本信息丢失 暴力截断512丢失关键信息 Head+Tail截断 / 滑动窗口
类别极度不均衡 小类样本不足1% Focal Loss + 采样策略 + 数据增强
伪标签引入噪声 低置信度样本标签错误 置信度阈值0.9+ + 多模型投票生成