Skip to content

第2章 数学の準備(2)— ベクトルと行列

この章で学ぶこと

  • ベクトルとは何か — 「数の並び」であり「矢印」でもある、という2つの見方
  • ベクトルの足し算とスカラー倍
  • 内積(dot product) — 本書で最も重要な演算。計算方法と幾何的な意味
  • 「内積 = 類似度」という考え方 — 第8章のAttentionを理解する鍵(本書全体の最重要ポイント)
  • ノルム(ベクトルの長さ)とコサイン類似度
  • 行列とは何か — 数の表であり、ベクトルの束でもある
  • 行列 × ベクトル、行列 × 行列の計算方法(手計算で完全に)
  • なぜ行列の掛け算はあんな定義なのか — 「行列はベクトルを変換する機械、行列積は変換の合成」
  • 転置 X
  • n 個の d 次元ベクトルは n×d 行列にまとめられる」— 文章の数値表現の形(第6章への布石)

この章の前提


2.1 ベクトルとは何か — 「数の並び」と「矢印」

2.1.1 「数の並び」としてのベクトル

ベクトル(vector) には2つの見方があります。1つめの見方は、とても単純です。

IMPORTANT

ベクトルとは、数を順番に並べたもの(数のリスト)である。

たとえば、ある人の健康診断の結果を「身長170cm、体重60kg」とまとめたとします。この2つの数をセットにして

x=(17060)

(読み下し: ベクトル x は、170 と 60 という2つの数を縦に並べたもの)

と書いたもの、これがベクトルです。並んでいる数の個数を 次元(dimension) と呼びます。上の例は 2次元ベクトル です。

記法の約束を確認します。

  • ベクトルは 太字の小文字 で書きます: x,a,v(ただの数 x と区別するため)
  • 中身の1つ1つを 成分(component) と呼び、添字で指します: x=(x1, x2) なら x1=170x2=60
  • 本書では縦に並べる(縦ベクトル)を基本にしますが、紙面の都合で x=(170,60) と横に書くこともあります。中身は同じです
  • ベクトルでないただの1個の数(3 とか −0.5 とか)は スカラー(scalar) と呼びます

3次元なら数が3個、100次元なら数が100個並びます。「100次元」と聞くとSFめいて怖いですが、実体は「数が100個並んだリスト」にすぎません。怖がる必要はまったくありません。

2.1.2 「矢印」としてのベクトル

2つめの見方では、ベクトルは矢印です。2次元ベクトル a=(3, 2) を、「原点(0,0)から出発して、右に3、上に2だけ進む矢印」として絵に描くことができます。

(図: 原点 (0,0) から点 (3,2) へ伸びる線分が、ベクトル a=(3,2) です。「右に3、上に2」という向きと長さを持ちます)

矢印には「向き」と「長さ」があります。この幾何的なイメージこそが、このあと学ぶ「内積 = 類似度」という見方を支えます。

TIP

2つの見方の使い分け: 計算するときは「数の並び」として、意味を考えるときは「矢印」として見る。この行き来が自由にできることが、ベクトルに慣れるということです。

2.1.3 なぜ本書にベクトルが必要なのか

先回りして言ってしまいます。

IMPORTANT

Transformerの中では、単語1つ1つがベクトル(数の並び)で表されます。

たとえば「猫」という単語が (1.2,0.3,0.8,0.1) のような4次元(実際のモデルでは数千次元)のベクトルになります。「単語を数の並びにする」方法そのものは第6章(埋め込み)で学びますが、ここで大事な予告をひとつ。

IMPORTANT

意味が似ている単語は、似た向きの矢印(ベクトル)になるように作られます。

「猫」と「犬」の矢印は近い向きを向き、「猫」と「銀行」の矢印はバラバラの向きを向く。だとすると、「2つの矢印がどれくらい同じ向きを向いているか」を数で測れれば、「2つの単語がどれくらい意味的に近いか」を計算できることになります。その測る道具が、この章の主役 内積 です。


2.2 ベクトルの足し算とスカラー倍

内積に進む前に、ベクトルの基本操作を2つだけ押さえます。どちらも拍子抜けするほど簡単です。

2.2.1 足し算: 成分ごとに足すだけ

(32)+(12)=(3+12+2)=(44)

