どうも、カタミチです。
さて、今日も「最短コースでわかる ディープラーニングの数学」のひとり読書会、やっていきたいと思います。
今日は3章「ベクトル・行列」の後半戦ですね。行ってみよー。
3-4. 三角関数
はい、ベクトルの話をしていたと思ったら、いきなりやってきました「三角関数」。
どうやら、この次の節で出てくるベクトルの「内積」に関係があるので、別分野から出張してきたようです。図式交えて分かりやすく説明されていましたが、とりあえず、2つだけ覚えておくことにしました。
1つ目は、\( cos \theta \)の定義。斜辺の長さが\(r\)で、底辺の長さが\(x\)。その間のなす角が\( \theta \)な直角三角形があったとき…
$$cos \theta = \frac{x}{r}$$
である、ってやつですね。そういえば太古の昔、三角形に「C」の文字を書いて覚えたなぁ(遠い目)。
2つ目は\( y=cos\theta \)のグラフです。\( \theta = 0^{\circ} \)の時に\( y=1\)を通り、\( \theta = 90^{\circ} \)の時に\( y=0\)を、\( \theta = 180^{\circ} \)の時に\( y=-1\)を通って、\( \theta = 270^{\circ} \)の時に\( y=0\)を通るような、ウネウネしたカーブを描く…
とりあえず、この2つは覚えておくことにしました。
ちなみに角度のこの表現法は…度数法ですかね。1周が\(360^{\circ} \)ってやつですね。ちなみに、1周を\(360^{\circ} \)と定義したのは、4,000年前にも遡るメソポタミアの国家であるバビロニアだった…という話を聞きました。調べてみたら面白かったので、興味がある方はぜひ調べてみてください(^-^)
3-5. 内積
ということで、またベクトルの領域に戻ってきました。
内積とは「ベクトル内の演算として定義されたかけ算」とのこと。前の節でスカラーとベクトルのかけ算がありましたが、今回はベクトル同士のかけ算のようですね。定義としては…
「ベクトル\( \boldsymbol{a} \)の長さ」と「ベクトル\( \boldsymbol{b} \)のベクトル\( \boldsymbol{a} \)と同じ向きの成分の長さ」をかけたもの。
となっています。長さと長さをかけるってことは、計算結果はベクトルではなく実数、つまりスカラーになりますね。ふむふむ。
式としては、\( \boldsymbol{a} \)と\( \boldsymbol{b} \)の内積を「\( \boldsymbol{a} \cdot \boldsymbol{b} \)」と表現すると…
$$ \boldsymbol{a} \cdot \boldsymbol{b} = \mid \boldsymbol{a} \mid \mid \boldsymbol{b} \mid cos \theta $$
ってことで、ここで三角関数が出てくるわけですね。\( \theta \)ってのは、ベクトル\( \boldsymbol{a} \)とベクトル\( \boldsymbol{b} \)の間の角度のことなので、上にあった\( cos \theta \)の定義からすると、\( \mid \boldsymbol{b} \mid cos \theta \)は「ベクトル\( \boldsymbol{b} \)のベクトル\( \boldsymbol{a} \)と同じ向きの成分の長さ」になりますね。日本語の定義と式の意味は確かに一致しているようです。
ここで不思議だなー、と思ったのが、定義の中の\( \boldsymbol{a} \)と\( \boldsymbol{b} \)を入れ替えた場合…
「ベクトル\( \boldsymbol{b} \)の長さ」と「ベクトル\( \boldsymbol{a} \)のベクトル\( \boldsymbol{b} \)と同じ向きの成分の長さ」をかけたもの。
となりますが、結果が同じになるってことですよね。図で書いてみると違うプロセスなのに、計算結果は同じになる…。たぶん、数学的にちゃんと考えれば当たり前のことなんだと思うんですが、初学者的には不思議な感じです。
ここで、感覚的に重要な話が出てきました。それは…
内積は、\( \theta \)が\(0^{\circ}\)のとき最大、\(90^{\circ} \)のとき\(0\)、\(180^{\circ}\)のとき最小となる
という話。確かに\(y=cos \theta\)のウネウネカーブからしてもそうですし、何より、同じ方向を向いたほうが力強くなるってのはイメージしやすいですね。仕事やってても「お前は俺とは\(180^{\circ}\)考え方が違うな」と言った場合、足を引っ張り合って仕事が前に進まない…なんてことありますしね。つまり、内積とはものごとを前に進めるためのパワーみたいなもんですかねー。…しらんけど(しらんのかい)。
で、ここで式変換。\(\boldsymbol{a}\)の成分を\( (a_1,a_2) \)、\( \boldsymbol{b} \)の成分を\( (b_1,b_2) \)とした場合…
$$\boldsymbol{a} \cdot \boldsymbol{b}=a_1b_1+a_2b_2$$
となるようです。なんか、右辺が馴染みのある感じになりましたね。この式の導出については、本書で見事に式変形で教えてくれたので非常に分かりやすかったです。
で、この式は多次元に拡張しても同じ要領で行けると言うことで…
$$ \boldsymbol{a} \cdot \boldsymbol{b}=\sum_{k=1}^n a_k b_k $$
ってのが、成分表示における内積の公式になります。
内積を出したい場合、各成分の値が分かっているなら、こっちの方が計算は早そうですね。逆に、長さと角度だけが与えられているなら、日本語の定義と同義の、上のほうに出てきた公式の方が使えそうです。
3-6. コサイン類似度
さて、ついに来ましたね。G検定を受験したときにはよく意味が分かっていなかった概念…コサイン類似度!
とりあえず、ここまでで揃った材料で何をするかと言うと、内積の定義を合体させて式を作ります。こんな感じ。
合体!
\( \mid \boldsymbol{a} \mid \mid \boldsymbol{b} \mid cos \theta= a_1b_1+a_2b_2\)
で、こいつを\(cos \theta\)について解くと…
\(cos\theta=\frac{a_1b_1+a_2b_2}{\mid \boldsymbol{a} \mid \mid \boldsymbol{b} \mid}=\frac{a_1b_1+a_2b_2}{\sqrt{a_1^2+a_2^2}+\sqrt{b_1^2+b_2^2}}\)
ってな感じになって、\( cos \theta \)を、各成分の値から導き出せるってことになりますね。3-4の三角関数のところであったように、ベクトル間の角度が\(0^{\circ}\)のときには同じ方向を向いている、\(180^{\circ}\)のときは反対を向いているってことなので、\(cos \theta\)の値を見ることでベクトルの向きがどの程度近いのか?は分かりますね。
で、これを多次元ベクトルを対象をするように拡張した場合も、ベクトル間の\( cos \theta \)めいたものが出てくるので、これのことを…
$$cos \theta = \frac{\sum_{k=1}^{n}a_kb_k}{\sqrt{\sum_{k=1}^{n}a_k^2}\sqrt{\sum_{k=1}^{n}b_k^2}}$$
コサイン類似度というようです!
利用の実例としてWord2Vecが挙げられていました。確かに、G検定の勉強していたときもWord2Vecのところで出てきましたね、コサイン類似度。これでようやく、実感を持ってこいつの意味が分かりましたねー。
3-7. 行列と行列演算
「ベクトル・行列」ワールドの最後は、行列の話ですね。
前節までは、コサイン類似度を求めるためにベクトルの勉強をした…という感覚がありましたが、ベクトルを勉強した目的が実はもうひとつあり、それが「行列の計算ができるようになることである」というのが本節の主旨ですね。
この節を読んで私が勝手に理解したところとしては…
「行列の計算にベクトルが深く関わってはいるが、『向きと大きさを持っている』というベクトルの特性を意識する必要はなく、単に、行列を使って計算することで計算上の見た目がスッキリするから採用している」
という感じです。この本で勉強するまでは、「ニューラルネットワークの計算をするために、なんで突然ベクトルが出てくるんや…」と思っていたんですが、単に、計算上楽になるから行列の演算を利用している、と思うようにしました。
実際の活用としては、よく出てくるこんなやつですね。
\( y_1=w_{11}x_1+w_{12}x_2 \)
\( y_2=w_{21}x_1+w_{22}x_2 \)
\( y_3=w_{31}x_1+w_{32}x_2 \)
これを、行列だとまとめて表記できます。すなわち…
\( \left( \begin{array}{c} y_1 \\ y_2 \\ y_3 \end{array} \right) = \left( \begin{array}{c} w_{11} & w_{12} \\ w_{21} & w_{22} \\ w_{31} & w_{32} \end{array} \right) \left( \begin{array}{c} x_1 \\ x_2 \end{array} \right)\)
こうですね。
行列のかけ算は「左の行列の行」と「右の行列の列」を、それぞれベクトルとして考えた場合の内積の計算結果を新たな行列として定義したものになるので、上の3つの式と下の行列表現がイコールになるわけですね、はい。
さらにスッキリ表現すると…
\( \boldsymbol{y} = \boldsymbol{W}\boldsymbol{x} \)
という感じですね!
ということで
「ベクトル・行列」の章が無事に終わりましたねー。
コアとなる考えである「内積」から、「コサイン類似度」と「行列演算」に発展する…という感じでしたね。ベクトルに関してはイマイチよく理解していなかったので、非常に勉強になりました。
さて、次回からは4章の「多変数関数の微分」ですね。微分については2章でもやりましたが、また微分に戻っていく感じかー。なぜ章を連続させずに間にベクトル・行列の章を入れたのか。次の章では、その意図も考えながら読んでいくことにしますかねー。
ではまた。