🎄

5分でわかる線形代数

2020/12/16に公開

これはKCS AdventCalendar2020 17日目の記事です

←14日目 | 18日目→

はじめに

機械学習でもなんでもそうですが、理工系大学生で「線形代数」の4文字を見てアレルギー反応を起こす人は多いと思います。そこで、工学書(特に機械学習の本)を読む上で最低限頭に入れておけばいい事項をまとめてみました。さあ、これらの武器を手に入れて、例の「黄色の本」や「花畑の本」の世界に飛び込みましょう。

頭に入れたい公式5選

機械学習の名著(PRMLとか...)の鉄板ネタ、「簡単な式変形をすると...」というフレーズで急に答えが書いてある場合、以下の3つの公式を使えば大体解決します。(もちろん式変形に行列が絡む場合ですよ?)

(A + B)^T = A^T + B^T \tag{1}
(AB)^T = B^TA^T \tag{2}
\vec{w}^T\vec{x} = \vec{x}^T\vec{w} \tag{3}

さらに追加で微分の公式を持っていると安心です。

\frac{\partial}{\partial \vec{w}} \vec{w}^T\vec{x} = \vec{x} \tag{4}
\frac{\partial}{\partial \vec{w}}\vec{w}^TA\vec{w} = (A + A^T)\vec{w} \tag{5}

ちなみにA, Bは行列、\vec{x}, \vec{w}はベクトルです。A^TAの転置行列を表します。(一応確認)

公式たちの解説

この5つの公式を頭に入れてくださいといえばそれで終わりなんですが、軽く1つずつ式の解説していきます。

(A + B)^T = A^T + B^T \tag{1}

(A + B)^Tの形を見たら、そのまま式変形していってもいいことがない(ことが多い)のでこの公式を使って分解してしまいましょう。

(AB)^T = B^TA^T \tag{2}

証明はしませんがこれもとても大事な関係です。式変形の途中で手が止まったらこれを使って式をこねくり回してもいいかもしれません。

\vec{w}^T\vec{x} = \vec{x}^T\vec{w} \tag{3}

内積はベクトルの順番を入れ替えても結果が同じというものです。「バカにしないでくれ」と声が聞こえてきそうですが、この関係はバカになりません。自分もこれには何度も救われました。

\frac{\partial}{\partial \vec{w}} \vec{w}^T\vec{x} = \vec{x} \tag{4}
\frac{\partial}{\partial \vec{w}}\vec{w}^TA\vec{w} = (A + A^T)\vec{w} \tag{5}

明確に微分をやらないといけない場面が出てくる(損失関数を微分するなど)こともあると思うので上記2つの微分公式を覚えておきましょう。

ちょっと練習(Option)

比較的簡単な式変形を通してどこでどのように公式が使われているか確認してみてください。

例) 損失関数から正規方程式を導出する

L(\vec{b}) = ||\vec{y} - X\vec{b}||^2 = (\vec{y} - X\vec{b})^T(\vec{y} - X\vec{b})

公式(1)~(3)を使って整理します。

L(\vec{b}) = (\vec{y} - X\vec{b})^T(\vec{y} - X\vec{b})
= (\vec{y}^T - (X\vec{b})^T)(\vec{y} - X\vec{b})
=\vec{y}^T\vec{y} - \vec{y}^TX\vec{b} - (X\vec{b})^T\vec{y} + (X\vec{b})^TX\vec{b}
\quad \quad =\vec{y}^T\vec{y} - \vec{b}^T(X^T\vec{y}) - (\vec{b}^TX^T)\vec{y} + \vec{b}^TX^TX\vec{b}
=\vec{y}^T\vec{y} - 2\vec{b}^T(X^T\vec{y}) + \vec{b}^TX^TX\vec{b}

微分公式(4),(5)を使います。

\frac{\partial L(\vec{b})}{\partial\vec{b}} = -2X^T\vec{y} + (X^TX + (X^TX)^T)\vec{b}
= -2X^T\vec{y} + 2X^TX\vec{b} = 0

答えは

\vec{b} = (X^TX)^{-1}X^{T}\vec{y}

[TIP] 次元の確認

当たり前のことですが、今計算しているものが、「スカラー」なのか「ベクトル」なのか「行列」なのかを常に確認することが大事です。最初何かしらのスカラー値を計算するために式変形をして、気付いたら答えが行列になっていたら明らかな計算ミスだと気付けるわけです。それぞれの例として例えば以下のような分類ができます。

  1. 行列 \cdots \cdots A \quad AB \quad \vec{x}\vec{x}^T
  2. ベクトル \cdots \cdots \vec{x}\quad A\vec{x} \quad c\vec{x}
  3. スカラー \cdots \cdots c \quad \vec{x}^T\vec{x} \quad \vec{x}^TA\vec{x}

cは定数でスカラーです。

個人的な感覚では、式(2), (3)の変形を行った際に誤った式変形をすると次元が合わなくなってしまうことが多いので、常に次元は意識しておきましょう。

