理系リアルタイム

大学院生の情報ブログ

テクノロジー 人工知能・機械学習 深層学習を学ぶシリーズ

【深層学習】深層学習に必要な数学まとめ 【No.1 線形代数 編】

投稿日:1月 31, 2019 更新日:


こんにちは!ATSです!

最近では、一般の人でも人工知能、機械学習、ディープラーニングなどのフレーズを耳にすることが多くなり、

機械学習を勉強し始めて、これから本格的に機械学習、深層学習(ディープラーニング)を学んでいこうとしている人も多いのではないでしょうか?

Pythonでプログラミングだけならあまり数学の知識はいらないかもしれませんが、ある程度の知識があるとプログラミングするときにも理解が進みますし、本格的に学ぶ人にとっては数学の基礎知識は必須です。

そこで今回は、機械学習、深層学習に必要な数学をまとめたいと思います!

※この記事はまとめですので、一から丁寧に説明していません。大学の初歩数学を学んでいない人は、この記事だけでは厳しいと思うので他の参考書と合わせて学ぶことをお勧めします。

この記事を参考に、深層学習の道への第一歩を踏み出してください!!

ちなみに、主に参考にした参考書は『深層学習 (株式会社ドワンゴ)Ian Goodfellow, Yoshua Bengio, Aaron Courville 【著】、岩澤有祐、鈴木雅大、中山浩太郎、松尾豊【監訳】』です。

この本は人工知能の分野で有名な先生が書いた本を、ディープラーニングで有名な松尾豊先生の研究室の方が日本語に監訳した本で、僕もまだ勉強中の初心者です。

線形代数

線形代数はほとんどの科学に使わている数学といっても過言ではない。コンピュータサイエンスの計算では離散値を使うため、機械学習を学ぶ上で連続値を扱う線形代数は必要のないように思われるが、実は機械学習・深層学習の理解には線形代数は必要不可欠である。ここでは、線形代数の基本的な定義と計算について触れる。

スカラー、ベクトル、行列、テンソル

・スカラー

大きさのみをもつ量のことで、数学的には単に数のことを指す。物理的には、体積、温度など、方向に依存しない物理量は分類としてスカラーである。

・ベクトル

大きさと方向をもつ量のことで、数学的には数値の配列である。数値が一列に並んだ形をしていて、ベクトルの各成分の大きさと次元数でその方向を指定する。例えば、n成分をもつベクトルは次のような形で表される。

    \[\mbox{\boldmath $x$} = \left(\begin{array}{c}x_1\\x_2\\ \vdots\\x_n\\ \end{array}\right) \eqno(1.1)\]

ベクトルは空間上の点を表しているとみなせ、ベクトルの各要素は各軸に沿った座標を与える。ベクトル要素のインデックスは1つである。つまり、ある軸を指定すればベクトルの成分は決まる。

物理的には、力、速度などがベクトルである。

・行列

2次元の数値配列である。行列の各成分は行と列を指定しないと決まらないため、2つのインデックスで指定される。一般的に行列を表す場合、行列の成分\mbox{\boldmath $A$}i列目j列目の成分をA_i_jと表す。例えば、以下のような3次元正方行列では、A_2_3は2行目で3列目の成分である。

    \[\mbox{\boldmath $A$} = \left(\begin{array}{ccc}A_1_1 & A_1_2 & A_1_3 \\A_2_1 & A_2_2 & A_2_3 \\A_3_1 & A_3_2 & A_3_3\end{array}\right) \eqno(1.2)\]

・テンソル

行列は2つの軸をもつ2次元配列だが、テンソルは3つ以上の軸をもつ多次元配列を含む、行列より一般化された概念である。3次元空間では、n階テンソルは3^nの成分をもつ。よって、スカラーは0階テンソル、ベクトルは1階テンソル、行列は2階テンソルとみなせる。

行列の転置

2行3列の行列

    \[\mbox{\boldmath $A$} = \left(\begin{array}{ccc}A_1_1 & A_1_2 & A_1_3 \\A_2_1 & A_2_2 & A_2_3 \end{array}\right)\eqno(1.3)\]

の転置行列\mbox{\boldmath $A$}^{\mathrm{T}} は、行と列の成分を入れ替え、以下のように3行2列の行列になる。

    \[\mbox{\boldmath $A$}^{\mathrm{T}} = \left(\begin{array}{ccc}A_1_1 & A_2_1 \\A_1_2 & A_2_2 \\A_1_3 & A_2_3 \end{array}\right)\eqno(1.4)\]

