AI の仕組みを説明した本や記事を読むと、ベクトル・行列・内積という言葉が最初のほうで出てきます。この3つをまとめて扱う数学の分野を線形代数(せんけいだいすう)と呼びます。この記事では、AI を読むために必要な範囲だけを、小さな数で手計算しながら確かめます。証明は扱いません。

紙とペンを用意してください。電卓(スマホの電卓でかまいません)もあると楽です。途中に小さな問題を置いているので、答えを読む前に自分で計算してみてください。

AI の中で線形代数が出てくる場所

AI に何かを判断させるには、まず判断する材料を数にします。身長と体重なら [170, 60] のように並べます。この数の並びがベクトルです。

次に、その数に AI の中にある数を掛けて足し、答えを出します。AI の中にあるこの数を重み(おもみ)と呼びます。学習とは、重みを少しずつ直していくことです。掛け算と足し算が大量に出てくるので、行列という書き方でまとめます。

左から「入力(ベクトル)」「計算(行列を掛ける)」「出力(予測した答え)」「答え合わせ(誤差を出す)」の4つの箱が並ぶ。答え合わせの箱から計算の箱へ青い点線が戻り、微分でどちらに直すと誤差が減るかを出して行列の数を直すと書いてある

図の右から戻る線は、答えが外れたときに重みを直す部分で、微分を使います。この記事では左半分のベクトルと行列に絞ります。

ベクトルは数を1列に並べたもの

ベクトルは、数を決まった順番で1列に並べたものです。並んでいる1つ1つの数を要素(ようそ)、要素の数を次元(じげん)と呼びます。

表したいもの ベクトルにした例 次元
ある人の身長(cm)と体重(kg) [170, 60] 2
1日の勉強時間・睡眠時間・スマホの時間 [2, 7, 3] 3
縦28マス・横28マスの白黒の画像 784個の明るさの数の並び 784
1つの言葉の意味 数百から数千個の数の並び 数百から数千

順番には意味があります。[170, 60] は「1番目が身長、2番目が体重」と決めたうえでの並びなので、[60, 170] と書くと別のものです。

画像は、小さなマスの明るさ(たとえば 0 が黒、1 が白)の集まりです。28 × 28 = 784 個のマスの明るさを左上から順に並べると、784次元のベクトルになります。

式での書き方

教科書や論文では、ベクトルに1文字の名前を付け、要素には右下に小さな数字を付けます。

x = [x₁, x₂, x₃] = [2, 7, 3]

右下の数字は何番目かを表し、添え字(そえじ)と呼びます。x₁ は「エックスいち」と読み、x の1番目の要素です。この例では x₁ = 2、x₂ = 7、x₃ = 3 です。何番目かを決めずに「i 番目」と言いたいときは xᵢ と書きます。

要素が2つのベクトルは矢印で描ける

要素が2つのベクトルは、平面の矢印として描けます。1番目の要素の数だけ右へ、2番目の要素の数だけ上へ進んだ所に矢印の先を置きます。

方眼の上に3本の矢印がある。原点から右へ3・上へ1の青い矢印が a = [3, 1]。その先から右へ1・上へ2の黒い矢印が b = [1, 2]。原点から右へ4・上へ3の点線が a + b = [4, 3]

要素が3つなら立体の中の矢印です。784個になると絵には描けませんが、計算のしかたは2つのときと同じです。

足し算と、数を掛ける計算

ベクトルどうしの足し算は、同じ番目の要素どうしを足します。

[3, 1] + [1, 2] = [3+1, 1+2] = [4, 3]

図では、a の先に b をつないだときの出発点から最後の点までが a + b です。ベクトルに1つの数を掛けるときは、全部の要素にその数を掛けます。

2 × [3, 1] = [2×3, 2×1] = [6, 2]

矢印で見ると、向きはそのままで長さが2倍になります。マイナスの数を掛けると向きが反対になります。

練習として、[1, 4, 2] + [3, 0, 5] と 3 × [2, −1] を計算してください。答えは [4, 4, 7] と [6, −3] です。

内積は2つのベクトルから1つの数を作る計算

AI の中でよく出てくる計算が内積(ないせき)です。2つのベクトルの同じ番目の要素どうしを掛けて、全部足します。答えは1つの数になります。

パンが1個120円、牛乳が1本150円、卵が1パック100円の店で、パンを2個、牛乳を1本、卵を3パック買ったとします。

値段のベクトル  [120, 150, 100]
個数のベクトル  [  2,   1,   3]

