機械学習ライブラリ進捗3 - Armadillo導入

このバージョンの時点

前回

Matrix(二次元配列)でもMatrixArray(三次元配列)でも同じ型で扱えるように修正をするつもりでいる。

これを実装した。
具体的には代数を扱うライブラリをEigenからArmadilloへ変更した。
機能は増えてないし、動作も変わってない。

Armadilloを選定した理由としては、前回も書いた通りEigenでは三次元配列が扱えないからだ。
正確に言うと、扱えないわけではないが使いにくいようだった。

三次元配列から二次元配列を取り出して行列計算して、結果を元の三次元配列に反映するということがやりたいので、その度にコピーが発生するようだとちょっとつらいな、ということで却下。
(Eigen開発陣の名誉のために注釈しておくと、ちゃんと彼らはこのTensorクラスをunsupportedフォルダ(次以降のバージョンに入るかもしれない機能を開発中ながら公開してくれてるところ)に入れているし、Tensor.hppファイルにはちゃんと、「.asMatrix()や.asVector()といった関数を提供するつもり」と書いてくれている。)

さてArmadilloだが、率直に言ってかなり使いやすい。少々雑に書いてもいい感じに暗黙の型変換をしてくれるし、操作がおかしいところではちゃんとassertionしてくれる。assertionのメッセージも親切。

しかし日本人のユーザーが少ないのか、QiitaのArmadilloタグは投稿が3件。しかもそのうち2件は何か違うArmadilloのことを書いているので実質1件。
ということで日本語の情報は少ないのだが、公式のドキュメントがかなり簡潔でわかりやすく、特にどこにもつまづかなかった。素晴らしい。感謝。

前回の疑問

- CNN層という呼び方は適切?

 後輩の船津くんがFacebookにコメントで教えてくれた。

CNNという言葉は、NNと入っているので、畳み込み層を含むニューラルネットワーク全体のことを指す言葉ですね。RNNなどの他のNNに対する対義語だと思います。
あえて層だけを指すときは、畳み込み層とかConvolution(al) Layerとか、単にconvとかと表記されてることが多いですね。

とのこと。なるほど言われてみればそうですな。

- 二・三次元配列を扱えるライブラリとしてboost::multi_arrayを考えているけど他におすすめはある?(C++です)
- 行列計算は必要なのだけどboost::multi_arrayとboost::ublas::matrixを同時に扱う良い方法はある?いちいち変換する必要がある?

これらについてはArmadillo導入によって解決した。
ちなみにboost::multi_arrayを使うと多分辛くて、それはboost::multi_arrayはC++で多次元配列を扱う場合に、普通の方法(int array[3][3][3]とか)では辛いことを解消するのが狙いであって、線形代数をやるためのものではないからだと理解した。

(おまけ)

疑問

- ハイパーパラメータはみんなどうやって考えてるの?
- ハイパーパラメータの試行錯誤を定量的に行う方法はある?
- 他に有効そうな線形代数ライブラリはある?

(追記)

これらで四次元以上のテンソル扱えそう。次方向転換することがあれば検討する。
https://github.com/BTAS/BTAS
https://github.com/blitzpp/blitz

この記事が参加している募集

#つくってみた

19,492件

サポートしていただけたら、書く勢いになります!