CoolFace
Modelpublic

yuuki14202028/kanakanji-edge-33m

sourceHugging Faceapache-2.0updated 15d agoView on Hugging Face
1likes631downloads
Model Card

kanakanji-edge-33m

日本語かな漢字変換モデル(33.5M パラメータ)。カタカナ読みと左文脈を入力として漢字かな混じり文を出力します。 エッジデバイス(スマートフォンの IME)で動かすことを前提に、4bit 量子化で 20MB 枠に収まるよう設計しています。

A 33.5M-parameter Japanese kana-kanji conversion model for on-device IMEs. Input: katakana reading (+ optional left context). Output: mixed kanji-kana text.

アーキテクチャ

標準の LlamaForCausalLM(カスタムコード不要)。

項目値
d_model / 層数512 / 8
Attention8 heads, GQA (kv 2), head_dim 64, RoPE (θ=10000)
FFNSwiGLU 2048
NormRMSNorm, bias 無し
語彙6,003(byte-level BPE, 文字単位), 埋め込み tied
パラメータ33.5M(非埋め込み 30.4M)

zenz-v2.5-dataset(1.89 億件)でゼロから 6 エポック学習。オプティマイザは ScheduleFree(AdamC + 反復平均)。

評価

ベンチマークAcc@1CER
AJIMEE-Bench(200 件, greedy)0.8050.0255
Anthy corpus.1(1,745 件)0.7050.0519

held-out 5,000 件の CE(fp32): 0.0537。

GGUF は torch と同じ入力で AJIMEE-Bench 200 件を回し、出力が異なる件数を数えてあります。

ファイルサイズAcc@1 / CERtorch と出力が異なる件数
model.safetensors(fp32)134 MB0.805 / 0.0255—
kanakanji-edge-33m-f16.gguf67 MB0.805 / 0.02550 / 200
kanakanji-edge-33m-Q8_0.gguf36 MB0.805 / 0.02552 / 200

プロンプト形式

Private Use Area の Unicode 文字を制御トークンとして使います。

トークンUnicodeid用途
CONTEXTU+EE026000左文脈マーカー(文頭に置く。文脈が無くても置く)
INPUT_STARTU+EE006001カタカナ入力開始
OUTPUT_STARTU+EE016002変換結果開始
入力: \uEE02<left_context>\uEE00<katakana>\uEE01
出力: <converted text></s>

使い方(transformers)

python
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 以下の量子化では出力が目に見えて変わります(Q5KM で AJIMEE Acc@1 が約 -0.04)。

ライセンス

  • —モデルの重み(model.safetensors, *.gguf の重みテンソル): Apache-2.0。 ゼロから学習しており、他モデルの重みは含みません。
  • —トークナイザ(tokenizer.json の語彙と merges。GGUF にも同じ語彙が埋め込まれています): ku-nlp/gpt2-small-japanese-char (京都大学 黒橋研究室)の byte-level BPE 語彙をそのまま使用。CC-BY-SA 4.0。 本モデル側で追加した 3 つの制御トークン(id 6000〜6002)は Apache-2.0。
  • —訓練データ: Miwa-Keita/zenz-v2.5-dataset (CC-BY-SA 4.0 の Wikipedia 由来部分と ODC-BY の llm-jp-corpus-v3 由来部分)。

トークナイザは重みと併用されるだけで翻案されていないため、CC-BY-SA の継承条項は重みには及びません。 重みを fine-tune・蒸留・量子化して再配布する場合は Apache-2.0 の条件(帰属と変更の明示)だけが適用されます。 トークナイザファイルを再配布する場合は ku-nlp への帰属を保ってください。

評価ベンチマーク

  • —AJIMEE-Bench(azooKey)
  • —Anthy corpus.1(Anthy 付属のテストコーパス)

学習コード

<https://github.com/yuuki14202028/gpt2-kanakanji>(リポジトリ名は初代の GPT-2 版の名残)