0-1行列ベクトル乗算の自動最適化


22

質問:

行列が密で、ゼロと1だけで満たされている場合、行列ベクトル乗算を効率的に適用するコードを生成するための手順または理論は確立されていますか?理想的には、最適化されたコードは、以前に計算された情報を体系的に使用して、重複する作業を減らします。

つまり、行列 あり、に基づいて事前計算を行い、後でベクトル受け取ったときにを可能な限り効率的に計算します。MMMvv

Mは「コンパイル時」に知られている長方形の密なバイナリマトリックスであり、は「実行時」にのみ知られている未知の実数ベクトルです。v

例1:(スライディングウィンドウ)

簡単な小さな例を使用して、私のポイントを説明します。、行列を考える この行列をベクトルに適用してを取得するとします。結果のエントリは、

M=[11111111111111111111].
vw=Mv
w1=v1+v2+v3+v4+v5w2=v2+v3+v4+v5+v6w3=v3+v4+v5+v6+v7w4=v4+v5+v6+v7+v8

標準の行列ベクトル乗算を行うと、この方法で正確に計算されます。ただし、この作業の多くは冗長です。「実行中の合計」を追跡し、次の数を取得するために加算/減算することにより、同じ行列計算をより低いコストで実行できます。

w1=v1+v2+v3+v4+v5w2=w1+v6v1w3=w2+v7v2w4=w3+v8v3

例2:(階層構造)

前の例では、実行中の合計を追跡できます。ただし、通常は中間結果のツリーを作成して保存する必要があります。たとえば、考え 中間結果のツリーを使用して効率的に 計算できます。w=Mv

M=[111111111111111111111111]
w=Mv
  1. と計算し、それらを追加してを取得し。w 7 w 3w5w7w3
  2. と計算し、それらを追加してを取得し。w 6 w 2w4w6w2
  3. とを追加してを取得しw2w 1w3w1

上記の例の構造は見やすいですが、私が興味を持っている実際の行列については、構造はそれほど単純ではありません。

例3:(低ランク)

混乱を解消するために、行列は通常スパースではありません。具体的には、この問題を解決する方法は、大きなブロックがブロックで満たされているマトリックスを適用するための効率的な方法を見つけることができる必要があります。たとえば、考慮してください

M=[111111111111111111111111].

この行列は、2つのランク1行列の差として分解できます

M=[111111111111111111111111111111][111111]

そのため、ベクトルに対するアクションは、 w 1w:=Mv

w1=v1+v2+v3+v4+v5+v6w2=w1w3=w2v5v6w4=w3w5=w4.

動機:

私はいくつかの画像処理のための数値的手法に取り組んでおり、常に固定されているさまざまな構造を持ついくつかの大きな密な行列があります。後でこれらの行列は、ユーザーの入力に依存する多くの未知のベクトル適用する必要があります。現在、私は鉛筆と紙を使用して、マトリックスごとに効率的なコードを作成していますが、プロセスを自動化できるかどうか疑問に思っています。v i01vi

編集:(追記)

ここまでの回答はすべて(9/5/15現在)興味深いものですが、私が期待したほど満足に答えられるものはありません。おそらく、これは難しい研究質問であり、誰も良い答えを知らないことが判明します。

時間が経ちましたので、EvilJSが正しい質問に答えているので、私はEvilJSの答えに賞金を授与しています。しかし、答えにもっと明確で詳細な説明が含まれていればいいのにと思います。

tranisstorの答えは、この質問とオンラインブール行列-ベクトル乗算(OMv)問題との間に関係を作りますが、この質問が求めているものとはまったく関係がありません。特に、次の仮定は実際には当てはまりません(太字の強調)。

今と仮定すべてのため、すべて行列、N × N M nn0n×nM、我々は、アルゴリズムを知っているすべてのベクトルのためにあること、計算時間、すなわち、真のsubquadratic時間に一部の。 V MとVのO N 2 - εε > 0An,MvMvO(n2ε)ε>0

すべての行列に準2次アルゴリズムが存在するかどうかは、可能な限り高速な特定の行列のアルゴリズムを見つけるという問題に直結します。ほとんどの0-1行列は、ランダムノイズのように見え、(もし推測するなら)おそらく2次アルゴリズムを持たないでしょう。ただし、実際に悪い行列が存在するという事実は、たとえば「スライディングウィンドウ」行列など、良い行列で高速アルゴリズムを見つけることを妨げません。

vznの回答、最初の回答2番目の回答は興味深い(そして、私の意見ではそれほど多くのダウン票に値しない)が、それらはそこでのコメントで議論された理由のために質問に適用されない。


1
マトリックスがこの形式の場合、TDMAはバンドマトリックス、トーマスアルゴリズムです。まだ0-1ではありませんが、この機能を活用する必要があります。

