CoolFace
Modelpublic

GeneLab/3LM-MLX-GAL

sourceHugging Faceapache-2.0updated 1mo agoView on Hugging Face
0likes74downloads
Model Card

3LM-MLX-GAL

M1 Max (64GB) 1台で作った日本語の小さな言語モデルに、特定の口調を後から学習させたものです。

概要

項目
パラメータ数35,658,240
非埋め込みパラメータ19,274,240
語彙32,000 (SentencePiece unigram / byte fallback)
文脈長512
層 / 次元 / ヘッド6 / 512 / 8
構成RoPE / RMSNorm / SwiGLU / bias なし / weight tying
事前学習トークン367,607,808
事前学習コーパス1,199,015,862 文字
学習環境Apple M1 Max 64GB / MLX

評価

同じサンプリング条件 (temperature 0.8 / topk 40 / repetitionpenalty 1.15 / seed 777) で測っています。

指標3LM-MLX-GAL口調の学習前 (3LM-MLX)
bits/char (低いほど良い)3.1542.801+0.353 (悪化)
反復率 (低いほど良い)0.0000.300-0.300 (改善)
主題保持率 (高いほど良い)0.4000.667-0.267 (悪化)
破綻率 (低いほど良い)0.0000.000+0.000 (変化なし)

検証セット: holdout_clean.txt (220 行)。学習データから除いたうえで、部分一致でも混入していないことを検査してから測っています。

検証セットを変えると、勝敗が変わります

上の表は「公開データ由来の会話」で測ったものです。前作はその公開データで事前学習したモデルなので、そこは前作の得意分野にあたります。土俵を変えて、同じ bits/char (低いほど良い) で並べます。

モデルA 公開データ由来の会話B Web文+青空文庫
2LM 13.81M2.5406.481
3LM 35.66M 事前学習のみ3.3813.680
3LM 35.66M SFT済み2.8014.651
3LM 35.66M 口調あり3.1544.901

一般的な日本語の文 (土俵B) では前作を大きく上回ります。bits/char は分母が文字数なので、語彙の大きさが違うモデル同士でも比べられます。

使い方

bash
pip install mlx numpy sentencepiece
python
from 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_bundlechat_stream は学習に使ったリポジトリ (https://github.com/hiroki-abe-58/3LM-MLX) に入っています。

学習の流れ

  1. 1.事前学習: FineWeb2 の日本語 + 青空文庫から作ったコーパスで、次のトークンを当てる学習
  2. 2.SFT (指示学習): 対話データで書式を合わせる。損失は <|assistant|> より後ろと <|end|> だけに掛けています (instruction masking)
  3. 3.口調の学習: 上のモデルに、特定の話し方の会話を追加学習

SFT で損失を数えたトークンの割合: 58.3% (会話 2,584 件)

学習データと帰属表示

事前学習

データライセンス使った量
HuggingFaceFW/fineweb-2 (jpn_Jpan)ODC-By 1.01,080,000,054 文字 (90.1%)
globis-university/aozorabunko-cleanCC BY 4.0119,015,882 文字 (9.9%)

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

データライセンス
kunishou/oasst1-89k-jaApache-2.0
llm-jp/oasst2-33k-jaApache-2.0
llm-jp/magpie-sft-v1.0Apache-2.0
Aratako/Magpie-Tanuki-8B-97kApache-2.0

継承条件のあるデータ (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)