(読み下し: ベクトルの足し算は、同じ位置の成分どうしを足すだけ。1番目どうし 3+1=4、2番目どうし 2+2=4)

矢印として見ると、足し算は「矢印をつなげて進む」ことに対応します。

(図: 途中で折れている線が「まず a=(3,2) で点 (3,2) まで進み、続けて b=(1,2) で進む」経路。まっすぐな線が、和 a+b=(4,4) へ一直線に進む経路。どちらも同じ到着点 (4,4) にたどり着きます)

Transformerの中では「単語の意味ベクトル + 位置の情報ベクトル」(第9章)や「元の入力 + 変換結果」(残差接続、第9章)のように、ベクトルの足し算が「情報を合流させる」操作として頻繁に登場します。

2.2.2 スカラー倍: 全成分を同じ数で伸び縮み

ベクトルにスカラー(ただの数)を掛けることを スカラー倍(scalar multiplication) といいます。全成分にその数を掛けるだけです。

2×(32)=(64),0.5×(32)=(1.51)

(読み下し: 2倍すれば各成分が2倍、0.5倍すれば各成分が半分になる)

矢印として見ると、スカラー倍は「向きを変えずに長さだけ伸び縮みさせる」操作です(負の数を掛けると向きが真逆になります)。

第8章のAttentionでは「各単語のベクトルに重み(0.7 とか 0.1 とかのスカラー)を掛けて足し合わせる」= 重み付き平均 という操作が中核になります。その部品は、いま学んだ「スカラー倍」と「足し算」だけです。

具体例(重み付き平均の先取り): a=(2, 0) に重み 0.8、 b=(0, 2) に重み 0.2 を付けて混ぜると、

0.8a+0.2b=(1.60)+(00.4)=(1.60.4)

(読み下し: a を8割、 b を2割の配合で混ぜたベクトル。結果は a 寄りの位置になる)

「配合率を変えてベクトルをブレンドする」。このイメージは、第8章まで持っていてください。


2.3 内積 — 本書で最も重要な演算

いよいよ本書全体の最重要ポイントに入ります。ここから先の数節は、特に丁寧に読んでください。ここでつかむ考え方が、第8章のAttention(Transformerの中核)を理解できるかどうかを左右します。

2.3.1 計算方法: 成分どうしを掛けて、足す

内積(ないせき、dot product / inner product) は、同じ次元の2つのベクトルから、1つのスカラー(ただの数)を作る演算です。計算ルールはこうです。

同じ位置の成分どうしを掛けて、全部足す。

ab=a1b1+a2b2++anbn=i=1naibi

(読み下し: ベクトル ab の内積は、1番目の成分どうしの積、2番目の成分どうしの積、…を全部足したもの。第1章のシグマ記法がさっそく登場)

具体例1: a=(3, 2)b=(1, 4) のとき、

ab=3×1+2×4=3+8=11

(読み下し: 1番目どうし 3×1、2番目どうし 2×4 を掛けて、足す。答えは 11 という「ただの数」)

具体例2(4次元でも同じこと): a=(1,0,2,1)b=(2,3,1,0) のとき、

ab=1×2+0×3+2×1+(1)×0=2+0+2+0=4

(読み下し: 4組の掛け算をして全部足すと 4)

計算自体は小学生の算数です。ベクトル2本を入れると、数が1個出てくる。実はこの「出てきた1個の数」から、2本のベクトルの関係について多くのことが読み取れます。それを次の節で見ていきます。

なお、内積には2つの書き方があります。

abab

(読み下し: 「エー・ドット・ビー」と「エー・転置・ビー」。どちらも同じ内積を表します。 の記号(転置)は2.7節で説明しますが、先に「同じものの別表記」とだけ約束しておきます。論文では後者が多用されます)

2.3.2 幾何的な意味: 内積は「向きの揃い具合 × 長さ」

さて、この「掛けて足すだけ」の計算が、矢印の世界では何を意味するのか。結論から言います。

IMPORTANT

内積は、2つの矢印の「向きがどれくらい揃っているか」を(長さも加味して)測る数である。

  • 同じ向きを向いているほど → 内積は大きな正の数
  • 直角(無関係な向き)なら → 内積はちょうど 0
  • 逆向きなら → 内積は負の数

