cl-online-learningの紹介
Satoshi Imai / 今井 悟士
Twitter: @masatoi0 Github: masatoi
これは何か
● cl-online-learning
●
書籍「オンライン機械学習」に出てくる線形
識別器のアルゴリズムからいくつか実装
● 2値分類と多値分類ができる
● githubにあります
– https://github.com/masatoi/cl-online-learning.git
インストール
●
シェルから
● Lisp処理系から
– SBCL、CCL、ECL、CLISPで動作確認済み
(ql:quickload :cl­online­learning)
 $ cd ~/quicklisp/local­projects/
 $ git clone https://github.com/masatoi/cl­online­learning.git
オンライン学習
●
バッチ学習: 訓練データをまとめて学習する
●
オンライン学習: 訓練データを逐次的に学習する
– とにかく速い: 収束が速い、データ数に対して線形時間、省メモリ
– リアルタイム処理に組込める
– 実装が簡単
– 偏りのあるデータ、ノイズのあるデータに弱い
→ 対策されたアルゴリズムが出てきた (AROW, SCW)
線形識別器
●
線形分離可能なデータに対して有効な二値分類器
● 識別関数f(x)が正か負かでクラスを分ける(xは入力データ点)
● 上手く分けられるようにパラメータ(wとb)を調整する
決定境界 f(x)=0
線形分離可能 線形分離不可能
非線形SVM(バッチ学習)
●
線形分離不可能なデータを高次元の特徴空間に射影して線形分離し
ている様子
– https://www.youtube.com/watch?v=3liCbRZPrZA
● 計算量はO(mn^2) (m: データの次元数、 n: データ数)
– データ数が増えてくると無理
– オンライン線形分類器だとO(mn)
● Common Lisp Machine Learningからフォーク
– clml-svm (github.com/masatoi/clml-svm)
cl-online-learningで実装している
二値分類アルゴリズム
●
二値分類
– パーセプトロン
– 平均化パーセプトロン
– 線形SVM
– AROW
– SCW-I、SCW-II
精度
良い
悪い
メタパラメータの数
なし
なし
2
1
2
パーセプトロン
● 学習データ: 入力x と 教師信号y の組
● パーセプトロン: 以下のルールでwを更新する
●
直近の学習データの影響を受けすぎる
→ 過去の w の更新差分を平均化 (平均化パーセプトロン)
の正負と y を比べてみて、分類に失敗していれば
w ← w + y x
AROW
● パラメータ w が、正規分布からサンプリングされたものと考える
– その正規分布の平均 μ と分散 Σ を更新する
●
精度良い、収束速い、学習も安定している ← おすすめ!
● メタパラメータとして正則化パラメータ γ を持つ
AROWは頑健
●
マージン最大化
– 決定境界から一番近いデータとの距離(マージン)を大きくとる
●
特徴量ごとに信頼度をつける
– 頻繁に出てきた特徴量の更新量は減らしていく
cl-online-learningで実装している
マルチクラス分類アルゴリズム
●
複数個の二値分類器を組み合わせてマルチクラス分類できる
●
マルチクラス分類
– 1対多 (one-vs-rest)
– 1対1 (one-vs-one)
– 誤り訂正出力符号(ECOC)
↑(予定)
必要な二値分類器の数
K個
K(K-1)/2個
K個とK(K-1)/2個の間
one-vs-rest
● クラスの数だけ二値分類器を用意: K個
●
学習時: 観測されたデータのクラスに対応する学習器では正例、そうで
なければ負例として学習
●
予測時: 全部の学習器で識別関数 を計算して最大の
ものに対応するクラスを出力する
1
2
3
各クラスに対応する
学習器
クラス2と
ラベルのついた
データ
教師信号を -1 として学習
教師信号を +1 として学習
教師信号を -1 として学習
one-vs-one
● 2つのクラスの組合せの数だけ二値分類器を用意: K(K­1) / 2 個
●
学習時: 観測されたクラスのノードに接続する学習器を学習
●
予測時: 全部の学習器で分類。多数決して一番多かったクラスを出力
1
5 2
4 3
エッジが学習器に対応
1
5 2
4 3
クラス2が観測されたとき
+1
-1
+1
-1
+1-1
+1
-1
ノードの数字が若い方を+1とした
使い方(二値分類)
●
学習器をつくる
●
データを1個用意 (double-float型のsimple-array)
●
更新する
●
予測する
(defparameter input 
  (make­array 3 :element­type 'double­float
                :initial­contents '(1d0 2d0 3d0)))
(defparameter plearner (make­perceptron 3))
(update plearner input 1d0)
(predict plearner input)
⇒1.0d0
教師信号
入力次元数
使い方(マルチクラス分類)
●
学習器をつくる
●
データを1個用意 (double-float型のsimple-array)
●
更新する
●
予測する
(defparameter input 
  (make­array 3 :element­type 'double­float
                :initial­contents '(1d0 2d0 3d0)))
(defparameter mlearner (make­one­vs­one 4 3 'arow 1d0))
(update mlearner input 2)
(predict mlearner input)
⇒1.0d0
教師信号(整数)
入力次元数 クラス数
学習器の型
学習器のメタパラメータ
データセットの学習
●
データセット: 教師信号と入力ベクトルのドット対のリスト
– Libsvmのサイトで公開されているデータセットを読み込む
●
訓練データをまとめて訓練する
●
テストデータをまとめて予測する
(defparameter a9a­dim 123)
(defparameter a9a­train (read­libsvm­data "/path/to/a9a" a9a­dim))
(defparameter a9a­test (read­libsvm­data "/path/to/a9a.t" a9a­dim))
(train plearner a9a­train)
(test plearner a9a­test)
; Accuracy: 79.988945%, Correct: 13023, Total: 16281
使用上の注意
●
スケーリング大事
– 入力の各次元が [-1, 1] の範囲に入るようにする
●
データの順序大事
– 同じクラスのデータが延々と続くような場合は性能悪化
●
必要なら順序をシャッフルする
iris
● 入力データ: アヤメの花びらとがくの大きさ (4次元)
● クラス数3、データ数150
番外:深層学習
●
特徴選択をどうするかは職人芸
→ 深層学習
●
ニューラルネットはオンライン学習できるが、更新ごとの計算量が大きい
– ミニバッチをつくってまとめて計算
● GPU向きの計算(大きな行列×行列の計算)
● cl-cudaベースの深層学習ライブラリ
– github.com/melisgl/mgl
今後の課題
●
疎ベクトルの演算を実装
● 誤り訂正出力符号(ECOC)にもとづくマルチクラス分類を実装
● cl-online-learningから流用してclml-svmもマルチクラス分類できるよ
うにする

Lisp meetup #29 cl-online-learningの紹介