Rest Term

Blog

JavaScriptで機械学習の実装 4 SCW

前回 JavaScriptで機械学習の実装 3 AROW に引き続きオンライン学習アルゴリズムを試しています。Node.js勉強中なのでJavaScriptを使ってこつこつ学んでいきましょう。

今回は SCW (Soft Confidence Weighted Learning) と呼ばれるアルゴリズムを扱います。

SCW (Soft Confidence Weighted Learning)

2012年に提案された、CW (Confidence Weighted Learning)と前回紹介したAROW (Adaptive Regularization of Weight Vectors)の特徴を備え持つ手法です。SCWはCWと同様に重みベクトルの各重みが正規分布に従って生成されていると考えます。

SCWのアルゴリズムは以下のようになっています(元論文から引用)。
scw_algorithm

μが信頼している重み、Σが各重みの信頼度・自信(confidence)を表しており、ハイパーパラメータCでどの程度の誤りを許容するか(損失関数を常に0にするという制約を緩める)を調整しています。
scw_update_kld

損失関数は以下のように定義されており、信頼度が低いパラメータは重視されないようになっています。
scw_loss_function

また、αとβはどちらもCWと同様に閉じた形で更新式が表されます。αの計算式は二通りあり、それぞれSCW-IとSCW-IIと呼ばれています。具体的な式については論文などを参照。

SCWの特性として論文の最後で以下の4つが挙げられています。

  1. large margin training
  2. confidence weighting
  3. adaptive margin
  4. capability of handling non-separable data

性能面ではCWやAROWと比べて多くのケースにおいて高精度で効率が良い(収束が速い)とされているようです。

検証

今回はLIBSVM Data: Classificationの a9a データセットで分類精度や収束速度などを確認してみます。a9a は世帯収入が一定以上かどうかの二値、線形分離不可能なデータになっています。

SCW実装の本体やデータ読み込み用モジュール、動作確認用のテストコード一式はこれまで通りGitHubに置いておきます。今回もAROWと同様にTypeScriptとJavaScriptの両方のコードを上げてあります。

疎ベクトル用に最適化してないナイーブな実装なので、1,355,191次元もある news20.binary データセットを用いたAROWとの比較は難しいです。ということで a9a を使って動作確認をします。

データファイルの読み込み部分は前回作ったLIBSVMフォーマットファイルをStream APIで読み込むモジュールを使い回しました。Node.js環境において以下のような感じで学習とテストを実行できます。

SCWの2つのハイパーパラメータは適当に設定し、データは1巡のみで84.6%の分類精度となりました。AROWの時もそうでしたが、やはりオンライン学習は収束が速くて助かります。

オンライン学習の性質を確認するため、学習データを1件ずつ与えて学習する毎に精度確認を行いました。データを与える順番を変えるためにデータをシャッフルして合計3回試行しています。
result_a9a_scw
a9aなら5,000サンプルくらい与えてやれば十分なようです。

線形SVMのscikit-learn実装(sklearn.svm.LinearSVC)でも試してみました。グリッドサーチして学習した結果、こちらも84%の分類精度となりました。a9a データセットにおいては線形SVMと精度面での違いはそこまでないようです。

SCWはAROWよりもパラメータが一つ多いので調整がめんどくさそうに思えますが、適当に設定しても高い精度が出るのでそんなに悩まなくても大丈夫です。とりあえず動作確認はできたと思うので今回はこの辺で。次はそろそろ分散学習アルゴリズム周りを学んでいきたいです。

参考

 

Tags: , , ,

GTC Japan 2016 参加レポート

GTC Japan 2016が10月5日にヒルトン東京お台場で開催されました。今回で参加は2回目ですが、前回(2014年)より参加者はとても増えていたように思います。ゆりかもめでは小さすぎる。

dsc07402

dsc07447

基調講演

NVIDIA ジェンスン・ファン(Jen-Hsun Huang)CEOの基調講演に関するレポートは大手ネットメディアがたくさん書いてるのでそちらを見た方が詳細が分かると思いますが、ここでもメモ書き程度におさらい。

続きを読む »

 

Tags: ,

IoT関連のサンプルコードと技術メモ

2016年2月に発売されたRaspberry Pi 3を買ってから、センサーモジュールやIoTクラウドサービスなどをいくつか試しているので、検証用サンプルコードと技術メモ(Wiki)を残しています。

dsc07361

サンプルコードは基本的にはPythonが多いですが、一部はRubyやJavaScriptのコードも含まれています。技術メモはGistなどの外部サービス上ではなく自前のWiki上に備忘録としてメモしています。結構分量が増えてきたのでここでも周知しておこうと思いまして。

Raspberry Pi 3ではCPUが64ビットになり、前モデルのRaspberry Pi 2より動作周波数(クロック)が向上しています。また、Wi-Fi(802.11b/g/n)とBluetoothが搭載されたのも素晴らしいです。

イメージセンサー性能が格段に向上したCamera Module v2.1も入手しました。このカメラモジュールのイメージセンサーは、SONYの最近のデジタルカメラで使われている裏面照射型のセンサー(back-illuminated sensor)なので高感度性能も期待できます。

raspi_cameramodulev2

