Gemma 4 微调 商品分类
在之前已经完成了对Gemma4在情绪数据集上的LoRA微调,这里切换商品分类数据集进行实际实践,以下是实践笔记记录:
原项目:
- 数据集:
AI-ModelScope/emotion(英文情绪 6 分类,parquet 格式) - 模型:Gemma 4 E4B-it
- 方式:LoRA 单卡微调
改造后:
- 数据集:
winwin_inc/product-classification-hiring-demo(中文商品 10 分类,jsonl 格式) - 模型:还是 Gemma 4 E4B-it
- 方式:还是 LoRA 单卡微调
但是由于两个数据集的形式是不同的,所以需要对切换的数据集进行一定的预处理,大致处理逻辑如下:
def pre_process(split_name: str, label_id: int): file_path = os.path.join(dataset_dir, f"{split_name}.jsonl") data = [] cur_label = label_id with open(file_path, 'r', encoding='utf-8') as file: for line in file: json_obj = json.loads(line.strip()) cat = json_obj['category'] # 新类别就分配一个 label if cat not in LABEL_DICT: LABEL_DICT[cat] = cur_label LABEL_NAMES.append(cat) cur_label += 1 # 把 category 换成 label(数字) del json_obj['category'] json_obj['label'] = LABEL_DICT[cat] data.append(json_obj) # 存成 json,后面用 datasets 加载 with open(os.path.join(dataset_dir, f"{split_name}.json"), 'w', encoding='utf-8') as f: json.dump(data, f) return cur_label这样,就可以实现在不知道数据集标签的数量和具体标签的情况下维护一个对应的标签字典,适配之前情绪数据集微调的后续训练操作。
另外,在prompt方面,因为当前数据集为中文数据集,所以在模板上进行了相应的修改:
SYSTEM_PROMPT = """你是一个产品判别专家。 阅读用户文本,并使用一个准确的标签进行回答。 你的回答只能从以下选项中选择:即饮奶茶, 即饮茶, 硬糖, 牙膏, 非冷藏即饮果汁, 冷藏即饮果汁, 白酒, 方便面, 软糖, 口香糖。 你的回答只能是上面一个选项标签。 """在分类任务上将输出标签固定,不让模型自行发挥。
最终也是成功完成了整个模型的新数据集的切换与适配,本次实现最大的感受就是,做微调项目,数据预处理真的是最花时间的。模型加载、LoRA 配置这些都是套路,照着写就行。但数据不一样,每个数据集格式都不同,坑也不一样,每次都得重新折腾。
之后如果有时间也会尝试分析一下bad case,看看是否有哪些地方可以进一步优化一下的。
