TinyLlama 微调实战:打造 Tamazight(Tifinagh)聊天机器人
Reddit r/LocalLLaMA2026/02/12 21:06机翻/自动摘要/自动分类
1 阅读
摘要
本文围绕使用 TinyLlama‑1.1B 为 Tamazight(Tifinagh 脚本)打造聊天机器人 Awal‑LM 的实战经验展开。作者面临 tokenizer 覆盖不足、输出重复循环以及指令化不足等难题。文章提供了手动添加 Tifinagh token、重新训练词表、采样惩罚、负样本标注、数据增强(回译、合成对话)以及先进行小规模持续预训练后再 LoRA/QLoRA 指令微调的完整方案,并给出具体代码示例和超参数建议,帮助低资源语言开发者高效微调模型。
正文
项目概述
- 目标:基于 TinyLlama‑1.1B 构建面向 Tamazight(Berber)语言、使用 Tifinagh 脚本 的对话机器人 Awal‑LM。
- 数据:约 54k 条句子,来源于民间传说、维基百科以及 IRCAM 官方文献。
- 先前尝试:使用 GPT‑2 时出现严重的重复循环(如 "inna as: inna as:"),对话逻辑几乎不存在,表现更像一个破碎的故事续写器。
关键技术难点与解决思路
1. Tokenizer 适配
- Tifinagh 字符覆盖率低:建议在现有 LlamaTokenizer 基础上 手动添加 所有 Tifinagh 字符(约 33 个基本字符 + 变体)为独立 ,随后 重新训练 BPE/Unigram 词表(
sentencepiece或tokenizers),而不是仅依赖字节级(byte‑level)编码。 - 实现示例(Python):
from transformers import LlamaTokenizerFast
base_tok = LlamaTokenizerFast.from_pretrained('TinyLlama/TinyLlama-1.1B')
new_tokens = ["\u2D30", "\u2D31", "\u2D32", ...] # Tifinagh Unicode 列表
base_tok.add_tokens(new_tokens)
base_tok.save_pretrained('./tifinagh_tokenizer')
- 添加后 重新初始化 LoRA/QLoRA 权重,以确保新 能获得梯度更新。
2. 重复循环的抑制
- 采样层面:在推理时使用 repetition_penalty ≥ 1.2、top‑p (nucleus) 0.9、temperature 0.7,并开启 no_repeat_ngram_size=3。
- 训练层面:
- 在 SFT 数据中加入 负样本(故意重复的句子)并标记为
bad_response,让模型学习避免此类输出。 - 使用 DPO(Direct Preference Optimization) 或 RLHF(若资源允许)进一步强化不重复的对话行为。
- 在 SFT 数据中加入 负样本(故意重复的句子)并标记为
- 数据层面:对原始语料进行 去重(基于 n‑gram)并混入 多样化的对话示例(问答、指令、情感回复),降低模型对单一“民间传说”风格的偏好。
3. 指令微调(Instruction Tuning)
- 将原始散文转化为 ChatML 或 Alpaca 格式,例如:
{"instruction": "请用 Tifinagh 脚本回答以下问题:", "input": "你今天过得怎么样?", "output": "ⴰⵣⵓⵍⴰⵏ…"}
- 批量转换:使用脚本把每条句子包装成
user → assistant对,必要时加入 系统提示(system prompt)说明模型角色(如 “你是 Tamazight 语言的助理”。) - LoRA/QLoRA 参数:推荐 rank=8‑16、alpha=16,并在 4‑8 GPU(显存 24GB)上使用 bitsandbytes 4‑bit 量化,以降低显存占用。
4. 数据规模与微调策略
- 54k 句子 对于 1.1B 参数模型来说仍属 小数据,但足以进行 LoRA/QLoRA ,只要 学习率 控制在 1e‑4~5e‑4、epoch 设为 3‑5,并配合 梯度累积(batch size ≈ 4‑8)即可。
- 数据增强:
- 回译:将 Tifinagh 文本翻译成阿拉伯语/法语再翻回 Tifinagh,产生同义变体。
- 字符噪声:随机插入/删除少量 Tifinagh 辅助符号,提升模型对噪声的鲁棒性。
- 合成对话:利用已有的 GPT‑4(或其他)生成 question‑answer 对,过滤后加入训练集。
5. 持续预训练 vs 直接 SFT
- 推荐流程:
- Continual Pre‑training (CPT):在 54k 句子上进行 1‑2 epoch 的自监督语言模型训练(masked LM),让模型熟悉 Tifinagh 语料的分布。
- Supervised Fine‑Tuning (SFT):基于 CPT 后的模型进行 LoRA/QLoRA 指令,收敛更快且重复现象显著下降。
- 若算力受限,可直接 SFT,但要在 学习率 与 正则化(weight decay 0.01)上更保守。
实践小结
- Tokenizer:手动加入 Tifinagh 并重新训练词表是关键。
- 重复:结合采样技巧、负样本标注和多样化对话数据可有效破除循环。
- 指令化:使用 ChatML/Alpaca 格式包装原始文本,配合 LoRA/QLoRA 低秩适配。
- 数据:54k 句子足以进行 LoRA ,配合回译、合成对话等增强手段可进一步提升质量。
- 训练顺序:先做一次小规模的持续预训练,再进行指令,效果最佳。
温馨提示:在每轮后使用 Tifinagh‑specific evaluation set(如人工标注的问答对)进行 BLEU、chrF 以及 重复率 指标评估,确保模型真正摆脱“民间传说模式”。