GeneLab/3LM-MLX-GAL
3LM-MLX-GAL
M1 Max (64GB) 1台で作った日本語の小さな言語モデルに、特定の口調を後から学習させたものです。
概要
評価
同じサンプリング条件 (temperature 0.8 / topk 40 / repetitionpenalty 1.15 / seed 777) で測っています。
検証セット: holdout_clean.txt (220 行)。学習データから除いたうえで、部分一致でも混入していないことを検査してから測っています。
検証セットを変えると、勝敗が変わります
上の表は「公開データ由来の会話」で測ったものです。前作はその公開データで事前学習したモデルなので、そこは前作の得意分野にあたります。土俵を変えて、同じ bits/char (低いほど良い) で並べます。
一般的な日本語の文 (土俵B) では前作を大きく上回ります。bits/char は分母が文字数なので、語彙の大きさが違うモデル同士でも比べられます。
使い方
pip install mlx numpy sentencepiecefrom huggingface_hub import snapshot_download
from src.generate import load_bundle, chat_stream
path = snapshot_download("GeneLab/3LM-MLX-GAL")
model, tokenizer = load_bundle(path)
for piece in chat_stream(model, tokenizer, [], "日本の首都はどこですか"):
print(piece, end="", flush=True)load_bundle と chat_stream は学習に使ったリポジトリ (https://github.com/hiroki-abe-58/3LM-MLX) に入っています。
学習の流れ
- 事前学習: FineWeb2 の日本語 + 青空文庫から作ったコーパスで、次のトークンを当てる学習
- SFT (指示学習): 対話データで書式を合わせる。損失は
<|assistant|>より後ろと<|end|>だけに掛けています (instruction masking) - 口調の学習: 上のモデルに、特定の話し方の会話を追加学習
SFT で損失を数えたトークンの割合: 58.3% (会話 2,584 件)
学習データと帰属表示
事前学習
FineWeb2 は Common Crawl から作られたデータセットで、ODC-By 1.0 に従い帰属を表示します。青空文庫版 (globis-university/aozorabunko-clean) は CC BY 4.0 です。どちらも継承条件 (ShareAlike) が無いため、この重みを Apache-2.0 相当で配布できます。
再現性のため、使用した revision と各シャードの SHA256 を構築スクリプトの manifest に記録しています (FineWeb2 af9c13333eb9 / 青空文庫 42a9c9c0f1d6)。コーパス本体は再ホストせず、スクリプトと manifest で再現できる形にしています。
適用したフィルタ: 日本語文字比率 70% 以上 / 200〜20,000文字 / 定型文とエラーページの除去 / 重複除去 / 同一並びの繰り返し検出。
SFT
継承条件のあるデータ (CC BY-SA など) は、配布ライセンスの整合が崩れるため意図的に使っていません。
制限
- 35,658,240 パラメータしかありません。事実を答える能力はほとんど期待できません。知識の参照には使えません
- 学習データの大半が Common Crawl 由来のウェブ文書なので、そこに含まれる偏りや不適切な表現を引き継いでいる可能性があります
- 青空文庫を約10%混ぜているため、文語的な言い回しが出ることがあります
- 商用利用の可否は、上記データセット各々のライセンスもご確認ください
- 事前学習コーパスは Common Crawl 由来のため、メールアドレスや電話番号が含まれています。学習後に prefix attack で 60 件試したところ、そのまま復元できたものはありませんでした (コーパスを1周未満しか読んでいないため)。ただし、より強い攻撃で引き出せない保証はありません
ライセンス
- 重み: Apache-2.0 相当
- 学習コード: MIT (https://github.com/hiroki-abe-58/3LM-MLX)
- 学習データの帰属: 上記のとおり (ODC-By 1.0 / CC BY 4.0 / Apache-2.0)
実測値のメモ
- 1トークンあたり 2.101 文字 (語彙 32,000 / ウェブ文書)
- コーパス 1,199,015,862 文字 = 570,676,120 トークン (うち学習に使ったのは 569,281,544)
