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