どれがどれだっけ、ってなってたので知識の整理。
どれも単一層のニューラルネットワークです。
重みの更新の仕方や、損失関数の定義、活性化関数などが違います。
重みと入力ベクトルの内積をとるところは一緒。
$$z=w\cdot x$$
その結果をどうするかによって違いが出ます。
パーセプトロン
内積の結果得られる$z$をそのまま量子化器に入れて分類。重みの更新には$z$ではなく量子化後の出力ラベルを用います。
すなわち、出力ラベルが正解だったら何もしない、間違ってたら重みを更新する、といった感じ。損失関数とか最適化アルゴリズムとかも出てきません。
パーセプトロンについては、こんな記事も書いてます。
scikit-learnでパーセプトロンを実装して標準化の効果を実感したお話
ADALINE
パーセプトロンから、重みの更新のところを改良したのがADALINE。
量子化後の出力ラベルを見て重みの更新をするのではなく、内積を計算して得られる$z$を用いて重みを更新しようぜ、っていうコンセプト。
出力方向の計算はパーセプトロンと一緒で、重みの更新だけ異なります。
ADALINEでは損失関数を定義して、その損失関数が小さくなるように重みを更新していきます。
これ以降、機械学習のアルゴリズム全般に「損失関数を定義してこれを小さくしていく方向で重みを更新していく」という流れがやってきたらしい。
ADALINEの損失関数は誤差平方和で定義されます。
正解ラベルと$z$の差(誤差)の平方のデータの個数分の和です。
データの個数分の和といったように、ADALINEではバッチごとに学習をまとめて行うようにもなりました。
損失関数を減少させる重みを見つけるアルゴリズムには、勾配降下法を用いています。
バッチごとにまとめて更新するので、バッチ勾配降下法と呼ばれたりもする。
ロジスティック回帰
ロジスティック回帰は回帰という名前が付いているのに、分類問題に用いられるというややこしいアルゴリズムです。
ロジスティック回帰は前作ADALINEからさらに改良されたアルゴリズムになっています。
ADALINEでは重みの更新に内積の計算結果$z$をそのまま用いていましたが、ロジスティック回帰ではこの$z$にロジスティック関数を作用させたものを用います。
ロジスティック関数はシグモイド関数とも呼ばれ、以下のように定義されます。
$$f(x)=\frac{1}{1+\exp (-x)}$$
$$f(x)=\frac{1}{1+\exp (-x)}$$
グラフはこんな感じ。
これによって、内積$z$を大きさが0~1の値に変換することができます。
大きさが0~1なので、これは入力したデータがあるクラスに分類される確率と捉えることができます。
あるクラスに分類される確率を計算できるようになるので、分類結果だけでなく。分類の確信度のようなものが数値化されて出てくるようになります。
現実でも、明日の天気が晴れか雨かだけでなく、「どのくらいの確率で雨が降るのか」という情報は需要があったりしますよね。
このようなメリットもあり、ロジスティック回帰は実務でも利用されることの多いアルゴリズムではないかと思います。
ADALINEでは損失関数に誤差平方和を用いていましたが、
損失関数には対数尤度関数というものを用います。
重みの更新はこの損失関数を減らすように勾配降下法を用いて行います。
多クラス拡張について
でも紹介したとおり、クラスの個数だけ判定器を作って、$z$の絶対値が最大のクラスに分類するという形で拡張します。
one-vs-rest法と呼ばれたりします。
これに対して、任意のクラスを二つ選んできてどちらのクラスに属するかを判定する判定器を${}_n C_2$($n$はクラスの個数)だけ用意して多数決的なことをする手法をone-vs-one法と言います。
しかし、ロジスティック回帰も同じ感じで拡張されるのかと思いきや、調べてみるとちょっとちがうっぽい?
ロジスティック回帰は、活性化関数(ここではシグモイド関数)をソフトマックス関数に変え、損失関数を対数尤度関数から交差エントロピー関数に変えることで多クラスに拡張できます。
この変更に従って、教師ラベルもスカラーからonehotベクトルに変更します。
むー。参考書や記事によっては、one-vs-rest法で多クラス拡張するって書いてあるものもあるんですが、どうなんですかねえ。
まあでもこれで僕は納得はできるので、ロジスティック回帰の多クラス拡張はこれであってるんじゃないかと思います。
(むしろone-vs-rest法でロジスティック回帰を多クラスに拡張するのってどうやるんだって気もします。確率の解釈とか謎な感じにならね?)
おわりに
パーセプトロンからADALINE、そしてロジスティック回帰までの進化の流れを追いつつ知識の整理をしてみました。
0 件のコメント:
コメントを投稿