🏠 总目录📚 本教程 08 · 数据增强与输入处理
📑 本页目录(点开跳转)

数据增强与输入处理

30 分钟 | 🎁 NLP 增强专题


🎯 一句话

文本增强比图像增强难得多——改一个字就可能改变语义,而图像翻转一下还是同一只猫。所以这一章的核心不是「有哪些增强方法」,而是怎么判断一个增强是不是保持了标签。判断错了,你是在往训练集里灌噪声。


一、文本数据增强方法

1.1 词级别增强

方法 原理 实现难度 效果
同义词替换 用同义词替换原文中的词汇 稳定提升
随机插入 在随机位置插入同义词 轻微提升
随机删除 以概率p删除每个词 轻微提升
随机交换 随机交换两个词的位置 轻微提升
实体替换 将实体替换为同类型其他实体 NER任务显著提升

1.2 句级别增强

方法 原理 实现难度 效果
回译增强 中文→英文→日文→中文 显著提升
上下文增强 用语言模型预测替换词 显著提升
文本片段交换 交换两个句子的片段 轻微提升

1.3 特征空间增强

方法 原理 实现难度 效果
Mixup 在Embedding空间做线性插值 正则化效果
CutMix 随机遮蔽部分Token 正则化效果
对抗增强 FGM/PGD在Embedding上添加扰动 显著提升

1.4 增强策略选择

任务类型 推荐增强方法 不推荐方法
文本分类 同义词替换 + Mixup + 对抗增强 实体替换
NER 实体替换 + 同义词替换 + 回译 Mixup(标签对齐困难)
关系抽取 实体替换 + 上下文增强 随机交换(破坏关系)

二、半监督学习与伪标签

2.1 K折伪标签(降噪)

维度 说明
问题背景 医疗数据人工标注主观性强,存在大量漏标和错标
核心原则 严禁在全量训练集上直接生成伪标签以防过拟合
实现方式 利用K折交叉验证,让模型仅在它未见过的验证集上生成预测结果
融合策略 融合多个模型生成的高质量伪标签来替代人工标签重新训练
本质作用 利用AI群体完成自动纠错和降噪

2.2 测试集伪标签(冲刺)

维度 说明
适用时机 模型开发到瓶颈时
实现方式 用高分模型对测试集预测,打上伪标签
置信度阈值 通常取0.9+,过低引入噪声
混合训练 高置信度伪标签样本与原训练集混合重新训练
核心优势 压榨最后一点分数

2.3 FixMatch半监督框架

维度 说明
核心思想 对同一无标签样本生成弱增强和强增强两个版本
一致性正则 若弱增强预测置信度超过阈值,则用弱增强伪标签监督强增强预测
优势 充分利用无标签数据,无需手动设置伪标签阈值
适用场景 有大量无标签数据时

三、基础文本预处理

3.1 清洗与标准化

步骤 说明 代码示例
去除HTML标签 清除爬虫数据中的HTML残留 re.sub(r'<[^>]+>', '', text)
统一编码 全角→半角、繁体→简体 unicodedata.normalize
去除特殊字符 保留字母、数字、中文 re.sub(r'[^\w\s]', '', text)
空格规范化 多空格合并为单空格 re.sub(r'\s+', ' ', text)
URL替换 将URL替换为特殊标记 re.sub(r'http\S+', '[URL]', text)

3.2 TF-IDF特征工程

维度 说明
核心思想 词频-逆文档频率,衡量词对文档的区分度
TF(词频) 词在文档中出现的频率
IDF(逆文档频率) log(总文档数 / 包含该词的文档数)
适用场景 传统ML模型(SVM、Logistic Regression)的特征输入
与深度学习互补 TF-IDF特征可与BERT向量拼接,提供词频先验信息

四、长文本截断策略

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

滑动窗口实现

1. 将长文本按步长切分为多个512 Token的窗口
2. 每个窗口独立预测
3. 重叠区域取平均或取最大值
4. 合并所有窗口的预测结果

五、多语言混合文本处理

