@olanleed
機械学習とか、自然言語処理とか専攻してる
C++の機械学習ライブラリ
AROWとか使いたかった。
アルゴリズムの実装→線形代数
uBLASをつかっていたけど使い勝ってが悪いのでEigenに
uBLASへの不満
AutoEncoderの例
- 重み行列
- sigmoid(w * x + b)
現実は甘くなくって、matrix or vector型同士しか*演算子しか使えないので、prod関数を使わないといけない。スカラー積にしか対応してない
prod関数で行列とベクトルの積ができる
- for文を使って更新するしかない
- でも数式がたくさんあるとつらい
- できれば数式をそのままコードの表現したい
- 数式とコードが素直に対応していれば、とても読みやすくなる→使い勝ってが悪い
ので、Eigenを使う。
- ライブラリのビルド不要
- 日本語の文献が多い
- 論文の数式をそのままコードに書ける
- パフォーマンスが良い
- 多用途
- 機械学習アルゴリズムの実装
- AROW解説
blog.k11i.biz: AROW を Ruby で実装してみた
- 教師あり学習
- オンライン学習
- 線形分類器
- AROWはノイズにつよい。SVMより高精度、変動にあまり敏感ではない
- 更新式にしたがって、各特徴の分散を小さくしつつ、与えられた教師データを正しく分類
実装はとてもシンプル
- ハイパーパラメータ
- 共分散行列 単位行列で初期化
平均、0初期化しておく
margin計算
confidence計算
損失関数の定義。推定の悪さを定義した関数
平均と共分散
βの計算
Eigenを使えば楽々実装できる。予測関数の定義。
問題
- 共分散行列をまともに計算。対角要素だけを計算すれば高速化できる。
- MatrixではなくVectorでよい 超高次元にも対応できるから。
AROW実装でも前準備。
- Pythonのnenumerate関数みたいなのが欲しかったので書いた。
- Eigen::Vectorの先頭を指すイテレータを返す関数と末尾を返すイテレータの関数はどうするのか
- Eigen::VectorXdで置き換え
Onesですべての要素を1で初期化しておく
シリアライズとデシリアライズ
- std::vectorにコピーすればシリアライズできる
- std::vectorからEigen::Vectorへの変換でデシリアライズできる
MochiMochiの展望
- マルチクラス分類
- 良いアルゴリズム
- 高次元スパースベクトル
- まともなREADME
なぜEigenは早いのか
- 遅延評価を行っているから早いのでは?