HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

連立方程式から始める機械学習

 

 

follow us in feedly

https://cdn.blog.st-hatena.com/images/theme/og-image-1500.png

 

はじめに

この記事では機械学習の初心者が、連立方程式という比較的馴染みのある数学からスタートして、学習とは一体何を行っているのかを把握し、その後、連立方程式を簡単に記述できる線形代数の世界に少しだけ足を踏み入れ、現代的な機械学習の初歩が理解できるようになることを目指します。

 

余力があれば、実際に線形代数の操作を手で行ってみると良いでしょう。

 

連立方程式

初歩的な連立方程式

連立方程式とは、例えば以下のような式を言います。

 

\begin{cases} x + 2y = 3 \\ x - y = 6 \end{cases}

 

これを解く方法はいくつかあります。

 

代入法

1つは代入法です。2つ目の式を

 

\begin{cases} x + 2y = 3 \\ x =y+ 6 \end{cases}

 

と変更することで、xについてとりあえず解けたことになります。このxを1つ目の式に代入することで

 

(y+6) + 2y = 3

⇔ 3y = -3

⇔ y = -1

 

となり、x = y+6でしたので、x = -1 + 6 = 5としてやることで

 

\begin{cases} x = 5 \\ y = -1 \end{cases}

 

と連立方程式を解くことができたというわけです。

 

加減法

もう1つが加減法であり、こちらのほうがテクニカルではありますが、便利な場合が多いです。

 

\begin{cases} x + 2y = 3 \\ x - y = 6 \end{cases}

 

の両辺を差を取ることで

 

3y = -3

⇔y = -1

 

となります。残りのxは、今求まったyを使えばすぐに求まるのですが、一貫性を持って加減法で解きましょう。二番目の式を2倍して、連立方程式を以下に書き換えます。

 

\begin{cases} x + 2y = 3 \\ 2x -2y = 12 \end{cases}

 

その後、両辺和を取ることで

 

3x = 15

⇔x = 5

 

と求まります。消したい文字の係数を揃えることで、和あるいは差を取り文字を消去するという作戦です。

 

連立方程式の重要な性質

まず連立方程式の重要な性質を列挙しておきます。

 

求めたい文字が2つ有る場合には、方程式が2つあれば解くことが(大抵の場合は)可能です。

 

できない場合もあります。それは後に話します。また、加減法でやったように

 

連立方程式を足したり引いたりして方程式を新たに作っても構いません。

 

更に、こちらも加減法で見ましたが、

 

方程式の両辺を定数倍して方程式を作っても構いません。

 

加減法で見た連立方程式の解法には、上記の非常に重要な方程式に関する性質が全て詰まっています。

 

\begin{cases} x + 2y = 3 \\ x - y = 6 \end{cases}

 

例えば、xを求めるときには、二番目の式を2倍しましたね。これによって新たな方程式を創りだしており、正確には以下のように記述されるところでしょう。

 

\begin{cases} x + 2y = 3 \\ x - y = 6 \\2x - 2y = 12 \end{cases}

 

しかし、二番目の式と三番目の式は本来同じものであるため、わざわざ2つ目の式は書いても書かなくてもいいということです(しかしここでは明記しておきましょう)。さらに、一番目と三番目の式の和を取ることで、4つ目の式を作り出しました。

 

\begin{cases} x + 2y = 3 \\ x - y = 6 \\2x - 2y = 12 \\3x = 15  \end{cases}

 

こうして作り出された4番目の式は、幸運にも求めたいxだけを含む形になっているので、すぐに値を確定させることができたわけです。

 

いま、4つの式が羅列されていますが、ここに現れている式は、本質的には全て同じものであり、実質はもともとの2つの式の別の姿にすぎません。ですから、見かけ上方程式は増えていますが、人間に取って分かりやすく変形しただけのものです。

 

逆に、基本的ないくつかの変形というものを取り揃えていれば、それらを用いて、もともと与えられた連立方程式を、それらを組み合わせるだけで解くことができるようになります(その手段行列によって得られますが、その話はもっと後にしましょう)

 

連立方程式が解けるか解けないか

「求めたい文字が2つ有る場合には、方程式が2つあれば解くことが(大抵の場合は)可能です」と述べました。

 

不定

しかし、連立方程式が以下の2つであった場合にはどうでしょうか。

 

