20
cl-online-learning の紹介 Satoshi Imai / 今井 悟士 Twitter: @masatoi 0 Github: masatoi

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

Embed Size (px)

Citation preview

Page 1: Lisp meetup #29 cl-online-learningの紹介

cl-online-learningの紹介

Satoshi Imai / 今井 悟士

Twitter: @masatoi0 Github: masatoi

Page 2: Lisp meetup #29 cl-online-learningの紹介

これは何か

● cl-online-learning

● 書籍「オンライン機械学習」に出てくる線形

識別器のアルゴリズムからいくつか実装

● 2値分類と多値分類ができる

● githubにあります

– https://github.com/masatoi/cl-online-learning.git

Page 3: Lisp meetup #29 cl-online-learningの紹介

インストール

● シェルから

● Lisp処理系から

– SBCL、CCL、ECL、CLISPで動作確認済み

(ql:quickload :cl­online­learning)

 $ cd ~/quicklisp/local­projects/ $ git clone https://github.com/masatoi/cl­online­learning.git

Page 4: Lisp meetup #29 cl-online-learningの紹介

オンライン学習

● バッチ学習: 訓練データをまとめて学習する

● オンライン学習: 訓練データを逐次的に学習する

– とにかく速い: 収束が速い、データ数に対して線形時間、省メモリ

– リアルタイム処理に組込める

– 実装が簡単

– 偏りのあるデータ、ノイズのあるデータに弱い

→ 対策されたアルゴリズムが出てきた (AROW, SCW)

Page 5: Lisp meetup #29 cl-online-learningの紹介

線形識別器

● 線形分離可能なデータに対して有効な二値分類器

● 識別関数f(x)が正か負かでクラスを分ける(xは入力データ点)

● 上手く分けられるようにパラメータ(wとb)を調整する

決定境界 f(x)=0

線形分離可能 線形分離不可能

Page 6: Lisp meetup #29 cl-online-learningの紹介

非線形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)

Page 7: Lisp meetup #29 cl-online-learningの紹介

cl-online-learningで実装している二値分類アルゴリズム

● 二値分類

– パーセプトロン

– 平均化パーセプトロン

– 線形SVM

– AROW

– SCW-I、SCW-II

精度

良い

悪い

メタパラメータの数

なし

なし

2

1

2

Page 8: Lisp meetup #29 cl-online-learningの紹介

パーセプトロン

● 学習データ: 入力x と 教師信号y の組

● パーセプトロン: 以下のルールでwを更新する

● 直近の学習データの影響を受けすぎる

→ 過去の w の更新差分を平均化 (平均化パーセプトロン)

の正負と y を比べてみて、分類に失敗していれば

w ←w + y x

Page 9: Lisp meetup #29 cl-online-learningの紹介

AROW

● パラメータ w が、正規分布からサンプリングされたものと考える

– その正規分布の平均 μ と分散 Σ を更新する

● 精度良い、収束速い、学習も安定している ← おすすめ!

● メタパラメータとして正則化パラメータ γ を持つ

Page 10: Lisp meetup #29 cl-online-learningの紹介

AROWは頑健

● マージン最大化

– 決定境界から一番近いデータとの距離(マージン)を大きくとる

● 特徴量ごとに信頼度をつける

– 頻繁に出てきた特徴量の更新量は減らしていく

Page 11: Lisp meetup #29 cl-online-learningの紹介

cl-online-learningで実装しているマルチクラス分類アルゴリズム

● 複数個の二値分類器を組み合わせてマルチクラス分類できる

● マルチクラス分類

– 1対多 (one-vs-rest)

– 1対1 (one-vs-one)

– 誤り訂正出力符号(ECOC)

↑(予定)

必要な二値分類器の数

K個

K(K-1)/2個

K個とK(K-1)/2個の間

Page 12: Lisp meetup #29 cl-online-learningの紹介

one-vs-rest

● クラスの数だけ二値分類器を用意: K個

● 学習時: 観測されたデータのクラスに対応する学習器では正例、そうで

なければ負例として学習

● 予測時: 全部の学習器で識別関数 を計算して最大の

ものに対応するクラスを出力する

1

2

3

各クラスに対応する学習器

クラス2とラベルのついた

データ

教師信号を -1 として学習

教師信号を +1 として学習

教師信号を -1 として学習

Page 13: Lisp meetup #29 cl-online-learningの紹介

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とした

Page 14: Lisp meetup #29 cl-online-learningの紹介

使い方(二値分類)

● 学習器をつくる

● データを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

教師信号

入力次元数

Page 15: Lisp meetup #29 cl-online-learningの紹介

使い方(マルチクラス分類)

● 学習器をつくる

● データを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

教師信号(整数)

入力次元数 クラス数学習器の型

学習器のメタパラメータ

Page 16: Lisp meetup #29 cl-online-learningの紹介

データセットの学習

● データセット: 教師信号と入力ベクトルのドット対のリスト

– 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

Page 17: Lisp meetup #29 cl-online-learningの紹介

使用上の注意

● スケーリング大事

– 入力の各次元が [-1, 1] の範囲に入るようにする

● データの順序大事

– 同じクラスのデータが延々と続くような場合は性能悪化

● 必要なら順序をシャッフルする

Page 18: Lisp meetup #29 cl-online-learningの紹介

iris

● 入力データ: アヤメの花びらとがくの大きさ (4次元)

● クラス数3、データ数150

Page 19: Lisp meetup #29 cl-online-learningの紹介

番外:深層学習

● 特徴選択をどうするかは職人芸

→ 深層学習

● ニューラルネットはオンライン学習できるが、更新ごとの計算量が大きい

– ミニバッチをつくってまとめて計算

● GPU向きの計算(大きな行列×行列の計算)

● cl-cudaベースの深層学習ライブラリ

– github.com/melisgl/mgl

Page 20: Lisp meetup #29 cl-online-learningの紹介

今後の課題

● 疎ベクトルの演算を実装

● 誤り訂正出力符号(ECOC)にもとづくマルチクラス分類を実装

● cl-online-learningから流用してclml-svmもマルチクラス分類できるよ

うにする