LoginSignup
1
6

More than 5 years have passed since last update.

機械学習のための数学メモ #3 (分類)

Last updated at Posted at 2017-11-03

復習と頭の整理のためにメモとして書いていきます。随時、追記していきます。

分類

画像が縦長か横長か、2つの分類先に分ける二値分類について考える。
スクリーンショット 2017-10-29 12.36.34.png
スクリーンショット 2017-10-29 12.36.42.png
データ : 高さと横幅の部分
ラベル : 形の部分
スクリーンショット 2017-10-29 16.46.18.png

表の内容をプロットすると次のようになる。
スクリーンショット 2017-10-29 16.48.27.png
更に、データ数を増やしてみる。
スクリーンショット 2017-10-29 16.48.51.png

再度、プロットすると次のようになる。
スクリーンショット 2017-10-29 12.37.08.png
これは、次のように線を引いて分類できる。
スクリーンショット 2017-10-29 12.37.20.png

分類の場合は、図形的に解釈するとわかりやすいから、大きさと向きを持った矢印のベクトルをイメージするといい。
スクリーンショット 2017-10-29 12.37.30.png
先の線は、重みベクトル法線ベクトルとする直線ということになる。
(注意)
スクリーンショット 2017-10-29 16.55.30.pngは重みベクトルというパラメータで、法線は、ある直線に対して垂直なベクトルのこと。

ベクトル同士の内積について
実ベクトル空間の内積は各要素の積を足し上げたものだから、次の式と同じ意味ということ。
スクリーンショット 2017-10-29 12.37.36.png

今回の縦幅と横幅を求める式は次のようになる。
スクリーンショット 2017-10-29 12.37.42.png
スクリーンショット 2017-10-29 16.55.30.png = (1, 1)のとき
スクリーンショット 2017-10-29 12.37.53.png

スクリーンショット 2017-10-29 17.02.57.pngとなり、傾き-1の直線を表すということがわかる。
(内積の式は直線のグラフを表す。)

スクリーンショット 2017-10-29 12.37.58.png

重みベクトルスクリーンショット 2017-10-29 16.55.30.png = (1, 1)を書き加えると、スクリーンショット 2017-10-29 16.55.30.pngが直線に対して垂直になっていることがわかる。

次の学習データがあるとき、
スクリーンショット 2017-10-29 12.38.41.png
スクリーンショット 2017-10-29 12.38.47.png

縦長か横長かを判定する関数(つまり1か-1を返す関数スクリーンショット 2017-10-29 22.28.06.png)は識別関数という名前がついている。

スクリーンショット 2017-10-29 12.38.58.png
スクリーンショット 2017-10-29 12.38.52.png
スクリーンショット 2017-10-29 22.31.17.pngが負になるのはスクリーンショット 2017-10-29 22.32.15.pngのとき、つまり重みベクトルスクリーンショット 2017-10-29 16.55.30.pngとの成す角がスクリーンショット 2017-10-29 22.32.15.pngの範囲内、つまり直線を挟んだ重みベクトルの反対側の範囲。

スクリーンショット 2017-10-29 12.39.07.png
スクリーンショット 2017-10-29 12.39.14.png

重みベクトルの更新式は、次のようになる。
これをすべての学習データに対して繰り返し処理して重みベクトルを更新していく。
スクリーンショット 2017-10-29 12.39.45.png

スクリーンショット 2017-10-29 22.42.25.pngは、識別関数による分類がうまくいかなかった場合。
(横幅と高さのベクトルスクリーンショット 2017-10-29 22.43.43.pngを識別関数に通して分るいした結果と、実際のラベルyが異なっている)
それに対して、スクリーンショット 2017-10-29 22.44.50.pngは、識別関数による分類がうまくいったということ。
つまり、
スクリーンショット 2017-10-29 12.39.45.png
この式は、識別関数による分類に失敗した時だけ新しいパラメータに更新するよ、という式。
分類に成功した時は、そのままスクリーンショット 2017-10-29 16.55.30.pngを代入しているので何も変わらない。

では、詳しく分類に失敗した時の更新式スクリーンショット 2017-10-29 22.48.26.pngを見ていく。
重みベクトルは、回帰のパラメータ同様、ランダムな値で初期化するから、適当に以下のベクトルで考えてみる。