维度 说明
问题背景 推文等社交媒体文本常混合多种语言和字符集
语言检测 使用langdetect或fasttext识别文本语言
多语言模型 使用XLM-RoBERTa等多语言预训练模型
翻译统一 将非目标语言翻译为目标语言后统一处理
字符集归一 统一全角/半角、繁体/简体

六、训练稳定性技巧(NLP专项)

6.1 梯度累加

维度 说明
问题背景 大型模型极大,普通显卡往往只能把Batch Size设为1
导致后果 Batch Size为1导致梯度更新方向剧烈震荡
解决方案 开启梯度累加模拟大Batch Size训练效果
配套措施 配合梯度截断防止累加梯度爆炸

6.2 动态填充

维度 说明
问题背景 固定长度填充(如统一填充到512)对短文本浪费计算
解决方案 使用DataCollatorWithPadding按batch内最长序列填充
效果 短文本训练加速约75%

6.3 FP16混合精度

维度 说明
显存节省 显存占用减半
速度提升 训练速度提升约30%-50%
必须配合 梯度截断防止梯度爆炸
实现 PyTorch的torch.cuda.amp自动混合精度

七、数据增强实战流程

1. 基线训练 → 确定数据管线无误
2. 简单增强 → 同义词替换(10%替换率)
3. 任务特定增强 → NER: 实体替换; 分类: Mixup
4. 半监督 → K折伪标签降噪
5. 对抗增强 → FGM/PGD
6. 测试集伪标签 → 高置信度样本混合训练
7. 后处理 → 规则修正

增强效果预期

增强方法 单模型提升 融合后提升
同义词替换 +0.2~0.5% +0.1~0.3%
实体替换(NER) +0.5~1.0% +0.3~0.5%
对抗训练 +0.3~0.8% +0.2~0.5%
伪标签 +0.5~1.5% +0.3~1.0%
Mixup +0.1~0.3% +0.1~0.2%

八、EDA(Easy Data Augmentation)

维度 说明
核心方法 四种简单操作的组合:同义词替换、随机插入、随机交换、随机删除
同义词替换(SR) 从句子中随机选n个非停用词,用同义词替换
随机插入(RI) 随机选一个词的同义词,插入句子中随机位置
随机交换(RS) 随机交换句子中两个词的位置
随机删除(RD) 以概率p删除句子中的每个词
alpha参数 控制增强强度,alpha=0.05表示每句改动约5%的词
优势 实现极简,无需外部模型,适合快速baseline

九、UDA(Unsupervised Data Augmentation)

维度 说明
核心思想 对无标签数据做增强,要求模型对原始样本和增强样本的预测一致
与FixMatch区别 UDA使用更强的增强策略(TF操作+回译),FixMatch使用标准增强
增强策略 回译 + 基于TF的词替换(BERT预测替换)
一致性损失 KL散度衡量原始预测与增强预测的差异
置信度阈值 仅对高置信度(>0.9)无标签样本计算一致性损失
适用场景 有大量无标签数据时,半监督学习效果显著

十、条件生成式增强

维度 说明
核心思想 用预训练语言模型(如GPT/T5)生成与原始样本语义相似但表述不同的新样本
实现方式 将原始文本作为Prompt输入生成模型,控制生成文本与原文的相似度
T5改写 输入"paraphrase: {原始文本}",T5生成改写后的文本
GPT生成 输入原始文本的前半段,GPT生成后半段
质量控制 用分类模型过滤生成质量差的样本,或用BLEU/语义相似度筛选
优势 生成多样性高,语义保持好
劣势 需要额外模型,生成速度慢,可能引入噪声

十一、对抗验证(Adversarial Validation)

维度 说明
核心思想 训练二分类器区分训练集和测试集,找出分布不一致的特征
实现方式 给训练集打标签0、测试集打标签1,训练LightGBM分类器
AUC解读 AUC接近0.5说明分布一致;AUC>0.7说明分布差异大
特征重要性 分类器给出的特征重要性即为训练/测试分布差异最大的特征
应用一 删除分布差异大的特征,减少协变量偏移
应用二 用分类器预测的概率作为采样权重,让训练集中与测试集相似的样本权重更高
竞赛价值 解决线下CV与线上LB不一致的核心方法

