rian-minichat-x1
从随机初始化训练的小型中文对话模型 · 13.7M 参数 · 无任何预训练权重
| 字段 | 说明 |
|---|---|
| 模型 ID | rian-minichat-x1 |
| 架构族 | decoder-only Transformer |
| 归一化 | RMSNorm(Pre-Norm,无 bias) |
| 位置编码 | RoPE(旋转位置编码,NeoX 前后半配对约定) |
| 前馈层 | SwiGLU(隐层宽度 ≈ 8/3·n_embd,对齐 64) |
| 注意力 | 因果自注意力,走 F.scaled_dot_product_attention 融合内核 |
| 层数 / 头数 / 维度 | 6 / 6 / 384(head_dim = 64) |
| 参数量 | 13,693,824 |
| 词表大小 | 8,000(含 <pad> <unk> <bos> <eos>) |
| 上下文 | 预训练 256 / SFT 512 token |
| 激活函数 | SiLU(SwiGLU 门控) |
| 推理精度 | fp32(CPU 即可,55MB 常驻内存) |
| 对话格式 | <bos>用户:…\n助手:…<eos> |
参数量构成
为什么是这个数:每层约 5.67·d²,加上共享的嵌入矩阵。
| 模块 | 计算 | 参数量 |
|---|---|---|
| 注意力(qkv 合并 + o) | 4 · d² = 4 · 384² | 589,824 × 6 层 |
| SwiGLU 前馈 | 3 · d · h = 3 · 384 · 1024 | 1,179,648 × 6 层 |
| 两层 RMSNorm | 2 · d | 768 × 6 层 |
| 词嵌入(与输出层共享) | V · d = 8000 · 384 | 3,072,000 |
| 最终 RMSNorm | d | 384 |
| 合计 | 13,693,824 |
词嵌入和输出投影共享同一份权重(tie_weights)。如果不共享,参数量会变成 16.8M,
但小模型共享能更快收敛,也省下 12MB 内存。
训练配置
阶段一 · 预训练
数据:纯文本,一行一段,拼接成 token 流后按 256 切窗口。
目标:下一词预测,所有位置都计 loss。
batch 16 × 梯度累积 4 × 256 = 16,384 token/步,
10,000 步约 1.64 亿 token。
阶段二 · SFT 监督微调
数据:{"instruction","response"} 指令对。
目标:只对「助手:」之后的 token 计 loss,用户输入部分 label = -1。
学习率 1e-4,序列长度 512(RoPE 天然支持长度变化)。
训练稳定性手段
AMP 混合精度(T4 用 fp16+GradScaler,A10 用 bf16)· 梯度裁剪(全局范数 1.0)· cosine 学习率 + 200 步线性 warmup · 每 500 步存 checkpoint 并支持断点续训。
硬件
训练:单张 T4 16GB 约 2–3 小时(Kaggle)/ A10 24GB 更快。
推理:任意 x86 服务器,CPU 单核即可,约 10–20 字/秒。
不同尺寸对比
改 config.yaml 里的三个数字就能换尺寸,下面给了几个实测过的组合。
| 配置 | n_layer / n_head / n_embd | 参数量 | 显存(T4, batch 16×256) | 适用场景 |
|---|---|---|---|---|
| extra-small | 4 / 4 / 320 | ≈ 7.0M | ≈ 2.5 GB | 快速验证流程 |
| small(当前) | 6 / 6 / 384 | ≈ 13.7M | ≈ 4 GB | 基础问答 |
| medium | 8 / 8 / 512 | ≈ 27M | ≈ 7 GB | 更好的话术一致性 |
| large | 10 / 8 / 640 | ≈ 42M | ≈ 11 GB | T4 上限附近 |