『パターン認識』 で課題が出ました。
パーセプトロンの学習規則により、重みを決定するプログラムを書け。
ただし、学習パターンは数直線上で与えられた1次元特徴とする。
すなわち、x1 = 1.2, x2 = 0.2, x3 = -0.2, x4 = -0.5, x5 = -1.0, x6 = -1.5 とする。
クラスω1はx1, x2, x3、クラスω2はx4, x5, x6とする。
このプログラムを使って、重みを決定せよ。
ただし、重みの初期値を w = (2, -7) とし、学習パターンはx1, x2,… x6の順に繰り返し与えることとする。
時間があれば、重みの初期値や修正量の大きさを変えても収束することを確かめよ。
……とはいっても、課題の意味自体がよく解っていない人も多いと思うので、今回はちょっとだけその話題を書きたいと思います。
ブログネタがないというのが正直なところですが。 今日は図と数式をいっぱい使うので、携帯ではなくパソコンから見た方が幸せになれると思います。
◆
【課題の解釈】
ぶっちゃけ、こういうことです。
『成人男性とピカチュウを (身長という情報だけを使って) 識別してみよう!』
……出された課題とは若干シチュエーションが異なりますが、まずは意味を理解するところから始めましょう。
◆
成人男性とピカチュウでは、身長が決定的に違いますね。
ピカチュウであれば、だいたい身長40cmくらいですし、人間ならば175cm前後でしょう。 個人差はありますが。
ですので、『身長』 を軸にした数直線上に、3人の成人男性と3匹のピカチュウの身長をそれぞれプロットすると、上の図のようになります。
ちなみにこれ、「『身長』 を特徴とした1次元の特徴空間」 と言います (言葉の定義はいい加減ですが、なんとなく感覚的にこういうものだと思って下さい)。
◆
で、両者を区別するためには 『境界点』 が必要です。 『ここより小さければピカチュウ、ここより大きければ人間』 という基準点の事ですね。
たぶん、うすうす感付いた人もいると思いますが、この例では直感的に境界を決める事が可能です。
運よく 『身長』 という1つの特徴量だけで両者を識別できるので、図形的にもイメージしやすく、識別境界のあたりをつける事も容易です。 したがって、この例題は少々わざとらしい気もするのですが……。
◆
しかし、『色』 『匂い』 『形』 など、特徴が多ければ多いほど、図形的なイメージが難しくなっていきます。
ちなみに 『色』 と 『味』 を軸とした2次元特徴空間の例はこんな感じです。
この場合、1次元の場合と違い、識別境界は 『点』 ではなく 『線』 になります。
3次元特徴空間上では、識別境界は平面に、4次元特徴空間では超平面に……。
我々が図形的なイメージできるのは3次元までですが、特徴量は容赦なく増える可能性があるため、どうにか境界を決めるための一般的な手法が欲しいわけです。
特徴空間の次元数に関係なく、うまい具合に識別境界を決める方法はないでしょうか?
実は、古典的手法ながらそこそこ使えるテクニックこそが 『パーセプトロン (以下略)』 なのです。
◆
とりあえず、計算を簡単にするために、特徴空間を拡張した 『拡張特徴空間』 というものを作ります。 “空間” を “拡張” するため、次元が一つ増えてしまいます。

『なんでわざわざ次元を増やすの?』 とか 『なんで縦軸の値が1なの?』 という疑問は、配布プリントを見て頂ければ解決すると思うのですが (←ええええっ!?)、こうすれば表記上スマートになるというただそれだけの理由からです。
そして、拡張特徴ベクトル x1 ~ x6 というのは、拡張特徴空間上にある各パターンの座標のようなものです。 ただし、(縦軸の座標値, 横軸の座標値)t という表記法なのでご注意を。
例えば、人間の x1 さん (身長179cm) の拡張特徴ベクトルは、(1, 179)t です。 右上の t は転置を意味しています。 ベクトルの第2要素がちゃんと特徴量 (身長) を表していますね?
同じように、ピカチュウの x6 さん (身長37cm) の拡張特徴ベクトルは (1, 37)t です。
◆
じゃあ、どうやって人間とピカチュウの境界を決めるかというと、適当な “重みベクトル (←なんかまたわけわかんないのが出てきた)” w = (w1, w2)t というのを持ってきて、
wtx1 > 0 かつ、wtx2 > 0 かつ、wtx3 > 0
かつ、wtx4 < 0 かつ、wtx5 < 0 かつ、wtx6 < 0
を、すべて満たすように w を微調整してやります。
要するに、x が 『人間クラス』 に属する場合、wtx は常に正になり、x が 『ピカチュウクラス』 に属する場合は wtx が常に負になるように w を調節してやるわけです。
じゃあ、wtx = 0 だったら……?
そう、そこが両者を分かつ境界となるわけですな。
◆
つまり、wtx = 0 を満たすベクトル x (ただし、x = (1, x1)t ) を求めれば、x1 (スカラー) が識別境界の境界点となるわけです。 ……大丈夫でしょうか?
wtx = (w1, w2)(1, x1)t = 0 を x1 について解けば、特徴空間上の識別境界となる点の座標が判明します。 答えを言ってしまうと、x1 = -w1/w2 だったような気がします。
ただし、課題では 『識別境界』 ではなく、重み w を求めるプログラムさえ書ければ大丈夫らしいので、今回は識別境界までは求めません。
◆
【アルゴリズム】
1) ベクトル w に適当な初期値を与える
2) x1 ~ x6 の中から適当に x をひとつ選ぶ (課題では、選択する順番も指定されているようだが)
3) w を使って、さっきの x が正しいクラスに識別されるかをテスト
→ x がクラス1 なら、wtx > 0 となるかどうか。 ならなければ、w を修正
→ x がクラス2 なら、wtx < 0 となるかどうか。 ならなければ、w を修正
4) これを、すべての学習パターン x1 ~ x6 が正しく識別されるまで繰り返す
◆
……という流れです。
w を修正する際は、適当な修正量ρ (←正の数) を使います。
もしも x がクラス1に属しているにも拘わらず、wtx < 0 となってしまった場合は、
w ← w + ρx
と w を修正。 逆に、x がクラス2に属しているにも拘わらず、wtx > 0 となってしまった場合は、
w ← w - ρx
と修正します。 もちろん、1回の修正ではうまく行かない事の方が多いのですが、何度も繰り返すうちにちゃんと収束する定理があります。
別にρは正なら何でもいいので、ρ = 1 と置けば、単純に
w ← w + x
または
w ← w - x
という修正でよくなります。
◆
結局、重み w が決まれば識別境界も求められるので、次に新しく 『身長190cm』 というデータが入力されたときにも、ちゃんと 『これは人間だ』 と識別できるようになるというわけですな。
まぁ、本物の課題は数値もちょっと違うし、クラス名も 『人間』 とか 『ピカチュウ』 ではなく 『ω1』 『ω2』 みたいに抽象度がアップしているのですが、基本的な考え方はこんな感じです。
……そして、実はこの課題、1年前と全く一緒の内容なので、参考までに 2008年4月30日に書いた日記へのリンクを貼っておく事にします。
ここには Perl で書いたプログラムのソースが載っているのですが……。 ほんのちょっと間違っているのであんまり参考にしない方がいいと思います。
最近のコメント