まずこの3パターンを図で見比べ、続いて1つずつ数値で確かめます。

内積の3パターン: 同じ向き・直角・逆向き

パターン1: 向きが揃っている → 内積は大きい

a=(3, 1)b=(2, 1) 。どちらも「右上」を向いています。

ab=3×2+1×1=7

(読み下し: 似た向きの2本の内積は 7 という大きめの正の数)

パターン2: 直角 → 内積は 0

a=(2, 0)(真横)、 c=(0, 2)(真上)。

ac=2×0+0×2=0

(読み下し: 直角に交わる2本の内積はちょうど 0)

パターン3: 逆向き → 内積は負

a=(2, 1)d=(2, 1)(真逆)。

ad=2×(2)+1×(1)=41=5

(読み下し: 正反対を向いた2本の内積は −5 という負の数)

まとめの表にします。

2本の矢印の関係内積の符号・大きさイメージ
ほぼ同じ向き大きな正の数「仲間」「似ている」
やや同じ向き小さめの正の数「ちょっと似ている」
直角0「無関係」
やや逆向き小さめの負の数「ちょっと反対」
正反対大きな負の数「正反対」

2.3.3 なぜ「掛けて足す」と向きの揃い具合が測れるのか

「計算ルールと幾何的意味がなぜ結びつくのか」を、腑に落ちる形で確認しておきましょう(厳密な証明ではなく、イメージの確認です)。

内積 a1b1+a2b2 は「 x 方向の積」と「 y 方向の積」の合計です。

  • 2本が同じ向きなら、 x 成分の符号も y 成分の符号も揃います(両方プラス、または両方マイナス)。すると各項 aibi はどれもになり、足すとどんどん大きくなる。
  • 2本が逆向きなら、成分の符号がことごとく食い違い、各項はになり、足すと大きな負になる。
  • 2本が直角だと、「一方がプラスに効く分を、もう一方の食い違いが打ち消す」形になり、正の項と負の項がちょうど相殺して 0 になる。

具体例で相殺を確認: a=(1,1)(右上45°)と c=(1,1)(左上45°)は直角です。内積は

1×(1)+1×1=1+1=0

(読み下し: x 方向の食い違い(−1)と y 方向の一致(+1)がちょうど打ち消し合って 0)

「方向ごとの一致度を集計している」。これが内積の計算の正体です。

2.3.4 【本書最重要】内積 = 類似度

以上を、本書全体を貫く合言葉としてまとめます。本書で何度も立ち戻る大事な一文です。

IMPORTANT

内積は、2つのベクトルの「類似度」を測るものさしである。内積が大きい = 似ている。内積が 0 に近い = 無関係。負 = 逆方向。

そして2.1.3節の予告を思い出してください。単語はベクトルで表され、意味が似た単語は似た向きのベクトルになるのでした。つなげると、こうなります。

単語ベクトルどうしの内積を計算すれば、「単語どうしの意味の近さ」が1個の数として手に入る。

ミニチュアの例で体感しましょう。いま、仮に単語たちが次の2次元ベクトルで表されているとします(値は説明用に作ったものです)。

単語ベクトルイメージ
(2,1)動物っぽい方向
(2,2)動物っぽい方向
(1,2)動物(食べ物寄り)方向
銀行(2,1)まったく別の方向

単語ベクトルの配置

(図: 単語ベクトルの配置の例。猫・犬・魚は近い向きを向き、銀行だけ別の向きを向いている)

内積(=類似度)を計算してみます。

=2×2+1×2=6

(読み下し: 猫と犬の類似度は 6。高い)

=2×1+1×2=4

(読み下し: 猫と魚の類似度は 4。そこそこ高い)

銀行=2×(2)+1×1=3

(読み下し: 猫と銀行の類似度は −3。むしろ逆方向)

ペア内積解釈
猫・犬6とても似ている
猫・魚4まあまあ似ている
猫・銀行−3似ていない(逆方向)

「掛けて足す」だけの計算で、意味の近さがランキングできてしまいました。 これが内積の力です。

2.3.5 第8章への予告 — Attentionは内積でできている

なぜここまで内積にこだわるのか。種明かしをします。

