はじめに
ElixirからCUDA・cuBLASを利用する行列計算ライブラリ、cuMatrixにつき仕様を取りまとめました。Deep-Learningへの応用を目的としています。Pure Matrixライブラリと比較して、1000*1000の行列積でおよそ2500倍、Matrexと比較しても7倍程度高速です。
動作確認
Linux系のOSでCUDAがインストールされていれば、たいていのマシンで動作可能だと思います。私はドスパラのガレリアで動作させています。OSはLinux Mintです。
インストール 起動
githubよりクローンを作るかダウンロードします。makeによりnifs.soという動的リンクオブジェクトが生成されます。
iex -S mix でライブラリを含んで起動します。
仕様
行列の要素はすべて浮動数点数である必要があります。それ以外の場合の動作は無保証です。
Cumatrix.new(r,c)
正整数r,cを行数、列数とする行列を生成します。各要素は0.0です。
Cumatrix.new(r,c,val)
正整数r,cを行数、列数とする行列を生成します。各要素は浮動小数点数valです。
Cumatrix.new(list)
リストで与えられたデータをもとにして行列を生成します。
例
Cumatrix.new([[1,2],[3,4]])
Cumatrix.rand(r,c)
正整数r,cを行数、列数とする行列を生成します。各要素はbox-muller法により生成されたガウス分布乱数です。
Cumatrix.add(mt1,mt2)
行列mt1,mt2の加算行列を生成します。いずれか一方の引数が行ベクトルの場合にはサイズを合わせます。これはDeep-Learningでのバイアスの加算のための機能です。
Cumatrix.sub(mt1,mt2)
行列mt1,mt2の減算行列を生成します。
Cumatrix.mult(mt1,mt2)
行列mt1,mt2の行列積を生成します。cuBLASにより計算しています。
いずれか一方の引数がスカラー浮動小数点数である場合には各要素をスカラー倍します。
Cumatrix.emult(mt1,mt2)
行列mt1,mt2のアダマルド積を生成します。各要素どうしを乗算した行列です。Deep-Learningの勾配を乗ずる場面で利用します。
Cumatrix.transpose(mt)
行列mtの転置行列を生成します。バックプロパゲーションで利用します。
Cumatrix.ident(n)
正整数nをサイズとする単位行列を生成します。
Cumatrix.activate(mt,fun)
行列mtに活性化関数funを適応した行列を生成します。活性化関数には :sigmoid :relu :softmax が使えます。
Cumatrix.size(mt)
行列mtの行数、列数をtupleにして返します。{rowsize,colsize}
Cumatrix.sum(mt)
行列mtの各要素の和を返します。
Cumatrix.to_list(mt)
行列mtをリストに変換したものを返します。
Cumatrix.trace(mt)
行列mtのトレースを返します。
Cumatrix.print(mt)
行列mtを画面表示します。
Cumatrix.elt(mt,x,y)
行列mtの行位置x、列位置yの要素を返します。位置を表す数は1から始まる自然数です。(数学の慣習と同様)
Cumatrix.average(mt)
行列mtを行ベクトルの集合体とみなす。すべての行ベクトルについてその要素の平均値を求めて行ベクトルを生成する。
例
[[1.0,2.0],[4.0,1.0]] -> [[2.5,1.5]]
これはバックプロパゲーションで修正するバイアスの平均値をとるために使用します。
Cumatrix.loss(mt1,mt2,fun)
Deep-Learningでの損失関数の計算をします。mt1は計算した行ベクトルの集合体、mt2は教師データの行ベクトルの集合体です。結果は浮動小数点数として返します。
funは損失関数を指定します。 :squreは二乗和 :cross はクロスエントロピーです。
Cumatrix.diff(mt1,mt2,fun)
Deep-Learningでのバックプロパゲーションでの微分を行います。mt1は後層からの損失行ベクトルの集合体です。mt2は直前層での計算結果である行ベクトルの集合体です。funは前向き計算で利用した活性化関数です。 :sigmoid :tanh :relu を指定します。それら関数の微分関数をmt2に適用しその値をmt1の要素に乗じた行列を生成します。