合計 = 120×2 + 150×1 + 100×3
     = 240 + 150 + 300
     = 690

レジでしている計算がそのまま内積です。

内積で点数を付ける

AI での使い方に近い例です。1日の過ごし方 [勉強時間, 睡眠時間, スマホの時間] から、テストの点の伸びを予想するとします。各項目が点にどれだけ効くかを、次のように決めておきます。

過ごし方  x = [2, 7, 3]
効き方    w = [10, 2, −4]

x と w の内積 = 2×10 + 7×2 + 3×(−4)
             = 20 + 14 − 12
             = 22

w の数が大きい項目ほど、答えに強く効きます。マイナスの数(スマホの時間の −4)は、その項目が増えるほど答えを下げます。この「どれだけ重く見るか」を表す数が AI の重みです。重みを w と書くのは、英語の weight の頭文字だからです。ニューラルネットワークの部品(ニューロン)は、入力のベクトルと重みのベクトルの内積を取って、答えの材料にしています。

式での書き方と Σ

内積は、式では次のように書きます。

x・w = x₁×w₁ + x₂×w₂ + x₃×w₃

要素が784個あると足し算が784個並ぶので、「同じ形のものを全部足す」ことを表す記号 Σ(シグマ)を使います。

 n
 Σ  xᵢ × wᵢ   =  x₁×w₁ + x₂×w₂ + … + xₙ×wₙ
i=1

Σ の下の「i=1」と上の「n」は、「i を 1 から n まで1つずつ変えて、右の xᵢ × wᵢ を全部足す」という意味です。論文では × を省いて xᵢwᵢ と書くことも多いです。

内積の符号は向きが似ているかを表す

2つの矢印の向きが似ているほど、内積は大きなプラスになります。直角に交わるときは 0、反対を向くとマイナスになります。

3つの場合が並ぶ。左は似た向きの2本の矢印で、[2, 1]・[1, 1] = 3 でプラス。真ん中は直角の2本の矢印で、[1, 0]・[0, 1] = 0。右は反対を向く2本の矢印で、[1, 1]・[−1, −1] = −2 でマイナス

[1, 0] と [0, 1] で考えると理由が分かります。片方は右だけ、もう片方は上だけを向いているので、同じ番目どうしを掛けると、どちらかが 0 になります。似た向きの矢印は同じ番目の要素が同じ符号になりやすく、掛け算の結果がプラスばかりになります。反対向きなら符号が逆の数どうしを掛けることになり、マイナスが並びます。

ベクトルの長さと、向きだけを比べる計算

内積は向きだけでなく長さにも左右されます。[2, 1] と [1, 1] の内積は 3 ですが、[20, 10] と [1, 1] の内積は 30 です。向きは同じなのに、片方を10倍に伸ばすと内積も10倍になります。

向きが似ているかだけを知りたいときは、内積を2本の長さで割ります。ベクトルの長さは、要素をそれぞれ2乗して足し、その平方根(2乗するとその数になる数)を取って出します。直角三角形の斜めの辺の長さを出す三平方の定理と同じ計算です。

[3, 4] の長さ = √(3² + 4²) = √25 = 5

[2, 1] と [1, 1] で計算します。

内積         = 2×1 + 1×1 = 3
[2, 1] の長さ = √(4 + 1) = √5 ≈ 2.24
[1, 1] の長さ = √(1 + 1) = √2 ≈ 1.41

3 ÷ (2.24 × 1.41) ≈ 0.95

この数をコサイン類似度と呼びます。同じ向きなら 1、直角なら 0、反対向きなら −1 になり、長さには左右されません。[20, 10] と [1, 1] で計算しても同じ 0.95 になります。LLM では、2つの言葉や文の意味が近いかどうかをコサイン類似度で測ることがあります。意味の近い言葉ほどベクトルの向きが似るように作られているからです。

練習として、次の3つを計算してください。

  1. [1, 2, 3] と [4, 5, 6] の内積
  2. [1, 2] と [2, −1] の内積と、2本の矢印の向きの関係
  3. [6, 8] の長さ

答えは次のとおりです。1 は 1×4 + 2×5 + 3×6 = 32。2 は 1×2 + 2×(−1) = 0 なので直角に交わっています。3 は √(36 + 64) = 10 です。

行列は内積をまとめて何本も計算する書き方

行列(ぎょうれつ)は、数を縦と横の長方形に並べたものです。横の並びを行(ぎょう)、縦の並びを列(れつ)と呼びます。行が2つ、列が3つの行列を「2行3列の行列」と呼びます。

      列1  列2  列3
