単純パーセプトロンをExcelに実装して2値分類問題を解いてみた。
2値分類問題とは?
倉庫の中の従業員が熱射病になり易い条件を調べるために、次のようなデータを採りました。
グラフにすると次のようになります。
このグラフの点線のように、熱射病になる境目の条件をニューラルネットワークで求めてみましょう。
このように任意のデータを2つのクラスに分ける問題を2値分類問題といいます。
これはニューラルネットワークの中でも最も簡単な単純パーセプトロンで求めることができます。
>> 【初心者向け】ニューラルネットワークの仕組みをわかりやすく解説
単純パーセプトロンのアルゴリズムを2値分類問題で理解する
求める境界線を定式化する
まずは問題を式で表現するところからスタートします。
境目の線は直線ですから、中学校で習った一次関数で表現できます。
一次関数の式は
y=ax+b
でしたね。
これでも良いのですが、この式は横軸がx、縦軸がyの場合にしか使えません。
ということは2つの変数の場合しか使えません。
今回は温度と湿度しか変数がないためこれでいいのですが、今後3変数以上になっても大丈夫なように変数をx1、x2、、、xnで表すことにします。
すると、式もy=ax+bではなくて次のように表します。
0=w0+w1x1+w2x2+...+ wnxn
今回の例では、温度をx1、湿度をx2とすると、次のような式になります。
0=w0+w1x1+w2x2
これが境目を表す点線の式です。
この式の中のw0、w1、w2をこれから単純パーセプトロンで求めていくことになります。
さて、このように定式化すると熱射病になる点とならない点とを簡単に識別できるようになります。
なぜでしょうか?
下のグラフを見て下さい。
このグラフを地図だと思って下さい。
地図では、それぞれの地点に緯度と経度がありますね。
緯度と経度は座標ともいいます。
このグラフでも同じです。
15個の点はすべてx1とx2の座標を持っていますね。
その座標の値を
w0+w1x1+w2x2
に代入すると、オレンジ色の点はプラスに、青色の点はマイナスになります。
なぜでしょうか?
直線上には点はありませんが、あると仮定しましょう。
そうすると、直線上の点の座標をw0+w1x1+w2x2に代入すると
w0+w1x1+w2x2=0
になりますね。
これが直線の式なのですから、直線上の点ではいつもこの方程式が成り立ちます。
逆にいうと、直線上以外の点ではプラスかマイナスかのどちらかになります。
すると、直線より上側がプラス、下側がマイナスになることが直観的に理解できると思います。
ですので、
u=w0+w1x1+w2x2
として、uがプラスになるかマイナスになるかを調べれば、熱射病になるかならないかが分かります。
更にもっといいことも分かります。
uの値は、その点から直線までの距離に比例するのです。
点(x10,x20)から直線0=w0+w1x1+w2x2までの距離は
で計算できます。
>> 【3分でわかる!】点と直線の距離の公式の証明、使い方のコツを分かりやすく
ですので、uを値を求めれば、その点が熱射病のエリアに入っているかどうかだけでなく、どのくらい境界線から離れているかまで分かるのです。
これはとても重要で、後でこの性質を使います。
誤差関数を定式化する
さて、これで定式化できましたので、後は直線の係数w0、w1、w2をどのように決めるかです。
これをコンピュータでやらせるために、以前の記事で紹介した勾配降下法を使います。
>> 【Excelでわかりやすく】勾配降下法で最小値が見つかる理由を視覚的に理解する
>> 【例題をExcelでわかりやすく】最急降下法で単回帰の最小二乗法を解いてみる
勾配降下法の手順は次の通りです。
- 各パラメータ(w0、w1、w2)の初期値をテキトーに決める
- 教師データとの差を表す誤差関数を計算する
- 誤差関数をパラメータごとに偏微分して傾きを求める
- 傾きと逆方向にパラメータを少し動かす
- 2へ戻り、3の傾きがほぼゼロになるまで繰り返す
順に詳しく見ていきましょう。
1はいいですね。
2で「教師データ」という初めて聞く言葉が出てきます。
これは今回の例でいうと、下表の15組のデータが教師データです。
要するに機械学習させるための教材です。
私たちが知りたいのは、温度と湿度が分かった時に、熱射病になり易いかどうかということですね。
今回は教師データは15組しかありませんが、少なくともこの15組の温度と湿度との組み合わせにおいては、単純パーセプトロンで正しく分類できないと話しになりませんね。
ですので、(w0、w1、w2)を更新する度に、教師データと答え合わせをしてやる必要があります。
この答え合わせをするために誤差関数(損失関数ともいう)を使います。
単純パーセプトロンでの誤差関数は次のように定義します。
E=max(0, -tu)
ここでt=1(教師データがYesの時)、t=-1(教師データがNoの時)。
なぜこのような式にするのかということを説明する前に、どうなれば正しいといえるのかということを確認しておきましょう。
勾配降下法では(w0、w1、w2)を初期値から少しずつ変えていきますが、その度に
u=w0+w1x1+w2x2
の式に基づいて、uを計算します。
x1とx2には15組のデータを順々に入れていくのですが、その度に教師データがYesの時にuがプラスになっているかどうか?また、教師データがNoの時にuがマイナスになっているかどうか?をチェックします。
このことが分かっていれば、先ほどの誤差関数がなぜそうなるかが理解できます。
教師データがYesの時にはuがプラスなら正解ですね。
この時、誤差関数のtは1ですので、-tuは-uになります。
つまり-tuはマイナスです。
すると
E=max(0, -tu)
はゼロになります。
逆に教師データがYesの時にuがマイナスなら不正解ですが、この時は-tuはプラスの数になりますので、
E=max(0, -tu)
は-tuになります。
tは1ですので、-uです。
教師データがNoの時でも同じです。
正解の時はE=0になり、不正解の時はE=uになります。
つまり、誤差関数をこのように定義しておけば、正解の時にはE=0になり、不正解の時にはEはuの絶対値になり都合が良いのです。
先ほど、uの大きさは点から直線までの距離に比例するといったのを覚えていますか?
それがここで効いてきます。
誤差関数をこのように定義することによって、
- 正解の場合はゼロ
- 不正解の場合はどのくらい間違っているのかを表すuの絶対値
を返してくれるのです。
これは(w0、w1、w2)を更新する時に、誤差関数が大変役に立つことを示しています。
パラメータを偏微分して勾配を求める
次に、勾配降下法のステップ3を説明します。
勾配降下法ではパラメータである(w0、w1、w2)をそれぞれどのくらい動かすかを、各パラメータを偏微分した値で決めます。
>> 【Excelでわかりやすく】勾配降下法で最小値が見つかる理由を視覚的に理解する
ニューラルネットワークではこの偏微分が難しいのですが、単純パーセプトロンでは簡単です。
u=w0+w1x1+w2x2
をw0、w1、w2でそれぞれ偏微分すると次のようになります。
∂u/∂w0=1
∂u/∂w1=x1
∂u/∂w2=x2
偏微分がよく分からないという人はこちらのサイトを参考にしてみて下さい。
>> 必ずわかる!微分・全微分・偏微分|宇宙に入ったカマキリ
とても簡単な値になりますね。
例として15組のデータのうち、1組目のデータで見てみましょう。
x1=27
x2=53.2
ですね。
u=w0+w1x1+w2x2
ですから、(w0、w1、w2)の初期値が(10,10,10)であれば
u=10+10×27+10×53.2=812
になります。
この時の教師データはNoですから、uはマイナスになっていないといけません。
ですからこれは間違いで、誤差関数E=812になります。
それでは次に(w0、w1、w2)をどれくらい動かせば良いかというと、勾配の値分だけ、勾配と逆方向に動かします。
(w0、w1、w2)それぞれの勾配は、
∂u/∂w0=1
∂u/∂w1=x1=27
∂u/∂w2=x2=53.2
ですね。
ですから、w0は10から9に、w1は10から-17に、w2は10から-43.2に動かします。
勾配に学習率を掛けて調整する
でもよく見ると、少しずつ動かすという割には、随分と大きく動かしすぎですね。
ですので、普通は勾配に1より小さい係数を掛けてから引きます。
この係数のことを学習率といいます。
学習率を小さくするほどパラメータ(w0、w1、w2)をゆっくり動かすことになりますので、収束(学習)するのに時間がかかります。
が、大きくし過ぎるとパラメータが行ったり来たりしてしまい、収束しなくなってしまいます。
ここでは学習率を0.01としましょう。
すると、w0は10から9.99に、w1は10から9.73に、w2は10から9.468に動かすことになります。
これで勾配降下法のステップ4まで説明してしまいました
以上を、15組のデータすべてについて誤差関数Eがゼロになるまで繰り返します。
そうすれば単純パーセプトロンは学習し終わったということになり、(w0、w1、w2)が適正な値になります。
つまり、その時の
0=w0+w1x1+w2x2
が、熱射病のエリアとそうでないエリアをきれいに分ける直線になるということです。
単純パーセプトロンをExcelに実装する
それでは、このアルゴリズムをExcelで試してみましょう。
Excelシートには次のように入力します。
注意すべき点がいくつかあります。
一つ目
学習の元になる教師データは15組ありますが、これを1組目から15組目まで行を変えて一つずつ学習させていきます。
学習させるとは、(w0、w1、w2)を勾配降下法により少しずつ変化させるということです。
この学習は15組の教師データを一巡させても全然終わりません。
何度も何度も同じ15組のデータで繰り返します。
ちなみに今回のシミュレーションでは、15組の教師データを393回読み込ませてやっと終了しました。
二つ目
(w0、w1、w2)のパラメータのことを、ニューラルネットワークでは重みといいます。
これはノードをつなぐ線の太さを表します。
重みが大きいほど、前のノードから来る信号を沢山通すようなイメージです。
三つ目
I列に出力f(u)があります。
Excelの関数を見れば分かるように、これはuがゼロ以上の場合は1、マイナスの場合は-1を出力する関数です。
uの値を見ながら、(x1,x2)の点が熱射病エリアに入っているかいないかを判定しているのです。
ですのでG列の正解データとf(u)が同じなら正解、異なるなら不正解と判断できます。
このf(u)のことをニューラルネットワークでは活性化関数といいます。
従って、先ほどの図は正確には次のようになります。
四つ目
K列ではf(u)が正解ならゼロ、不正解なら1を出力するExcel関数を入れています。
そしてO列の収束判定では、K列が15行連続でゼロになったら学習完了と判断するための関数を入れています。
結果は先ほどいいましたように、393巡目で収束しています。
この時の(w0、w1、w2)は(-97.6、2.056、0.663)です。
これが学習結果です。
つまり、熱射病エリアとそうでないエリアを分ける直線は
0=-97.6+2.056x1+0.663x2
ということです。
これをグラフに描くと次のようになります。
きれいに分ける直線が単純パーセプトロンで求めることができました。
なお、同じ問題をサポートベクターマシンでも解くことができます。
興味のある人は、こちらも読んでみて下さい。
サポートベクターマシンをExcelに実装して2クラス分類問題を解いてみた。