和と内積、2次形式

これはマストではありませんが、スカラー\rightarrowベクトル、スカラー\rightarrow行列への式変形を知っておくといろいろ便利です。(これは実際に数式をプログラムに落とし込むときにとても役に立ちます。)

和と内積はとても相性がいいです。例えば和の記号が出てきたら内積を使ってベクトル表示に変換することができます。

\sum_{i=1}^{N} x_i^2 = x_1^2 + x_2^2 + \cdots + x_N^2
= (x_1, x_2, \cdots x_N)^T \begin{pmatrix} x_1 \\ x_2 \\ \vdots \\ x_N \\ \end{pmatrix} = \vec{x}^T\vec{x} \tag{6}

和の記号が2つある場合や和の中にベクトルが入っていることもよくあります。その場合は例えば以下のような行列表示に変形できます。

例1) スカラーの二重和 \rightarrow 行列の2次形式

(式(7)の右辺を2次形式と呼びます)

\frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}\alpha_i\alpha_jt_it_j\vec{x_i}^T\vec{x_j}= \frac{1}{2}\vec{\alpha}^TH\vec{\alpha} \tag{7}

ただし、

\vec{\alpha} = (\alpha_1,\alpha_2,...,\alpha_N)^T
\vec{t} = (t_1,t_2,...,t_N)^T
H = \begin{pmatrix} t_1t_1\vec{x}_1^T\vec{x}_1 & \cdots & t_1t_j\vec{x}_1^T\vec{x}_j & \cdots &t_1t_N\vec{x}_1^T\vec{x}_N \\ \vdots \\ t_it_1\vec{x}_i^T\vec{x}_1 & \cdots & t_it_j\vec{x}_i^T\vec{x}_j & \cdots &t_it_N\vec{x}_i^T\vec{x}_N \\ \vdots \\ t_Nt_1\vec{x}_N^T\vec{x}_1 & \cdots & t_Nt_j\vec{x}_N^T\vec{x}_j & \cdots &t_Nt_N\vec{x}_N^T\vec{x}_N \\ \end{pmatrix}

例2) ベクトルの和 \rightarrow 行列表示

\sum_{n=1}^{N}p_n\vec{x}_n= X^T\vec{p} \tag{8}

ただし、

\vec{p} = (p_1, p_2, ... ,p_N)^T
X = \begin{pmatrix} \vec{x}_1^T \\ \vdots \\ \vec{x}_n^T \\ \vdots \\ \vec{x}_N^T \\ \end{pmatrix} = \begin{pmatrix} x_{11}& \cdots & x_{1m} & \cdots &x_{1M} \\ \vdots \\ x_{n1} & \cdots & x_{nm} & \cdots & x_{nM} \\ \vdots \\ x_{N1} & \cdots & x_{Nm} & \cdots & x_{NM}\\ \end{pmatrix}

Xは、データ点\vec{x}_nが1行ずつ上から順に格納されているような行列です。機械学習ではこのようにデータが格納されていることが多く、「表現行列」と呼ばれています。(pandasとかで読み込んでくるデータやkaggleで配布される表形式のデータはこの行列の形をしています。)

例えば逐次学習を行うような場合に関しては、和の記号はfor文を用いて処理することもできますが、大抵の学習(最適化問題)は、更新する式の中に出てくる和の記号をこのような式変形でベクトル表示もしくは行列表示にして、データを一気にこれらのベクトルor行列に入れ込んで計算をします。(いわゆるバッチ処理です。)Pythonを使う場合はnumpyという便利なものがあるのでデータを格納するベクトルや行列を自前で作って行列の形で処理させた方が楽だし、for文を回すより時間がかかりません。

行列だけあっても...

初期装備としてはこれくらいで十分ですが、特に機械学習の場合はもう一つの壁として「確率統計」というものがあります。ただ、確率、統計に関しては大抵の本の序章付近で1~2章分割いて説明してくれているのでそこまで問題ないと思います。最初にその章を流し見して、その先の章を読んでいてどうしても詰まったら該当箇所を見直すくらいの感覚でいいと思います。最悪、機械学習の場合は「グラフィカルモデル」と「ベイスの定理」を知っておけば大抵は読めてしまうので、確率統計のプロになっておく必要は必ずしもありません。(学問として奥が深くて面白いので体系的に勉強する価値はあると思いますが...)

最後に

この公式たちを頭に入れたら実際に自分の読みたい技術書に飛び込みましょう。線形代数を体系的に勉強していたら日が暮れてしまうので、最低限この5つの装備を持って、式変形で詰まったらその都度ネットか何かで調べて必要そうな知識を増強しながら読み進めましょう。「実際に応用でどういう風に使われているのかを知ってからの方がイメージを持ちやすい」 + 「目的意識を持って勉強できる」ので、体系的に勉強したい場合は、自分が読みたい本を読んだ上で検討するのがいいと思います。

Discussion