JavaScriptによるパーセプトロン/Passive-Aggressive体験デモ

前回k-NNデモを作った後に「これパーセプトロンも同じようにデモ作れるんじゃね?」と思ったので実装してみた.今度はクリックでデータ点を追加できるようにしたり,サンプル選択方法を可変にしたり,PAの更新の様子を可視化すると面白いかもと思って後からPAも追加してみた.

パーセプトロンは誤分類するサンプルを正しく分類するように超平面を更新する線形識別器で,Passive-Aggressive (PA) は損失を発生させるサンプルに対して損失が0になり,重みベクトルの変化量が最小になるように超平面を更新するアルゴリズム

オンライン学習についてざっくりした俯瞰は以下の資料などをご参照.

というわけでk-NNと同じように公開.

使い方

Update onceボタンで初期値の超平面から更新を試みる.初期画面ではサンプルはランダムに選択されるので,誤りがない場合には超平面が更新されないことに注意.なお,損失が発生しているサンプルは赤色,そうでないサンプルは緑色のボックスで囲まれる.Trainボタンでは#iterationで指定された回数,Update onceボタンが押されたのと同じ挙動をする.

おすすめなのは,サンプル選択方法を"Misclassified"にして,Update onceボタンをカチカチやると超平面更新の様子がわかって面白いかと思う.分離超平面が見つかったあとに画面をクリックしてデータ点を追加し,更新によって超平面がどう変化するかを眺めることができる.

以下,それぞれのオプションの説明.

  • Additional instance label で追加データのラベルを選択可能
    • 画面上をクリックするとデータ点を追加することができる
    • 線形分離可能な超平面を発見した後に誤分類するサンプルを追加すると楽しいかも
  • Sample selection でlearnerに渡すサンプルを選択する方法を選ぶ.
    • Random: ランダムにひとつ選ぶ
    • Misclassified: 誤分類するサンプルをランダムに選ぶ (= 必ず超平面が更新される).PAの場合はヒンジロスで損失が発生するサンプルをランダムに選択.
  • Generate data で正規分布に基づいて訓練データを発生させることができる.

適当な感想

わかっている人間にとっては不要なデモだけれど,Misclassifiedオプションを選択してカチカチやってみると,おー,収束した,という感じを機械学習ナニソレな人に伝えたくて作ってみた.

Perrceptronで学習率が大きいとぶっ飛んでしまうことや*1PAで線形分離可能でないとMisclassified sampleに対してガタガタするのを体験することができる*2

やっぱり視覚化すると見ていて楽しい.また何かのアルゴリズムをやってみたい.次は決定木かブースティングあたりのデモを作ってみたい.

2012-06-05追記

パーセプトロンに学習率って必要だったっけ? というコメントを頂いたので自分の頭の整理を兼ねて以下の記事を書きました

*1:本当はfeatureをscalingすればよいのだけれど,面倒なのでしなかった

*2:ソフトマージン相当のPA-I, PA-IIを実装してもよかったけれど面倒だっ初心者向けなので敢えて実装しなかったキリッ