\begin{cases} x + 2y = 3 \\ 2x + 4y = 6 \end{cases}

 

文字2つに式が2つです。これに対してウキウキしながら、代入法や加減法を使ってみても、「0=0」という当たり前の式が作られるだけです。今はわざとわかりやすい例を示していますからそんなことをする人はいないでしょう。どうみても2つの式は同じものです。

 

先ほど述べたように、両辺定数倍をした方程式というのは実質同じものです。今回は一番目の式を2倍したものが2番目の式になっており、全く同じものなのです。

 

2つの文字に1つの式しか無いため、これを確定させることはできません。

 

確定はできませんが、この方程式を満たすx,yの組を示すことはできます。

 

例えばx=1,y=1は上記の式を満たしていますし、x = -1, 2も上記の式を満たしています。

 

x = t

 

という値だとすれば、

 

\displaystyle y = \frac{1}{2}(3-t)

 

と決定するのです。こんなx=tという値を明確に決めなくても式変形すれば

 

\displaystyle y = \frac{1}{2}(3-x)

 

なのですから当たり前です。こういった場合には、連立方程式の解(x,y)は上記で表される直線上の全ての点になります。ただ1つには求まりません。連立方程式の解が1つに求まるのは実は非常に運が良いケースなのです。

 

このように解はあるんだけど、確定はしません。というタイプの連立方程式を「不定である」と言ったりします。

 

不能

次は以下のようなケースを考えましょう。

 

\begin{cases} x + 2y = 3 \\ x - y = 6 \\ x + y = 100\end{cases}

 

さて、この連立方程式は解けるでしょうか。

 

結論から言えば、この連立方程式は絶対に解けません。

 

1番目と2番目の式は最初の例で見た連立方程式と全く同じものです。ですから、上の2つの式だけを見れば答えはx=5,y = -1となります。

 

しかし、この答えは3番目の式を満たしていません。では2番目の3番目だけを見てみるとどうでしょう。x = 106,y = -6になるのですが、これは1番目の式を満たしません。いかなる2つの連立方程式に着目しても、解は求まらないのです。

 

連立方程式を解くというのは、その与えられた数式を満たす都合の良い値を見つけましょうということです。2つの文字に、3つの数式を満たすように要請するのはあまりに酷だというわけです。

 

この手の連立方程式を「不能」と表現します。

 

クイズ

以下の連立方程式は、解が求まるか、不定か不能か判断してみてください。

 

1.\begin{cases} x + 2y = 3 \\ x - y = 6 \\ -3x +3 y = -18\end{cases}

 

2.\begin{cases} x + 2y = 3 \\ x - y = 6 \\ 2x + y = 9\end{cases}

 

 

 

 

 

 

 

正解は1.も2.も解が求まります。

 

「1.」は簡単ですね。3番目の式は2番目の式を-3倍した式です。実質2つの式です。

「2.」は別々の方程式が3つあるように見せかけて、実は実質2つです。3番目の方程式は、1番目の2番目の足して作ったものです(足したり引いたりした式は、元の式と同じだった)。

 

 

さて、「2.」のようなケースは実世界では頻繁に起こりえます。にも関わらず、これを判断するのは意外と難しいということを直感的に理解できたでしょうか(実はこれをシステマチックに判定するのが行列式の役割なのですが、これももっと後に話しましょう)。

 

 

 

連立方程式と機械学習

さて、連立方程式をおさらいしたところで、機械学習の話に入りましょう。

 

機械学習とはデータ{\bf x} = (x_1,x_2,x_3,...,)に対して、tという値を出力する関数t = f({\bf x})を上手く作ることです。ここで、tが連続的な値ならば回帰(例えば株価のいくつかの指標から、特定の銘柄の株価を出力する)であり、離散的な値ならば分類(例えばいくつかの個人情報から、男女のいずれかを出力する)です。

 

機械学習を行う場面とは、実際にはデータが{\bf x_i}がたくさんあり、それに対応するt_iも沢山手元にあるという状況で、手元のデータでt = f({\bf x})を上手く再現するような関数を作り上げ、新たなデータに対して予測を行いたいということになります。

 

とっても簡単な機械学習の例

データ{\bf x} = (x_1,x_2)に対してその答えtの組が2つ手元に有るとしましょう。

 

{\bf x^{(1)}} = (1, 2) に対して  t^{(1)} = 3

 

