月曜の午後、チームスペース。凡田が新規案件のアサインを考えている…
凡田(チームリーダー・38, 主人公)

新しい案件、誰に振るかな…。求められるのは 実装力・折衝力・ドメイン知識・スピード の4つ。Aさんは実装8・折衝3だから…重みつけて足すと…うーん。次、Bさんは…(電卓を叩く)。メンバー20人ぶん、これ一人ずつやるのか…。

川口(アナリスト・22)

凡田さん、それ 一人ずつやらなくていい ですよ。メンバー全員の 「強みの数値」 を縦に積んで 1枚の表(行列) にすれば、案件の要求ベクトルとの掛け算 「1回」 で、全員ぶんのフィット度がまとめて出ます。

凡田

え、20回ぶんの計算が1回の掛け算に化けるの?

川口

それが 行列・ベクトルの積 です。しかも ── ニューラルネットが 1つの層 でやっているのも、まさにこの計算なんですよ。

チームスペースで凡田が電卓とメンバー一覧を前に一人ずつ採点して悩んでいる横で、川口がタブレットにメンバーの強みを縦に積んだ表(行列)を見せ『1回の掛け算で全員分出ます』と説明している図
この記事の要約(3行)
  • 行列・ベクトルの積とは、ひとことで 「内積を、行の数だけまとめて一気にやる」 演算。重み行列 × 入力ベクトル = 出力ベクトルで、出力の各マスは「その行と入力の内積」1回ぶん。凡田が一人ずつ電卓で出していた採点を、表(行列)にして全員分を一括で出すのと同じ。
  • なぜ大事かというと、これが ニューラルネット 「1層」 の計算そのもの だから。「入力に重みを掛けて足す」を出力ニューロンの数だけやる = 行列ベクトル積。AI の中身は、この掛け算を何十層も積み重ねたもの。
  • そして GPU はこの 「まとめて掛ける」 のが死ぬほど得意。一人ずつより、行列で一括にした方が桁違いに速い ── これが「AI の計算が行列だらけ」な理由で、AI が速い理由でもある。