スクリーンショット 2017-10-29 12.39.52.png

スクリーンショット 2017-10-29 22.51.16.pngというデータがあるとき、これでパラメータを更新することを考えてみる。
スクリーンショット 2017-10-29 12.40.00.png
スクリーンショット 2017-10-29 12.40.12.png
お互いのベクトルはほぼ反対を向いているからスクリーンショット 2017-10-29 16.55.30.pngスクリーンショット 2017-10-29 22.55.58.pngの成す角θスクリーンショット 2017-10-29 22.32.15.pngになって、内積は負になる。
したがって、識別関数スクリーンショット 2017-10-29 22.57.16.pngによる分類は-1となる。

つまり、スクリーンショット 2017-10-29 22.42.25.pngになって、分類に失敗したという状態。
更新式が適用され、スクリーンショット 2017-10-29 22.59.47.pngより、
スクリーンショット 2017-10-29 12.40.19.png

このグラフは次のようになる。
スクリーンショット 2017-10-29 12.40.25.png

ここで面白いのは、新しい次のスクリーンショット 2017-10-29 16.55.30.pngスクリーンショット 2017-10-29 23.04.15.pngで、その新しい重みベクトルに垂直な直線(識別関数)は回転したこと。

スクリーンショット 2017-10-29 12.40.30.png
これでスクリーンショット 2017-10-29 22.55.58.pngは直線を挟んで重みベクトルと同じ側に持ってくることができた。

スクリーンショット 2017-10-29 23.09.24.pngなので、内積が正になり、スクリーンショット 2017-10-29 22.28.06.pngによる分類は1になる。
スクリーンショット 2017-10-29 22.59.47.pngなので、分類に成功したということになる。
スクリーンショット 2017-10-29 12.40.37.png
このように、パラメータの重みベクトルは更新されていく。
この更新をすべての学習データについて繰り返していくことがパーセプトロンの学習ということになる。

ロジスティック回帰/シグモイド関数

ロジスティック回帰は、分類を確率として考えるので、アプローチの仕方が異なる。

横長を1、縦長を0とすると、
Q. 縦長を今回−1にしなかったのは何故か?
更新式を簡潔にするための便宜上の理由。本当はどちらでもいい。

回帰の関数スクリーンショット 2017-10-29 12.40.58.pngは、勾配降下法を使ってθを学習し、そのθを使って未知のデータスクリーンショット 2017-10-30 0.32.32.pngに対する出力値を求めることができた。

このように、未知のデータがどのクラスに分類されるかを求める関数スクリーンショット 2017-10-30 0.33.44.pngが必要で、次のような式になる。
スクリーンショット 2017-10-30 0.34.36.png
ちなみにスクリーンショット 2017-10-30 0.37.02.png = スクリーンショット 2017-10-30 0.37.20.pngなので、スクリーンショット 2017-10-30 0.37.47.pngは、スクリーンショット 2017-10-30 0.38.09.pngと書き換えることができる。

スクリーンショット 2017-10-30 0.39.40.pngを横軸、スクリーンショット 2017-10-30 0.33.44.pngを縦軸だとする、シグモイド関数は次のようなグラフになる。
スクリーンショット 2017-10-29 12.41.18.png

シグモイド関数の特徴は、スクリーンショット 2017-10-29 12.41.53.png
スクリーンショット 2017-10-29 12.42.16.pngのとき、スクリーンショット 2017-10-29 12.42.22.png

シグモイド関数は、スクリーンショット 2017-10-29 12.41.53.pngだから、分類を確率として考える上で便利。
未知のデータスクリーンショット 2017-10-30 0.32.32.pngが横長だとう確率スクリーンショット 2017-10-30 0.33.44.pngは、次のように表すことができる。
スクリーンショット 2017-10-29 12.42.28.png
スクリーンショット 2017-10-30 0.51.39.pngの中の縦棒は、条件付き確率、つまりスクリーンショット 2017-10-30 0.32.32.pngというデータが与えられた時に横長(スクリーンショット 2017-10-30 0.49.13.png)になる確率を表す。
スクリーンショット 2017-10-29 12.42.35.pngのとき、横幅である確率は70%だということ。=>横長に分類される。
スクリーンショット 2017-10-29 12.42.49.pngは横幅の確率が20%ということ。=> 縦長に分類される。