ここで、一般的に行列\mbox{\boldmath $A$}ij成分をA_i_j = (\mbox{\boldmath $A$})_i_jと表すと、

    \[(\mbox{\boldmath $A$})_i_j  =  (\mbox{\boldmath $A$}^{\mathrm{T}})_j_i \eqno(1.5)\]

の関係がある。

行列とベクトルの乗算

行列 \mbox{\boldmath $A$} と行列 \mbox{\boldmath $B$} の積 \mbox{\boldmath $AB$} は、掛け算される \mbox{\boldmath $A$} の列数と \mbox{\boldmath $B$} の行数が一致していなければならない。つまり、 \mbox{\boldmath $A$} の型が m \times n で、 \mbox{\boldmath $B$} の型が n \times p のとき、行列の積が定義され、その積 \mbox{\boldmath $C$} = \mbox{\boldmath $AB$} の型は m \times p になる。

このとき行列 \mbox{\boldmath $C$} の要素は以下のようになる。

    \[C_i_j = \sum_{k} A_i_k B_k_j \eqno(1.6)\]

計算例:
3 \times 4 の行列 \mbox{\boldmath $A$}4 \times 2 の行列 \mbox{\boldmath $B$} の積 \mbox{\boldmath $C$} は次のように計算される。

    \[\begin{split}\mbox{\boldmath $C$} = \mbox{\boldmath $AB$} &= \left(\begin{array}{cccc}2 & 1 & 3 & 1 \\1 & 2 & 4 & 2\\5 & 3 & 1 & 3\end{array}\right) \left(\begin{array}{cccc}3 & 2 \\4 & 5\\2 & 2\\3 & 2\end{array}\right)\\& = \left(\begin{array}{ccc}2 \times 3 + 1 \times 4 + 3 \times 2 + 1 \times 3 & 2 \times 2 + 1 \times 5 + 3 \times 2 + 1 \times 2 \\ 2 \times 1 + 2\times 4 + 4 \times 2 + 2 \times 3 &1 \times 2 + 2 \times 5 + 4 \times 2 + 2 \times 2 \\5 \times 3 + 3 \times 4 + 1 \times 2 + 3 \times 3 &5 \times 2 + 3 \times 5 + 1 \times 2 + 3 \times 2\end{array}\right) \\&= \left(\begin{array}{ccc}19 & 17 \\24 & 24\\38 & 33\end{array}\right)\end{split}\\\eqno(1.7)\]

(計算例おわり)

行列の乗算は、分配法則と結合法則を満たしている。

分配法則 :

    \[\mbox{\boldmath $A$}(\mbox{\boldmath $B$} + \mbox{\boldmath $C$}) = \mbox{\boldmath $AB$} + \mbox{\boldmath $AC$}\eqno(1.8)\]

結合法則 :

    \[\mbox{\boldmath $A(BC)$} = \mbox{\boldmath $(AB)C$}\eqno(1.9)\]

ここで注意したいのが、行列の乗算はスカラーの乗算のように交換法則は一般的には満たさないことである。つまり、 \mbox{\boldmath $AB$} = \mbox{\boldmath $BA$} は一般的には成り立たない。

よく物理や数学で出てくる形として、行列とベクトルの積がある。ベクトル \mbox{\boldmath $x$} を一列の行列(配列)とみなすと、行列とベクトルの積はベクトルになる( m \times n 行列と n \times 1 行列の積は m \times 1 の行列(ベクトル))。

    \[\mbox{\boldmath $Ax$} = \mbox{\boldmath $b$}\eqno(1.10)\]

単位行列

単位行列とは、任意の行列と掛け合わせたときにその行列を変化させないような行列のことである。 n 次元単位行列を \mbox{\boldmath $I$}_n とする。例えば、3次元の単位行列は次のようになる。

    \[\mbox{\boldmath $I$}_3 = \left(\begin{array}{ccc}1 & 0 & 0 \\0 & 1 & 0 \\0 & 0 & 1\end{array}\right) \eqno(1.11)\]

この \mbox{\boldmath $I$}_3 に3行の行列やベクトルをかけても変化しないことが簡単な計算でわかる。

逆行列

行列 \mbox{\boldmath $A$} の逆行列は \mbox{\boldmath $A$}^{-1} と表記され、次の式によって定義される。

    \[\mbox{\boldmath $A$}^{-1} \mbox{\boldmath $A$} = \mbox{\boldmath $I$}_n \eqno(1.12)\]