Transformerの中核である Attention(注意機構) は、「文中のある単語が、他のどの単語に注目すべきか」を決める仕組みです。そして、その「注目度」の計算方法が、まさに ベクトルどうしの内積をとる ことなのです。第8章で学ぶ式 QK の実体は、「クエリというベクトルと、キーというベクトルの、総当たりの内積」にすぎません。つまり、

  • 内積の計算ができて(2.3.1節)
  • 内積 = 類似度という意味が分かっていれば(2.3.4節)

Attentionの核心はもう半分理解できたも同然です。「第2章で学んだ内積が、第8章で効いてくる」。これが本書でいちばん大事な伏線だと、ここではっきり宣言しておきます。

(図: この章の内積が第8章へつながる道筋。本書最重要の伏線)


2.4 ノルム — ベクトルの「長さ」

2.4.1 定義と計算

矢印には向きだけでなく長さがあります。ベクトルの長さを ノルム(norm) と呼び、 a と書きます。2次元なら、三平方の定理(直角三角形の斜辺の長さ)そのものです。

a=a12+a22++an2

(読み下し: ノルムは、各成分を2乗して全部足し、最後にルート(平方根)をとったもの)

具体例: a=(3, 4) のノルムは、

a=32+42=9+16=25=5

(読み下し: 右に3、上に4進む矢印の長さは5。3:4:5の直角三角形でおなじみの値)

ノルムは直角三角形の斜辺の長さ

(図: 右に3、上に4進むベクトルの長さは、底辺3・高さ4の直角三角形の斜辺 = 5)

ちなみに、自分自身との内積をとると aa=a12++an2 となり、ノルムの2乗に一致します。つまり a=aa 。ノルムは内積から求められる、という関係になっています。

2.4.2 内積の弱点: 長さに引きずられる

内積を「類似度」として使うとき、1つ注意があります。内積の値は向きの揃い具合だけでなく、矢印の長さにも比例するのです。

具体例: a=(2,1)b=(2,2) の内積は 2×2+1×2=6 でした。ここで b を10倍した b=(20,20) を考えると、向きは全く同じなのに、

ab=2×20+1×20=60

(読み下し: 向きは同じでも、相手が10倍長いと内積も10倍になる)

「向きの近さ」だけを純粋に測りたい場合、長さの影響が邪魔になることがあります。そこで登場するのが次のコサイン類似度です。


2.5 コサイン類似度 — 長さの影響を消した類似度

2.5.1 定義

コサイン類似度(cosine similarity) は、内積を両者のノルムで割ったものです。

cos(a,b)=abab

(読み下し: コサイン類似度は、内積を「 a の長さ × b の長さ」で割ったもの。長さの寄与を割り算で打ち消して、純粋に「向きの揃い具合」だけを取り出す)

この値は必ず −1 から +1 の間 に収まり、次のように読めます。

コサイン類似度意味
1完全に同じ向き
0.7前後かなり似た向き
0直角(無関係)
−1正反対

名前の由来は、この値が2本の矢印のなす角度 θ(シータ)の「コサイン cosθ 」に一致するからです。三角関数を忘れていても大丈夫です。「−1〜+1に正規化された、向きだけの類似度」と理解すれば十分です。

2.5.2 手計算してみる

2.3.4節の単語ベクトルで、猫と犬のコサイン類似度を計算します。

  • =(2,1) 、ノルムは 22+12=52.236
  • =(2,2) 、ノルムは 22+22=82.828
  • 内積は 6(計算済み)
cos(,)=62.236×2.82866.3250.949

(読み下し: 猫と犬のコサイン類似度は約0.95。ほぼ同じ向き=とても似ている)

同様に猫と銀行((2,1) 、ノルム 52.236)では、

cos(,銀行)=32.236×2.236=35=0.6

(読み下し: 猫と銀行は −0.6。向きがかなり食い違っている)

さらに、さきほどの「10倍に伸ばした犬 b=(20,20) 」で計算しても、分子も分母も10倍になるので答えは 0.949 のまま変わりません。長さの影響が消えていることが確認できました。

2.5.3 内積とコサイン類似度の使い分け

内積コサイン類似度
値の範囲制限なし−1 〜 +1
長さの影響受ける受けない
計算コスト掛けて足すだけ(軽い)ノルム計算と割り算が追加
本書での主な登場場面第8章 Attention のスコア計算第6章 単語の意味の近さの測定