@EvilJSのマトリックスは、たまたま特定の例のためにバンディングされています。一般的に、それはバンディングされません。バンド化されていない別の例を追加しました。
ニック・アルジェ

バイナリの実数ベクトルである多くの定数行列N x Mがあり、インスタンスごとの前処理段階で最適な実行パスを事前計算したいですか?このような操作の出力は、マトリックスごとにハードコーディングされた操作を含むコードであり、メソッドでそうする必要がありますか?インスタンスごととは、マトリックスごとを意味します。チェックしてるだけ。
邪悪な

@EvilJSこの質問は、1つの既知のバイナリマトリックスが存在する状況に関するもので、これは後で多くの未知の実ベクトル適用されます。基づいてだけ、私たちは適用されるコード事前計算したい私たちが受け取ったときに、後でそのことを、効率的にできる限りを、我々は計算することができできるだけ早くとして。この質問の動機となる特定のアプリケーションでは、ベクトルは予測不可能でプログラムのユーザーからの入力に依存するのに対し、このように少数の(実際には12個の)バイナリマトリックスは常に固定されています。V I M MはV 、私は M V I V IMviMMviMvivi
ニック・アルジェ

1
2つの要素のフィールドにわたって、与えられた線形変換をシミュレートする最小XORゲート回路を計算する問題はNP困難です。参照してくださいcstheory.stackexchange.com/a/32272/225
ライアン・ウィリアムズ

回答:


5

