首页/详情

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 词表(sentencepiecetokenizers),而不是仅依赖字节级(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.2top‑p (nucleus) 0.9temperature 0.7,并开启 no_repeat_ngram_size=3
  • 训练层面
    • SFT 数据中加入 负样本(故意重复的句子)并标记为 bad_response,让模型学习避免此类输出。
    • 使用 DPO(Direct Preference Optimization)RLHF(若资源允许)进一步强化不重复的对话行为。
  • 数据层面:对原始语料进行 去重(基于 n‑gram)并混入 多样化的对话示例(问答、指令、情感回复),降低模型对单一“民间传说”风格的偏好。

3. 指令微调(Instruction Tuning)

  • 将原始散文转化为 ChatMLAlpaca 格式,例如:
{"instruction": "请用 Tifinagh 脚本回答以下问题:", "input": "你今天过得怎么样?", "output": "ⴰⵣⵓⵍⴰⵏ…"}
  • 批量转换:使用脚本把每条句子包装成 user → assistant 对,必要时加入 系统提示(system prompt)说明模型角色(如 “你是 Tamazight 语言的助理”。)
  • LoRA/QLoRA 参数:推荐 rank=8‑16alpha=16,并在 4‑8 GPU(显存 24GB)上使用 bitsandbytes 4‑bit 量化,以降低显存占用。

4. 数据规模与微调策略

  • 54k 句子 对于 1.1B 参数模型来说仍属 小数据,但足以进行 LoRA/QLoRA ,只要 学习率 控制在 1e‑4~5e‑4epoch 设为 3‑5,并配合 梯度累积(batch size ≈ 4‑8)即可。
  • 数据增强
    • 回译:将 Tifinagh 文本翻译成阿拉伯语/法语再翻回 Tifinagh,产生同义变体。
    • 字符噪声:随机插入/删除少量 Tifinagh 辅助符号,提升模型对噪声的鲁棒性。
    • 合成对话:利用已有的 GPT‑4(或其他)生成 question‑answer 对,过滤后加入训练集。

5. 持续预训练 vs 直接 SFT

  • 推荐流程
    1. Continual Pre‑training (CPT):在 54k 句子上进行 1‑2 epoch 的自监督语言模型训练(masked LM),让模型熟悉 Tifinagh 语料的分布。
    2. 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 以及 重复率 指标评估,确保模型真正摆脱“民间传说模式”。

标签