アーキテクチャ
標準の LlamaForCausalLM(カスタムコード不要)。
Table with columns: 項目, 値| 項目 | 値 |
|---|
| d_model / 層数 | 512 / 8 |
| Attention | 8 heads, GQA (kv 2), head_dim 64, RoPE (θ=10000) |
| FFN | SwiGLU 2048 |
| Norm | RMSNorm, bias 無し |
| 語彙 | 6,003(byte-level BPE, 文字単位), 埋め込み tied |
| パラメータ | 33.5M(非埋め込み 30.4M) |
zenz-v2.5-dataset(1.89 億件)でゼロから 6 エポック学習。オプティマイザは ScheduleFree(AdamC + 反復平均)。
評価
Table with columns: ベンチマーク, Acc@1, CER| ベンチマーク | Acc@1 | CER |
|---|
| AJIMEE-Bench(200 件, greedy) | 0.805 | 0.0255 |
| Anthy corpus.1(1,745 件) | 0.705 | 0.0519 |
held-out 5,000 件の CE(fp32): 0.0537。
GGUF は torch と同じ入力で AJIMEE-Bench 200 件を回し、出力が異なる件数を数えてあります。
Table with columns: ファイル, サイズ, Acc@1 / CER, torch と出力が異なる件数| ファイル | サイズ | Acc@1 / CER | torch と出力が異なる件数 |
|---|
model.safetensors(fp32) | 134 MB | 0.805 / 0.0255 | — |
kanakanji-edge-33m-f16.gguf | 67 MB | 0.805 / 0.0255 | 0 / 200 |
kanakanji-edge-33m-Q8_0.gguf | 36 MB | 0.805 / 0.0255 | 2 / 200 |
プロンプト形式
Private Use Area の Unicode 文字を制御トークンとして使います。
Table with columns: トークン, Unicode, id, 用途| トークン | Unicode | id | 用途 |
|---|
| CONTEXT | U+EE02 | 6000 | 左文脈マーカー(文頭に置く。文脈が無くても置く) |
| INPUT_START | U+EE00 | 6001 | カタカナ入力開始 |
| OUTPUT_START | U+EE01 | 6002 | 変換結果開始 |
入力: \uEE02<left_context>\uEE00<katakana>\uEE01
出力: <converted text></s>
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
repo = "yuuki14202028/kanakanji-edge-33m"
tok = AutoTokenizer.from_pretrained(repo)
model = AutoModelForCausalLM.from_pretrained(repo).eval()
def convert(kana: str, left_context: str = "") -> str:
prompt = f"\uEE02{left_context}\uEE00{kana}\uEE01"
ids = tok.encode(prompt, add_special_tokens=False, return_tensors="pt")
with torch.no_grad():
out = model.generate(ids, max_new_tokens=64, do_sample=False,
eos_token_id=tok.eos_token_id, pad_token_id=tok.pad_token_id)
return tok.decode(out[0][ids.shape[1]:], skip_special_tokens=True)
print(convert("ニホンゴ"))
print(convert("ノイライガクルヨウニ", "きっかけで、漫画の仕事"))
print(convert("キョウハイイテンキデスネ"))
使い方(llama.cpp)
3 つの制御トークンは GGUF 上で CONTROL トークンです。トークナイズは parse_special=true で呼んでください
(false だと各制御文字が 3 バイトに割れて出力が壊れます)。貪欲は temperature 0, top_k 1。
llama-cli -m kanakanji-edge-33m-Q8_0.gguf -p $'\uEE02\uEE00ニホンゴ\uEE01' --temp 0 --top-k 1 -n 32
制約
- 入力はカタカナ読みを想定しています(訓練データの仕様)。ひらがな入力は保証しません。
- 数字・記号を含む入力、長い文脈(訓練時の最大長 192 トークン)は精度が落ちます。
- 33M の小モデルなので、5bit 以下の量子化では出力が目に見えて変わります(Q5_K_M で AJIMEE Acc@1 が約 -0.04)。
ライセンス
トークナイザは重みと併用されるだけで翻案されていないため、CC-BY-SA の継承条項は重みには及びません。
重みを fine-tune・蒸留・量子化して再配布する場合は Apache-2.0 の条件(帰属と変更の明示)だけが適用されます。
トークナイザファイルを再配布する場合は ku-nlp への帰属を保ってください。
評価ベンチマーク
学習コード
https://github.com/yuuki14202028/gpt2-kanakanji(リポジトリ名は初代の GPT-2 版の名残)