層ごとの埋め込み(Per-Layer Embeddings): 小さなGemma 4モデルの「魔法」の簡単な解説

Reddit r/LocalLLaMA / 2026/4/6

💬 オピニオンSignals & Early TrendsIdeas & Deep AnalysisModels & Research

要点

  • この記事では、Gemma 4の小型バリアント(gemma-4-E2Bおよびgemma-4-E4B)は、典型的な密(dense)モデルでもなく、Mixture-of-Experts(MoE)でもなく、推論時の計算量のトレードオフを変える別の仕組みを使っていると説明しています。
  • MoEではルータがトークンごとに少数の専門家(experts)だけを選択するのに対し、これらのGemma 4「E」モデルでは、パラメータの大部分を埋め込みパラメータ(embedding parameters)として分離します。
  • 中心となる考え方は、gemma-4-E2Bは総パラメータが5.1Bである一方、2.8Bが埋め込みパラメータとして分類されており、Googleはそれらが実質的に「カウントされない」と主張していることで、実効パラメータは約2.3Bになるという点です。
  • 推論中に「アクティブ」とみなすものを切り替えることで、モデルはトークンあたりに必要な実際の計算を減らしつつ、パラメータが性能へ与える影響の仕方や、メモリへの読み込み要件を変えることを狙っています。

みなさんは最近の投稿 "TurboQuantの鍵となる考え方の簡単な説明" が気に入ったようですね。さて、私はそもそもあまりブロガー気質ではなく、いつも使える時間のほとんどを Heretic の開発に投資してしまうのですが、もう一つ、これだけで十分クールな新しい開発が進行中で、しかもそれについて多くの混乱があるようなので、別の短い解説記事を作ることにしました。

新しく登場した Gemma 4 のモデルファミリーには、2つの小型モデルが含まれているのにお気づきかもしれません:gemma-4-E2Bgemma-4-E4B

そう、それは「A」ではなく「E」です。

これらは、Mixture-of-Experts(MoE)モデルでも、従来の意味での密(dense)モデルでもありません。まったく別の何かであり、そのおかげで推論における面白い新しい性能のトレードオフが可能になります。

何が起きているの?

これらのモデルがどう動くのか、そしてなぜこんなにクールなのかを理解するために、まず Mixture-of-Experts(MoE)モデルが何かを手短におさらいしましょう:

gemma-4-26B-A4B は MoE モデルの例です。パラメータは 252億(モデル名では 26B に丸め)あります。ご存じのとおり、トランスフォーマーの言語モデルは層で構成されており、各層には、いわゆる MLP(Multi-Layer Perceptron)コンポーネントが含まれています。この MLP は、層のスタックを通過する際に残差ベクトルを処理する役割を担います。MoE モデルでは、この MLP が「エキスパート」に分割されます。エキスパートとは、学習の過程で専門化するサブネットワークです。ルーティングネットワークが 各トークンごとに そのトークンに最も適切なエキスパートを決め、トークンを処理するときに実際に使われるのは、その選ばれたエキスパートネットワークだけです。

言い換えると、MoE モデルには多数のパラメータがありますが、特定の位置で次のトークンを予測するのに必要なのは、そのうちのほんの一部だけです。これがモデル名の意味です:gemma-4-26B-A4B には合計 260億(実際には 252億)のパラメータがありますが、単一の推論ステップでアクティブになるのはそのうちの 40億(実際には 38億)だけです。

良いニュースは、計算に関わるのが 38億のパラメータだけなので、密(dense)の 26B モデルよりもはるかに高速に推論できることです。悪いニュースは、すべての 252億パラメータを VRAM(または高速 RAM)にロードできる必要があることです。そうしないとパフォーマンスが大きく落ちます。なぜなら、トークンに対してどのパラメータが必要になるか事前には分からず、アクティブなエキスパートはトークンごとに変わりうるからです。

さて gemma-4-E2B はまったく別の生き物です:パラメータは 51億ありますが、そのうち 28億は埋め込み(embedding)のパラメータです。 Google はそれらのパラメータは「カウントされない」と主張しており、その結果、実際の 有効な パラメータは 23億だけだと言っています。これが「E2B」の「E2B」部分を表しています。

えっ?なぜ埋め込みのパラメータはカウントされないの?

言語モデルに関する基本的な導入を読んだり見たりしたことがあるなら、埋め込みが何かはたぶんご存じでしょう。埋め込みとは、語彙(ボキャブラリ)の各トークンに対応づけられた、高次元のベクトルです。直感的に言えば、それは埋め込み空間における「方向」と「大きさ」の組み合わせとしてエンコードされ、トークンが表す「本質」を捉えます。

埋め込みは固定で、位置に依存しません。特定のトークンに対応する埋め込みベクトルは、そのトークンが入力のどこに現れるか、そしてその周囲にどの他のトークンがあるかにかかわらず、常に同じです。数学的な定式化では、埋め込みはしばしば行列として表され、その行列にワンホット化されたトークンの行列を掛けることで、そのトークンに対する埋め込みベクトルの行列が得られる、という形で表されます。

小型の Gemma 4 モデルは Per-Layer Embeddings(層ごとの埋め込み)(PLE)を使用します。処理の開始時にトークナイザの直後で適用される、単一の大きな埋め込み行列の代わりに、各層ごとに追加の(より小さな)埋め込み行列があります。学習を通じて、それぞれの層の意味的な専門化のためにトークンの文脈を組み替え直すような、専門的な知識を獲得し、その結果、処理品質が大きく向上します。層ベースの埋め込みベクトルは一連の演算を通じて残差と結合され、局所的に関連する情報が追加されます。

gemma-4-E2B では、これらの Per-Layer Embeddings を保持する行列が、モデルパラメータの半分以上を占めています。

なるほど、でもなぜ埋め込みのパラメータはカウントされないの!?

あなたが見てきた 「Transformers入門」系のチュートリアルが嘘をついているからです。 埋め込みを行列の積で適用することは数学的には非常に美しいのですが、実際の運用では完全にクソです。どの推論エンジンもそんなことはしません。

埋め込みベクトルは:

  • 固定(Static)(トークンそのものだけに依存する)
  • 位置非依存(Position-independent)(各トークンに対して埋め込みベクトルは1つだけ)
  • 固定(Fixed)(語彙全体に対して事前計算されている)

つまり「埋め込み行列」は、語彙内のトークン数と同じ要素数を持つ、埋め込みベクトルのリストです。列(カラム)同士の相互作用は一切ありません。これは行列ではなく、ルックアップテーブルです。だから、埋め込みを得るために実際に行列の積をする必要はありません。トークンIDに対応するエントリを、固定サイズの配列から引くだけで済みます。しかも、エントリの大半はそもそも参照する必要すらありません。現代のトークナイザの語彙は、通常およそ25万種類のトークンを含みます。しかし入力が1000トークンだとしたら、そのうち参照するのはごく一部です。

そのために CUDA のコアや最適化カーネルは不要です。埋め込み行列を VRAM に置く必要もありません。必ずしも CPU RAM に保持する必要すらありません。実際には、ディスクに置くことさえできます。 携帯端末ではフラッシュメモリに保存し、将来的にはそれにフラッシュ内処理を組み合わせて、さらに高速化につなげる計画のようです。

そしてそれが Per-Layer Embeddings の秘密です:巨大ですが、推論ステップごとに必要なのはそのうちのごく小さな部分だけなので、どこにでも置けます。だから速いのです。

submitted by /u/-p-e-w-
[link] [comments]