前回はニューラルネットワークは素子を一列に並べた3層構造だけでも関数の再現能力があるっていう話でした。
今回は「じゃあどうやってある関数に似せるのか」という話です。
希望の関数に近づける
ある入力をした時にある出力をする関数があるとします。そして、その関数の式がわからない。これが現実の世界です。
「デートに行きませんか?」と言って「やめておきます」という結果が出てくるまでは自分で調べられますが、相手の頭の中でどういう処理がされて、なんでこの結果になったのかは謎です。
人工ニューラルネットワークも元から決まっている関数なら似せるのはとても簡単ですが、わからないものに対処するためのニューラルネットワークです(そもそもわかってるなら式でいいですからね)。
じゃあどうするかというと、関数はわからないけどいくつかの入力と出力の結果は持ってるわけです。それを使って「じゃあこういう入力した時はこういう出力になるように」とそのデータを使って”学習”させるわけです。
この学習に使うデータを教師データって言います。まんまですね。
教師データには沢山の入力とその時の正解の出力が入っています。例えば入力が100なら50が正解と言った具合に。
それでなにをやるかというと、ニューラルネットの前回までやった閾値や重み付けの値を変えていきます。
最初はとりあえず適当に決めた値で作っちゃいます。そして、適当に作ったニューラルネットに100を入れてみるわけです。その時に80とかの答えが出てきたら「あ〜あと30大きいから30ぐらい結果が小さくなるように色々減らさなきゃ」となるわけです。
理想はニューラルネットの出力が教師データと同じになることです。そのためにズレ(誤差)を元に「もうちょっと少なくなるように」「もうちょっと多くなるように」微調整していきます。
のちのち、実際にニューラルネットの何を変えていくかを紹介しますが、まずは「どうやって誤差を小さくするのか」について話します。それにはニュートン法(勾配法の基礎)を使います
差とニュートン法
グラフを用意しました。
さっきの教師データ 80入力で50出力が理想とした時にニューラルネットワークのいろんなパラメーターを変えて出てきた出力が下の図の青だとします。
誤差というのはニューラルネットの出力(青い線)と教師データの出力(赤い線=50)の差のことです。この差だけをグラフにするとこうなります。
この時に誤差が最も小さくなる場所が作りたいニューラルネットのパラメーターということになります。
ニュートン法
ニュートン法というのは中身が謎な関数があったときに「答えがYになるようなxってどこか」を求めるやり方です。ここでYを例えば0とかにすれば0になるようなxを探せます。もし関数が正の出力しかしないならそれで最小が探せますね。
さて、ここにある謎関数があります。
y=(x-2)^2です。
「関数分かっとるやないかい!」という突っ込みはしないで下さい。
確かに、わかってるので最小値はx=2のときのy=0ってのは中学生でも分かりますが、今回は練習。
さて、この関数の導関数も分かっちゃうとしますy’=2x-4です。
で、僕らはこのf(x)がわかりません。だけど入力したら出力できるとします。この時にyが0になるのはどこか、どうやって調べましょう。お、何個か思いつきました
1) おなじ間隔で調べる x=1 x=2 x=3 ,,,,
2) とりあえずxを決めて値が小さくなる方にxを動かしていく
さて、1だと大変です。何故ってマイナス無限からプラス無限まであります。
ということで2をやってみます。なんでもいいから値を決めます。じゃあ3。
x=3だとyは1になるようです。
さて、ここでxをちょっとずつ動かしたいのですがどうしましょう。まずxを増やせばいいのか減らせばいいのか。
それを知るために微分を使います。y'(3) = 2*3-4なので2です。どうやらx=3ではxが1増えるとyが2増えるような傾きをしているらしいです。上り坂ですね。じゃあyを減らすためにはxも減らさないといけないですね。
どのぐらい減らしましょう。1ぐらいにしとく?7とか?
でも、どうせ微分がわかってて傾きが計算できるんだからそれを使いたいですね。。y’が2なので、この場所はxを1増やすとyが2増えることがわかっています。
だったら!今yをあと1だけ減らしたいんだからxを0.5だけ左に動かせば2*(-1)で1減って0になりそうですよね!今の計算は
xの動かす量 = – y(x)/y'(x)
で計算しました。これがyが0なxを探すニュートン法です。
つまりニュートン法とは
1) 適当にx決める
2) その場所のyとy’を得る
3) 誤差とy’からyが理想の値になるようなxを計算して 2)に戻って繰り返し
ということです。
ちなみに傾きは一定じゃないので一発では決まりません。さっきのも0.5動かしたって x=2.5で、正解の2までまだ0.5ズレてます。
でもこれをずっと繰り返していけばかなり近づいていきます。xがほとんど動かなくなったらゴールです。
ということで謎な関数でも入力と出力とその場所の微分値が分かるならあるyを出すxを探すのは難しくないんです。
勾配法とは
ただ、ニュートン法だと答えを決めないといけません。「つまりyが0になるようなx」みたいな。
でも謎な関数ですから最小値なんかそもそもわかりません。
そんな時は勾配法です。勾配法はニュートン法と同じですが最小値が謎なので「・・・まぁ、ちょっとずつ動かしてこうぜ、微分も考慮しながら」っていうのが勾配法です。さっきのニュートン法が
xの動かす量 = – y(x)/y'(x)
こんなのでしたが、勾配法になると
xの動かす量 = – α y(x)/y'(x)
αみたいな数字がついてきてこれに小さな値を入れます。ビビリ係数です。
つまり答えがわからない以上ちょっとずつ動かすしか無いのでαに小さめの値を入れてちょっとずつ動かしてyをどんどん小さくしていきます。で、最小な場所を探す。
αをどのぐらいにするのかが問題になってきそうですが、でもこれで謎関数の最小値を探せそうですね。
ニュートン法と勾配法の問題
さて、実はこのやり方には根本的な問題があります。それは、この絵を見ればわかると思います。
谷が2つ以上あるとき、適当に決めたxから動かして谷底に落ちて「ここが最小だ!右に行っても左に行っても増えるぞ!」ってなります。
こういう問題はありますが。それでも適当な場所から一番近い最小をさがせるわけですからよく使われています。
まとめ
- ニューラルネットワークをある関数に近づけることを学習という
- ある関数の中身は謎だけど、教師データというのがある
- 教師データとの誤差を小さくするのに勾配法を使う
- 勾配法はニュートン法をちびちびビビりながら行うこと
- 本当の最小じゃないところで留まる可能性がある
最急降下法とニュートン法を区別しましょう