世界を動かす技術を、日本語で。

HNに表示: 言語モデルの仕組みを明らかにするための小さなLLMを作りました

概要

  • GuppyLM は約 9Mパラメータ の小型LLMで、魚のキャラクターとして会話
  • Colabノートブック1つ・5分 で誰でも訓練・会話可能
  • 60,000件の合成会話データ からゼロから学習
  • シンプルなVanilla Transformer構成 で理解しやすい設計
  • 性格や会話トピックもカスタマイズ可能 な教育用プロジェクト

GuppyLMとは何か

  • GuppyLM は、 小型LLM として魚(Guppy)のキャラクターを演じるモデル
  • 短く、すべて小文字 の文章で水槽や食べ物、光など魚らしい話題を語る
  • 人間の抽象的な概念 (お金、スマホ、政治など)は理解しない設計
  • 60種類のトピック (挨拶、感情、温度、食べ物、光、水、夜、孤独、泡、反射、夢、友達、冗談など)に沿った会話データを合成
  • HuggingFace から事前学習済みモデルをダウンロードし、すぐに会話可能

モデルアーキテクチャ

  • パラメータ数 :8.7M
  • 層数 :6
  • 隠れ次元 :384
  • ヘッド数 :6
  • FFN :768(ReLU)
  • 語彙数 :4,096(BPE)
  • 最大シーケンス長 :128トークン
  • 正規化 :LayerNorm
  • 位置埋め込み :学習済み
  • LMヘッド :埋め込みと重み共有
  • バニラTransformer :GQA、RoPE、SwiGLU、early exitなしのシンプル構成

性格と会話スタイル

  • Guppy は短く、好奇心旺盛で少し間抜けな性格
  • 水、温度、光、振動、食べ物 など五感的な体験が中心
  • 「食べ物」への執着 が強い
  • 人間の複雑な話題 は一切理解しない
  • 一回ごとのやりとり(シングルターン) で安定した出力

学習データとデータセット

  • HuggingFaceデータセット :arman-bd/guppylm-60k-generic
    • サンプル数 :60,000(訓練57K/テスト3K)
    • 形式 :{"input": "...", "output": "...", "category": "..."}
    • カテゴリ数 :60
  • 合成テンプレート を用いた会話生成
    • 30種類の水槽オブジェクト
    • 17種類の餌
    • 25種類の活動
    • 60テンプレートから約16,000通りの出力

プロジェクト構成

  • guppylm/
    • config.py:ハイパーパラメータ管理
    • model.py:バニラTransformer実装
    • dataset.py:データ読み込み・バッチ化
    • train.py:訓練ループ(コサインLR・AMP対応)
    • generate_data.py:会話データ自動生成
    • eval_cases.py:テストケース評価
    • prepare_data.py:データ準備・トークナイザ訓練
    • inference.py:チャットインターフェース
  • tools/
    • make_colab.py:Colabノートブック自動生成
    • export_dataset.py:データセットHuggingFaceアップロード
    • dataset_card.md:データセットREADME

設計のポイント

  • システムプロンプトなし :全学習サンプルが同一プロンプトで、性格は重みに直接埋め込み
  • シングルターン会話 :128トークン制限により複数ターンは出力が崩れるため採用せず
  • バニラTransformer採用 :小規模モデルでは複雑な構造は不要
  • 合成データ利用 :一貫した性格・話題を保つためテンプレート合成で大量生成

クイックスタート

  • 事前学習済みモデルで即チャット :Colabで全セル実行
  • 自分で訓練 :T4 GPU選択、全セル実行でデータ取得・トークナイザ訓練・モデル訓練・テストまで完了
  • ローカルチャット
    • pip install torch tokenizers
    • python -m guppylm chat

ライセンス・利用例

  • MITライセンス
  • 性格や会話テンプレートを自由にカスタマイズ可能
    • 独自キャラクターへの応用も容易

まとめ

  • GuppyLMは教育・実験用に最適な小型LLM
  • LLMの基本構造・学習・推論の全工程を体験可能
  • 大規模モデルのブラックボックス感を払拭する教材
  • 手軽にカスタムLLMを構築・拡張できる設計

Hackerたちの意見

本当にLLMの素晴らしい入門ですね。少し前にミルトンの『失楽園』を元に自分のを作ったんですよね。: https://www.wvrk.org/works/milton

あなたは私のお気に入りの大きな形です。あなたがいると私の口は幸せです。大声で笑ったよ :-D

これは合成トレーニングデータからの直接の出力だけど、ちょっとオーバーフィッティングが起きてるのか、それとももっと小さいモデルの自然な限界なのか気になるな。

魚のキャラクターが一貫性を持つために、どれくらいのトレーニングデータが必要だったの?こういうのに必要な最小限のデータセットがどんな感じか気になるな。

うーん、実は自分のGPUでトレーニングを試せるかも。次に試してみたいことの一つなんだ。魚よりちょっと複雑かもしれないけど :)

大好き!使っているツール(これからますます使うことになるもの)が裏でどう動いているかを理解するのは大事だと思う。

これめっちゃクール!どうやって作ったのか、参考にしたものについての解説を見てみたいな。ニューラルネットワークの設計はいつも迷路みたいに感じるから ;)

長い文脈にはどう対応してるの?それとも2文くらいで幻覚を見始めるのかな?9Mパラメータの前にどこまでが限界なのか気になる。

アイデアはいいと思うけど、例がトレーニングデータセットから再現されてるのが気になるな。未知のクエリにはどう対応するの?

これは多分、トレーニングデータが全部小文字だからだと思う。あなた> こんにちは グッピー> やあ。マイクロペレット持ってきた? あなた> こんにちは グッピー> それが何を意味するのか分からないけど、俺のだよ。

新しいアカウントからの死んだコメントがこんなに多いのはなんで?

みんなスラップコメントみたいだね。