つまり、スクリーンショット 2017-10-30 0.56.12.pngの結果を見て、0.5をしきい値として横長か縦長かを分類される。
スクリーンショット 2017-10-29 12.42.53.png

つまり、
スクリーンショット 2017-10-30 0.59.34.pngのときは、スクリーンショット 2017-10-30 1.00.10.png
スクリーンショット 2017-10-30 1.00.39.pngのときは、スクリーンショット 2017-10-30 1.00.57.png
ということがわかる。

スクリーンショット 2017-10-29 12.43.10.png
スクリーンショット 2017-10-29 12.42.53.pngは、
スクリーンショット 2017-10-29 12.43.17.pngと書き直せる。
横軸を横幅(スクリーンショット 2017-10-30 1.04.55.png)、縦軸が縦幅(スクリーンショット 2017-10-30 1.05.08.png)のグラフを考える。
θの値をここでは適当に入れて
スクリーンショット 2017-10-29 12.43.24.png
スクリーンショット 2017-10-29 12.43.28.png
スクリーンショット 2017-10-30 1.08.20.pngをグラフに表すと次のようになる。
スクリーンショット 2017-10-29 12.43.34.png

つまり、縦長だと分類される領域は次のようになる。
スクリーンショット 2017-10-29 12.43.43.png

要するに、スクリーンショット 2017-10-30 1.11.41.pngを境界線として、分類している。
このようにデータを分類するための直線のことを決定境界という。
スクリーンショット 2017-10-29 12.43.51.png
今回は、パラメータθに適当な値を入れたので、上手く分類できていない。
次はそのθを求めるために、目的関数を定義して微分してパラメータの更新式を求める(ロジスティック回帰)。

スクリーンショット 2017-11-03 15.34.46.pngが横長である確率スクリーンショット 2017-10-29 12.44.04.pngスクリーンショット 2017-10-30 0.56.12.pngと定義したので、学習ラベルスクリーンショット 2017-11-03 15.36.18.pngスクリーンショット 2017-10-30 0.56.12.pngの関係は、
スクリーンショット 2017-11-03 15.40.00.pngのときスクリーンショット 2017-11-03 15.39.11.png
スクリーンショット 2017-11-03 15.40.09.pngのとき、スクリーンショット 2017-11-03 15.39.23.png

つまり、
スクリーンショット 2017-10-29 12.44.36.png

すべての学習データはお互い関係なく独立に発生すると考えると、この場合の全体の確率は、次のように表すことができる。
スクリーンショット 2017-10-29 12.44.45.png

この同時確率の式を一般化して次のように表すことができる。
スクリーンショット 2017-10-29 12.45.07.png

スクリーンショット 2017-10-29 12.45.30.pngをそれぞれ考える。

指数部のスクリーンショット 2017-11-03 15.47.51.pngに1を代入してみると、
スクリーンショット 2017-10-29 12.45.38.png

指数部のスクリーンショット 2017-11-03 15.47.51.pngに0を代入してみると、
スクリーンショット 2017-10-29 12.45.46.png

場合分けするより、1つの式にまとまって表記が簡単になっている。
目的関数がわかったところで、次は、目的関数を最大化するパラメータθを考える。
(回帰の時は誤差を最小化する、今考えているのは、同時確率。確率が高くなってほしいから、最大化する。)

目的関数スクリーンショット 2017-11-03 15.59.06.pngは尤度という。「もっともらしい度合い」という意味。
スクリーンショット 2017-10-29 12.45.07.png

対数尤度関数

これからは尤度関数を微分して、パラメータθを求めていく。
ただし、予め尤度関数は変形する(尤度関数の対数をとる)。
(確率は全て1以下の数で、同時確率のようなかけ算は、かけるほど値が小さくなっていくため。)
スクリーンショット 2017-10-29 12.46.20.png

logは単調増加関数(グラフがずっと右上がりで、スクリーンショット 2017-11-03 16.24.53.pngならスクリーンショット 2017-11-03 16.25.02.pngとなるような関数スクリーンショット 2017-11-03 16.27.07.pngのこと。)で、そのグラフの形はこのような感じ。
スクリーンショット 2017-10-29 12.46.27.png

