えんじにあのじゆうちょう

勉強したことを中心にアウトプットしていきます。

線形回帰で考える統計学、機械学習とニューラルネットワーク

はじめに

統計、機械学習、ニューラルネットワーク(深層学習)と勉強していくと、結局何がどれに分類されるのかよく混乱してしまいます。
あくまで私の勉強した結果そう思ったというまとめにはなりますが、本記事でまとめてみようと思います。

統計学的に線形回帰を考える

線形回帰の中でも一番単純な単回帰について考えます。
単回帰分析は以下のような数式で表現されます。

 y_i = \omega_0 + \omega_1 x + \epsilon_i

ここでxyに添え字のiがついていますが、単回帰分析を行うとき、(x, y)の組は1つではなく、複数ないと計算できません。
例えば、よくある例で気温とアイスクリームの売上の関係のような場合、温度が10度のときは10個売れた、20度のときは22個売れた、30度のときは35個売れたと言うデータがあるなら(10, 10), (20, 22), (30, 35)のような形になります。
(数値はとても適当です)

改めて \epsilonは誤差項ですが、変形すると以下のように表せます。

 \epsilon_i = y_i - ( \omega_0 + \omega_1 x_i)

このとき求めたい回帰式の誤差 \epsilonはそれぞれの点に対して存在しますので、この誤差の合計を最小化すれば最も当てはまりの良い回帰直線を計算できます。

誤差は単純に足し合わせると+/-で打ち消し合ったりして、あまりいい値にならないこともあるので、毎度のお決まりのように二乗して足し合わせます。


\begin{equation*}
\begin{split}
S(\omega)&=\sum_{i=0}^{n} \epsilon_i^2\\
&= \sum_{i=0}^{n} (y_i - ( \omega_0 + \omega_1 x_i))^2\\
\end{split}
\end{equation*}

つまりこれはそれぞれの \omega_iについての2次方程式です。2次方程式の最小値は傾き=0となる点なので、 \omega_iに対する偏微分を行い、それぞれが最小、つまり0となる点を求めれば良いので、

\frac{\partial S}{\partial \omega_0} = 0

\frac{\partial S}{\partial \omega_1} = 0

を解く、つまり連立1次方程式を解くことになります。

結果として以下で\omega_0, \omega_1を求められます。

 \omega_1 = \frac{\sum(x_i - \overline{x})(y_i - \overline{y})}{(x_i - \overline{x})^2}

 \omega_0 = \overline{y} - \omega_1\overline{x}

これで単回帰の式が求めることができます。重回帰になっても変数が増えてとても面倒ですが、考え方は同じです。

ちなみに、行列表現で書くと以下のようにすることで\omegaが計算可能です。

\omega = (X^TX)^{-1}X^TY

この式は単回帰だけでなく、重回帰分析でも適用可能です。

コンピュータに線形回帰を解いてもらう

コンピュータが線形回帰を解く場合は、上記の統計学的アプローチを解析的に解けるようプログラムを実装します。
連立一次方程式の形ではコンピュータが解くのは大変なので、最後に上げた行列式の形式で実現したりします。

ただ、実際に実装することはあまりなく、大体はscikit-learn*1などで実装済みのライブラリを使うことになるかと思います。

重要なのは結局\omegaを計算するための式をコンピュータに与えているという点です。
つまり、機械に問題の解き方をアルゴリズム(例えば先程の行列計算)をプログラムしていて、機械は設定されたアルゴリズムに従ってデータからパラメータ\omegaを計算して求めます。

ニューラルネットワークで解く

ニューラルネットワークは例えば以下のようなものです。

パーセプトロンの絵
perceptron

この最も単純な形はパーセプトロンと呼ばれていて、人間の脳細胞を模したもので、入力値に重みをかけて足し合わせた結果を一定の規則に基づいて出力を出します。

 \hat{y}=f(\omega_0+\omega_1 x_1+\omega_2 x_2 + \cdots)

ここで f(x)が活性化関数と呼ばれるもので、計算結果を変形して出力しているものです。

例えば、よくある手書き文字認識の要な場合では活性化関数では元の数値を確率に変換するものが使われています。
ここでは活性化関数の詳しい話は行いませんが、もし活性化関数が恒等関数であれば \hat{y}は回帰分析の式と同じとなります。

さて、肝心の重みである \omega_iの決め方ですが、まずはランダムに決め、そこから少しずつ調整していきます。
ここがいままでのアプローチとの大きな違いになると思います。

まずは適当に置いた \omega_iを用いて \hat{y_i}を計算します。計算された \hat{y_i}とデータとして得られている真の y_iを比較して \omega_iの調整を行います。

では具体的にどのように比較を行うのでしょうか?そのために誤差関数というものを設定します。

例えば、誤差関数では二乗和誤差というものがあり、これは統計学的な回帰分析のところで書いた最小二乗法とほぼ同じで、 \hat{y_i} y_iの距離=誤差を最小化するように計算します。
具体的な式は以下となります。

 L = \frac{1}{2}\sum(y_i - \hat{y_i})^2

この式を変形すると

 L = \frac{1}{2}\sum(y_i - (\omega_0+\omega_1 x_{1i} +\omega_2 x_{2i} + \cdots))^2

となりますが、y_iy_jiはデータから得られていますので、L\omegaの関数となりますので、L(\omega)で表せられます。

L(\omega)を最小とする点を求めれば良いので、L(\omega)\omegaで偏微分して傾きを求めます。

\frac{\partial L}{\partial \omega} = (\frac{\partial L}{\partial \omega_1}  \frac{\partial L}{\partial \omega_2}  \frac{\partial L}{\partial \omega_3}  \cdots)

これの傾きがゼロになる点が解なので、元々の \omegaに反映すればよいのですが、一度に反映してしまうと大きく動きすぎて行き過ぎてしまったりするなどして収束しないかもしれません。

そのため、単純に学習率として \etaを書けたものを引いて \omegaを更新します。新しい \omega \omega'とすると、

 \omega' = \omega - \eta\frac{\partial L}{\partial \omega}

となります。これが勾配法と呼ばれる学習アルゴリズムになります。

これを十分な値になるまで繰り返し処理を行うことで学習をし、 \omegaを獲得します。

良い \omegaを獲得するためには何度も何度もこの処理を行って更新していきます。

\omegaを直接的に求めるのではなく、正解と現在のパラメータで予測された値を元に、L(\omega)を最小にする、つまり予測と現実が最も近くなる\omegaを求めていきます。
\omegaがどういうものかは一切機械に教えていなくて、機械が試行錯誤しながらパラメータ\omegaを求めていきます。

まとめ

ここでは線形回帰を例にとって、統計学として数式で直接求める方法、機械学習として解析的に解くこと、ニューラルネットワークでの学習のされ方について見てきました。
似たような計算手法ではあるのですが、統計学、機械学習では数式を直接解いています。つまり、学習というよりは数学の問題を解くことで求めたい結果をバチッと求める感じです。
一方のニューラルネットワークでは人間が学習するように試行錯誤しながらフィットする回帰直線を求めていました。

結果は同じようになりますが、アプローチとして差がある、と理解すると良いのかなと思いました。
(あと、数式さえ解ければ正確なのは従来手法なのかとも思います)

別の記事で実際にコードを動かしてみた版も書こうと思います。