rian-minichat-x1

从随机初始化训练的小型中文对话模型 · 13.7M 参数 · 无任何预训练权重

字段说明
模型 IDrian-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 · 10241,179,648 × 6 层
两层 RMSNorm2 · d768 × 6 层
词嵌入(与输出层共享)V · d = 8000 · 3843,072,000
最终 RMSNormd384
合计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-small4 / 4 / 320≈ 7.0M≈ 2.5 GB快速验证流程
small(当前)6 / 6 / 384≈ 13.7M≈ 4 GB基础问答
medium8 / 8 / 512≈ 27M≈ 7 GB更好的话术一致性
large10 / 8 / 640≈ 42M≈ 11 GBT4 上限附近