行1 [ 100,  30, 150 ]
行2 [ 120,  20, 130 ]

行列とベクトルの掛け算

店を2つに増やして考えます。りんごを2個、みかんを5個、パンを1個買うとき、店Aと店Bのどちらが安いかを比べます。

          りんご みかん パン
店A の値段 [ 100,   30,  150 ]
店B の値段 [ 120,   20,  130 ]

個数のベクトル [2, 5, 1]

店Aの合計は、店Aの値段の行と個数のベクトルの内積です。店Bも同じです。

店A: 100×2 + 30×5 + 150×1 = 200 + 150 + 150 = 500
店B: 120×2 + 20×5 + 130×1 = 240 + 100 + 130 = 470

この2本の内積をまとめて1つの式で書いたものが、行列とベクトルの掛け算です。

[ 100  30  150 ]   [2]   [500]
[ 120  20  130 ] × [5] = [470]
                   [1]

ベクトルを縦に書いているのは掛け算の形を見やすくするためで、中身は [2, 5, 1] と同じです。行列の1つの行とベクトルとの内積を取ると、答えの要素が1つできます。これを行の数だけくり返すので、答えは行の数と同じ数の要素を持つベクトルです。

左に2行2列の行列(1, 2 / 3, 4)、その右にベクトル(1, 1)、等号の右に答えのベクトル(3, 7)がある。行列の上の行とベクトルが青で強調され、上の行は 1×1 + 2×1 = 3、下の行は 3×1 + 4×1 = 7 と計算の中身が書いてある

掛けられる形と掛けられない形

行の中の数とベクトルの中の数を前から順に組にして掛けるので、行列の列の数とベクトルの要素の数は同じでなければなりません。2 × 3 の行列には、要素が3つのベクトルしか掛けられず、答えは要素が2つのベクトルになります。

行や列の数の組を、その行列の形(shape)と呼びます。Python で行列を計算するとき、形が合わないとエラーで止まります。エラー文に shape という言葉が出てきたら、列の数と要素の数がそろっているかを確かめてください。

練習として、次を計算してください。

[ 2  0 ]   [4]
[ 1  3 ] × [1]

答えは [8, 7] です。上の行は 2×4 + 0×1、下の行は 1×4 + 3×1 です。

行列どうしの掛け算

自分の買い物 [2, 5, 1] に加えて、友だちの買い物 [0, 4, 2] の代金も店Aと店Bで比べたいとします。2つの買い物を縦に並べて行列にすると、1回の掛け算で書けます。

                      自分 友だち
                    [ 2    0 ]   りんご
                    [ 5    4 ]   みかん
                    [ 1    2 ]   パン

[ 100  30  150 ]                      [ 500  420 ]   店A
[ 120  20  130 ]  ×  上の行列     =   [ 470  340 ]   店B

答えの行列は、行が店、列が買い物です。左の行列の行と右の行列の列の内積を取り、その行と列が交わる所に置きます。

左の行列の上の行(100, 30, 150)と、右の行列の右の列(0, 4, 2)が青で囲まれ、答えの行列の1行2列目の 420 につながっている。100×0 + 30×4 + 150×2 = 420 と書いてある

答えの1行2列目は、店Aの値段の行と友だちの買い物の列の内積で、100×0 + 30×4 + 150×2 = 420 です。

形のきまり

左の行列の列の数と右の行列の行の数がそろっていないと掛けられません。答えの形は、左の行の数と右の列の数で決まります。

(2行3列) × (3行2列) → (2行2列)
      └─ 3 がそろう ─┘

掛ける順番で答えが変わる

ふつうの数の掛け算は、2 × 3 も 3 × 2 も 6 です。行列の掛け算は、順番を入れかえると答えが変わります。

[ 1  2 ]   [ 1  0 ]   [ 3  2 ]
[ 3  4 ] × [ 1  1 ] = [ 7  4 ]

[ 1  0 ]   [ 1  2 ]   [ 1  2 ]
[ 1  1 ] × [ 3  4 ] = [ 4  6 ]

どちらが左にあるかで、行と列の役目が入れかわるからです。式を読むときは、左右の順番も見てください。

AI の中での行列の掛け算

店の例で、行列の1つの行は「1つの店の値段の付け方」でした。ニューラルネットワークでは、1つの行が1つのニューロンの重みになります。ニューロンが16個あれば16行の行列になり、入力が784個あれば784列です。16 × 784 の行列に784次元の画像のベクトルを掛けると、16個のニューロンの答えが一度に出ます。

