数据准备

预计学习时间:30分钟

高质量的训练数据是微调成功的关键前提。数据准备阶段的工作质量直接影响最终模型的性能表现。

数据准备的关键步骤

1. 数据收集与清洗

  • 数据来源选择:公开数据集(如GLUE、ImageNet)、企业内部数据、网络爬虫采集数据
  • 数据清洗
    • 文本数据:去除无关字符、修正拼写错误、统一格式(大小写、标点)
    • 图像数据:筛选低质量图片、校正尺寸与色彩、去除重复样本
    • 结构化数据:处理缺失值、异常值检测与处理、特征标准化

2. 数据标注与质量控制

  • 标注方法:人工标注、半自动标注(主动学习)、众包标注
  • 质量控制
    • 建立明确的标注指南
    • 多人交叉验证
    • 设置验证样本测试标注质量
    • 定期审核与更新标注标准

3. 数据预处理

  • 文本数据
    • 分词(Tokenization)
    • 序列填充(Padding)
    • 序列截断(Truncation)
from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
def preprocess_function(examples):
    return tokenizer(
        examples['text'], 
        truncation=True,
        max_length=512,
        padding='max_length'
    )
  • 图像数据
    • 归一化(Normalization)
    • 调整大小(Resize)
    • 数据增强(Data Augmentation):旋转、翻转、裁剪

4. 数据集划分

  • 典型划分比例:训练集70-80%、验证集10-15%、测试集10-15%
  • 划分策略
    • 随机划分:适用于iid(独立同分布)数据
    • 分层采样:保持各类别比例一致
    • 时间划分:用于时序数据,避免数据泄露
from sklearn.model_selection import train_test_split

train_data, test_data = train_test_split(
    dataset, test_size=0.2, random_state=42, stratify=dataset['label']
)
val_data, test_data = train_test_split(
    test_data, test_size=0.5, random_state=42, stratify=test_data['label']
)

数据增强技术

对于数据量有限的场景,数据增强是提升模型泛化能力的有效手段。

文本数据增强

  • 同义词替换:使用WordNet或词嵌入模型找到相似词
  • 回译:将文本翻译成另一种语言再翻译回来
  • EDA(Easy Data Augmentation):随机插入、删除、替换词语

图像数据增强

  • 几何变换:旋转、翻转、裁剪、缩放
  • 颜色变换:亮度、对比度、色相调整
  • 噪声添加:高斯噪声、椒盐噪声

数据增强示例

实战案例:IMDb数据集准备

以下是使用Hugging Face Datasets库准备IMDb电影评论数据集的代码示例:

# 加载IMDb数据集
from datasets import load_dataset
dataset = load_dataset('imdb')

# 查看数据集结构
print(dataset)
# 输出: DatasetDict({
#     train: Dataset({features: ['text', 'label'], num_rows: 25000})
#     test: Dataset({features: ['text', 'label'], num_rows: 25000})
# })

# 数据预处理
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

def preprocess_function(examples):
    return tokenizer(
        examples['text'],
        truncation=True,
        max_length=512,
        padding='max_length',
        return_tensors='pt'
    )

# 应用预处理
tokenized_dataset = dataset.map(
    preprocess_function,
    batched=True,
    remove_columns=['text']
)

# 设置数据集格式
tokenized_dataset.set_format(
    type='torch',
    columns=['input_ids', 'attention_mask', 'label']
)

print("数据预处理完成,准备进行微调...")

小结

高质量的数据准备能够显著提升微调效果:

  1. 确保数据质量:清洗、标注准确性是基础
  2. 合理的预处理:针对模型架构选择合适的预处理方法
  3. 合理的数据集划分:避免数据泄露,保证评估的有效性
  4. 数据增强:在数据有限时提升模型泛化能力

下一节,我们将探讨如何选择合适的微调框架。