はじめに
先日,courseraというオンライン講座にある機械学習のコースを修了したので,私自身の理解度チェックと備忘を兼ねて何回かに分けて記事にしておこうというのが目的です.
courseraとは
courseraとは海外の有名な大学の教授さんたちが作成しているオンライン講座です.
https://www.coursera.org
受講した機械学習の講座は計11週のボリュームで,動画による聴講が基本で,動画の途中で確認問題が出たり,週終わりに確認テスト,プログラミング演習などがあります.私にとっては理想的な内容だったので受講しました.
機械学習とは
機械学習というワードの前に,AIとの関連性や細かいところ(チューリングテストとか強いAI/弱いAIとか)も重要なキーワードがありますが...
大雑把に言うと機械学習とは,分類や回帰などといった予測を計算できるモデルで使用するパラメータ(数学の関数でいうところの係数)を観測データを基に算出するというもの.ほかの言い方をすれば,予測モデルのパラメータを観測データを使って最適化するというもの.
機械学習では,このパラメータの算出・最適化を観測データ(学習データ)を使って求めるのが主要分野になる.
線形代数の必要性
学習させるモデルは,基本的に$y=\theta x+b$のような1次式(線形関数)で表すようになる.ニューラルネットワークやボルツマンマシンなどといったモデルを扱うようになると複雑な式になっていく.併せて課題も増えていく.
この$x$が入力データを入れる部分で,入力値が3つなら$y=\theta_1x_1+\theta_2x_2+\theta_3x_3+b$と,入力値に比例して増えていく.つまり,求めたいパラメータ$(\theta,b)$を観測した$x$と$y$から求めることとなる.
ここまでに出てきたものをまとめて,多数の学習データとモデルのパラメータを使って連立方程式を組み立てていく.
y^{(1)}=\theta_1x^{(1)}_{1}+\theta_2x^{(1)}_{2}+\theta_3x^{(1)}_{3}+b\\
y^{(2)}=\theta_1x^{(2)}_{1}+\theta_2x^{(2)}_{2}+\theta_3x^{(2)}_{3}+b\\
y^{(3)}=\theta_1x^{(3)}_{1}+\theta_2x^{(3)}_{2}+\theta_3x^{(3)}_{3}+b\\
y^{(4)}=\theta_1x^{(4)}_{1}+\theta_2x^{(4)}_{2}+\theta_3x^{(4)}_{3}+b\\
y^{(5)}=\theta_1x^{(5)}_{1}+\theta_2x^{(5)}_{2}+\theta_3x^{(5)}_{3}+b\\
上式では,パラメータが3つで学習データ数が5つの場合である.$x$の上添え字が学習データのインデックス,した添え字が入力データのインデックスとなっている.
通常,学習データ数は1,000とか10,000とかのオーダーまで増えることもある.また画像処理の領域では,パラメータ数が100とか1,000とかも当たり前のように出てくる.
このことから,普通の連立方程式の発想では,手に負えなくなるボリュームになるため,簡単に扱えるようにパラメータや観測データを1つの塊にして扱えるように工夫する.ここから線形代数の出番となる.
前準備として$\theta$と$b$をバラバラに扱うのは面倒なので,$b=1 \times \theta_0$としておく.
線形代数での記述を使えば,以下のように整理できる.
Y=\left(
\begin{matrix}
y^{(1)} \\
y^{(2)} \\
y^{(3)} \\
y^{(4)} \\
y^{(5)} \\
\end{matrix}
\right) \\
\Theta=\left(
\begin{matrix}
\theta_0 \\
\theta_1 \\
\theta_2 \\
\theta_3 \\
\end{matrix}
\right)
\\
X=\left(
\begin{matrix}
1 && x^{(1)}_{1} && x^{(1)}_{2} && x^{(1)}_{3} \\
1 && x^{(2)}_{1} && x^{(2)}_{2} && x^{(2)}_{3} \\
1 && x^{(3)}_{1} && x^{(3)}_{2} && x^{(3)}_{3} \\
1 && x^{(4)}_{1} && x^{(4)}_{2} && x^{(4)}_{3} \\
1 && x^{(5)}_{1} && x^{(5)}_{2} && x^{(5)}_{3} \\
\end{matrix}
\right)
=\left(
\begin{matrix}
(x^{(1)})^T \\
(x^{(2)})^T \\
(x^{(3)})^T \\
(x^{(4)})^T \\
(x^{(5)})^T \\
\end{matrix}
\right)
\\
とベクトルと行列の表現にして各情報をまとめることが出来る.
ここから...
y^{(i)} = x^{(i)} \Theta
という1本の数式を求めることが出来るようになる.
期待値となる$\bf\it{y_i}$と計算した$\bf\it{x_i}\Theta$の誤差が最小になるようなパラメータ$\Theta$を求めれば良いのだが,学習データが多すぎるとすべてのデータに見合ったパラメータ$\Theta$を求めることが出来ない.それらしい値,つまり最適解を求めることとなる.
これは数式にすると
\min_{\Theta} \frac{1}{2m} \sum^{m}_{i=1}\|x^{(i)}\Theta - y^{(i)}\|^2 \\
という最適化問題になる.
この問題を解くのは,勾配降下法/最急降下法(gradient descent)が良く使われる.
行列とベクトルを用いたこのような数式にすることで,専用ライブラリ(BLASなど)による並列処理が行えたり,分散コンピューティング(Map-Reduceなど)の手法を取り入れたりすることが容易になる.
そして,この解法と手順は1次式に限らず,多項式やニューラルネットワークのような複雑なモデルにも適用できる.
まとめ
機械学習では,大量の学習データを用いて複数のパラメータの最適解を求めるというもの.
このパラメータを求めるには,一度に大量のデータを並列処理する必要があるため,行列やベクトルを用いた線形代数の分野が活躍する.