{\bf x^{(2)}} = (1, -1) に対して  t^{(2)} = 6

 

このデータに対してt = f(x)となる関数を構築せよ。というのが機械学習に与えられる課題ということになります。

 

さて、ここでは、この機械学習のモデルf({\bf x})にパラメータ\bf wを持たせて、パラメータ\bf wをいろいろ調整することで上手い関数を作りましょう。つまり

 

t = f({\bf w,x})

 

を、データを元につくり上げるということです。まだこのままでは何をすれば良いのかわからないので、もっと具体的に

 

f({\bf w,x}) = w^Tx = w_1x_1 + w_2x_2

 

というふうに表すことにしましょう。

 

パラメータを{\bf w} = (w_1,w_2)という2つの値を持つものだと限定したわけです(これを線形モデルという。他にもいっぱいニューラルネットとかサポートベクトルマシンとかあるけど、結局はどういう関数だと見るかの違い)。

 

ひとまずこのモデルのもとで、手元のデータをt = f({\bf w,x})表してみることにしましょう。

 

\begin{cases} t^{(1)} = w_1x^{(1)}_2 + w_2x^{(1)}_2 \\ t^{(2)} = w_1x^{(2)}_2 + w_2x^{(2)}_2 \end{cases}

 

という関係性があるはずで、具体的に手元のデータ(以下のデータ)

 

{\bf x^{(1)}} = (1, 2) に対して  t^{(1)} = 3

{\bf x^{(2)}} = (1, -1) に対して  t^{(2)} = 6

 

を当てはめてやれば、

 

\begin{cases} 3 = w_1 + 2w_2 \\ 6 = w_1 - w_2 \end{cases}

 

の2つの関係式が出てきます。どこかで見た式ですね。先ほど解いた連立方程式そのものです。さて、この連立方程式の解を求めてみれば

 

\begin{cases} w_1 = 5 \\ w_2 = -1 \end{cases}

 

となります。なので私達が求めたかった関数というのは、

 

f({\bf w,x}) = w^Tx = w_1x_1 + w_2x_2 = 5x_1 - x_2

 

というものだったわけです。これに対して、新しいデータ\bf x^{(new)} = (4,-3)みたいなものが得られたら、この関数は

 

t^{(new)} = 5 \times 4 - 1 \times (-3) = 23

 

と出力することになります。

 

手元にデータが有るときの学習というのは、wを求める連立方程式を解くことに相当しているのです。

 

 

現実の機械学習

現実の機械学習でも、上記で扱った線形モデルというのは馬鹿にできません。非常に広く使われており、これが正しく使いこなせるのであれば結構儲かります(使いこなすのは難しい)。

 

ただし、先ほど見たほど単純ではないのです。

 

 

解に関して

データ\bf x^{(i)}が通常は大量にあります。そして、データの次元が先程は2次元でしたが、仮に100次元のデータだとしましょう。そうすれば線形モデルを以下のように構築できるはずです。

 

f({\bf w,x}) = w_1x_1 + w_2x_2 + ... + w_{100} x_{100}

 

さて、ここでは未知数のwが100個あります。そして連立方程式はデータの数だけ構築されることになります。一般的に機械学習では未知数と方程式の数は一致しません。

 

未知数に対して、データ数が足りない場合は、連立方程式は不定になります。解があるのですが1つに確定しないのです。手元のデータのことだけ考えるならば、これはむしろ都合か良さそうに見えますが、新しいデータを予測するときに使える解がどれなのかは誰にも分かりません。

 

そして未知数に対してデータ数が過剰であれば連立方程式は不能になります。もはや全てのデータを説明できるようなモデルは絶対に構築できないということです。こうなった場合は、手元のデータに対してすら何らかの妥協をしなければならないということです。

 

そして忘れてはいけません。そもそも与えられた連立方程式に、同じようなものが含まれているかもしれないのです。

 

 

通常の機械学習ではピタっと方程式を解くのを諦め、そこそこ関係性を上手く表すことができれば良いだろう、という方針で行くことになります。

 

つまり、本当はt = f({\bf w,x})がほしいんだけど、それは難しいから代わりにy = f({\bf w,x})っていうものを考えて、t,yがどれくらい離れてしまっているかを評価しようという考えです。t=yと完全に一致すれば完璧に連立方程式が解けたということです(がもちろん、それは無理)。

 