スクリーンショット 2017-11-03 16.24.53.pngならスクリーンショット 2017-11-03 16.31.30.pngになっている。だから、尤度関数についてもスクリーンショット 2017-11-03 16.28.25.pngならスクリーンショット 2017-11-03 16.31.06.pngになる。
要するに、スクリーンショット 2017-11-03 15.59.06.pngを最大化することとスクリーンショット 2017-11-03 16.28.48.pngを最大化することは同じことになる。

それでは対数尤度関数を変形すると、
スクリーンショット 2017-10-29 12.46.47.png

次に、尤度関数の微分について
ロジスティック回帰は、この対数尤度関数を目的関数として使うことになる。
スクリーンショット 2017-10-29 12.47.25.png
これをパラメータθで微分していくと、
スクリーンショット 2017-10-29 12.47.31.png
次のように置き換えて、
スクリーンショット 2017-11-03 16.37.01.png
よって、
スクリーンショット 2017-10-29 12.47.47.png
まずは、スクリーンショット 2017-11-03 16.38.21.pngから計算すると、

スクリーンショット 2017-10-29 12.47.52.png

スクリーンショット 2017-11-03 16.39.23.pngの微分は、スクリーンショット 2017-11-03 16.39.28.png
また、スクリーンショット 2017-11-03 16.42.03.pngを微分すると、
スクリーンショット 2017-10-29 12.47.58.png
したがって、
スクリーンショット 2017-10-29 12.48.08.png

次は、スクリーンショット 2017-11-03 16.43.23.pngスクリーンショット 2017-11-03 16.43.28.pngで微分する。
ただし、スクリーンショット 2017-10-29 12.48.13.pngを微分することは、ややこしいので、以下のようなシグモイド関数の微分結果を利用して微分する。

スクリーンショット 2017-10-29 12.48.17.png

スクリーンショット 2017-11-03 16.45.31.pngとおいて、もう一段階、合成関数の微分を使う。

スクリーンショット 2017-10-29 12.48.24.png

スクリーンショット 2017-11-03 16.43.23.pngスクリーンショット 2017-11-03 16.47.17.pngで微分する部分が要するにシグモイド関数の微分のことなので、
スクリーンショット 2017-10-29 12.48.36.png

また、スクリーンショット 2017-11-03 16.47.17.pngスクリーンショット 2017-11-03 16.43.28.pngで微分すると、

スクリーンショット 2017-10-29 12.48.40.png

結果をかけあわせて、

スクリーンショット 2017-10-29 12.48.46.png

スクリーンショット 2017-10-29 12.48.52.png

あとは、この式からパラメータ更新式を導き出すだけ。今は最大化することが目的なので、微分した結果の符号と同じ方向に動かさないといけない。

スクリーンショット 2017-10-29 12.49.01.png

ηの前と、シグマの中の符号を入れ替えて、回帰の時と符号を合わせるようにして、次のようにも書ける。
スクリーンショット 2017-10-29 12.49.20.png

線形分離不可能

ロジスティック回帰を線形分離不可能な問題に適用する。
線形分離不可能な問題も、曲線であれば分類はできる。つまり次数を増やす必要がある。
スクリーンショット 2017-10-29 12.49.39.png

学習データにスクリーンショット 2017-11-03 17.16.37.pngを加えた以下のようなデータを考える。

スクリーンショット 2017-11-03 17.18.37.pngのとき、
スクリーンショット 2017-10-29 12.49.45.png
スクリーンショット 2017-10-29 12.49.50.png
θが以下のようなベクトルだったときのグラフの形を考えると、
スクリーンショット 2017-10-29 12.49.56.png
θをとりあえず代入して、
スクリーンショット 2017-10-29 12.50.01.png
よって、スクリーンショット 2017-11-03 17.24.05.pngとなる。

グラフに書くと次のようになる。
スクリーンショット 2017-10-29 12.50.10.png
このようにして、線形分離不可能な問題を解いて行く。
(今回はパラメータθがまだ適切ではないので、データを正しく分類できていない。)
例えば、好きなように次数を増やして、複雑な形の決定境界にすることもできる。

1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6