IBM Graniteの最新世代、Granite 4.1について解説した記事です。ざっくり言うと、「モデルを大きくすれば勝てる」という雑な話ではなく、データの選び方・学習段階の切り替え・長文対応・SFT・RLまで、かなり丁寧に積み上げて作ったLLMだよ、という内容でした。
個人的に面白いのは、このブログが「性能の数字」だけでなく、どうやってその性能を作ったかにかなり踏み込んでいるところです。LLMはもはや“魔法の箱”ではなく、かなり工学的な製品になってきたんだな、というのを改めて感じます。
Granite 4.1は、decoder-only transformerを使ったdense modelです。
ここをかんたんに言うと、
![]()
です。
サイズは3つあります。
![]()
モデルの中では、GQA(Grouped Query Attention)、RoPE、SwiGLU、RMSNorm、shared input/output embeddings など、最近の定番構成が採用されています。
専門用語が多いですが、要するに「今どきの強いLLMでよく使われる、堅実で実績のある部品を使っている」という理解でまず十分です。
ここでのポイントは、派手な新発明を前面に出すというより、よく効く設計をうまく組み合わせて、学習パイプラインで勝負していることだと思います。こういう路線、地味ですがかなり強いです。
![]()
Granite 4.1は、約15T tokensで学習されています。
しかも一気に同じデータで学習するのではなく、5段階に分けて進めています。
この設計思想はかなり重要です。
最初から「良いデータだけ」で学習すればよさそうに見えますが、実際にはそう単純ではありません。最初は広い知識を入れ、その後で質を上げ、さらに長文対応へと進めるほうが、モデルを安定して育てやすいのだと思います。
最初の段階は、まず広く言語を覚えるフェーズです。
![]()
データの内訳はおおむねこんな感じです。
CommonCrawlは、ざっくり言えばWeb由来の大規模データです。
つまり最初は「インターネットの広い世界」を見せて、一般的な言語能力を育てているわけです。
次は、mathとcodeを強化する段階です。
![]()
ここで一気に、推論力やプログラミング能力を伸ばしにいくのがわかります。
LLMは雑談だけできても実用性は限定的で、実際には「計算ができる」「コードが書ける」「指示に従える」がかなり大事です。IBMはそこを早めに強化しています。
ここからは、より高品質なデータへ寄せていく中間学習です。
さらに、chain-of-thoughtやsynthetic instruction dataも混ぜ始めます。
![]()
ここはかなり興味深いです。
「ただ大量に学習する」から、「考える過程や指示に従う形式まで含めて学習する」へ進んでいる。LLMを“会話の道具”として実用レベルに持っていくには、この段階がとても効くのだと思います。
さらに最後の仕上げでは、いよいよ高品質データ中心になります。
この段階の役割は、モデルの「クセ」を整えることに近い印象です。
広く覚えた後で、雑味を減らし、精度を上げる。料理で言えば、煮込み終わった後の味の調整みたいなものです。こういう後半の仕上げが、実際の使い心地をかなり左右するはずです。
最後は、長文対応のための学習です。
コンテキスト長を 4K → 32K → 128K → 512K と段階的に伸ばします。
![]()
ここがかなり面白いです。
長文対応というと、ただ長い入力を入れればよいように見えますが、実際には短文性能を壊さずに長文を覚えさせるのが難しい。そこで、各段階の後にmodel mergeを行って、性能の崩れを抑えているそうです。
個人的には、この「長文にしたら別物になる問題」への丁寧な対処が、かなり実務っぽくて好印象でした。長いだけで雑なモデルは、正直あまり使いたくないですからね。

記事では、RULER benchmarkの結果も紹介されています。
ざっくり見ると、3B / 8B / 30Bで、長いコンテキストでも一定のスコアを維持しています。
もちろん、数値だけで全部は語れませんが、512K contextを視野に入れた設計はかなり攻めています。
しかも、単に“長く入る”のではなく、途中で学習済み能力を壊しにくい設計にしているのがポイントです。