したがって通常の機械学習の方針は

 

y = f({\bf w,x})

 

を作る。y = tであれば、単に連立方程式を解くということになるが、それは無理なので、 (y - t)^2 みたいなものを考えて、これがなるべく小さくなるように\bf wを調整していく。という流れになります。この「二乗」を使った方法は、いわゆる最小二乗法です。

 

データ次元に関して

さて、今は、多次元の入力データ\bf xを入れたら一次元の出力データtを返してくるモデルを考えました。しかし、もっと一般的に、\bf xを入れたら同様に多次元の出力データtを返してくれるモデルを考えたい場合もあるはずです。

 

例えば、株価の複数の指標を入れたら、会社A、会社Bの株価をそれぞれ出力してくれるようなモデルを考えても良いわけです。そうなると、

 

t_1 = f({\bf w,x}) = w_1x_1 + w_2x_2 + ... + w_{100}  x_{100}

 

t_2 = f({\bf v,x}) = v_1x_1 + v_2x_2 + ... + v_{100} x_{100}

 

のように、同じ入力に対して2つモデルを同時に考慮しなければならないということになります。

 

{\bf W} = \left( \begin{array}{c} w_1 w_2 ... w_{100}\\ v_1 v_2 ... v_{100} \end{array}\right)  

 

と格納することで

 

 \bf t = Wx

 

というふうに、ベクトルと行列に格納してしまってモデルを考えることになります。

 

この表記にしておけば、出力が何次元であろうと、入力が何次元であろうと、いつでもこの形で表しておくことができるのです。

 

さらに具体的に複数のデータを代入していった場合には、データ数分の連立方程式が出来上がるわけですが、それも\bf X =  (x^{(1)}, x^{(2)},...)とベクトルデータを格納する行列を考えてやることで

 

 \bf T = WX

 

のような形で簡単に記述することができます。

あとはこの形式で最小二乗法なり何なりを計算できるようになれば、いつでも多次元のデータの取り回しが楽になるというわけです。

 

 

最後に

発展的な話題

 

 

データが単純な連立方程式に従っているとは思えない場合も有るはずです。

 

y = w_1x_1 + w_2x_2

 

ではなく、

 

y = w_1x_1^3 + w_2x_2^3

 

と成分の3乗で効いてくるかもしれないのです。このようなケースを考慮するために以下のアイデアが使えます。

 

線形基底モデル

その1つ目のアイデアは、データの方を予め非線形変換しておくというアイデアです。

 

\bf xが得られたら、とりあえず非線形変換{\bf x'} =  Φ({\bf x})で変形しておくのです。そうすれば、あとは新たに得られた\bf x'を使って、今までと同じように線形モデルを考えれば、モデルは

 

f({\bf w,x'}) = w_1x'_1 + w_2x'_2 +...

 

といった具合になります。もともとのデータからすれば

 

f({\bf w,x}) = w_1Φ(x_1) + w_2Φ(x_2) +...

 

となっており、確かに非線形性が導入されています。

実際はこのアイデアも含めて線形モデルと言います(一番簡単な線形モデルはΦ({\bf x})=\bf xとした場合というわけ)。

 

他入力他出力ならば

 

{\bf y} = f({\bf W,x}) = {\bf W}Φ({\bf x})

 

という表記がされることになります。

 

ニューラルネットワーク

ニューラルネットワークは実は線形基底モデルを線形基底モデルに突っ込んでいるような形をしています。

 

多層のニューラルネットワークでは

 

{\bf y} = f({\bf W,x}) = Φ_L(...W_2Φ_2({\bf W_1}Φ_1({\bf x})))

 

こんな形をしており、通常Φ_1(入力層)は何も変換しません。そして中間層から何らかの活性化関数が用いられます(基底関数をニューラルネットワークでは活性化関数と呼ぶ。これはバックグラウンドの違い)。出力層は回帰ならば何も変換せず、分類ならばソフトマックス関数が用いられます。

 

連立方程式から見れば、

 

※入力層は何もしないのがお決まりなので、たいていこれを「層」とカウントしない場合が多い。

 

 

他の基礎的話題

 

s0sem0y.hatenablog.com

s0sem0y.hatenablog.com

 

数学

 

s0sem0y.hatenablog.com

 

 

 

s0sem0y.hatenablog.com

 

s0sem0y.hatenablog.com