Fixed focus lens on-board
8 megapixel native resolution sensor-capable of 3280 x 2464 pixel static images
Supports 1080p30, 720p60 and 640x480p90 video
Size 25mm x 23mm x 9mm
Weight just over 3g
Connects to the Raspberry Pi board via a short ribbon cable (supplied)
Camera v2 is supported in the latest version of Raspbian, Raspberry Pi's preferred operating system

センサーモジュールは秋葉原で格安で手に入るので、もし面白そうなセンサーがあればいろいろと試していきたいと思います。技術WikiやGitHubの方はちょくちょく更新していきます。

1602_lcd

 

Tags: , , ,

JavaScriptで機械学習の実装 3 AROW

今回はオンライン機械学習アルゴリズムとして知られている AROW (Adaptive Regularization of Weight Vectors) を試してみました。内容的には以下のエントリーの続きになりますが、今回からタイトル文言を少し変えようと思います。TypeScript入門という段階はそろそろ脱したかなと思うのと、TypeScriptよりも直接JavaScriptで書く量の方が増えてきたためです。

前回のエントリー内で、次はブースティング系アルゴリズムを実装してみたいと書いたのですが、オンライン機械学習 (機械学習プロフェッショナルシリーズ)を読んでいたらこの分野への興味が強くなってしまったので、ちょっと寄り道。

AROW (Adaptive Regularization of Weight Vectors)

AROWのアルゴリズムは以下のようになっています(元論文から引用)。

arow_algorithm
AROWは Confidence Weighted Learning (CW) というアルゴリズムを改善したものです。CWでは"現在の訓練データを常に正しく分類する"という条件で最適化するので、訓練データにノイズの入っていると上手く学習できないという欠点がありますが、AROWではこれまでの分布(パラメータ)に近い分布を探しつつ、各特徴の確信度(Confidence)を更新毎に上げるという条件(正則化項として加える)も併せて考慮して最適化するため、ノイズが多いデータでもCWと比較して分類精度が高くなるという特徴があります。パラメータも一つだけというのも嬉しいです。実装上は計算量の削減の為に共分散行列の非対角項を0にして対角項だけ計算することが多いそうですが、これでも精度はほとんど落ちないようです。

Node.js Stream APIで学習データの読み込み

今回からはWebブラウザではなくNode.js上で実行します。理由はデータセットの効率的な読み込み処理の為にStream APIを使いたかった為です。LIBSVMフォーマットのデータファイルをStream APIで読み込むには例えば以下のように書くことができます。

これで一つのサンプルが取り出される度にコールバック関数が呼ばれます。これを応用して入力をファイルではなくHTTPのストリームを指定して、例えばJSON形式で一つのサンプルを渡してもらうインタフェースにすると、WebAPIで学習データをストリームで受け取り続けることができるのでオンライン学習と相性が良さそうです。ただ、上記のように単一のファイルを読み込む場合はオーバーヘッドが大きいので、通常の非同期読み込みの手順を使う方が良いと思います。

検証

AROW本体やデータ読み込み用モジュール、動作確認用のテストコード一式はこれまで通りGitHubに置いておきます。今回からはTypeScriptとJavaScriptの両方のコードを上げておきます。

今回はLIBSVM Data: Classificationの news20.binary データセットで分類精度や収束速度などを確認してみます。

事前にデータをシャッフルして15000例の訓練データと4996例のテストデータに分けています。今回作ったLIBSVMデータファイル読み込みモジュールは、非同期によるストリーム読み込みだけでなく同期読み込みもできるようにしてあります。動作確認には後者を使った方が楽です。

パラメータは適当に決めたのですが、分類精度(正答率)は約97.2%となりました。注目すべきは収束速度で、データを一巡しただけでほぼ収束しているように見えます。速いですね。

線形SVMとも比較してみます。まだJavaScriptでSVMの実装はしていないので、ここではscikit-learnの実装(sklearn.svm.LinearSVC)を使いました。

* 実行結果

パラメータはグリッドサーチで決定、分類精度は約96.5%で、AROWと同等あるいは少し悪いくらい。妥当な結果と言えるでしょうか。

おわりに

今回はオンライン機械学習アルゴリズムのひとつであるAROWを試してみました。最近はディープラーニング系のニューラルネットワークのプログラムを趣味でも書くことが増えてきたのですけど、それらに比べてオンライン機械学習のアルゴリズムは実装が楽で収束も速いので嬉しいです。それに加えてデータを蓄積しておかなくて良いので、近年のWebサービスで扱われるような断続的なストリームデータとも相性が良いと思います。この後はAROWより後発のアルゴリズムであるSCWなども試しつつ、Node.js上でのより効率的な処理の書き方なども併せて調べていくつもりです。

参考

オンライン機械学習 (機械学習プロフェッショナルシリーズ)
AROW (Adaptive Regularization of Weight Vectors) (論文PDF)
SCW (Soft Confidence Weighted Learning) (論文PDF)
CW, AROW, and SCW
[機械学習] AROWのコードを書いてみた
Node.js v6.3.1 Documentation
Node.js の Stream API で「データの流れ」を扱う方法

 

Tags: , , ,