可能であれば、行列の帯状三重対角性を活用してみてください。
それ以外の場合、マトリックスに一定数の個別値(確かにバイナリ)が含まれている場合は、Mailmanアルゴリズム(Edo Liberty、Steven W. Zucker In Yale大学テクニカルレポート#1402)を試してください:有限辞書で最適化
Common Subexpression Eliminationは、Multiple Constant Multiplicationのようにしばらくの間知られていますが、ゲートレベルまで下がることはオプションです-ここで使用されるパターンは、ソリューションとして個別に使用したり、他の方法とマージしたりすることができます、この「Improving Common Sub-expression Elimination Ning Wu、Xiaoqiang Zhang、Yunfei Ye、およびLidong Lanによる「新しいゲートレベルの遅延コンピューティング手法を使用したアルゴリズム」が「Proceedings of the World Congress on Engineering and Computer Science 2013 Vol II WCECS 2013、23-25 October、」に掲載されました。サンフランシスコ、米国」ゲートレベルCSE

また、定数を使用したシンボリックマトリックスを生成し、変数を使用してベクトル化し、コンパイラーからStatic Single Assingment(SSA)にプラグインして、マトリックスを手作業で記述するプロセスを自動化する、粗雑な作業方法もあります。

新しいアルゴリズムのプロトタイプ
sumの実行で行ったこと: 10回の操作を提供します。Thomasを使用するという私の最初のアイデアでは、同等です。 今のところ、私はまだ新しいアルゴリズムを書いてテストしていますが、ランタイムも厄介ですが、最初のテスト結果は驚くべき答えを与えました:

w1=v1+v2+v3+v4+v5w2=w1+v6v1w3=w2+v7v2w4=w3+v8v3


tmp1=v2+v3+v4+v5w1=v1+tmp1w2=tmp1+v6w3=w2+v7v2w4=w3+v8v3

これにより、9つの操作が行われ、+または-が1で、=が0として定義されます。

w1=v1+v2+v3+v4+v5+v6w2=w1w3=w2v5v6w4=w3w5=w4.

これにより7つの操作が得られ、アルゴリズムの結果は次のなりました: これにより、6つの操作が可能になりました 。今のところ、ハミング距離を使用していることがわかります。ビット単位の操作、使用回数のカウント、Cocke–Younger–Kasami(CYK)などの作成-「発明者であるJohn Cocke、Daniel Younger、およびKasami Tadaoにちなんで命名された、文脈自由文法の解析アルゴリズム。プログラミング。" -ウィキペディアからこれは、変数のブロックを作成するために使用するのと同じ手法です。

tmp1=v1+v2+v3+v4tmp2=v5+v6w1=tmp1+tmp2w2=w1w3=w2tmp2w4=w3w5=w4.


(rev5に関して)plzは「常緑法」の参照を与えます。また、SSAとは何ですか?CYK動的アルゴリズム?
vzn

私はこの答えに賞金を授与し、元の質問を編集する理由を説明しました。
ニック・アルジェ

8

これは、「Online Boolean Matrix-Vector Multiplication(OMv)problem」として知られる未解決の研究問題に関連しています。この問題は次のようになります([1]を参照)。バイナリ行列およびバイナリ列ベクトル与えられた場合、が到着する前にを計算する必要があります。n×nMnv1,,vnMvivi+1

質問からの問題はやや一般的であることに注意してください:行列と実数値ベクトルを考慮します。行列とブールベクトルの問題は、特別な場合を示すため、「簡単」であることに注意してください。m×nn×n

明らかに、Online Boolean Matrix-Vector Multiplication問題(これは標準のmatrix-vector-multiplictionを使用するだけです)のナイーブアルゴリズムには時間がかかります。これはよりも速く実行できないという推測があります(例[1]を参照。以下のように(より詳細には、この予想は行かない:オンラインブールマトリックス-ベクトル乗算の問題を解決し、真にsubcubicアルゴリズム、すなわちタイムランニングとはアルゴリズムが存在しない何が存在するのためには)。O(n3)O(n3)O(n3ε)ε>0

ウィリアムズのアルゴリズムは、この問題を時間解決することが知られてい。詳細については、[2]を参照してください。O(n3/log2n)

上記の推測を証明または反証することができれば、条件付き下限の分野での突破口となるでしょう。

[1]オンライン行列ベクトル乗算推測による動的問題の硬度の統一と強化。Henzinger、Krinninger、Nanongkai、Saranurak
[ http://eprints.cs.univie.ac.at/4351/1/OMv_conjecture.pdf ]

[2]準2次時間の行列ベクトル乗算:(前処理が必要です)。ウィリアムズ
[ http://dl.acm.org/citation.cfm?id=1283383.1283490 ]

更新

コメント内の質問の1つは次のとおりでした。コンパイル時にを知っています。合わせてアルゴリズムを調整できないので、OMv問題(推測)は適用されませんか?OMv推測が失敗しない限り、これは当てはまらないことがわかります。MM

証明のアイデアは単純です:ある特定のサイズまでのすべての行列に対して高速アルゴリズムを与えることができると仮定します(すべての可能なケースを区別するなど)。この特定のサイズの後、分割と征服を使用します。

詳細は次の
修正します(一般性を失うことなく)2のべき乗であり、2より大きくなります。すべてのおよびすべての行列我々は、アルゴリズムを知っているすべてのベクトルのためにあること、計算時間、すなわち、真のsubquadratic時間にいくつかのために。(これにより、サイズまでの各行列に個別のアルゴリズムが許可されることに注意して。)n0Nnn0n×nMAn,MvMvO(n2ε)ε>0n0×n0

今、私たちは本当にsubcubic時間でOMVを解決します:
バイナリ行列を考えるとサイズの、いくつかのためのと、我々は分割統治戦略を使用しています。をサイズ 4つの部分行列に分割します。場合、我々は、アルゴリズムを使用そうでなければ、我々は再帰しました。(は固定数であるため、一定の時間で正しいアルゴリズムを選択できます。)Mn×nn=2kkn>n0MM1,M2,M3,M42k1×2k12k1n0A2k1,Min0

最大で再帰ステップが必要になることに注意してください。また、ベクトルに対して、計算を行います。したがって、すべての行列とベクトルの乗算を処理するには、合計計算時間です。N 、V 1... V Nのn O N 3 - εログN O(logn)nv1,,vnnO(n3εlogn)

対数がどの多項式よりも遅くなる(特にどの根よりも遅くなる)ことはよく知られています。いくつかのをで修正すると、合計計算が真にサブキュービック時間で実行されていることがわかります(特に、時間)。したがって、OMvの推測は間違っています。ε <εON3- εε~>0ε~<εO(n3ε~)

(サイズが、およびが2のべき乗でない場合、およびを次の2のべき乗に増やすことができるので、実行時間の境界は引き続き適用されます。)m × n m n n mMm×nmnnm

結論:入力行列の大文字と小文字の区別を利用して高速アルゴリズムを導出できれば、OMv推測を改善できます。


著者とvznが指摘したように、これは事実ではなく、ベクトルはバイナリではなく、MatrixはN x Nでなく、著者は操作を事前に計算したいので、オンライン処理の必要はありません。推測に基づくだけでは十分ではありません。どちらの論文も質問とは無関係です。ここでのケースは、定数行列を事前計算して、最小限の数の操作を提供することです。完全な、帯状の対称的な場合には、さまざまなアプローチが考えられます。
邪悪な

@EvilJS:M x N行列と実数値ベクトルを許可すると、問題は答えで示したものよりも難しくなります(つまり、オンラインブール行列とベクトルの乗算は特別なケースになります)。より一般的な問題をO(n ^ 3)よりも本当に速く解くことができれば、予想を改善することもできます(これは大ニュースです!)。さらに、著者は質問に対するコメントの中で、ベクトルは最初は未知であると述べています。すべてのベクトルを事前に知っていれば、高速行列乗算(たとえば、Strassenのアルゴリズムのバージョン)を使用できます。
トラニスター

著者の場合は「実際のベクトル」を指摘しただけです。トーマス行列を見てください-O(n)の行列の特別な場合のみ。一般的なケースを意味するものではありません。マトリックスが定数であり、ベクトルがわかっている場合、Strassenを実装せずに回答をハードコードします;(
Evil

@EvilJS:あなたが言おうとしていることを完全に理解しているかどうかはわかりません。もちろん、Thomasマトリックスのような特殊なタイプのマトリックスでは、大幅に高速化できますが、一般的にこれはより困難です。たぶん、私が紹介した問題は前処理ステップ(ベクトルが到着する前)を考慮していることを指摘する必要があります。アルゴリズムを体系的に「ハードコード化」する方法を教えていただければ、推測を改善することもできます(このハードコーディングステップをアルゴリズムの前処理ステップとして実装できるため)。
トランシスター

うまくいくことに同意した。しかし、williamsによる2番目のrefは、特にバイナリ行列をまったく考慮していないようです。fyi彼はここ
-vzn

-2

これは本質的に研究レベルのCSであり、問​​題は少なくとも2つの装いで研究され、1つはスパース行列の乗算(先ほど引用した論文)であり、「バイナリスパース行列」の特殊なケースも研究されています。2 番目のケースは、定型プログラムの最適化に関連していることが知られています。最小限のプログラムは、加算と乗算の2種類の「ゲート」を備えたDAGのようなものである可能性があるため、いくつかの回路最小化の文献がこれに関連する場合があります。ここに、2 番目のケースに関する特定の参考文献と、いくつかの基本的な初期経験的研究を伴うcstheoryに関する同じ質問があります。


1
リンクをざっと読んだだけですが、これまでのところ2つの理由で懐疑的です。1)行列はスパースではありません。多くの場合、非ゼロの数はゼロの数とほぼ同じですが、パターンに基づいて非ゼロを持つ行列のアルゴリズムを見つける方法がしばしばあります。2)これらの論文は、基本的なバイナリ「ゲート」として加算と乗算のみを使用することに基づいているようですが、私の経験では減算も使用することが重要です。これには、減算バイナリゲート、または「-1で乗算」単項ゲートを含める必要があります。O n 2O(n)O(n2)
ニック・アルジェ

refがオンになっているのは、タイトルが示すように、スパース行列です。論文の定義とは異なる定義があるかもしれませんか?スパース性の正確な定義(ほとんどが大まかに相関している/ほとんど交換可能)に敏感な場合は、質問に記載する必要があります。
vzn

1
興味のある行列は密行列です。ちなみに、これで私の質問が完全に解決されるとは思わないが、その答えはありがたい。
ニック・アルジェ

すみません!混乱して、正確な質問に気付かなかった。ざっと見てみると、例2の塗りつぶしは½未満で、私には「スパース」に見え、スパース理論の一部は少なくともある程度適用できると考えられました。基本的に、行列が密であればあるほど、最適化できる演算が少なくなるため、このタイプの最適化に関する理論のほとんどは、疎行列を中心にしています。
vzn

-3

この問題が正確に研究されたかどうかはわかりませんが、この研究は関連しており、合理的なリード/スタートのようです。スパース行列乗算のハイパーグラフ分解を調べます。バイナリ行列は、このアプローチの特殊なケースです。このアプローチでは、「ストレート」乗算法よりも最適な戦略が見つかります。バイナリマトリックスプロパティに基づいて、(このフレームワーク内で)さらなる最適化が可能になる場合があります。


2
これが質問とどう関係するのかわかりません。その論文は、プロセッサ間通信の量を最小限にするために、並列計算のために、分散システム間で行列乗算を分割することについてです。それはこの質問と何の関係がありますか?質問は、並列計算やプロセッサ間通信については何も言及していないようです。接続をより明確にするために、回答を編集することをお勧めします。
DW

同じ問題が発生し、並列計算を最小化すると、同じ計算のシングルプロセッサ実装も最小化されます。少なくとも、質問者は並列実装を除外しませんでした。
vzn

1
リンクありがとうございます。ただし、マトリックスエントリに0と1しか含まれていないという事実を利用していないため、この問題の方法には懐疑的です。たとえば、最初の例の「running total」アルゴリズムは、マトリックスの特定の列の非ゼロエントリがすべて同じ値である場合にのみ機能します。
ニック・アルジェ

NAあなたの観察/異議は答えで扱われます。0/1プロパティを使用すると、おそらくさらに最適化できます。この方法は、並列化を装って加算/乗算の合計回数を最小限に抑えるようです。加算/乗算演算はDAGの「ゲート」と見なすこともでき、この手法はゲートを最小化します。論文のかなりの複雑さは、この最適化プロセスに固有のより深い/かなりの複雑さの一部を明らかにしています。述べられているように、答えはこの困難な問題を決定するものではなく、「何もないよりはまし」です。
vzn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.