Transformerの内部(Attention)では、シンプルで高速な内積がそのまま使われます(長さの影響が暴れる問題には、第8章で「 dk で割る」という別の対処が登場します。これも、いま見た「長さの影響を抑える」工夫の一つです)。一方、「この2つの単語はどれくらい似ているか」を人間が調べるときはコサイン類似度がよく使われます。


2.6 行列 — 数の表、そしてベクトルの束

2.6.1 行列とは

行列(matrix) とは、数を長方形の表の形に並べたものです。

A=(123456)

(読み下し: 行列 A は、数を縦3段・横2列に並べた表)

  • 横の並びを 行(row)、縦の並びを 列(column) と呼びます。「行は横、列は縦」。漢字の形で覚えるなら「の字は横棒が並び、の字は縦棒(リ)で終わる」
  • 上の A は「3行2列の行列」「 3×2 行列」と言います(行 × 列 の順。縦の段数が先)
  • 行列は 大文字イタリック(A,W,X など)で書きます
  • 成分は aij(「 ij 列目」)と添字2つで指します。上の例では a12=2a31=5 です(第1章の「座席番号」の話がここで回収されました)

2.6.2 行列の2つの見方

行列には、機械的な「数の表」以上の見方が2つあります。

見方1: ベクトルを束ねたもの

3×2 行列は、「2次元の横ベクトルを3本、縦に積んだもの」と見ることができます。

A=(123456)=(— 1本目の行ベクトル (1,2) —— 2本目の行ベクトル (3,4) —— 3本目の行ベクトル (5,6) —)

(読み下し: 行列は「ベクトルの束」。各行が1本のベクトル)

この見方が、本章の最後(2.8節)で「文章 = 単語ベクトルを積んだ行列」という形で具体化します。

見方2: ベクトルを変換する機械

もう1つは「行列は、ベクトルを入れると別のベクトルが出てくる変換機械」という見方です。これは次の2.6.3節と2.6.5節でじっくり説明します。第1章の「関数 = 機械」の、ベクトル版だと思ってください。

2.6.3 行列 × ベクトル — 「行と列の内積を並べる」

行列とベクトルの掛け算を定義します。ここは手を動かすのがいちばんの近道です。

(1234)(56)=(1×5+2×63×5+4×6)=(1739)

(読み下し: 結果の1番目の成分は「行列の1行目とベクトルの内積」、2番目の成分は「2行目とベクトルの内積」)

計算手順を分解します。

TIP

手順: 行列の各行を1本のベクトルとみなし、入力ベクトルとの内積を上から順に計算して並べる。

text
  A = [ 1  2 ]        x = [ 5 ]
      [ 3  4 ]            [ 6 ]

  1行目 (1,2) と (5,6) の内積:  1x5 + 2x6 = 17
  2行目 (3,4) と (5,6) の内積:  3x5 + 4x6 = 39

  Ax = [ 17 ]
       [ 39 ]

(図: 行列×ベクトルは「各行との内積を並べる」作業。内積がここでも主役)

つまり、行列 × ベクトルとは「内積の詰め合わせ」 です。2.3節で内積をマスターした皆さんは、もう行列の掛け算の本質を知っていることになります。

もう1つ具体例(2×3 行列 × 3次元ベクトル):

(102011)(341)=(1×3+0×4+2×10×3+1×4+(1)×1)=(53)

(読み下し: 3次元ベクトルを入れると2次元ベクトルが出てきた。 2×3 行列は「3次元→2次元」の変換機械)

この例から大事なルールが見えます。

  • m×n 行列は「 n 次元ベクトルを入れると m 次元ベクトルが出る機械」
  • 行列の列の数と、入力ベクトルの次元が一致していないと掛けられない(機械の投入口のサイズが合わない)

2.6.4 「変換機械」としての行列を目で見る

行列がベクトルを「変換」するとはどういうことか、2次元の例で目に見せます。使う行列は次の R です。

R=(0110)

この R に、いくつかのベクトルを入れてみます。

R(10)=(01),R(11)=(11)

(読み下し: 「右向き」の矢印を入れると「上向き」が出てくる。「右上向き」を入れると「左上向き」が出てくる)

