機械学習記10日目 ~ パーセプトロン
機械学習の入門などを見ると、「分離問題」を解決するアルゴリズムとして、「ロジスティック回帰」や「サポートベクターマシン」「ニューラルネットワーク」などが紹介されていますが、どのアルゴリズムにおいても「パーセプトロン」という概念が基本にあるようです。そこで、まずは「パーセプトロンとは何か」から調べることにしました。
パーセプトロンには、「単純パーセプトロン」と「多層パーセプトロン」の2種類があります。「多層パーセプトロン」の方は、ニューラルネットワークやディープラーニングへつながる技術らしいです。複雑そうなので、明日のブログで書くことにします。今日は、「単純パーセプトロン」の方の勉強をしていきたいと思います。
▶単純パーセプトロン
単純パーセプトロンとは、学習データをクラス1かクラス2(1か0)のどちらかに分類するアルゴリズムです。このような分類方法を「2クラス分類」(2値分類)といいます。(図1)
単純パーセプトロンは、入力に対する出力が教師データと異なる場合、「重み」を変更してから次の入力に進みます。もし、出力が教師データと一致した場合、重みはそのままです。これを、繰り返して最適な重みを見つけるのが単純パーセプトロンの学習です。
▶バイアス
単純パーセプトロンには、入力とひも付く「重み」がありますが、実際の計算では重みに「バイアス」という値を加えて、重みを特定の方向に偏らせることができます。このバイアス値も、学習中に調整されます。
▶活性化関数
活性化関数は、入力信号の総和がいくつになったら出力するのかを決める関数です。一般的に、「単純パーセプトロン」は1か0を出力するので、活性化関数には「ステップ関数」が使われます。
ステップ関数をPythonで実装してmatplotlibでグラフにしてみます(図2)。
▶単純パーセプトロンの学習方法
もう少し、単純パーセプトロンがどのようにクラスを分類するのかを調べていきます。
図3のような、クラス1とクラス2を2分する直線のあるグラフを考えます。このような直線を「決定境界」、直線でクラスを分割できることを「線形分離可能」といいます。
決定境界の直線は、未知のデータが入力されたとき、そのデータがクラス1に分類されるのか、クラス2に分類されるのかを決めます。この、決定境界の直線を引くには、「重みベクトル係数」を求める必要があります。
重みベクトル係数の求め方は、まず、最適な決定境界は引かれてるとして、直線を境に正の側と負の側に分けます(図4)。
このように、正の側にあるのか負の側にあるのかを判断する関数を「識別関数」といいます。そのために、決定境界を「識別面」と呼ぶ場合もあります。次に、負の側のデータを反転移動して正の側に移動します(図5)。
このように、片方のデータを反転移動しても決定境界自体に影響はありません。つまり、クラス1のデータを負のデータ、クラス2のデータを正のデータとする決定境界は、クラス1のデータを正側に反転させて「重みベクトルを法線ベクトルとする直線」を求めればよいことになります(図6)。
この「重みベクトルを法線ベクトルとする直線」を引くために、重みベクトルの係数Wを求めます。この係数は決定境界を導き出すための「パラメータ」とも呼ばれます。
それでは、単純パーセプトロンで決定境界を得るためにどのようにして重みベクトルの係数を得るのか説明します。ここでは、ラベル1のデータをクラス1(決定境界の負の側)に、ラベル2のデータをクラス2(決定境界の正の側)として分離することにします。
まず、適当な係数を用意して「仮の決定境界」を引いておきます(図7)。
次に学習データを読み込みますが、もし、ラベル1なら反転した値にします。
読み込んだ学習データが、「仮の決定境界線」の正の側にあるのか負の側にあるのかを判断します。もし、正の位置にある場合は、重みベクトルの係数はそのままです(図8)。
しかし、読み込んだデータが負の位置にある場合は・・・(図9)。
重みベクトル係数を変更して、傾きを回転させてデータが正の位置に来るようにします(図10)。
こうして、学習データを読み込みながら、重みベクトルの係数を逐次調整します(図11)。
データの読み込みが完了すると、すべてのデータが正の位置に来ます。これにより、「重みベクトルを法線ベクトルとする直線」が引けることになります(図12)。
反転してあったラベル1のデータを再び反転させると、この直線は2つのデータを2等分する決定境界になっています(図13)。
▶クラスが複数ある場合
ここまでは、クラスが2つの場合でしたが、クラスが3つ、4つと増えた場合は、決定境界をたくさん引くことになります。たとえば、図14のように線形分離が可能な場合があります。