式(1.10)において、ベクトル \mbox{\boldmath $x$} を求めたいときがしばしばある。式(1.10)の両辺に \mbox{\boldmath $A$}^{-1} を掛け、逆行列の性質(1.12)を使うことで、 \mbox{\boldmath $x$} を次のように求めることができる。

    \[\mbox{\boldmath $x$} = \mbox{\boldmath $A$}^{-1}\mbox{\boldmath $b$}\eqno(1.13)\]

また、行列 \mbox{\boldmath $A$} が正方行列の場合は、右から掛ける逆行列と左から掛ける逆行列は等しくなるので、以下の関係が成り立つ。

    \[\mbox{\boldmath $A$} \mbox{\boldmath $A$}^{-1} = \mbox{\boldmath $A$}^{-1} \mbox{\boldmath $A$} = \mbox{\boldmath $I$}_n \eqno(1.14)\]

ノルム

機械学習では、ノルムは一般的にベクトルの大きさを指す。高校から数学を学んできた読者にとって、もっとも馴染みあるノルムは

    \[\| \mbox{\boldmath $x$} \| = \sqrt{\sum_{i}x_i^2} \eqno(1.15)\]

であるが、これは2次のノルムであり、一般的には p 次のノルム L^p は次のように定義される。

    \[\| \mbox{\boldmath $x$} \|_p = \left({\sum_{i} |x_i|^p}\right) ^\frac{1}{p} \eqno(1.16)\]

ベクトル \mbox{\boldmath $x$} のノルムは、原点から点 \mbox{\boldmath $x$} までの非負の距離を意味する。ノルムについての厳密な定義は存在するが、ここでは触れないことにする。

p = 2である式(1.15)にのノルム L^2 は、特にユークリッドノルムと呼ばれ、物理ではこのユークリッドノルムが頻繁に用いられ、機械学習でもよく使われるノルムである。

微分のしやすさなどから、単純な L^2 よりも L^2 の二乗の方が扱いやすい。一方で、数値的に0である場合と非常に小さい数の区別が重要となることがある機械学習では、ときに L^2 の二乗は原点近くで非常にゆっくりと増加するために望ましくない関数となる場合がある。

そこで、このような場合においては機械学習では L^1 ノルムが使われる。

    \[\| \mbox{\boldmath $x$} \|_1 = \sum_{i}x_i \eqno(1.17)\]

L^1 ノルムを使うことで、すべての場所で同じ割合で変化する数値を扱うことができる。

また、機械学習では次式で表される最大値ノルムと呼ばれる L^\infty ノルムもよく使われる。

    \[\| \mbox{\boldmath $x$} \|_\infty = \max_{i}|x_i| \eqno(1.18)\]

この式は、ベクトルの各要素の絶対値の中の最大値ひとつを意味する。

特殊な性質をもつ行列

ここでは線形代数において重要な、いくつかの特殊な行列をまとめる。

対角行列:主対角成分以外が0である行列。主対角成分とは、式(1.2)の例でいえば A_1_1, A_2_2, A_3_3 のことである。式(1.11)の単位行列では主対角成分はすべて1であり、それ以外は0なのでこれは対角行列である。対角行列を使うことで、計算が簡単になる場合が多い。

対称行列:行列の転置がその行列自身である行列。つまり、 \mbox{\boldmath $A$} = \mbox{\boldmath $A$}^{\mathrm{T}} を満たすとき、行列 \mbox{\boldmath $A$} は対称行列である。

単位ベクトル:ノルム L^2 が1であるベクトル。つまり、\mbox{\boldmath $x$}_2 = 1 を満たす、大きさが1であるベクトル。 また、ベクトル \mbox{\boldmath $x$} と ベクトル \mbox{\boldmath $y$}\mbox{\boldmath $x$}^{\mathrm{T}}\mbox{\boldmath $y$} = 0 を満たすとき、これらのベクトルは互いに直交しているという。さらに、ベクトルが直交していて、かつ単位ベクトルであるときに正規直交しているという。

直交行列:正方行列で、行が互いに正規直交していて、かつ列も正規直交している行列。直交行列は \mbox{\boldmath $A$}^{\mathrm{T}} \mbox{\boldmath $A$} = \mbox{\boldmath $A$} \mbox{\boldmath $A$}^{\mathrm{T}} = \mbox{\boldmath $I$} をみたす。これから、 \mbox{\boldmath $A$}^{\mathrm{T}} = \mbox{\boldmath $A$}^{-1} となり、直交行列では簡単に逆行列を知ることができる。

固有値分解

行列の機能的性質の情報を得るために、行列を分解する方法の1つを固有値分解という。固有値分解では、行列を固有ベクトル固有値の周到に分解する。