90度回転行列の変換前後

この R は「90°回転マシン」だったのです。行列によって、回転させるもの、引き伸ばすもの、押しつぶすもの、いろいろな変換機械が作れます。

そしてこれが、Transformerを理解する上で決定的に重要な見方につながります。

IMPORTANT

Transformerの内部にある WQ,WK,WV などの行列(第8章)は、すべて「単語ベクトルを、目的に合った別のベクトルに変換する機械」です。しかも、その変換のしかた(行列の中身の数値)は学習によって獲得されます。「学習とは、良い変換機械を作り上げること」なのです。

2.6.5 行列 × 行列 — 小さい例で全要素を手計算

次は行列どうしの掛け算です。ルールは行列×ベクトルの自然な拡張です。

結果の ij 列の成分 = 左の行列の第 i 行と、右の行列の第 j 列の内積。

2×2 どうしの例で、4つの成分すべてを手計算します。

AB=(1234)(5678)

(読み下し: 行列 A と行列 B の積を求める)

1つずつ計算します。

  • 結果の (1行, 1列): A の1行目 (1,2)B の1列目 (5,7) の内積 =1×5+2×7=19
  • 結果の (1行, 2列): A の1行目 (1,2)B の2列目 (6,8) の内積 =1×6+2×8=22
  • 結果の (2行, 1列): A の2行目 (3,4)B の1列目 (5,7) の内積 =3×5+4×7=43
  • 結果の (2行, 2列): A の2行目 (3,4)B の2列目 (6,8) の内積 =3×6+4×8=50
AB=(19224350)

(読み下し: 結果も 2×2 行列。各マスは「左の行、右の列、その内積」で埋まっている)

text
            [  5    6 ]      <- 右上: 行列 B(1列目は 5,7、2列目は 6,8)
            [  7    8 ]
  [ 1  2 ]  [ 19   22 ]      <- 上の行: A の1行目 (1,2) と B の各列の内積
  [ 3  4 ]  [ 43   50 ]      <- 下の行: A の2行目 (3,4) と B の各列の内積

  例: 左上のマス 19 は、A の1行目 (1,2) と B の1列目 (5,7) の内積 1x5 + 2x7

(図: 行列積の各マスの埋め方。「左から行を、右から列を持ってきて内積」の総当たり表)

サイズのルールも押さえます: (m×n) 行列 × (n×p) 行列 =(m×p) 行列。内側の n が一致しているときだけ掛けられます(左の行の長さと右の列の長さが同じでないと内積がとれないから)。

IMPORTANT

ここで気づいてほしいこと: 行列積の正体は「内積の総当たり表」です。第8章に登場する QK という行列積は、「すべてのクエリベクトルと、すべてのキーベクトルの、内積(=類似度)を総当たりで並べた表」、つまり単語どうしの関連度の一覧表を一発で作る計算なのです。行列積を学んだ今、あの式の意味はもう半分見えています。

2.6.6 なぜこんな定義なのか — 行列積は「変換の合成」

「行と列の内積を並べる」という一見ややこしい定義には、ちゃんと理由があります。

行列 AB の積 AB は、「まず B で変換し、続けて A で変換する」という2段変換を、1つの行列にまとめたものになっている。

第1章の関数の合成 f(g(x)) を思い出してください。「 g が先、 f が後」で、合成結果 f(g(x)) は1つの新しい関数でした。行列でも全く同じことが起きます。

A(Bx)=(AB)x

(読み下し: 「 B でベクトルを変換してから A で変換する」のと、「先に AB という1個の行列を作っておいて一発で変換する」のは、同じ結果になる)

具体例で検証します。使う行列とベクトルは次のとおりです。

A=(1234),B=(5678),x=(11)

経路1: 2段階で変換

まず B で変換すると、

Bx=(5×1+6×17×1+8×1)=(1115)

続けて、この結果を A で変換すると、

A(1115)=(1×11+2×153×11+4×15)=(4193)

経路2: 先に合成してから一発変換

さきほど計算した合成行列 AB(1行目が 19, 22、2行目が 43, 50)を使って、

(AB)x=(19×1+22×143×1+50×1)=(4193)

(読み下し: 経路1と経路2の結果が (41, 93) で完全に一致した)

