Upload
satoshi-imai
View
332
Download
1
Embed Size (px)
Citation preview
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 :clonlinelearning)
$ cd ~/quicklisp/localprojects/ $ git clone https://github.com/masatoi/clonlinelearning.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(K1) / 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 (makearray 3 :elementtype 'doublefloat :initialcontents '(1d0 2d0 3d0)))
(defparameter plearner (makeperceptron 3))
(update plearner input 1d0)
(predict plearner input)⇒1.0d0
教師信号
入力次元数
使い方(マルチクラス分類)
● 学習器をつくる
● データを1個用意 (double-float型のsimple-array)
● 更新する
● 予測する
(defparameter input (makearray 3 :elementtype 'doublefloat :initialcontents '(1d0 2d0 3d0)))
(defparameter mlearner (makeonevsone 4 3 'arow 1d0))
(update mlearner input 2)
(predict mlearner input)⇒1.0d0
教師信号(整数)
入力次元数 クラス数学習器の型
学習器のメタパラメータ
データセットの学習
● データセット: 教師信号と入力ベクトルのドット対のリスト
– Libsvmのサイトで公開されているデータセットを読み込む
● 訓練データをまとめて訓練する
● テストデータをまとめて予測する
(defparameter a9adim 123)(defparameter a9atrain (readlibsvmdata "/path/to/a9a" a9adim))(defparameter a9atest (readlibsvmdata "/path/to/a9a.t" a9adim))
(train plearner a9atrain)
(test plearner a9atest); 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もマルチクラス分類できるよ
うにする