内積 (#005) は「ベクトル2本から1つの数を作る」演算だった。本記事はそのすぐ上の階 ── 「内積を、行の数だけまとめてやる」 行列・ベクトルの積を扱う。これが分かると、ニューラルネットの1層の中で何が起きているか が、計算レベルで見えるようになる。

定義 — 内積を「行の数だけ」まとめたもの

行列・ベクトルの積は、新しい難しい計算ではない。知っている「内積」を、行列の各行について繰り返すだけ だ。

重み行列 W × 入力ベクトル x = 出力ベクトル y。出力 y の i 番目のマスは、「W の第 i 行」と「x」の内積

つまり、出力ベクトルのマスの数 = 行列の行の数。各マスを作るのに、内積を1回ずつ使う。具体例で見れば一目だ ── 下の図で、出力の「5」は 行列の第2行 [0,1,1,2] と入力 [2,0,3,1] の内積(0·2+1·0+1·3+2·1=5)。第1行なら 3、第3行なら 9。行のぶんだけ内積を並べたものが、出力ベクトルだ。

3×4の重み行列に長さ4の入力ベクトルを掛けて長さ3の出力ベクトルを得る図。出力の2番目の値5が、行列の第2行[0,1,1,2]と入力[2,0,3,1]の内積(0·2+1·0+1·3+2·1=5)であることを色と計算式で示す

図1: 行列ベクトル積 = 「各行 × 入力ベクトル」という内積を、行の数だけまとめて一気にやること。出力の各マスは、対応する行と入力の内積1回ぶん

ポイントは 「行列の1行 = 1つの出力を作るための重みのセット」 ということ。凡田の采配でいえば、行列の1行 = メンバー1人の 「強みプロファイル」。それと案件の要求ベクトルの内積が、そのメンバーのフィット度になる。行を縦に積めば、全員ぶんが1回の掛け算で出る。

これがニューラルネットの「1層」

ここが本記事の核心だ。ニューラルネットの全結合層(線形層)がやっている計算は、まさにこの行列ベクトル積1回 に他ならない。

ニューロン (#008) 1個は、「入力それぞれに重みを掛けて、全部足す」 ── つまり 入力ベクトルと、自分が持つ重みベクトルの内積 を計算している。出力ニューロンが3個あれば、内積を3回。これを 重みを3行ぶん積んだ行列 × 入力ベクトル と書けば、層まるごとの計算が、たった1回の行列ベクトル積 になる。

「重み」(#009) は、見る粒度で姿が変わる

ここで 「重み」という言葉が指すもの を、粒度で整理しておくと一気に腑に落ちる:

粒度 正体 この記事の例
線1本(入力1個 → 出力1個 をつなぐ1本) ただの数(スカラー) 入力「2」から出力①へ伸びる線の重み = 1
ニューロン1個ぶん 数の並び(ベクトル)= 行列の1行 出力①の重み = [1, 2, 0, 1]
層まるごと 表(行列) 重み行列 W = 3行 × 4列

いちばん細かい 線1本 は、「ある入力を、ある出力でどれだけ効かせるか」を表す数字ひとつ。下の図2の線1本1本が、それぞれこの数字を持っている。それを 1つの出力ぶん(横一列)集めるとニューロン(= 行)全出力ぶん集めると層(= 行列)。テンソル (#047) でやった スカラー → ベクトル → 行列 が、そのまま重みにも当てはまる ── 「重みって、実は行列だったのか」というわけだ。

左に4つの入力ニューロン、右に3つの出力ニューロンを置き全結合した図。各線が重み(行列の1要素)で、2番目の出力ニューロンに入る4本の線を強調し、その出力5が第2行と入力の内積であることを示す。層全体が行列ベクトル積1回に対応することを表す

図2: 色分けした行列の3つの行が、それぞれ1つの出力ニューロンを作る(行→同色の束→同色の出力)。出力1個 = 「その行」と入力の内積。層ぜんぶ = 行列ベクトル積1回 ── 図1とまったく同じ計算を、ネットワークの絵で描いただけ

だから ── MLP(#037) も、アテンション(#030) の Q/K/V (#035) を作る部分も、中身を開ければ 「行列 × ベクトル(やその束)」の繰り返し。AI の計算の大半は、この一種類の演算でできている。行列ベクトル積が分かれば、ニューラルネットの 「1層の中身」 は分かったも同然だ。

なぜ「行列で」まとめるのか — 速さの理由

「一人ずつ内積すればいいなら、なぜわざわざ行列にするのか?」── 答えは 速さ だ。

内積を一人ずつ順番に計算するのは、凡田が電卓を20回叩くのと同じ。一方、GPU は 「たくさんの掛け算と足し算を同時に」 やるのが死ぬほど得意 な専用チップで、行列ベクトル積はその得意技そのもの。20人ぶんでも、1000人ぶんでも、ほぼ一瞬で並列に 片づける。さらに入力を バッチ (#047) でまとめれば、行列 × 行列の積になり、もっとまとめて処理できる。

「AI の計算は行列だらけ」と言われるのは、これが理由だ。計算をあえて行列の形に揃えることで、ハードの並列性を最大限に引き出している。AI が速いのは、賢いアルゴリズムというより、計算を 「まとめて掛けられる形」 に整えてあるからでもある。

コンサル感覚 — 「一人ずつ」を「一括」に変える視点

本記事の核心メッセージは 「同じ計算を多数の対象に繰り返すなら、それは 「行列1回」 にまとめられる」。凡田の采配がそうだったように、この視点は実務でも効く:

① 「一人ずつ手作業」 を見つけたら、まとめる余地がある: 各案件・各顧客・各メンバーに同じ採点や判定を繰り返しているなら、それは 「評価軸 × 対象」の表(行列)1枚 に置き換えられるサイン。Excel の表計算も、業務システムのバッチ処理も、AI の層も、本質は同じ「まとめて一括」だ。

② AI 案件の 「重い処理」 の正体を説明できる: クライアントに「なぜ GPU が要るのか」を聞かれたら、「AI の中身は巨大な掛け算表(行列ベクトル積)の繰り返しで、それを一括並列でやるのが GPU だから」 と返せる。モデルの賢さの裏に、地道な行列計算がある、と伝わる。

③ クライアント説明の一言: 「ニューラルネットって中で何してるんですか?」には、「入力に重みを掛けて足す、を大量にまとめてやってます。表(行列)と数の並び(ベクトル)の掛け算の繰り返し、それだけです」。難解な箱の中身が、急に手触りのある計算に見えてくる。

夕方の給湯室、采配の話が広がって…
凡田

いや〜、さっきの行列の話、地味に効いたわ。20人を一人ずつ電卓で…ってやってた俺、何だったの。

大蔵(アシスタントマネージャー・35)

あら、私は13年それを Excel の SUMPRODUCT で一行ずつ…でも下にコピーすれば一気でしたわね。…まさかあれ、行列の掛け算でしたの?

川口

まさにそれです。SUMPRODUCT が内積、それを縦にコピー = 行列ベクトル積。大蔵さんは13年前から1層ぶんの計算を手でやってたんですよ。GPU はそれを、何千行でも一瞬でやるだけなんです。

夕方の給湯室で、凡田が脱力した表情で電卓を置き、大蔵がノートPCのExcelでSUMPRODUCTの列を下にコピーした表を指し示し、川口が『それが行列ベクトル積です』と笑顔で説明している3人の図