Gemma 3 270M向けのLoRAを作成し、たぶん最小の“思考”モデルになったかも

Reddit r/LocalLLaMA / 2026/4/29

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical UsageModels & Research

要点

  • 開発者がHugging FaceでGemma 3 270M向けのLoRAファインチューニングを公開し、それが「思考」機能を持つ最小級のモデルかもしれないと主張しています。
  • LoRAはまずローカルでのファンクションコーリング対応のために作られ、その後「thinking」のフォーマットとタグを維持するよう拡張されました。
  • 著者によると、最も大きな課題は出力形式を崩さないことにあり、ランク24・最大シーケンス長768・適切なタグがない場合に強く罰するカスタム損失などの学習設計に至ったとのことです。
  • 学習には厳しい制約があり、RTX 3050 4GB(バッチサイズ1、勾配蓄積あり)で学習したほか、勾配蓄積ステップの調整が安定性に大きく影響し、崩れた出力を抑えるのに重要だったと述べています。
  • SFTとLoRAの主要設定(学習率、スケジューラ、q_proj/v_projなどの対象モジュール、ドロップアウトや損失の挙動)を提示し、論文推奨どおりにLoRA alphaをランクの2倍にすると性能が崩れたとも触れています。

https://huggingface.co/firstbober/gemma-3-270M-it-smol-thinker

これは出力例です:
```
==================== THINKING ==================== ここが思考プロセスです:

  • これは興味の幅が広い大きなコミュニティです
  • ユーザーは質問したり、経験を共有したり、地域のイベントについて議論したりできます
  • ルールは一般にオープンエンドで、創造性を許すものです
  • ただし、ルールが不明確または不完全な場合があります<|thinking_end|>

==================== RESPONSE ====================

r/LocalLLaMA は大規模なオープンソースの質問応答サブレディットです。ルールは一般にオープンエンドで、ユーザーが質問したり経験を共有したりできるようになっています。ただし、コミュニティの現状によってはルールが不明確または不完全かもしれません。

<|response_end|>
```

内蔵されている知識はあまり多くありませんが、プロンプトを与えることで面白い結果がいくつか出せます。

経緯:

私はこれを数日間取り組んでいました。まず、FunctionGemmaを使わずに関数呼び出し用にローカルで適応したいと思ったのです。うまくいった(ある程度)ので、そこから「思考」を追加することに移りました。データセットは手続き的に生成したものに加え、Qwen 3.6 35B A3B(Q4量子化)とGLM 5.1のものも少し混ぜています。

最大のハードルは、フォーマットを維持させる方法を突き止めることでした。私は学習データのために rank 24、最大長 768 を採用し、適切なタグを使わなかった場合に20倍の損失になるように損失関数をカスタムしました。それにより損失はおよそ7のあたりで推移しましたが、効果はちゃんと出ています。

もっと長い例を追加したいと思っていますが、私のRTX 3050 4GB Mobileではちょっと足りません。学習バッチサイズが1で、グラディエント蓄積ステップが2なので、これが私にできる最良のところです。

もう一つ面白い点として、Claude/Geminiが言っていたのは、より大きいgradient_accumulation_stepsは本質的にはバッチサイズが大きくなることを意味するが、実際にはバッチサイズを増やさない、ということでした。これは私の悩みの40%くらいを占めていて、モデルが完全に意味のないゴミを吐いたり、ランダムな中国語の文字の塊みたいなものが出てきたりしていました。

さて、これで全部だと思います。関連する学習パラメータはすべて以下です:
```
SFTConfig:

per_device_train_batch_size=1, gradient_accumulation_steps=2, per_device_eval_batch_size=1, learning_rate=1e-4, lr_scheduler_type="cosine", warmup_ratio=0.10, weight_decay = 0.1, load_best_model_at_end=True,

LoraConfig:

n_rank = 24 r=n_rank, lora_alpha=n_rank, target_modules=["q_proj", "v_proj", "k_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], lora_dropout=0.15, task_type="CAUSAL_LM",
```

あ、あと論文で推奨されていたとおり alpha をランクの2倍に増やしたら、なんだか全部が壊れてしまいました。これも、かなり突き止めるのが大変だった別の要因です。

今後も続けて、別のアイデアでいくつか追加のアダプタを学習するつもりです。十分なVRAMのあるカードを買ったら、Qwen 3.5 0.8Bに切り替えるかもしれません。どうなるかは分かりません。確実にやることの一つは、FunctionGemma用の「思考アダプタ」を作ることです。そうすれば、ある程度は関数呼び出しに関する私の問題が解決するはずです。

submitted by /u/Firstbober
[link] [comments]