AIモデル、特に大規模言語モデル(LLM)の性能や規模を語るとき、必ずと言っていいほど登場するキーワードがあります。それが「MatMul(行列積)」と「量子化」です。
この記事では、AIの計算の大部分を占める「MatMul」がそもそも何なのか、なぜそれが必要なのか、GPU上でどう計算されているのかを解説したうえで、その高速化手法の中でも特に重要な「量子化」について詳しく掘り下げていきます。
AIの計算の大部分を占めるMatMul
Transformer系のAIモデルでは、計算量(FLOPs)の大部分、しばしば9割以上がMatMulによって占められています。具体的には、以下のような処理がすべてMatMulです。
- Attentionにおける Query / Key / Value への変換
- FFN(Feed Forward)層の2つの大きな行列積(全体の計算量では最大になりやすい部分)
- Attentionスコアの計算(QK^T)とその後の重み付き集約(softmax × V)
また、モデルの「パラメータ数」、つまりモデルサイズそのものも、その大半はMatMulで使われる重み行列によって構成されています。「AIの計算の多くを占め、モデルを巨大化させている最大の要因はMatMul」と言われるのは、こうした理由からです。
なお近年では、三値の重みを使うBitNetのような「MatMul-free」アーキテクチャの研究も進んでおり、MatMulへの依存自体を減らす動きも出てきています。
MatMulとは具体的にどんな計算か
MatMul(matrix multiplication、行列積)は、2つの行列を掛け合わせて新しい行列を作る計算です。
行列 A (m×k) と行列 B (k×n) を掛けると、結果は C (m×n) になり、各成分は次の式で求まります。
Cij=∑p=1kAip×BpjC_{ij} = \sum_{p=1}^{k} A_{ip} \times B_{pj}
つまり、Aのi行目とBのj列目を要素ごとに掛けて、すべて足し合わせたものが、結果のij成分になります。
具体例
A(2×3)とB(3×2)の積を考えてみましょう。
A = [1 2 3] B = [ 7 8]
[4 5 6] [ 9 10]
[11 12]
C = A×B (2×2) の各成分は以下のようになります。
C[0][0] = 1×7 + 2×9 + 3×11 = 58
C[0][1] = 1×8 + 2×10 + 3×12 = 64
C[1][0] = 4×7 + 5×9 + 6×11 = 139
C[1][1] = 4×8 + 5×10 + 6×12 = 154
C = [ 58 64]
[139 154]
各成分の計算は「掛けてから足す」の繰り返し(積和演算、MAC)です。m×n×kサイズの行列積では、この操作がm×n×k回発生します。
ニューラルネットにおける実態
全結合層(Linear層)は、入力ベクトル x を出力ベクトル y に変換します。
y=Wx+by = Wx + b
Wは重み行列であり、バッチで複数サンプルをまとめて処理する場合、これは行列同士の掛け算、つまりMatMulになります。Transformerでは、Query/Key/Valueへの変換、Attentionスコアの計算、FFN層での次元変換など、あらゆる箇所でこのMatMulが繰り返し登場します。
LLMではこの m, n, k がそれぞれ数千〜数万に達するため、1回のMatMulだけで数十億〜数兆回規模の演算が発生し、これが何百層にもわたって積み重なります。GPUがMatMulに特化した専用回路(Tensor Coreなど)を搭載しているのも、この演算がAI計算最大のボトルネックだからです。
なぜニューラルネットはMatMulを行うのか
重み付き和の積み重ねが本質
ニューロン1個の基本動作は、複数の入力それぞれに重みをかけて足し合わせることです。
y=w1x1+w2x2+⋯+wnxn+by = w_1x_1 + w_2x_2 + \cdots + w_nx_n + b
これは入力ベクトルと重みベクトルの内積そのものです。1つの層に多数のニューロンがあれば、それらの内積をまとめて計算する処理がMatMulになります。
- 1個のニューロンの計算 → ベクトルの内積
- 1つの層(複数ニューロン)の計算 → 行列とベクトルの積
- バッチ処理(複数サンプル同時) → 行列と行列の積
重み付き和という形式が採用されているのは、これが学習可能なパラメータによって入力の特徴を柔軟に組み合わせられる、最もシンプルな方法だからです。重みを学習によって調整することで、どの入力の組み合わせが重要かをデータから発見できます。
非線形関数とセットで表現力が生まれる
MatMul単体は線形変換であるため、それだけを何層重ねても結局は1つの線形変換にしかなりません。ReLUやSoftmaxなどの非線形関数を層の間に挟むことで、初めて複雑な関数を近似できるようになります。「MatMul → 非線形関数 → MatMul → …」という繰り返しが、ニューラルネットの基本構造です。
Attentionも本質は重み付き和
Transformerの自己注意機構(Self-Attention)も、各トークンが他のトークンの情報を「関連度に応じた重みで」集約する仕組みです。この関連度の計算(QK^T)も、その後の情報集約(重み×V)も、いずれもMatMulによって実現されています。
GPUではどのように計算されているのか
並列処理との相性の良さ
MatMulの各成分の計算は、他の成分の計算と完全に独立しています。CPUのように命令を逐次実行するのではなく、GPUは数千個の演算コアを持ち、これらの独立した計算を同時に処理できます。この並列性の高さこそが、GPUがMatMulに向いている最大の理由です。
実際の計算の流れ
タイル分割(Tiling) 行列全体をそのままGPUの高速メモリに載せることはできないため、行列を小さなブロック(タイル)に分割し、ブロック単位で計算します。
スレッドへの割り当て GPUは数万のスレッドを同時に走らせ、出力行列の一部分をそれぞれのスレッド群が並列に担当します。
メモリ階層の活用 GPU計算では、演算そのものよりも「メモリからデータを取ってくる速度」がボトルネックになることが多くあります(メモリバウンド)。そこで低速なメモリ(HBM)からデータをまとめて読み込み、高速なオンチップメモリ(Shared Memory・レジスタ)にタイル単位でキャッシュし、そのタイル内で何度も再利用しながら積和演算を行います。
Tensor Core(専用ハードウェア) NVIDIAのGPUには、通常のCUDAコアとは別に、MatMulの小さな塊を1クロックでまとめて処理する専用回路「Tensor Core」が搭載されています。これにより、汎用コアで1つずつ演算するより桁違いの高速化が実現します。低精度(FP16、BF16、FP8、INT8など)を使うことで、1クロックあたりの処理量をさらに増やすこともできます。
MatMulを高速化する手法
MatMulの高速化には、大きく分けて「計算量自体を減らすアルゴリズム的アプローチ」と「ハードウェア・実装レベルで効率を上げるアプローチ」があります。
1. 数値精度を落とす(量子化・低精度化)
もっとも効果が大きく、広く使われている手法です。詳細は次の章で解説します。
2. アルゴリズム的に計算量を減らす
- 疎行列化(Sparsity):重みの多くをゼロにして計算をスキップする
- 低ランク分解:大きな行列を小さい行列の積で近似する(LoRAなど)
- 構造化行列:フルの行列積より計算量の少ない構造を利用する
3. モデル構造自体を変えて計算量を削減
- Mixture of Experts(MoE):一部のExpertだけをルーティングして計算し、総パラメータ数を増やしつつ実際のMatMul量は抑える
- Grouped Query Attention(GQA):Key/Valueのヘッド数を減らし、Attention部分の計算量とメモリ使用量を削減する
- 枝刈り(Pruning):重要度の低い重みやニューロンを削除し、行列サイズ自体を縮小する
4. メモリアクセスの最適化
- カーネル融合:一連の処理を1つのGPUカーネルにまとめ、中間結果の書き戻しを減らす
- FlashAttention:巨大な中間行列をメモリに書き出さず、タイル単位で高速メモリ上に留めたまま計算する手法
5. 並列化・分散処理
単一GPUで収まらない規模のMatMulは、テンソル並列化やパイプライン並列化によって複数GPU・ノードに分散させます。
6. 専用ハードウェア・ソフトウェアライブラリ
cuBLAS、cuDNN、CUTLASS、Tritonといった最適化カーネルライブラリは、GPUのハードウェア特性に合わせて手書きよりも高速なカーネルを自動生成・提供します。
量子化とは何か
高速化手法の中でも、特にインパクトが大きいのが「量子化(Quantization)」です。
量子化の基本的な考え方
通常、AIモデルの計算はFP32(32bit浮動小数点)やFP16/BF16(16bit)といった精度で行われます。量子化とは、この数値表現のビット数を減らし、より少ないビットで重みや活性化値を表現する技術です。
例えば、重みの値をINT8(8bit整数)やFP8(8bit浮動小数点)、さらにはINT4のような超低ビットで表現します。
なぜ量子化で高速化・省メモリ化できるのか
量子化には主に2つの効果があります。
① 演算速度の向上 GPUのTensor Coreは、低ビットの数値であるほど1クロックあたりに処理できる演算数が多くなるよう設計されています。FP32からFP8に落とせば、理論上は同じハードウェアでも数倍の演算スループットを得られます。
② メモリ使用量・帯域の削減 ビット数が半分になれば、モデルのサイズ(重みを保存するために必要なメモリ)も単純計算で半分になります。前述の通りGPU計算はメモリバウンドになりやすいため、読み書きするデータ量が減ること自体が大きな高速化につながります。より大きなモデルを同じGPUメモリに載せられるようになる、というメリットもあります。
量子化の種類
- Post-Training Quantization(PTQ):学習が完了したモデルに対して、事後的に量子化を適用する手法。手軽だが精度劣化が起きやすい
- Quantization-Aware Training(QAT):学習の段階から量子化を見込んでトレーニングし、精度の劣化を抑える手法
- Mixed Precision:モデルの一部の層だけ低精度にする、あるいは重みと活性化で異なるビット数を使うなど、精度と速度のバランスを取る手法
- BitNet系(1.58bit):重みを{-1, 0, 1}の三値に制限する、極端な量子化のアプローチ。掛け算そのものを加算だけで近似できるため、「MatMul-free」に近い性質を持つ
量子化のトレードオフ
量子化は万能ではありません。ビット数を落としすぎると、表現できる数値の精度が粗くなり、モデルの出力精度(推論結果の正確さ)が劣化するリスクがあります。そのため実務では、精度と速度・メモリ効率のバランスを見ながら、どの層をどこまで量子化するかを慎重に設計する必要があります。
まとめ
| 観点 | 内容 |
|---|---|
| MatMulとは | 2つの行列を掛け合わせる計算。ニューラルネットの「重み付き和」を大量にまとめて表現したもの |
| なぜ重要か | AIの計算量・モデルサイズの大部分を占める最大のボトルネック |
| GPUでの計算 | 出力の各成分が独立している性質を利用し、数千コアで並列処理 |
| 量子化とは | 数値のビット数を減らし、演算速度とメモリ効率を高める技術 |
| 高速化の全体像 | 量子化、疎性・低ランク化、MoEなどのモデル構造変更、メモリ最適化、並列化、専用ハードウェアを組み合わせて実現 |
MatMulはAIモデルの計算コストとモデルサイズを決定づける中心的な存在であり、量子化はその負荷を軽減するもっとも実践的な手法の一つです。今後もモデルが大規模化していく中で、これらの技術の重要性はさらに増していくと考えられます。


