by shigemk2

当面は技術的なことしか書かない

Eigenでオンライン機械学習アルゴリズムを実装したときの話 #kbkz_tech

kbkz.connpass.com

Eigen

@olanleed

機械学習とか、自然言語処理とか専攻してる

C++の機械学習ライブラリ

github.com

AROWとか使いたかった。

アルゴリズムの実装→線形代数

uBLASをつかっていたけど使い勝ってが悪いのでEigenに

uBLASへの不満

AutoEncoderの例

  • 重み行列
  • sigmoid(w * x + b)
  • 現実は甘くなくって、matrix or vector型同士しか*演算子しか使えないので、prod関数を使わないといけない。スカラー積にしか対応してない

  • prod関数で行列とベクトルの積ができる

  • for文を使って更新するしかない
  • でも数式がたくさんあるとつらい
  • できれば数式をそのままコードの表現したい
  • 数式とコードが素直に対応していれば、とても読みやすくなる→使い勝ってが悪い

ので、Eigenを使う。

  • ライブラリのビルド不要
  • 日本語の文献が多い
  • 論文の数式をそのままコードに書ける
  • パフォーマンスが良い
  • 多用途
  • 機械学習アルゴリズムの実装
  • AROW解説

blog.k11i.biz: AROW を Ruby で実装してみた

  • 教師あり学習
  • オンライン学習
  • 線形分類器

教師あり学習 - Wikipedia

  • AROWはノイズにつよい。SVMより高精度、変動にあまり敏感ではない
  • 更新式にしたがって、各特徴の分散を小さくしつつ、与えられた教師データを正しく分類

実装はとてもシンプル

  • ハイパーパラメータ
  • 共分散行列 単位行列で初期化
  • 平均、0初期化しておく

  • margin計算

  • confidence計算

  • 損失関数の定義。推定の悪さを定義した関数

  • 平均と共分散

  • βの計算

d.hatena.ne.jp

Eigenを使えば楽々実装できる。予測関数の定義。

問題

  • 共分散行列をまともに計算。対角要素だけを計算すれば高速化できる。
  • MatrixではなくVectorでよい 超高次元にも対応できるから。

AROW実装でも前準備。

  • Pythonのnenumerate関数みたいなのが欲しかったので書いた。
  • Eigen::Vectorの先頭を指すイテレータを返す関数と末尾を返すイテレータの関数はどうするのか
  • Eigen::VectorXdで置き換え
  • Onesですべての要素を1で初期化しておく

  • シリアライズとデシリアライズ

  • std::vectorにコピーすればシリアライズできる
  • std::vectorからEigen::Vectorへの変換でデシリアライズできる

MochiMochiの展望

  • マルチクラス分類
  • 良いアルゴリズム
  • 高次元スパースベクトル
  • まともなREADME

なぜEigenは早いのか

  • 遅延評価を行っているから早いのでは?