以下の式(1.19)のように、正方行列 \mbox{\boldmath $A$}\mbox{\boldmath $A$} の固有ベクトル \mbox{\boldmath $v$} をかけると、この固有ベクトルに対応した固有値 \lambda と固有ベクトル \mbox{\boldmath $v$} になる。

    \[\mbox{\boldmath $Av$} = \lambda\mbox{\boldmath $v$}\eqno(1.19)\]

この固有ベクトルと固有値の関係を固有方程式という。

ここで、正方対角行列の記法を定義しておく。対角成分がベクトル \lambda\mbox{\boldmath $v$} の要素で与えられる正方対角行列を \mathrm{diag}(\mbox{\boldmath $v$}) と表す。

行列 \mbox{\boldmath $A$} が線形独立な固有ベクトル \{\mbox{\boldmath $v$}^{(1)}, \cdots ,\mbox{\boldmath $v$}^{(n)}\}をもつとし、この固有ベクトルにそれぞれ対応した固有値を \{\lambda_1, \cdots, \lambda_n\}とする。このすべての固有ベクトルを横に並べた行列 \mbox{\boldmath $V$} = \left(\mbox{\boldmath $v$}^{(1)}, \cdots ,\mbox{\boldmath $v$}^{(n)}\right)および固有値を横に並べたベクトル \mbox{\boldmath $\lambda$} = \left(\lambda_1, \cdots, \lambda_n\right)^{\mathrm{T}} を用意したとき、 \mbox{\boldmath $A$}固有値分解は次のようになる。

    \[\mbox{\boldmath $A$} = \mbox{\boldmath $V$} \mathrm{diag}(\mbox{\boldmath $\lambda$})\mbox{\boldmath $V$}^{-1} \eqno(1.20)\]

逆に式(1.20)から、おなじみの対角化された行列(対角行列) \mathrm{diag}(\mbox{\boldmath $\lambda$})が導かれ、問題を簡単にできることがある。

すべての行列が固有値と固有ベクトルに分解できるわけではないが、実対称行列に限っては、次のように実数のみを使った固有値と固有ベクトルに分解できる。

    \[\mbox{\boldmath $A$} = \mbox{\boldmath $Q$} \mbox{\boldmath $\Lambda$}\mbox{\boldmath $Q$}^{\mathrm{T}} \eqno(1.21)\]

\mbox{\boldmath $Q$}\mbox{\boldmath $A$}の固有ベクトルからなる直交行列、\mbox{\boldmath $\Lambda$} は対角行列である。

トレース

行列 \mbox{\boldmath $A$} のトレース \mathrm{Tr}\mbox{\boldmath $A$} は、行列の対角成分の和である。

    \[\mathrm{Tr}\mbox{\boldmath $A$} = \sum_{i} A_i_i \eqno(1.22)\]

トレースの性質として、ある行列のトレースとその行列を転置したトレースとは等しいというものがある。

    \[\mathrm{Tr}\mbox{\boldmath $A$} = \mathrm{Tr}\mbox{\boldmath $A$}^{\mathrm{T}} \eqno(1.23)\]

また、行列の積のトレースを考える場合、その積の順番を入れ替えても不変になる。

    \[\mathrm{Tr}(\mbox{\boldmath $ABC$}) = \mathrm{Tr}(\mbox{\boldmath $CAB$}) =\mathrm{Tr}(\mbox{\boldmath $BCA$}) \eqno(1.24)\]

行列式

\mathrm{det}\mbox{\boldmath $A$} で表される行列式は、その行列のすべての固有値の積であり、行列式の絶対値は行列による乗算で空間の体積がどれくらい膨らむか、ということを意味している。

機械学習での線形代数の使用例 主成分分析

主成分分析(PCA)とは、多次元データを低次元データに圧縮し、データの特徴を抽出する場合に使用される方法である。一見、解釈が難しいデータ点の集合を、次元を落とし、その特徴のみを解析することで、データの大雑把な解釈を可能にする。

機械学習では、データのカテゴリ分析、データの特徴量の分析などに使われる。

データの圧縮は、もとのデータの情報損失を少なく、分散が最大になるように主成分軸を探すことにより行う。

ここでは、2次元のデータ集合に主成分線を引くことで特徴を抽出すること考える。

