![見出し画像](https://assets.st-note.com/production/uploads/images/144737435/rectangle_large_type_2_a776169d0a549cd434dafc45caab614c.png?width=1200)
野良DSの適当な解説~機械学習の学習ってなに?
最初のQA
質問)機械学習の学習って実際のところ何やってるの?
回答)大抵の場合、嫌になるぐらいたくさんの変数の値を決めているよ。
解説しよう
まぁ、そもそも機械学習ってなんやねんという話も大事なのですが、今回は機械学習ってどういう仕組みなん?ってところを書きます。
機械学習は、シンプルに書くと、入力データを入力として、何らかの結果を出力する関数(モデルと言います)を使って複雑な判断を行うものです。
特徴は、関数の各種パラメタを人間ではなく、学習というフェーズで決定することです。
まぁ、結構いろんな結果を返す関数(但し、パラメタはたくさんある)を用意して、そいつのパラメタを決めることが学習ですね。パラメタ=変数なので、未知の変数を決定するという問題と考えても良いです。
ふと気がつくかもしれませんが、モデルの構造は関数の構造と何らかわりはありません。まぁ、出力変数が山ほどあるケースもあるので、関数の集合体という言い方の方が正しいかもしれません。
ん?生成系は?って思うかもしれませんが、生成系も同じと思って問題ありません。乱暴に言えば束ねているだけです。もちろん、関数をただ使うだけではなく、それを使ってうまい結果を出すためのコツとかも使われていたりするのですが、ここではそこには立ち入ることはしません。
学習とは
モデルの振る舞いを決める変数をデータから推定する一連の処理のことを学習と言います。
単純な話で言えば、f(x,y) = ax + by + c という関数の a,b,c をデータから推定することと一緒です。
学習用のデータとして与えるものは、x, y, f(x,y) のセットですね。これぐらい単純だと3変数なので3つあればOK?と思うかもしれませんが、それほど簡単な問題ではない。
データ中にはノイズやら誤りなんてものもいっぱいあります。それに、この関数 f(x,y) = 0 を満たす点が与えられるわけでもない。だから、それが原因で発生する矛盾なども加味しつつ変数の推定をしないといけません。結構大変です。
機械学習に与えられるデータは、多くの場合はノイズにまみれていますからね…
図形的なイメージで考えると
色々しんどくなるのは嫌なので、2値分類の問題だと思いましょう。f(x,y) は x-y 平面に曲線を引く式だと思ってください。んで、パラメタ(a,b,c,...)を決めると曲線が決まる。あとは、任意の点(x1,y1) をモデルに与えるのです。
すると、f(x1,y1) の値がわかる。仮に、f(x,y) = 0 となるところが境界線であると定義しているのであれば、f(x1, y1) が正か負かで 2値分類のどっちかが判定できるという寸法です。
任意の点で回答が得られるというのが大事
モデルを使うと、とにかく全ての点で何らかの判定結果が得られます。だから、それなりに良いデータが用意できれば結構いろんなデータでそれなりの結果を返してくれるという事になります。
これは利点ですね。
ただ、前にも外挿について書いていますが、データがないところでは f(x,y) = 0 の線を正しく引くことは出来ません。人間にも出来ませんから、当然、その辺はあやふやになります。注意しましょう。
変数を決めるということから言えること
モデル自体の柔軟性(どんな曲線が引けるのか?)ということがとても大事になってきます。シンプルなモデルはシンプルな線しか引けませんので、やっぱり色々と無理がある。
でも、複雑なモデルは決めないといけない変数が多くなりすぎて使うのがしんどい。
というわけで、この辺の真ん中を狙っていろんなモデルが改良されていくわけです。
目標は、いかに少ない変数で風雑な曲線を描くか。少ない変数は少ないデータにも通じます。
正直、こっちの努力は DNN が出てきてどうでも良くなったような気もしますが、DNN は変数だらけなので学習するのがしんどい。あと、どう考えてもDNNの変数は適当に決めるところが出てきてしまうんで、学習結果が安定しない。そもそも、そんなに複雑な曲線が必要なのか?なんてことも踏まえ、考えないといけないんですよね。
だから、個人的には昔からの手法群も大事なので、忘れないでほしいと思います。データ数が少ないなら、DNN なんか選択肢に入れちゃあかんです。
変数の量の影響
変数が増えると、それだけ学習がやりにくくなります。だから、データがたくさん必要になります。
変数が少なくなれば、学習は楽になります。つまり、データ量は少なくて済みます。
ここの理解は結構大事です。
よりよく理解したいのであれば
実際に手で計算してみることをお薦めします。ついでにグラフなんか書きながら。特に、ニューラルネットワークとかは、よくわかんないで使っているケースも多いんで。
線形の活性化関数のニューラルネットをいくつも繋いだところでやっぱり線形なんだ…とか、その辺は実際に式を解いてみると実感できますよ。
余談ですが
DNN の学習で使う Adam オプティマイザを使って方程式が解けないかなと思って、ダメだろうと思いつつもチャレンジしたことがあります。
当然のようにダメでした。近しい値にすらならん。ま、やっぱり用法用量を守ることは大事。
以上を踏まえて
機械学習の学習ってのは実は変数決める作業です。中身は結構地味であんまりおもしろくないです。
でも、そんなもんだと思えば別に大したことはありません。
複数のモデルを組み合わせるというケースもありますが、結局組み合わせ方も変数で表現できるから、結局変数に帰着しちゃいます。
アンサンブルとかブースティングとかRandomForest といった系統の手法も学習したモデルをどんな形で結合するかって話になりますからね。
今回の結論
「学習は変数を決定する作業」
「すんごいたくさんの変数を決めないといけないので、変数の量は学習に必要なデータ量に影響を与える」
覚えときましょう。
この記事が気に入ったらサポートをしてみませんか?