AIの記事でよく出るベクトルと行列、ここだけ読めれば怖くない
目次
前回のAIの記事でよく見る数式、ここだけ読めば怖くない では、ベクトルを「数字が横に並んでいるだけ」でまとめて流してしまった。 ただ、TransformerやAttentionの式をもう少し真面目に読もうとすると、ベクトルと行列はもう一段だけ踏み込んでおいた方がラクになる。
この記事も前回と同じで、解けるようになる必要はなく、読めるようになることを目標にする。
行列式・逆行列・固有値は出さない。 内積と行列積、この2つだけ押さえればLLM周辺の式はかなり読める。
ベクトルは「特徴を数字で並べた入れ物」
まず前回のおさらいから。
ベクトルは数字の並びで、AIの中では単語・画像・音声の特徴をこの形で持つ。
- 単語なら「どういう意味の近くにいるか」を数百〜数千個の数字で表す
- 画像ならピクセル値、あるいは輪郭や色の特徴を並べた数字で表す
- 音声なら時間や周波数ごとの強さを並べた数字で表す
3次元だけに絞って雑に書くと、単語のベクトルはこんなイメージになる(本物はもっと高次元)。
| 単語 | 数字の並び |
|---|---|
| 王 | [0.8, 0.1, 0.9] |
| 女王 | [0.8, 0.9, 0.9] |
| リンゴ | [0.1, 0.1, 0.0] |
「王族っぽさ」「女性寄りか」「人間か」みたいな特徴が各列に入っている、と思っておけば十分。
実際の学習済みベクトルは、人間が各次元に名前を付けられるほど綺麗に分かれていない。 ただ「似た意味の単語は近くに並ぶ」傾向はちゃんと出る。
矢印で見ると「向きと長さ」だけ
ベクトルは矢印で描くこともできる。
2次元で見たときに大事なのは2つだけだ。
- 長さ = その特徴全体の強さ
- 向き = どんな特徴の組み合わせか
高次元でも考え方は変わらない。 意味の近い単語どうしは「だいたい同じ向き」、関係ない単語どうしは「全然違う向き」になる、とイメージしておけばいい。
ちなみに長さのことを ノルム と呼ぶ。記号で書くと のような縦棒で挟む形が多い。
高校数学の矢印記号との違い
高校数学ではベクトルを のように矢印頭で書いた。 ただ、大学以降の数学やAI系の論文・教科書だと、矢印はあまり使われない。 代わりに、太字で と書いたり、文脈で「小文字=ベクトル、大文字=行列」と使い分けることが多い。
この記事でも以降は矢印を付けずに や のように書く。 素のアルファベットで出てきても、文脈でベクトルや行列を指していると思っておけばいい。
ついでにノルム(ベクトルの長さ)の書き方もペアで変わる。
- 高校数学: (縦棒1本)。矢印でベクトルだと示しているので、縦棒は1本で済ませる
- 大学以降・AI系: (縦棒2本)。矢印が無いぶん、絶対値との見分けがつくように縦棒を増やす
この記事は矢印を使わない側なので、ノルムは縦棒2本の で書く。
足し算・引き算は「意味を合成する」動き
ベクトルの足し算・引き算は素直だ。
対応する位置どうしを足しているだけになる。
中身を一般的に書く記法
これ以降は具体的な数字だけでなく、ベクトルの中身を記号で書くことも出てくる。 先にその書き方だけ入れておく。
ベクトル と を中身が見える形で書くと、こうなる。
読み方はこれだけ押さえればいい。
- はベクトル の1番目の数字、 は2番目、と続く
- 右下に小さく付いている数字は「何番目か」を表すだけで、掛け算や累乗ではない
- は途中を省略しているだけ
- 最後の は「ベクトルの要素数」を表している
この「右下の数字で位置を表す」書き方は、後で行列が出てきたときも同じだ。 そのときは のように数字が2つ並んで「何行目・何列目」を指すようになるが、発想はここと変わらない。
この記法を使うと、足し算はこう書ける。
やっていることは具体例と同じで、対応する位置どうしを足しているだけだ。
単語ベクトルで意味を動かす
有名な話として、単語のベクトルでこんな関係が成り立つことがある、と昔から言われている。
王 - 男 + 女 ≒ 女王
「王」から「男っぽさ」を引いて「女っぽさ」を足したら「女王」に近づく、という話だ。 実際のモデルで毎回きれいに出るわけではないけれど、「ベクトルの足し引きで意味を動かせる」くらいの直感はここで掴んでおくと、あとの話が入りやすい。
画像の世界でもスタイル変換で「あるベクトルを足すと画風が変わる」みたいな話が出てくる。 根は同じで、特徴を表す方向をベクトルで足し引きしているだけだ。
ベクトルの掛け算には種類がある
足し算・引き算の次は掛け算が気になるところだが、ベクトルの掛け算は用途ごとに何種類かあって、1つに決まっていない。 AI関連の記事で特によく出てくるのは次の2つだ。
- 内積(dot product): 2つのベクトルから1つの数字を返す
- 要素ごとの積(アダマール積): 対応する位置どうしを掛けて、同じ長さのベクトルを返す
他にも外積など別の掛け算もあるが、LLMや画像生成の解説で出てくる場面はそれほど多くない。 ここではまず、Attentionや類似度計算で一番よく使われる内積から見ていく。
内積はこう書く。
やっていることは「1番目どうしを掛ける、2番目どうしを掛ける、……それを全部足す」だけだ。
さっきの2つのベクトル と で実際に計算するとこうなる。
「対応する位置どうしを掛けて、全部足す」。それだけの動きだ。
ここで前回の「重み付き足し算」と並べてみる。
真ん中の の部分は、内積とまったく同じ形をしている。 前回の計算を、ベクトルという言葉で書き直すと「重みベクトル と入力ベクトル の内積」だった、と見ることができる。
意味としては、2つのベクトルの向きの近さを測る動きになる。
- 同じ向きに近い → 内積は大きいプラス
- 直交(関係ない) → 内積はほぼ0
- 逆向き → 内積はマイナス
なぜ「成分を掛けて足すだけ」でこうなるのか、図で見ると腹落ちしやすい。
成分単位で見るとシンプルな話になる。 2つのベクトルで同じ方向に伸びている成分どうしは掛け算でプラスの値を出し、逆向きに伸びている成分どうしはマイナスの値を出す。 それを全部足し合わせているので、向きが近いほどプラスがたまって大きくなり、直交すると正と負が打ち消し合って0、反対向きになるとマイナスがたまって負の値に振れる、という仕組みだ。
だからニューラルネットの各ニューロンがやっているのは、「重みベクトルと入力がどれだけ同じ向きか」を測る動きだ、と言い換えてもいい。
長さと角度で書く形
ここまでの内積は、もう一段だけ幾何的な形で書き直すこともできる。
- と はそれぞれのベクトルの長さ
- は2つのベクトルの間の角度
この記事では三角関数そのものは深掘りしないので、以降この形はほとんど使わない。 ただ、知っておくとさっきの「向きの近さ」の話がそのままここから出ているのが分かる。
- 同じ向き(角度が0) → → 内積は長さの積、最大
- 直交(角度が90度) → → 内積は0
- 逆向き(角度が180度) → → 内積は負で最小
両辺を2つの長さで割り直すと、こうなる。
「内積を2つのベクトルの長さで割ったもの」が、2つのベクトルの間の そのものだ、と読める。
これが次に出てくる コサイン類似度 という名前の由来にもなっている。
コサイン類似度とembedding検索
検索や類似度で出てくる コサイン類似度 は、まさにこの を計算したものだ。
内積を2つのベクトルの長さで割ることで、長さの影響を取り除き、向きだけがどれくらい近いかを1つの数字にしている。
ベクトル検索DBやembedding検索は、この「向きの近さ」を大量に計算しているだけだ。
縦に並べるか横に並べるか、で呼び名が変わる
ここまでベクトルは のように横に並べて書いてきたが、本やAI系の論文では縦に並べて書くことも多い。
書き方の前に、カッコの話を一つ挟んでおく。 行列や列ベクトルを囲むカッコには小カッコ ( ) と大カッコ [ ] の2種類がある。 かつての日本の高校数学では小カッコで書くのが主流だったが、プログラミングや洋書、AI関連の論文・教科書では大カッコのほうがよく使われる。 どちらでも意味は同じだが、この記事ではここから先は大カッコで統一する。
縦に並べたほうを 列ベクトル 、横に並べたほうを 行ベクトル と呼ぶ。
中身は同じで、書く向きが違うだけだ。
AI関連の文献では列ベクトルで書かれることが多い。
手書きするなら両方とも縦に並べると楽
個人的な話だが、内積を手書きで計算するときは、両方を列ベクトル(縦)で並べて書くとミスしにくい。
2つを並べて縦に書くと、 と 、 と のように対応する成分が自然に横に並ぶ。 あとは各行で「掛ける、足す」をやればいいだけなので、目で追いやすい。 横書きの だと、対応する成分が離れた位置にあるぶん、パッと視線で追いにくい場面が出る。
実は、列ベクトルは「1列だけの行列」、行ベクトルは「1行だけの行列」と見ることができる。 次の節の行列は、この形を縦横どちらにも広げたものになる。
行列は「ベクトルをまとめて変換する装置」
ここから行列に入る。 さっきの列ベクトル・行ベクトルを縦横どちらにも広げたものが、行列だ。
これは の行列(3行2列)と呼ばれる。
行と列、どっちが横だっけ
日本語で読むと、漢字の形からヒントが取れる。
- 「行」の中には横線(二)が入っている → 横方向が行
- 「列」の中には縦線(刂)が入っている → 縦方向が列
ついでに個人的な覚え方を書いておくと、英語のほうにも似た手を使っている。
- row の
rには横に伸びる線がある → row は横 - column の
lはただの縦棒 → column は縦
HTMLやCSSで flex-direction: row と column を混同してレイアウトを崩す、みたいなのをよくやるので、これで思い出している。
英語圏のネイティブにこの覚え方が通じるかは分からないので、完全に個人的なライフハック扱いで。
行列はベクトルをまとめて変換する
行列を何に使うかというと、ベクトルをまとめて別のベクトルに変換する、という用途がメインになる。
左辺の と右辺の はベクトル、間の が行列だ。 この1行だけ見ると味気ないが、中身を展開するとやっていることは単純で、さっきの内積を何本もまとめているだけになる。
の行列 と、2次元の列ベクトル を掛けるとこうなる。
の各行を1本のベクトルと見て、それを と内積した結果が の各成分になる、と読める。
- 1行目の と の内積 → の1個目
- 2行目の と の内積 → の2個目
- 3行目の と の内積 → の3個目
具体的な数字でやるとこうなる。
3行2列の行列に2次元のベクトルを掛けると、3次元のベクトルが出てくる、という形になっている。
サイズが合わないと掛けられない
ここで気になるのは「サイズがずれていたらどうなるのか」だ。 結論は単純で、左の行列の列数と、右に置くベクトル(や行列)の行数が一致していないと掛け算そのものが定義できない。
- の行列 × 2次元の縦ベクトル → 3次元の縦ベクトル(計算できる)
- の行列 × 3次元の縦ベクトル → 計算できない
- の行列 × の行列 → の行列(計算できる)
- の行列 × の行列 → 計算できない
合わないときは、転置で向きを揃えるか、そもそも行列やベクトルの作り方を見直すことになる。
PyTorchやNumPyでよく見る shape mismatch 系のエラーは、だいたいこの「左の列数と右の行数が合っていない」で出ている。
つまりニューラルネットの1層の処理は、だいたいこの形で書ける。
前回の記事で出した重み付き足し算を、入力1つずつではなく層まるごとで書くとこうなる、というだけだ。
行列×行列は「変換の合成」
ニューラルネットは層を何枚も重ねる。 式で書くとこんな見た目になる。
括弧が深くて読みにくいが、やっていることは順番に変換しているだけだ。
- で1回変換
- でさらに変換
- で最後に変換
活性化関数を無視すれば、複数の行列を次々に掛ける動きになる。
このときに行列と行列を掛け合わせる 行列積 が出てくる。
flowchart LR
A[入力ベクトル x] -->|W1を掛ける| B[中間ベクトル]
B -->|W2を掛ける| C[次の中間ベクトル]
C -->|W3を掛ける| D[出力ベクトル y]
行列積の計算手順は「1行目×1列目の内積、1行目×2列目の内積……」と埋めていく形で、手でもできる。 ただ手で計算できるようになる必要はない。「行列と行列を掛けると、2つの変換をまとめた1つの変換になる」くらいの読み方で十分だ。
掛ける順番を入れ替えると答えが変わる
もう一つ注意したいのが、行列の掛け算は順番を入れ替えても同じにならない、という性質だ。 普通の数字なら が成り立つが、行列の場合は と が同じ値になるとは限らない。
- サイズの都合で片方しか計算できないケースもある
- サイズが合って両方計算できても、結果の中身まで一致するのは特別な場合だけだ
これは「行列は変換を表している」と考えるとイメージしやすい。 「右に90度回してから拡大する」と「拡大してから右に90度回す」では、変換の順番が違うので結果も違ってくる。
AI周りの式でも のように層を重ねる順番が意味を持つので、 同士の並びは入れ替えないように気をつけたい。
転置は「縦横入れ替え」だけ
AI記事でよく見かけるもう1つの記号が 転置 だ。
や のように、肩に T が乗った記号で書かれる。
中身は本当にただの縦横入れ替えだ。
なぜ必要かというと、ベクトルや行列を掛け合わせるとき、縦横のサイズが合わないと計算できないからだ。 合わないときに転置で向きを揃える、くらいの用途が多い。
内積を転置で書いた
転置の出番としてAI記事で一番よく見るのは、列ベクトル と の内積を次のように書く形だ。
片方の列ベクトル(縦)を転置して行ベクトル(横)にすることで、1行 × 1列 の形になり、行列の掛け算のルールで計算できる。 厳密には行列積の書き方だが、結果はスカラー(1つの数字)で、 と同じ値になる。 AI記事で を見かけたら、「内積を行列積の形で書いているだけ」と読めばいい。
ここまで読めるとAttentionの式が少しわかる
ここまでの道具で、LLM解説で一番出てくる式の形がちょっと読めるようになる。
いきなり という記号が並ぶが、これは Transformer が内部で用意する3種類の行列で、それぞれに役割がある。
| 記号 | 役割 |
|---|---|
| (Query / 質問) | いま注目している単語が、他のどの単語を見たいか |
| (Key / 鍵) | 各単語が「自分はこういう内容の場所だ」と名乗っているラベル |
| (Value / 値) | 各単語が実際に次の層へ渡したい中身 |
図書館で本を探す場面にたとえると、 が検索ワード、 が各本の背表紙、 が本の中身だ。 どれも元は同じ入力(単語の埋め込みベクトル)で、それぞれ別の重み行列を掛けて3種類の見方を作り出している、という関係になっている。
この前提で式を読むとこうなる。
- は「質問と鍵の類似度(内積)をまとめて計算」している部分
- 割っている は値が大きくなりすぎないようにする補正
- softmax で、類似度を確率っぽい重みに直す
- 最後に を掛けて、その重みで中身を加重平均して取り出す
「加重平均」って何だっけ
「加重平均」は聞き慣れない言葉かもしれないので補足しておく。 普通の平均(算術平均)は、値を全部足してから個数で割る、つまり全部の値を同じ重みで扱う計算だ。 加重平均はそこに「重み」をつけて、重いほど強く効かせた平均にする。
たとえば3回のテストの点数が70・80・90で、期末試験(90点)だけ2倍の重みでカウントする、という場面を考える。
- 算術平均:
- 加重平均(期末を2倍):
同じ点数でも、重みのつけ方によって結果が動く。 重みを全部同じにすると、加重平均はそのまま算術平均に戻る。
Attention の場合は、softmax で出した重み(全部足すと1になる)を各単語の に掛けて足し合わせるので、「注目度が高い単語の ほど強く、低い単語の は弱く」混ざった結果が取り出される、という動きになっている。
前回のsoftmaxと、今回の内積・行列積があれば、Attentionは「質問と鍵の内積で注目度を決めて、値をその重みで取り出す装置」と読めるようになる。
詳しい挙動は別として、式の形を見て何をまとめてやっているかが分かるだけでも、論文やリリースノートの読み心地はだいぶ変わる。
飛ばして問題ない話
入門の段階だと以下は無視してOKだ。
| 用語 | 中身 | なぜ飛ばしていいか |
|---|---|---|
| 行列式 | 行列が空間をどれだけ拡大縮小するかの指標 | LLM周りの解説にほぼ出てこない |
| 逆行列 | 元に戻す行列 | AIの記事で見かけるのは疑似逆行列くらいで、普段は不要 |
| 固有値・固有ベクトル | 行列の癖を表す値 | PCAや物理系では重要だが、LLM記事で必要な場面は少ない |
| 直交行列 | 回転だけをする行列 | 出てきたら「回転っぽい変換」で流していい |
| ゼロ行列 | 中身が全部0の行列 | 定義を知っておく程度で、入門段階で深追いする場面は少ない |
| 単位行列 | 対角に1、他が0の行列。何に掛けても値が変わらない | 論文で (残差接続あたり) で見かけるが「掛けても変わらないやつ」で流せる |
気になったら都度調べれば十分で、最初から全部押さえる必要はない。
ここまでで掴める読み方
この記事の範囲だけで、AI記事に出てくる式の雰囲気はかなり追えるようになる。
| よく出る形 | 読み方 |
|---|---|
| ベクトル を行列 で変換してバイアスを足す | |
| や | 2つのベクトルの向きが近いかを測る |
| たくさんの質問と鍵の類似度をまとめて計算 | |
| 層ごとの重み行列 | |
| ベクトルの長さ |
式の一つ一つが「計算しなきゃいけないもの」ではなく「何をまとめてやっているかのメモ」に見えてきたら、もう半分勝ちだと思う。
次に読むと繋がりやすい記事
- AIの記事でよく見る数式、ここだけ読めば怖くない 重み付き足し算・シグモイド・Softmax・学習の流れ。今回の記事はこの続き
- エンコーダーモデル+ローカルLLMでOCR誤字を自動検出・修正する 各位置のベクトルから確率を作る動きの実例
- ローカルVision LLMでキャラ画像からRPGパラメータを抽出できるか試した 画像もテキストも同じベクトル空間で扱う、マルチモーダルの例
- MoonshotAI(Kimi)がTransformerの残差接続をAttentionで置き換えるAttnResを提案、1.25倍の計算効率 やsoftmaxが実際の研究でどう使われているかの例
気になった人向けの用語メモ
この節は読み飛ばしてOK。
| 用語 | 意味 |
|---|---|
| スカラー | 普通の数字1つ。ベクトル1次元版ではなく素朴な値 |
| ベクトル | 数字の並び。AIでは特徴を表す入れ物として出てくる |
| 行列 | 数字の表。ベクトルをまとめて別のベクトルに変換する装置 |
| 次元 | ベクトルに何個数字が並んでいるか。LLMで「4096次元の埋め込み」のような形で出てくる |
| ノルム | ベクトルの長さ。 で書かれる |
| 内積 | 2つのベクトルの向きの近さを測る値。 や と書かれる |
| コサイン類似度 | 内積を長さで割ったもの。向きだけを比較したいときに使う |
| 行列積 | 行列と行列を掛ける計算。変換の合成にあたる |
| 転置 | 行列の縦横入れ替え。 や と書かれる |
| embedding | 単語や画像をベクトルに変えた結果。意味が近いほどベクトル空間で近くなる |
次は確率と統計のほうに進む予定で、softmaxの裏にある尤度や交差エントロピーあたりを「解かずに読める」形でまとめたい。