SFT(supervised fine-tuning)は、ベースモデルを実際に使いやすいアシスタントにする工程です。
ここでの話はかなり重要で、記事は「少量の変なデータでも悪い癖がつく」と明言しています。これは本当にその通りだと思います。モデルは良い例だけでなく、悪い例もちゃんと覚えてしまうので、データの質が命です。
Granite 4.1では、SFT用データをLLM-as-Judgeで評価しています。
これは、別のLLMに採点させる仕組みです。
評価は単なる好き嫌いではなく、

など、複数の観点で見るようです。
必要に応じてcritical-thinking checksも入るとのこと。
さらに大事なのは、hallucination(幻覚)、false premise、incorrect computation のような重大な問題は、スコアが良くてもhard rejectする点です。
つまり「なんとなく良さそう」では通さない。ここはかなり真面目で、好感が持てます。
LLMによる評価だけでなく、機械的なチェックも行っています。

要するに、形式が壊れていないか、長すぎないか、混入や重複がないかを厳しく見るわけです。
こういうのは地味ですが、実際には超重要です。
派手なベンチマークの数字より、日々の安定性を支えるのはこういう裏方仕事だと思います。

選別を通ったあと、3つのモデルは共通して、約4.1Mの高品質サンプルでSFTされます。
主な設定はこんな感じです。

ここから見えるのは、大きすぎない学習率で、きっちり整える方針です。
無理に暴れさせるより、丁寧に仕上げる感じですね。
SFTの次はRL(reinforcement learning)です。
これもかなり面白いです。Granite 4.1では、RLを1回だけやるのではなく、複数段階に分けて行っています。

使っているのは、
です。

簡単にいうと、モデル自身が出した答えを使って学習しつつ、より安定した更新を目指す方法です。
記事では、通常のGRPOより安定したシグナルが得られるとしていますが、動的サンプリングは計算コストが高いので、実際の訓練ではオフにしたそうです。こういう「理想と現実の折り合い」も、研究っぽくておもしろいところです。
RLは4段階です。
この順番がけっこう考えられていて、いきなり難問数学だけをやるのではなく、まず多様なタスクでバランスを取り、その後に人間らしい応答や知識の較正、最後に数学を詰める流れです。
![]()
複数分野をまとめて学習します。
この段階の狙いは、catastrophic forgettingを防ぐこと。
これは「ある能力を強化したら、前にできていたことを忘れる」現象です。人間でもありそうですが、LLMでも普通に起こります。
![]()
RLHFは、人間の好みに寄せる調整です。
わかりやすく言えば、「賢いけど使いにくい」状態を、「ちゃんと会話できる」状態へ持っていく工程です。
ここは少し専門的ですが、要するにモデルの自己認識や知識の言いすぎ問題を整える段階だと理解するとよいです。
LLMは知らないことまで自信満々に言うので、その“口の軽さ”を少し抑えるのはかなり重要です。
最後に数学を詰める。
これはわかりやすいですね。LLMの弱点が出やすい領域を、最後にしっかり補強するわけです。
TL;DRにもある通り、8B instructモデルが、前世代のGranite 4.0-H-Small(32B-A9B MoE)に匹敵または上回るとされています。
これはかなり大きな話です。
なぜなら、単純に考えると「32Bのほうが強そう」に見えるからです。でも実際には、
![]()
がうまく噛み合うと、小さめのdense modelでもかなり戦えるわけです。
個人的には、ここがGranite 4.1のいちばん面白いところです。
“とにかく巨大化”ではなく、設計とデータで勝つ方向に寄せている。これは今後のLLM開発の一つの本流になっていくのではないかと思います。
![]()
Granite 4.1の記事を読んでまず感じたのは、これは単なるモデル紹介ではなく、「強いLLMをどう再現可能な形で作るか」の教科書みたいな内容だということです。
特に印象的だったのは、
という点です。
派手さより堅実さ。
でも、その堅実さがちゃんと性能に結びついているように見えるのが、Granite 4.1の魅力だと思います。
「小さくても強いモデル」を本気で作ると、ここまで工学的になるのか、とちょっと感心しました。