十二、对抗训练在NLP中的应用

FGM(Fast Gradient Method)

维度 说明
核心思想 在Embedding层添加对抗扰动,提高模型鲁棒性
实现步骤 正常前向→计算Loss→反向传播→在Embedding上添加扰动→再次前向→计算对抗Loss→反向传播更新参数
扰动计算 r = epsilon * grad /
Attack Ratio 每个batch中参与对抗训练的样本比例,0.5兼顾速度和效果
效果 NLP任务中通常提升0.3~0.8个百分点

PGD(Projected Gradient Descent)

维度 说明
与FGM区别 FGM单步攻击,PGD多步攻击(K步)
实现 每步在FGM基础上迭代,K通常3~5步
效果 比FGM更强但训练速度更慢(约K倍)
竞赛建议 FGM性价比最高,PGD在冲刺阶段使用

🔗 这一章连到哪里

去哪为什么
ML基础 10 正则化全家桶数据增强本质是一种正则化:它在告诉模型哪些变换不该改变标签
大模型导论 03 Tokenizer 与上下文长文本截断策略、多语言混合文本的处理都取决于分词器
模型上线之后 06 数据漂移与概念漂移对抗验证测的就是「训练集和测试集分布差多少」,和漂移检测同一套工具

✅ 检查点

  1. 为什么文本增强比图像增强难?判断一个增强能不能用的标准是什么?
  2. EDA(Easy Data Augmentation)包含哪几种操作?它的适用边界在哪?
  3. 回译(Back Translation)的优点和代价分别是什么?
  4. UDA 的核心思想是什么?它和普通的数据增强有什么不同?
  5. 什么是对抗验证(Adversarial Validation)?它能诊断什么问题?
👀 答案
  1. 因为文本的语义对局部改动极其敏感——「不好看」改一个字变成「好看」,标签直接反了;而图像翻转后还是同一只猫。判断标准:增强之后,一个人类标注者会不会改变他的标签?会 → 别用。⚠️ 情感分析里的否定词、NER 里的实体边界、QA 里的答案位置,都是高危区。
  2. 同义词替换、随机插入、随机交换、随机删除四种。适用边界:句子级分类任务、且改动比例很小(通常 <10%)时有效;在需要精确结构的任务上(NER、抽取、QA)基本不能用——它会破坏实体和位置。
  3. 优点:语义保持得最好(翻译系统本身就在做语义保持),产出的句子自然、多样。代价:①慢且需要调用翻译服务/模型 ②会丢失细节和专有名词 ③对短文本效果有限(译回来往往一模一样)。
  4. 在无标注数据上,要求模型对「原文」和「增强后的文本」给出一致的预测。和普通增强的不同:普通增强是在有标注数据上扩样本,UDA 是用无标注数据做一致性正则——它让你能利用测试集和其他无标注语料,是半监督的一种。
  5. 训练一个分类器去区分「这条样本来自训练集还是测试集」。如果它能分开(AUC 明显 > 0.5),说明训练集和测试集分布不同。能诊断:分布漂移、需不需要做样本加权、以及哪些特征是造成分布差异的元凶(看特征重要性)——那些特征往往就是不该用或该做变换的。

🛑 可以停在这里

走神救援
⚠️⭐文本增强比图像增强难得多:改一个字就可能翻转标签(「不好看」→「好看」),而图像翻转还是同一只猫。判断标准:增强后人类标注者会不会改变标签?会就别用——情感分析的否定词、NER 的实体边界、QA 的答案位置都是高危区。EDA(同义词替换/随机插入/交换/删除)只适合句子级分类且改动 <10%NER/抽取/QA 基本不能用回译语义保持最好但慢、会丢专有名词、短文本无效。⭐UDA = 在无标注数据上要求模型对原文和增强文本预测一致——这是半监督不是普通增强,能利用测试集语料。⭐对抗验证:训一个分类器区分样本来自训练集还是测试集,AUC 明显 >0.5 就说明分布不同;看它的特征重要性能揪出造成分布差异的元凶特征

打卡记录保存在你的浏览器里,首页能看到总进度