前回では
さて、前回で回帰をやったことで、機械学習における学習がなんとなくつかめたのではないかと思います。
今回はニューラルネットワークを用いて、本格的に学習を行っていきます。
が、書くことが結構多かったので2回に分けたいと思います。
今回はニューラルネットワークというものの説明をプログラミング抜きで試みます。
そして次回は実際にpythonを用いて簡単なニューラルネットワークを実装していきます。
それでは始めましょう!
その前に
機械学習とはどのように行うかをまとめておきたいと思います。
機械学習は学習フェーズと推論フェーズに分かれます。
例えば、年齢と体重から握力を推測する場合を考えてみましょう。
【学習フェーズ】
まずは学習の仕組みを持つプログラムを作ります。
その際、1から作るのではなく頭のいい人達がすでに提供してくれているライブラリを使えますので安心してください。
次にそのプログラムに大量のデータを投入します(これを訓練データと呼びます)。
このデータは[入力:出力]のペアのデータで、こういう感じの入力だったら結果はこうだったよ!
というふうに、答え付きのデータです。
30歳で67キロのこの人の握力は46キロだったよ。
15歳で56キロのこの人の握力は36キロだったよ。
と、このように[入力:出力]のペアのデータをプログラムに投入するのです。
するとプログラムがこれらのデータ入力から出力をいい感じに説明できる式を以下のように見つけ出します。
y = aA + bB
y:握力、A:年齢、B:体重
当然、実際はこんなに単純な式ではないですが、イメージはこれでオッケーです。
この式において、いい感じのaとbを発見すること。これが学習です。
【推論フェーズ】
さあ、プログラムは年齢と体重から握力を説明できる式を得ました。
この式はある人の年齢と体重が与えられたら本当に握力を推測できるのでしょうか?
ではさっそく訓練データの入力のデータを使って、、、ってこれダメですよね。
訓練データに合うように式をつくったんだから訓練データを推測できるのは当たり前です。
ここは訓練データ以外のデータを使ってこの式を試さないと、この式が訓練データだけに当てはまる使えないものである
可能性があります(この訓練データだけにピッタリあてはまっちゃうことを過学習といって機械学習の悩みのタネです)。
こういう場合に使う訓練データとは異なるデータをテストデータといいます。
このテストデータを先ほどの式に投入して正答率を出してやります。
そして正答率がOKといえるほど高かった場合に初めて、未知の入力に対しての予想に使えるものが完成したといえるのです。
まとめると、学習フェーズで訓練データを用いて学習し、推論フェーズでテストデータを用いて正答率を出すのです。
この過程を経て、競馬予想AIソフトを作っていきます。
ニューラルネットワーク
上で出てきた学習の仕組みを持つプログラムを、ニューラルネットワークを用いて作ります。
pythonで実装していきたいと思いますが、上で述べた通り、実際のコードを載せるのは次回ということにして、
今回はプログラム作成の前準備としてニューラルネットワークの仕組みを学びます。
上で訓練データにあう式を見つけることを学習と言いましたが、
それはつまり式におけるいい感じのaとbを決定することです。
このaやbにあたるものを重みといいます。
ニューラルネットワークはこの重みを訓練データから自動で学習できるという性質を持っています。
ニューラルネットワークは層を形成し、それは例えば以下のようになります。(よく見る図だと思います)
一番左の入力層に訓練データを入力します。すると自動的に計算が右に進んでいきます。
そして、一番右の出力層に結果が出力されます。
例えば入力層に年齢と体重を入力すると、何らかの演算の末に出力層から握力を出力します。
このとき、ニューラルネットワークは全体として
y = aA + bB
y:握力、A:年齢、B:体重
のような式の役割をしているのです。
そして、本来ならば入力から出力をはじきだす式はこんなに単純であるハズはありません。
例えば以下のような式になるのかもしれません。
y = \frac{ae^{ibA} + \sqrt{bA^2+aB^2} }{cosbA + isinaB}
y:握力、A:年齢、B:体重
いや、ビビらなくて大丈夫です。これは適当ですから。
ですが、年齢と体重から握力を計算する式はこれよりかなり複雑な式になるでしょう。
ましてや、年齢と体重と身長と親の握力と運動頻度から握力を計算するとなるともっともっと複雑です。
複雑な式を自分で設定して、最適な重みをみつける。想像しただけでもう無理です。
そんなあなたにニューラルネットワークなのです。
ニューラルネットワークを使うと何が嬉しいのか
さあ、あえてここで初めてニューラルネットワークとは何か定義を述べると、ただの計算モデルです。
しかしただの計算モデルといいつつもタダモノではないのです。
再び先ほどの図を示します。
入力層と出力層の間に層がありますよね。これを中間層(隠れ層)といい、これが複雑な式の役割を担うのです。
一つ一つは単純な演算にも関わらず、いくつも重ねることで、複雑な演算を表現することができます。
これがニューラルネットワークでモデルを構築する理由です。
ニューラルネットワークの最高な点は、我々人間はもはや式すら意識する必要がないということです。
訓練データを入力し答え合わせして誤差を修正することを何度も何度も繰り返すことで、
最適なある重みを持った何らかの式が勝手に構築されるのです。
そしてその式などもはや我々は知る必要がありません。
入力から出力を高精度ではじき出してくれれば中身はどうでもいいのです。
ということで競馬予想に必要なのは、「適切なニューラルネットワークを実装した学習の仕組みを持つプログラム」です。
ニューラルネットワークの学習の仕組み
それでは具体的にニューラルネットワークはどのように学習するのかを見ていきましょう。
学習とは一言で言うと、「重みを訓練データから自動的に決定する」ことです。
ステップで示すと以下の通りです。
**ステップ①:ある重みからなるニューラルネットワークに訓練データ[入力]**を入力する。
ステップ②:ニューラルネットワークは入力されたデータをある重みに基づいて左から右に演算し、出力する。
**ステップ③:出力したデータと訓練データ[出力]**を比較し、誤差を計算する。
ステップ④:誤差を基に右から左に演算し1、重みをどれだけ変えると誤差が最も小さくなるかを計算する。
**ステップ⑤:**ステップ④を手掛かりに誤差を一番減らすように重みを少しだけ更新する。
①~⑤を繰り返す
繰り返した結果、訓練データの入力と出力の関係をうまく説明できる重みをもつニューラルネットワークが構築される。
**ステップ①:ある重みからなるニューラルネットワークに訓練データ[入力]**を入力する。
ステップ②:ニューラルネットワークは順伝播を行い、演算結果を出力する。
ステップ③:出力したデータと教師データ(訓練データ[出力])を比較し、損失関数を計算する。
ステップ④:****損失関数を基に逆伝播し、勾配を計算する。
ステップ⑤:****勾配方向に重みを少しだけ更新する。
①~⑤を繰り返す
繰り返した結果、訓練データの入力と出力の関係をうまく説明できる重みをもつニューラルネットワークが構築される。
さあ、それではこの専門用語たちは実際どのような動作を表すのかを見ていきましょう。
しかし、ここまで結構長くやってきました。集中力はそんなに続きません。
この続きは次回にまわし、ニューラルネットワークの回は全3回としましょう。
まとめ
今回はニューラルネットワークの全体像をざっくりと説明しました。
そして1回で説明が終わるほど単純なものでもないし、しっかりと理解するためには理論を2回、実装を1回の
全3回構成が最低でも必要だと思いました。分かりやすく説明していくつもりなのでお付き合いください。
今回と次回でニューラルネットワークの仕組みはバッチリ!
と言えるようにするつもりです。
次回は以下の言葉を中心に説明していくつもりです。
【活性化関数】
【順伝播】
【逆伝播】
【損失関数】
【勾配】
せーの!サハスラーラ
理解しやすくするため、書籍とは違い、同じことを何度も記載することがあります。冗長に感じたらごめんなさい。
-
ここは難しいので次回詳しくやります
以上の流れとなります。
今後のために今の流れを専門用語に置き換えて言い直してみます。
同じことを言っているので、自分のものになるまで反芻してみてください。 ↩