一致しました。行列積の定義は、「変換の合成が行列1個にまとまる」ように逆算して作られているのです。「行と列の内積」という手順は、そのための必然だったわけです。

(図: 2段変換と合成行列による一発変換は同じ結果になる。第1章の「関数の合成」の行列版)

なお、関数の合成と同じく、行列積も順番を入れ替えると結果が変わります(ABBA が普通)。実際に逆順の BA を計算すると、

BA=(5×1+6×35×2+6×47×1+8×37×2+8×4)=(23343146)

となり、さきほど求めた AB(1行目が 19, 22、2行目が 43, 50)とは別物です。

この「行列 = 変換機械、行列積 = 変換の合成」という見方は、第5章で「ニューラルネットの層を重ねる」ことの意味を理解するときの土台になります(そこでは「行列を何個掛けても1個の行列にまとまってしまう=線形だけでは深くする意味がない」という重要な話につながります)。


2.7 転置 — 行と列をひっくり返す

転置(てんち、transpose) は、行列の行と列を入れ替える操作です。記号は右肩の で、 X(「エックス・転置」「エックス・トランスポーズ」)と読みます。

X=(123456)X=(135246)

(読み下し: 3×2 行列を転置すると 2×3 行列になる。元の1行目 (1,2) が転置後の1列目に、元の2行目 (3,4) が2列目に…と、行が列に生まれ変わる)

text
   X (3x2)               X^T (2x3)

  [ 1  2 ]
  [ 3  4 ]    ==>    [ 1  3  5 ]
  [ 5  6 ]           [ 2  4  6 ]

  斜めの対角線でパタンと折り返すイメージ

(図: 転置は表の縦横をひっくり返す操作)

規則として、 ij 列の成分が ji 列に移ります。ベクトルも転置できます。縦ベクトルを転置すると横ベクトルになります。

a=(32)a=(3,2)

(読み下し: 縦に並んでいた 3 と 2 が、転置すると横並びになる)

ここで、2.3.1節で予告した記法の約束を回収します。横ベクトル a(1×2)と縦ベクトル b(2×1)の行列積を、行列のルールどおり計算すると、

ab=(32)(14)=3×1+2×4=11

(読み下し: 1×2 行列と 2×1 行列の積は 1×1、つまりただの数。そして中身は内積の計算と完全に同じ)

つまり ab という行列積の記法は、内積 ab と同じものです。論文や第8章の式(QK など)で転置が出てくるのは、多くの場合「内積をとるために向きを揃えている」だけなのです。「 を見たら内積の準備だな」と思えるようになれば、数式への恐怖はだいぶ薄れます。


2.8 文章を行列にする — 「 n 個の d 次元ベクトル = n×d 行列」

この章の総仕上げとして、本書の後半につながる最重要の「形」を導入します。

2.8.1 単語がベクトルなら、文は行列

2.1.3節で「単語1つ = 1本のベクトル」になると予告しました。では、単語が5個並んだ文はどうなるでしょうか?

通し例の文「猫は魚が好き」をトークン列 [猫, は, 魚, が, 好き] に分け、各単語が dmodel=4 次元のベクトルで表されるとします(値は説明用の架空のものです)。

トークンベクトル(4次元)
(1,0,2,1)
(0,1,0,0)
(2,0,1,1)
(0,1,0,1)
好き(1,2,0,1)

この5本の行ベクトルを、上から順に縦に積み重ねると、 5×4 の行列になります。

X=(10210100201101011201)好き

(読み下し: 文「猫は魚が好き」の数値表現。 i 行目が i 番目のトークンのベクトル。行数 5 = トークン数 n 、列数 4 = ベクトルの次元 dmodel)

一般化すると、次のようになります。

IMPORTANT

トークン数 n 、各トークンが d 次元ベクトルの文は、 n×d 行列 X で表せる。i 行目を取り出す」=「 i 番目のトークンのベクトルを取り出す」。

text
      [  1    0    2   -1 ]     <- 1行目 = 「猫」のベクトル
      [  0    1    0    0 ]     <- 2行目 = 「は」のベクトル
  X = [  2    0    1   -1 ]     <- 3行目 = 「魚」のベクトル
      [  0    1    0    1 ]     <- 4行目 = 「が」のベクトル
      [  1    2    0    1 ]     <- 5行目 = 「好き」のベクトル

  縦方向: 行の数 = トークン数 n = 5
  横方向: 列の数 = 意味を表す次元 d_model = 4

  文 = ベクトルを縦に積んだ n x d 行列 X

