ストラッセンはどのようにして行列乗算法を思いついたのですか?


18

有名なStrassenの行列乗算アルゴリズムは、時間の複雑さを従来のO(n 3)からO(n 2.8)に減らすので、私たちにとっては本当の扱いです。

しかし、コーメンとスティーブン・スキエナの本さえ含めて、私が経験したすべてのリソースのうち、彼らは明らかにストラッセンがそれについてどう考えたかについて述べていません。

Strassenの行列乗算アルゴリズムの理論的根拠は何ですか?これは幸運な事故なのでしょうか、それとももっと深いものがありますか?


私は誰も本当に知らないと言われました、何でも主に推測です。しかし、私はこれを適用できるかもしれません(私はそれを読んでいませんが)。
ダケリング

Strassen algと思います。ウィキペディアでは明確です。
MarshalSHI

4
@meshuai 他のほとんどのリソースのように彼がどう考えたのかではなく、なぜそれが機能するのかを説明しているだけだと思います。
ダケリング

回答:


26

Strassenを除けば、Strassenがどのように彼のアイデアを手に入れたかを誰も説明できません。Howeber¹、代数幾何学と表現理論に興味があるなら、その式を自分でどのようにして見つけたのかを説明できます。これはまた、Strassenの式が可能な限り優れていること、より正確には、7未満の乗算を使用する2つの2×2行列の積を計算する式がないことを示すツールを提供します。

行列に興味があるので、基本的な線形代数を知っていて、より高度な詳細については少しぼやけていると思います。

まず、平面から平面へのすべての線形マップのセットをEとします。これは基本的にすべての2×2行列のセットですが、特定の座標系については忘れています。「既定の」座標系よりも優れた座標系があれば、行列の乗算に使用できるからです。我々も示すによって†EのデュアルスペースEとによってX = P(E⊗E†⊗E†)のテンソル積に関連した射影空間E⊗E†⊗E†

特殊形式[c⊗α⊗β]X = P(E⊗E†⊗E†)の要素は、マトリックスの基本操作として解釈できます。これは、適切な座標系によっては、マトリックスの係数を読み取りますAと行列Bの係数。これらの係数の積を行列Cに書き込みます。Xの一般的な要素はこれらの基本演算の組み合わせであるため、P(E)×P(E)からP(E)へのマップとして理解される2つの行列の積πXの点です。

通常の行列積の公式とStrassenの公式は、これらの線形演算の組み合わせとして表現できるため、これらの基本演算のセット[c⊗α⊗β]W₁で示し、それらの組み合わせを幾何学的に説明します。

してみましょうW₂は、さまざまなことが割線W₁X.これは、の2つ(ジェネリック)のポイントを通過するすべての行の和集合(閉鎖)を取ることによって得られるW₁。itは、2つの要素演算のすべての組み合わせのセットと考えることができます。

してみましょうW₃は、さまざまなこと割線面W₁X.これは、の3(ジェネリック)のポイントを通過するすべての平面の労働組合(閉鎖)取ることで得られるW₁を。これは、3つの要素演算のすべての組み合わせのセットと考えることができます。

同様に、より大きなインデックスの割線の種類を定義します。これらの種類はますます大きくなる、つまりW₁⊂W₂⊂W₃⊂⋯であることに注意してください。したがって、古典的な行列積公式は、行列の積がW₈の点であることを示しています。実は

命題(シュトラッセ) -行列の積πで嘘W₇。

私の知る限り、ストラッセンはそのようなことをしませんでしたが、これはこの質問の幾何学的な観点です。この観点は、Strassenの式が最適であること、つまりπW₆にないことを証明できるため、非常に便利です。ここで開発された幾何学的手法は、より広範な問題にも使用できます。

私はあなたの好奇心をつかんだと思います。LandsbergとManivelによるこの記事を読むと、さらに先へ進むことができます。

http://arxiv.org/abs/math/0601097

¹風邪をひいたので、このタイプミスは修正しません。


21個の乗算で(3x3)行列積を行うことができると、漸近的に高速なアルゴリズムになることを示すのは非常に簡単です。これが可能/不可能/不明な場合、何か考えはありますか?
gnasher729

3

私はちょうど宿題のためにこれをするように任されました、そして私はきちんとしたエピファニーがあると思った:Strassenのアルゴリズムは「より深い」事前集計コンポーネントと引き換えに少ない操作を使用するためにその事前集計コンポーネントの「幅」を犠牲にしますそれでも最終的な回答を抽出するために使用できます。(これを言うのは最善の方法ではありませんが、説明するのは難しいです)。

操作とコンポーネント」のバランスを説明するために、2つの複素数を乗算する例を使用します。

複素数の方程式。

4つの乗算を使用しているため、4つの製品コンポーネントになります

4つの製品コンポーネントがあります。

最終的な2つのコンポーネントである複素数の実数部と虚数部は、実際には線形方程式であり、スケーリングされた積の合計であることに注意してください。そのため、ここでは加算乗算の 2つの演算を扱っています。

実際、コンポーネントを単純に追加または削除すると、4つの製品コンポーネント2つの最終コンポーネントを表すことができます。

製品コンポーネントは、最終的なコンポーネントを表すことができます。

ただし、最後の2つのコンポーネントは、製品の合計として表すことができますここに私が思いついたものがあります:

実際に必要な製品コンポーネントは3つだけです。

ご覧のとおり、実際には最後の2つを作成するために必要な製品コンポーネント3つだけです。

3つの異なるコンポーネント。

ちょっと待って!各大文字はそれ自体が製品です!しかし、キャッチは、(a + b)(c + d)から(A + B + C + D)を生成できることを知っていることです。これはたった1回の乗算です。

そのため、最終的に、アルゴリズムは最適化され、より少ないが「より太い」コンポーネントを使用するようになります。

これを可能にするものの一部は、A(B + C)が(AB + AC)と同等になることを可能にする分配特性です。1つは1加算と1乗算演算を使用して計算でき、2番目は2乗算と1合計を必要とすることに注意してください。

Strassenのアルゴリズムは、複素数の製品に適用した最適化を拡張したものです。ただし、より多くのターゲット製品用語と、それらの用語を取得するために使用できる製品コンポーネントが増える可能性があります。2x2マトリックスの場合、Strassenのアルゴリズムは、8個の乗算を必要とするアルゴリズムを7個の乗算を必要とするアルゴリズムにモーフィングし、分配プロパティを活用して2つの乗算を1つの操作に「マージ」し、代わりに新しい「fatter」ノードから1つを抽出します製品用語またはその他、など。

良い例:(-1)と(2)と(5)を取得するには、ちょうど(-1)、(2)、(5)と考えるか、(2-3と考えることができます) )、(2)、(2 + 3)。ただし、2番目の操作では、それほど明確でない数値を使用します。キャッチは、異なる数の数が、行列乗算のために計算する必要がある製品コンポーネントの数に等しいことです。このために最適化するだけで、分布プロパティを介して異なるバリエーションを使用して同型出力を活用する、基になる操作の特定のビューを見つけます。

おそらくこれは何らかの形でトポロジにリンクできますか?これは私の素人の理解方法です。

編集:これは、複素数の説明を作成する過程で描いたメモの写真です。

複素数部分を理解するためのいくつかのメモ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.