最小2乗法をブラケットで書いてみよう

これは 数学とコンピュータ Advent Calendar 7日目 の記事です。

僕の専門は物理なのですが、最近は機械学習についても勉強し始めていて、主に黄色い本(PRML)で勉強しています。 みなさんご存知のように機械学習の多くの手法では行列やベクトルによる計算が主になります。 また機械学習のほとんどの本ではその横(行)ベクトルと縦(列)ベクトルを明示的に分けて表記します。

\vec x は横(行)ベクトルで、その転置 \vec {x^T} が縦(列)ベクトルといった感じで転置で縦か横かを表記します。

もちろんその方が正確、かつ適切な表記であるので良いのですが、 ちょっと慣れてないと見づらいのです。特に困るのが \vec{x}  {\vec y}^Tスカラーになるのですが、 \vec {x^T} \vec{y} は行列になってしまうところです。ぱっと見でどちらがどちらになるのかが判別付けづらいです。 毎回嫌になってしまいます。

そこで物理を(量子力学を)学んでいる人にとっては馴染み深いディラックのブラケット記法でこれら縦ベクトルと横ベクトルを表記してしまおうというのが記事の主題です(おそらく物理を学んだ人であれば何度か頭によぎったことはあるかもしれません)。

ディラックのブラケット記法

とはどういう記法なのかというと、量子力学における状態を表す記法でこれを使うと量子力学を書いていくのにめっちゃ便利という記法です。 量子力学は「演算子 \hat H」と量子力学的な状態「ケットベクトル |x\rangle」とそれの共役「ブラベクトル\langle x |」で表記されます。またこれらは(演算子は)行列と(ケットベクトルは)縦(列)ベクトルとして解釈することができます。そのためディラックのブラケット記法を行列計算を行うための記法だと見ても良いだろうというのが発想の元です。

これ以上細かい話は抜きにしてではどうやって上記の縦ベクトル \vec x と横ベクトル \vec {x^T} を表記していくのかを見ていきましょう。

ベクトルの表記

まず縦(列)ベクトルはケットベクトル|x\rangleによって表記します。 \vec x \rightarrow |x\rangle 次に横(行)ベクトルはブラベクトル\langle x |によって表記します。 \vec {x^T} \rightarrow \langle x |

行列の表記

行列には上にハット ^ を付けます。 H \rightarrow \hat H

スカラーはそのままです。

a \rightarrow a

ベクトルの積

この表記のどこが良いかというとベクトルの積を取った時に行列になるのか、スカラーになるのかの判断が見た目でわかりやすいという点があります。

  • スカラーになる積 \vec x \vec {x^T} \rightarrow \langle x || x \rangle = \langle x | x \rangle と書きます。縦棒が2本並んだ時はくっ付けて1本で表記します。
  • 行列になる積 \vec {x^T} \vec x \rightarrow |x \rangle \langle x| と書きます。

見た目でパッと行列かスカラーかわかるではありませんか! 微妙?ですか? いやそんなことはないはず。きっと。もう少しこの表記の説明をします。

ブラケット記法の特徴

行列との積 行列\hat Hは 縦棒の隣にしか置けない

|x\rangle \hat H はダメですが(横(行)ベクトルと行列の積は取れない)。 \hat H |x\rangle は OKです。 行列は「縦棒 | 」にピタっとくっつくイメージで。

また\hat H |x\rangle は右を向いている感じがするので縦(列)ベクトルです。感じとか適当ですが、言わんとしていることをわかってくれると信じています。

逆に\langle x| \hat H は左を向いているので 横(行)ベクトルです。

まあ、あまりどれが縦で横かを意識する必要もないはずですので(意識せずにパッと見で左右のどこに行列やベクトルを演算したら良いかがわかるのがポイントなので)とりあえずどちらかを向いていればベクトルであると考えれば良いかと思います。

ベクトル同士の積 (縦棒とトンガリの位置関係

\langle x | x\rangle, |x\rangle\langle y | はOKです。

また \langle x | y\rangle はトンガリ \langle, \rangle で閉じているのでスカラーです(期待値を\langle E \rangle と書く気持ちだと言えばわかりやすいでしょうか)。

|x \rangle \langle y | は縦棒 | で閉じているので行列です。縦棒 | は行列ともくっ付けますし、他の縦棒 | (ベクトル)ともくっ付けます。縦棒は 他の縦棒と「くっ付き」待ちなのです。

転置

行列は普通に転置の記号を使いましょう。 ベクトルはブラケット記法の定義通りに向きをひっくり返す感じで。 |x\rangle ^T = \langle x | またスカラーの転置も同じようにひっくり返すだけです(スカラーは転置しても同じです)。 またブラとケットで行列を挟んだものはスカラーです(見た目からすぐわかる)。挟んでいる時の転置で行列に転置のマークを付け忘れないように。 \langle x | \hat H |y \rangle = \langle x | \hat H |y \rangle^T = \langle y | \hat H^T | x \rangle

こんな感じで x と yをひっくり返して 行列\hat H に転置をつければOKです。

具体的に計算しないとわからないので計算して見ましょう!

  • ベクトルの表記 まず縦(列)ベクトルはケットベクトル|x\rangleによって表記します。 \vec x \rightarrow |x\rangle 次に横(行)ベクトルはブラベクトル\langle x |によって表記します。 \vec {x^T} \rightarrow \langle x |
  • 行列の表記 行列には上にハット ^ を付けます。 H \rightarrow \hat H
  • スカラーはそのままです a \rightarrow a

を抑えて計算して見ましょう。

最小2乗法を計算してみる。

最小2乗法

データセット が (x1,y1), (x2,y2,), ・・・ という感じで N個ありこのデータセット

y = \sum_{t=0}^k a_t x^t

というk次多項式モデルから説明したい。 そのためにこの多項式とデータセットの誤差の2乗が最小になるようなパラメータa_tを見つけてくるというのが最小2乗法でした。 データセットを次のような行列表記で書くことで行列の線形式に落とすことができます。

f:id:mashiroyuya:20171207155908p:plain:w320

と書くことで誤差関数Eは E = |\vec{y} - X\vec a|^2

とかけます。これを最小化するような \vec a を求めたいというのが問題ですが、ここからブラケット記法で書いていきましょう。誤差関数Eをブラケットで書いて展開すると

f:id:mashiroyuya:20171207155016p:plain:w350

いいですね。スカラー量であることが一目でわかります。

では、これを最小化する |a\rangle を求めましょう。そのために誤差関数の微分を行います。本当は要素ごとに微分をしなければなりませんが、まあざっと微分してみましょう。

\frac{\partial E}{\partial \langle a |} = -2\hat X^T|y\rangle + \hat X^T \hat X |a\rangle

こう書いていいのかという問題がありますが、わかりやすくするためにこう書いておきましょう。

この微分が0になるような |a\rangle = |a_0\rangle が解になります。\hat X^T \hat X逆行列を持てば、 |a_0 \rangle = 2(\hat X^T \hat X)^{-1}\hat X^T |y\rangle と解を求めることができました。

まとめ

どうですかね?僕的にはわかりやすいと思うのですが。
まあこの記法ならではの問題も起きそうですが(というか微分が)。

自分の好きなミスのしにくい方法で勉強していきましょう。