(図: 本書で最も頻繁に登場する「形」。Transformerの中を流れるデータは、常にこの形の行列)

(図: 文が行列になるまでの流れ。この行列 X が本書後半のすべての議論の出発点になる)

2.8.2 なぜ「行列にまとめる」ことがそんなに嬉しいのか

単なる整理整頓に見えるかもしれませんが、これには計算上の決定的な利点があります。

5個のトークン全部に同じ変換(行列 W)を適用したいとします。1本ずつ Wx1,Wx2, と5回計算する代わりに、行列積 XW1回計算すれば、全トークンの変換が同時に終わります(行列積の各行が、各トークンの変換結果になるからです。2.6.5節の「総当たり」計算を思い出してください)。

そしてGPU(画像処理装置)というハードウェアは、まさにこの「大きな行列積を一発で計算する」ことが桁外れに得意です。

IMPORTANT

文を行列にまとめる → 全単語の処理が行列積1回になる → GPUで一気に並列計算できる。

実はこれこそが、Transformerが以前の技術(RNN、第7章)に取って代わった大きな理由の1つです。RNNは単語を1個ずつ順番に処理するしかありませんでしたが、Transformerは文全体を1つの行列として同時に処理できるのです。この伏線は第7章・第8章で回収します。


2.9 この章の記号一覧(チートシート)

記号読み方意味
a,xベクトル(太字小文字)数の並び/矢印a=(3,2)
aiエー・アイベクトルの第 i 成分a=(3,2) なら a2=2
abエー・ドット・ビー内積 = 掛けて足す = 類似度(3,2)(1,4)=11
aノルムベクトルの長さ(3,4)=5
cos(a,b)コサイン類似度長さの影響を消した類似度(−1〜1)猫と犬で約0.95
A,W,X行列(大文字)数の表/ベクトルの束/変換機械2×2 行列など
aijエー・アイ・ジェー行列の ij 列成分座席番号
AB行列積内積の総当たり表/変換の合成順番を変えると別物
Xエックス・転置行と列の入れ替えab = 内積
n×d 行列n 個の d 次元ベクトルの束文「猫は魚が好き」= 5×4

この章のまとめ

  • ベクトルは「数の並び」であり「矢印」でもある。計算は数の並びで、意味は矢印で考える。単語はベクトルで表される(詳細は第6章)
  • 足し算は「成分ごと」、スカラー倍は「全成分を伸縮」。組み合わせると「重み付き平均(ブレンド)」ができる — 第8章Attentionの部品
  • 内積は「同じ位置の成分を掛けて全部足す」演算で、ベクトル2本から数1個を作る。幾何的には「向きの揃い具合」を測っている
  • 【本書最重要】内積 = 類似度。大きい=似ている、0=無関係、負=逆方向。第8章のAttentionは、この内積で「単語どうしの注目度」を計算する
  • ノルムはベクトルの長さ。コサイン類似度は内積をノルムで割って長さの影響を消した、−1〜+1の純粋な「向きの類似度」
  • 行列は数の表であり、「ベクトルの束」とも「ベクトルの変換機械」とも見られる
  • 行列 × ベクトルは「各行との内積を並べる」。行列 × 行列は「内積の総当たり表」で、意味は「変換の合成」(第1章の関数合成の行列版)。順番を変えると結果が変わる
  • 転置 X は行と列の入れ替え。 ab は内積と同じもの
  • n 個の d 次元ベクトル = n×d 行列。文はこの形の行列 X になり、行列積1回で全単語を同時処理できる(GPU並列化、Transformerの強みの源泉)

次の章へ

次の章では、数学の準備の最終回として微分・勾配・確率を学びます。「機械が学習する」とは、損失(間違い度合い)という関数の谷底を、傾きを頼りに下っていくことです。その「傾き」を教えてくれるのが微分と勾配。そして「次に来る単語を確率で予測する」という、本書全体の核心となるものの見方も、この次の章で手に入れます。

第3章 数学の準備(3)— 微分・勾配・確率