データ点 \mbox{\boldmath $x$}_n をひとつの固有ベクトル \mbox{\boldmath $u$}を用いて射影したデータ \mbox{\boldmath $ux_n$} の分散

    \[\frac{1}{N}\sum^N_{n=1}(\mbox{\boldmath $u$}^{\mathrm{T}}\mbox{\boldmath $x$}_n - \mbox{\boldmath $u$}^{\mathrm{T}}\bar{\mbox{\boldmath $x$}})^2 \eqno(1.25)\]

を最大化することで、主成分軸を成すベクトルを求める。ここで、 \bar{\mbox{\boldmath $x$}} はデータ点の平均値である。この分散は、主成分軸方向についての分散であることに注意したい。この分散を最大化することで、情報量を多く保つことができる。

共分散行列を

    \[\mbox{\boldmath $S$} = \frac{1}{N}\sum^N_{n=1}(\mbox{\boldmath $x$}_n - \bar{\mbox{\boldmath $x$}})(\mbox{\boldmath $x$}_n - \bar{\mbox{\boldmath $x$}})^\mathrm{T} \eqno(1.26)\]

とおく。式(1.25)と単位ベクトルの正規直交条件を用いたラグランジュ関数

    \[\mbox{\boldmath $u$}^\mathrm{T}\mbox{\boldmath $S$}\mbox{\boldmath $u$}  + \lambda(1 - \mbox{\boldmath $u$}^\mathrm{T}\mbox{\boldmath $u$}) \eqno(1.27)\]

をラグランジュの未定乗数法で最大化することができる。第一項は式(1.25)そのものである。式(1.27)を \mbox{\boldmath $u$} について微分することで、 \lambda = \mbox{\boldmath $u$}^{\mathrm{T}}\mbox{\boldmath $S$}\mbox{\boldmath $u$}を得ることができ、 分散が最大になるときの固有値、固有ベクトルがわかる。

このように、射影分散を最大化する、最適な固有ベクトルを最大の固有値に対応して求めることで主成分の方向を定め、データを圧縮する。

主成分分析については『【参考文献】深層学習』により詳しい計算が記載されているので、参照してほしい。


created by Rinker
¥4,968 (2019/07/16 13:37:15時点 楽天市場調べ-詳細)

線形代数編は以上です!間違い、ご指摘などありましたら、ご連絡いただけると幸いです。Twitter : ATS@ゆとりの生き残り

次回は、【深層学習】深層学習に必要な数学まとめ 【No.2 確率 編】を掲載します!!


【参考文献】
・深層学習 (株式会社ドワンゴ)Ian Goodfellow, Yoshua Bengio, Aaron Courville 【著】、岩澤有祐、鈴木雅大、中山浩太郎、松尾豊【監訳】

Qiita 意味がわかる主成分分析 @NoriakiOshita https://qiita.com/NoriakiOshita/items/460247bb57c22973a5f0

-テクノロジー, 人工知能・機械学習, 深層学習を学ぶシリーズ

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

【重力波測定 in Japan 】アメリカLIGOに負けるな!神岡に眠る重力波測定装置KAGRA

こんにちは!理系リアルタイムへようこそ!! 今回は、岐阜県の神岡鉱山にある、重力が波として伝わる「重力波」を測定する装置である「KAGRA」について紹介します。 目次1 重力波とは?2 LIGOが重力 …

【機械学習初心者】機械学習(特に強化学習)を勉強中の僕が今読んでいる参考書まとめ 3選

みなさん、こんにちは!

【Google AdSense】【ブログ】初の申請後、たった5時間でGoogeleアドセンス審査が通ったブログの条件

Googleユーザーのみなさんこんばんは!ATSです!! みなさん、ググってますか?? 世の中で使われてる検索エンジンはGoogleかBingのほぼ2択ですし、Googleエンジンが圧倒してますから、 …

【衝撃】東南アジアと日本の違いはほとんど無い!?

Kamusta(こんにちは)!! 最近、タイ、ラオス、フィリピンを連続で行ってきました。 タイ、ラオスに5泊、フィリピンに10泊です。

【Ðialogflow】とっても簡単!自分のサイトにチャットボットを設置する方法

チャットボットDialogflowの育て方は別記事で紹介する予定です。育て方に関しては以下のページが分かりやすいです(引用)。https://qiita.com/kenz_firespeed/item …

理系リアルタイム 管理人

理系大学院生。いつか人工衛星を打ち上げたいと夢見ている。生息地は度々変わるので不明。物理/機械/laser/機械学習/backpacker/

理系リアルタイムでは、大学生・大学院院生に知ってもらいたい情報、体験を発信しています!!気になることがあれば、お気軽にご連絡ください。

管理人ATSのTwitter もよろしくお願いします!!