(57)【要約】      （修正有）【課題】メモリに収まりきらない行列データが現われる計算をメモリに収まるようにする。【解決手段】メモリに収まりきらないmatrixとのmatrix productのみが必要で、matrix productの演算手順だけなら、より少ないメモリで表現できる場合には、その手順をメモリに保存してmatrix productの演算結果が必要になったら毎回その手順を実行して演算結果を生成することで、メモリ使用量を減らす。【選択図】なし【特許請求の範囲】
【請求項１】
行列を遅延評価で表現することでメモリ使用量を減らす方法およびアルゴリズムおよび、その実装。
【請求項２】
請求項１を使って計算の途中段階での
メモリ使用量を減らす
correspondence analysis
【請求項３】
請求項２と同様のメモリ使用量を減らす
canonical correlation analysis
および
principal component analysis
【請求項４】
請求項１の方法をテンソルに適用した方法およびアルゴリズムおよび、その実装。
【請求項５】
請求項１および請求項２および請求項３および請求項４の方法でメモリ使用量を減らしてGPUのメモリにデータを格納する方法およびアルゴリズムおよび、その実装。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は matrix を使った計算において、
matrix を遅延評価で表現することで、
メモリ使用量を減らす方法である。
【背景技術】
【０００２】
1000x1000の diagonal sparse matrix を考える。
この matrix の対角成分が 2,3,2,3,2,3,... と同じ成分が連続している場合、
従来の sparse matrix の表現方法では対角成分全てを格納する大きさ1000の配列が必要となる。
しかし、この matrix は簡単なプログラムで生成できる。
例えば python のコードで書くと
lambda i,j: (2 if i%2==0 else 3) if i==j else 0 
で表わせる。
matrix の (i,j) 成分が必要になったら、毎回この手順を評価して値を得るようにすることで、 matrix を表現できる。
このコードの文字列は大きさ1000の配列よりはるかに小さい。
このように matrix を手順で表現し、その手順を遅延評価して利用することで、
メモリ使用量を大幅に減らすことができる。
ただし計算時間が増大するため、この方法が使われることは特殊な実装でしかない。
しかし近年は巨大なデータの統計処理が頻繁に行なわれるようになったため、この方法が有効な場面は増えてきている。
【０００３】
べき乗法のような matrix product の演算結果のみが必要となる場合を考える。
matrix product を線形写像とみなせば、この写像演算の遅延評価によって演算結果を表現できる。
例えば、前述の diagonal sparse matrix にベクトルxをかけた結果は python のコードで書くと
lambda i,x: (2*x[i] if i%2==0 else 3*x[i])
で表わされ、同様にはるかに少ないメモリ使用量で表現できる。
同様の事は加算などの他の演算にも言える。
【０００４】
matrix 演算を遅延評価で表現する方法としては、既に expression templates と呼ばれる方法がある。
しかし expression templates は計算時間を減らす方法であり、メモリ使用量を減らす方法としては使われていない。
ここで述べた方法は逆に計算時間を増加させるため単純に expression templates を適用しただけでは実現できない。
【０００５】
近年ビデオカードのGPUを使った計算方法が注目されている。
一般的にGPUは少ないメモリしか持たない。
GPUの少ないメモリに大きな matrix のデータを格納できるとCPUよりも高速な計算が可能となる。
そのために前述の遅延評価でメモリ使用量の減少させる方法を使うことができる。
【０００６】
計算の途中段階でのメモリ使用量を減らすことで今迄は不可能だった大規模なデータの計算が可能な場合もある。
1つの例としてcorrespondence analysis がある。
correspondence analysis の入力として与えられる
contingency table は一般的には sparse matrix である。
しかし計算の途中段階の singular value decomposition を行なう部分に注目すると、
singular value decomposition にかける直前の matrix は必ず dense matrix となりメモリ使用量が大幅に増加する。
具体的には
S=P - r * c.T
は必ず dense matrix となる。
ここで N を contingency table を表わす python scipy library の sparse matrix とした時、
P = N / N.sum()
r = P.sum(axis=1)
c = P.sum(axis=0).T
とした。
r * c.T が必ず dense matrix となるため N が sparse matrix であっても S は dense matrix となってしまう。
N が 1000x1000 の diagonal sparse matrix で非零要素が対角成分の1000個しかない場合でも、 S は 1000x1000 の dense matrix となり1000倍のメモリが必要になる。
この matrix S は前述の遅延評価で表現すると、contingency table の sparse matrix N とほぼ同程度のメモリ使用量で表現できる。
randomized singular value decomposition の様な入力 matrix に matrix product しか行なわない方法で
singular value decomposition の計算をする場合は matrix product を遅延評価で表わした matrix を使うことができる。
具体的には matrix product S*X を
lambda X:P*X+r*(c.T *X)
の遅延評価で表現すれば contingency table の sparse matrix N とほぼ同程度のメモリ使用量で matrix product
と singular value decomposition の計算ができる。
こうすることでメモリ使用量だけでなく計算速度の改善もできる。
例えば N が 1000x1000 の diagonal sparse matrix で最初の10個の singular value だけ求めたい場合は、
matrix product S*X の X には 1000x10 の大きさの matrix しか表われないため、1000＋1000x10 の配列のメモリ使用量だけですむ。
matrix S を展開してしまうと 1000x1000 の配列のメモリ使用量が必要となり約100倍のメモリが必要となる。
【０００７】
同様のことは sparse data に対する canonical correlation analysis や principal component analysis 
でも言える。
【先行技術文献】
【非特許文献】
【０００８】
【非特許文献１】expression templates https://en.wikipedia.org/wiki/Expression_templates
【発明の概要】
【発明が解決しようとする課題】
【０００９】
解決しようとする問題は、メモリに収まりきらない行列データが現われる計算の問題である。
【課題を解決するための手段】
【００１０】
メモリに収まりきらない行列が、より少ないメモリを使った手順で生成できる時、
その手順そのものをメモリに保存して、行列の値が必要になったら、毎回その手順を遅延評価して行列の値を生成することで、メモリ使用量を減らすことを特徴とする。
【００１１】
メモリに収まりきらない matrix との matrix product のみが必要で、
matrix product の演算手順だけなら、より少ないメモリで表現できる場合には、
その手順をメモリに保存して matrix product の演算結果が必要になったら毎回その手順を実行して演算結果を生成することで、メモリ使用量を減らすことを特徴とする。
および matrix product 以外の matrix 演算についても同様の方法を利用する方法。
【発明の効果】
【００１２】
計算の途中結果がメモリに収まりきらないため計算できなかった大きな sparse データの
correspondence analysis
や
canonical correlation analysis
や
principal component analysis
が出来るようになる。
【発明を実施するための形態】
【００１３】
matrix 演算を表わす関数、例えば
*, ＋ 
などのオペレータ関数が、
遅延評価で表わされた行列に作用した場合に、
遅延評価を評価して値になるように拡張することで、
randomized singular value decomposition
や、
べき乗法などのプログラムコードを書き換えることなく、
そのまま実行できるようにして実現した。
【実施例１】
【００１４】
python scikit-learn-0.17.1 library において
randomized singular value decomposition
の実装である
randomized_svd
関数内では matrix product は
safe_sparse_dot
関数を使って行われるようになっている。
この safe_sparse_dot 関数を遅延評価で表わされた行列にも適用できるよう拡張することで、
遅延評価で表現された行列の
singular value decomposition
が可能となる。
【００１５】
背景技術で説明した
contingency table N が sparse matrix となる場合の correspondence analysis は、この safe_sparse_dot 関数に拡張をした
randomized_svd 関数に、遅延評価で表わされた前述の行列 S を適用することで少ないメモリでの計算が可能となる。
contingency table N が 1000x1000 の diagonal sparse matrix の場合にはメモリ使用量は1/1000になる。
【産業上の利用可能性】
【００１６】
sparse なデータが頻繁に現われる自然言語処理の問題で特に有効である。