BERTc-165M
字级中文 Modern BERT,从零预训练。纯 PyTorch 实现,不依赖 transformers。
架构
- 参数量 165M
- 12L / 1024H / 2752I / 16 heads
- ScaledSinusoidal 位置编码、GeGLU 前馈、LayerNorm 无 bias、输入输出词嵌入绑定
- 全部 Linear 无 bias;Megatron 式初始化(残差支路 ×1/√2L)
- 预训练用 flex_attention 做跨文档隔离,微调走 SDPA
下游表现
| 任务 | 结果 |
|---|---|
| PD-1998 分词 / 词性 / 实体(联合微调) | score 1.4689(CWS 0.9836 / POS 0.9753 / NER 0.9632) |
| SIGHAN-15 拼写纠错 | SIGHAN-15 句级 F1 0.8333 |
首个在 165M 规模同时拿到 MT / CSC SOTA 的 Modern BERTc 骨干。
用法
import json, torch
from safetensors.torch import load_file
from model import ModernBertConfig, ModernBertForMLM
from tokenizer import PieceCharTokenizer
cfg = ModernBertConfig.from_dict(json.load(open("config.json")))
model = ModernBertForMLM(cfg)
model.load_state_dict(load_file("model.safetensors"), strict=True)
model.eval()
tok = PieceCharTokenizer(".")
ids = torch.tensor([tok.encode("北京是中国的首都")])
ids[0, 2] = tok.mask_token_id
print(tok.id_to_char(int(model(ids)["logits"][0, 2].argmax())))
依赖
只需要 PyTorch 和 PieceTokenizer,没有别的。
| 模型定义 | 目录内的 model.py(纯 torch,不 import transformers) |
| 权重读取 | 目录内的 checkpoint.py(85 行 safetensors 读取,不需要 safetensors 库) |
| 分词器 | PieceTokenizer,提供字级切分和词表 |
pip install torch
pip install git+https://github.com/Ismantic/PieceTokenizer
目录是自包含的:进到目录里直接 python example_*.py 就能跑,不依赖目录外的
任何文件。
Tokenizer
字级 SentencePiece,BERTc-Tokenizer.pt,词表 12536(pad=12531,mask=12535)。必须用 dict="no"
加载(字模式,不挂分词词典)——挂了词典编码结果会跟训练时不一致,而且不报错。
pip install git+https://github.com/Ismantic/PieceTokenizer
文件
| 文件 | 说明 |
|---|---|
model.safetensors |
权重 |
config.json |
架构配置 |
model.py |
模型定义(纯 PyTorch,无 transformers 依赖) |
BERTc-Tokenizer.pt |
词表(与 PieceTokenizer 仓库里那份相同) |
tokenizer.py |
字级 tokenizer 封装 |
example_load.py |
加载 + 掩码预测示例 |
许可
Apache-2.0。训练语料各自的许可见对应数据集卡。
- Downloads last month
- 100