学んだこと実装したこと

モチベーション維持のための備忘録

CythonでNumpyを使ってみたかったけど脱線した

Cythonで高速な最適化アルゴリズムを実装したくなって調べ事をしてみた。
わからないことだらけ。

Cythonを使う理由

Scikit-learnに実装されているようなアルゴリズムを自分でもPythonで実装してからCythonで高速化することで、Pythonのどういうところが最適化アルゴリズムにとってボトルネックになっているのか知りたい。
速度だけを考えれば、例えばEigen*1使ってアルゴリズムを書いて、CythonはPython用インターフェースを作るためだけに使えばいいかもしれない。
Cythonでの実装が一段落したらEigenで書いたものと速度比較してみようかなあ。

Scikit-learnのソースコードを読んでみる

試しにScikit-learnで実装されているSAG(Stochastic Averaged Gradient)を読んでみる*2
github.com
…あれ?SAGのメイン部分にNumpyのメソッドを使っている部分が見当たらない。
lagged_updateメソッドが解の更新っぽいけど、ベクトルとして更新はしてなくて一要素ずつ代入してる。
単純なことしかしてないからNumpyを使って書くメリットがないということ?

CythonのNumpyに関するチュートリアルを読んでみる

最初にScikit-learnのソースコードに突撃したのが悪かった気がしてチュートリアルを読むことにした。
Working with NumPy — Cython 0.29a0 documentation
…が、型付きメモリビューを使う方がいいからそっち向けのページを見てくれと下記ページに誘導された。
Cython for NumPy users — Cython 0.29a0 documentation
中身にそんな違いはなく、型付きメモリビューのことが追記してあるくらいだった。
そもそもベクトル同士の和とか積をやろうとしてない。


Scikit-learnの線形回帰に最急降下法がなくてcoordinate descentがあった理由が分かった気がする。
最急降下法だと行列ベクトル積が入るけど、coordinate descentならNumpyのメソッドを使わなくても書けるはず。
でもNumpyのメソッドを使わないメリットがよくわからない。
次は線形回帰に対するSGDでも書いてみて比較してみようかな。

*1:http://eigen.tuxfamily.org/index.php?title=Main_Page

*2:そもそもこれを読むのにTyped Memoryviews — Cython 0.29a0 documentationとかを読んで勉強する必要があった