画像を100枚まとめて計算したいときは、100枚分のベクトルを並べて 784 × 100 の行列にし、行列どうしの掛け算を1回します。答えは 16 × 100 の行列で、100枚分の答えがそろいます。このやり方をバッチと呼びます。AI の学習に GPU(同じ計算を大量に同時に行える部品)を使うのは、この大きな行列の掛け算を速く計算できるからです。

転置

行列の行と列を入れかえることを転置(てんち)と呼び、右上に小さく ᵀ を付けます。

     [ 1  2  3 ]          [ 1  4 ]
A =  [ 4  5  6 ]     Aᵀ = [ 2  5 ]
                          [ 3  6 ]

2行3列の行列を転置すると3行2列になります。形が合わずに掛けられない2つの行列も、片方を転置すると掛けられることがあります。

練習として、4行3列の行列と3行5列の行列をこの順に掛けたときの答えの形を考えてください。答えは4行5列です。反対の順番は、左の列の数 5 と右の行の数 4 がそろわないので掛けられません。

式に出てくる記号の読み方

記号 読み方 意味
x₁, xᵢ エックスいち、エックスアイ 右下の小さい文字は何番目か(添え字)
Σ シグマ 同じ形のものを全部足す
x・w エックス・ドット・ダブリュー 内積
‖x‖ ノルム・エックス ベクトルの長さ
Aᵀ エー・トランスポーズ 行と列を入れかえた行列
Wx ダブリュー・エックス 行列 W とベクトル x の掛け算(× を省く)
w ダブリュー 重み(weight)によく使う文字
b ビー バイアス(次の課題で出てくる)

論文では、ベクトルを太字の小文字、行列を太字の大文字で書くことがよくあります。

課題:層1つ分の計算

ここまでの計算を、ニューラルネットワークの層1つ分の計算として使います。ニューラルネットワークの1つの層は、入力のベクトル x に重みの行列 W を掛け、バイアス b というベクトルを足します。バイアスは、入力がすべて 0 のときにも答えを少しずらせるようにするための数です。

答え = W x + b

    [ 1   2 ]
W = [ 0  −1 ]      x = [2, 1]      b = [0, 1, −2]
    [ 3   1 ]
  1. W は何行何列ですか。x を掛けられる形ですか。答えは要素がいくつのベクトルですか
  2. W x を計算してください
  3. W x + b を計算してください。いちばん大きな値を出したのは何番目のニューロンですか
  4. W の1行目 [1, 2] と2行目 [0, −1] の内積を計算してください
  5. x と [1, 3] を列として並べた行列を X として、W X を計算してください

答え

  1. 3行2列です。列の数 2 と x の要素の数 2 がそろっているので掛けられます。答えは要素が3つのベクトルです
  2. [4, −1, 7] です。1行目は 1×2 + 2×1、2行目は 0×2 + (−1)×1、3行目は 3×2 + 1×1 です
  3. [4, 0, 5] です。[4, −1, 7] + [0, 1, −2] を要素ごとに足します。最大は3番目のニューロンの 5 です
  4. 1×0 + 2×(−1) = −2 でマイナスです。2つの重みのベクトルは反対寄りの向きなので、1行目が大きく反応する入力には、2行目はマイナスの値を返します。同じ層に違う向きに反応するニューロンが並ぶと、入力の違いを見分けられます
  5. 3行2列の行列 [[4, 7], [−1, −3], [7, 6]] です。1列目は 2 の答えと同じです。2列目は [1, 3] についての計算で、1×1 + 2×3 = 7、0×1 + (−1)×3 = −3、3×1 + 1×3 = 6 です

この課題でしたことは、ニューラルネットワークが答えを出すときに層ごとにくり返している計算そのものです。実際の AI では行列が何千行・何千列にもなり、層が何十も重なりますが、1マス1マスの計算は内積です。

この記事で出てきた言葉

言葉 意味
線形代数 ベクトルと行列を扱う数学の分野
ベクトル 数を決まった順番で1列に並べたもの
要素 ベクトルや行列の中の1つ1つの数
次元 ベクトルの要素の数
内積 同じ番目の要素どうしを掛けて全部足した数
コサイン類似度 内積を2本の長さで割った数。向きが似ているかを −1 から 1 で表す
行列 数を縦と横の長方形に並べたもの
形(shape) 行列の行と列の数の組
転置 行列の行と列を入れかえること
重み AI の中にある、学習で直していく数
バイアス 層の計算の最後に足す、答えをずらすための数

参考にした資料