Automatisierte Optimierung der 0-1 Matrixvektormultiplikation

22

Frage:

Gibt es eine etablierte Prozedur oder Theorie zum Erzeugen von Code, die eine Matrix-Vektor-Multiplikation effizient anwendet, wenn die Matrix dicht ist und nur mit Nullen und Einsen gefüllt ist? Im Idealfall würde der optimierte Code systematisch auf zuvor berechnete Informationen zurückgreifen, um Doppelarbeit zu reduzieren.

Mit anderen Worten, ich habe eine Matrix und möchte eine Vorberechnung auf der Grundlage von , um so effizient wie möglich zu berechnen , wenn ich später den Vektor erhalte .MMMvv

M ist eine rechteckige dichte binäre Matrix, die zur "Kompilierzeit" bekannt ist, während ein unbekannter reeller Vektor ist, der nur zur "Laufzeit" bekannt ist.v

Beispiel 1: (Schiebefenster)

Lassen Sie mich ein einfaches kleines Beispiel verwenden, um meinen Standpunkt zu veranschaulichen. Betrachten Sie die Matrix Angenommen, wir wenden diese Matrix auf einen Vektor an, um w = Mv zu erhalten . Dann lauten die Einträge des Ergebnisses \ begin {align} w_1 & = v_1 + v_2 + v_3 + v_4 + v_5 \\ w_2 & = v_2 + v_3 + v_4 + v_5 + v_6 \\ w_3 & = v_3 + v_4 + v_5 + v_6 + v_7 \\ w_4 & = v_4 + v_5 + v_6 + v_7 + v_8 \ end {align}

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

Wenn Sie eine Standardmatrix-Vektor-Multiplikation durchführen, wird genau dies berechnet. Ein Großteil dieser Arbeit ist jedoch überflüssig. Wir könnten die gleiche Matrixberechnung zu geringeren Kosten durchführen, indem wir eine "laufende Summe" verfolgen und addieren / subtrahieren, um die nächste Zahl zu erhalten:

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

Beispiel 2: (hierarchische Struktur)

Im vorherigen Beispiel konnten wir nur eine laufende Summe verfolgen. Normalerweise müsste jedoch ein Baum mit Zwischenergebnissen erstellt und gespeichert werden. Angenommen,

M=[111111111111111111111111]
Man könnte w=Mv effizient mit einem Baum von Zwischenergebnissen berechnen :
  1. Berechnen Sie w5 und w7 und addieren Sie sie, um w_3 zu erhalten w3.
  2. Berechnen Sie w4 und w6 und addieren Sie sie, um w_2 zu erhalten w2.
  3. Addiere und , um zu erhaltenw 3 w 1w2w3w1

Die Struktur in den obigen Beispielen ist leicht zu sehen, aber für die tatsächlichen Matrizen, die mich interessieren, ist die Struktur nicht so einfach.

Beispiel 3: (niedriger Rang)

Um einige Verwirrungen zu beseitigen, sind die Matrizen im Allgemeinen nicht spärlich. Insbesondere muss eine Methode, die dieses Problem löst, in der Lage sein, effiziente Methoden zum Anwenden von Matrizen zu finden, bei denen große Blöcke mit Einsen gefüllt sind. Zum Beispiel betrachten

M=[111111111111111111111111].

Diese Matrix kann als Differenz zweier Rang-1-Matrizen zerlegt werden,

M=[111111111111111111111111111111][111111]

so seine Wirkung auf einem Vektor berechnet werden kann effizient durch, w 1w:=Mv

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

Motivation:

Ich arbeite an einer numerischen Methode für einige Bildverarbeitungen, und es gibt mehrere große dichte Matrizen mit unterschiedlichen Strukturen, die für alle Zeiten festgelegt sind. Später müssen diese Matrizen auf viele unbekannte Vektoren angewendet werden , die von der Eingabe des Benutzers abhängen. Im Moment benutze ich Bleistift und Papier, um einen effizienten Code pro Matrix zu erstellen, aber ich frage mich, ob der Prozess automatisiert werden kann.v i01vi

Bearbeiten: (Nachschrift)

Alle Antworten hier (Stand 05.09.15) sind interessant, aber keine beantwortet die Frage so zufriedenstellend, wie ich es mir erhofft hatte. Wahrscheinlich stellt sich heraus, dass dies eine schwierige Forschungsfrage ist und niemand eine gute Antwort kennt.

Da die Zeit abgelaufen ist, gewähre ich der Antwort von EvilJS das Kopfgeld, da es die richtige Frage anspricht. Ich wünsche mir jedoch, dass die Antwort klarere und detailliertere Erklärungen enthält.

Die Antwort von tranisstor stellt eine Verbindung zwischen dieser Frage und dem Online Boolean Matrix-Vector Multiplication (OMv) -Problem her, aber die Verbindung ist nicht genau das, was diese Frage stellt. Insbesondere passt die folgende Annahme nicht wirklich (fett hervorgehoben meine),

Nehmen wir nun an, dass wir für alle und alle Matrizen n × nnn0n×nM einen Algorithmus , der für alle Vektoren in wirklich subquadratischer Zeit berechnet , dh in Zeit für einige .An,MvMvO(n2ε)ε>0

Ob für alle Matrizen subquadratische Algorithmen existieren oder nicht, ist orthogonal zur Frage, ob ein Algorithmus für eine bestimmte Matrix gefunden werden soll, der so schnell wie möglich ist. Die meisten 0-1-Matrizen sehen aus wie zufälliges Rauschen und haben (wenn ich raten würde) wahrscheinlich keine subquadratischen Algorithmen. Die Tatsache, dass es wirklich schlechte Matrizen gibt, hindert mich jedoch nicht daran, einen schnellen Algorithmus für eine gute Matrix zu finden, beispielsweise eine "Schiebefenster" -Matrix.

Die Antworten von vzn, die erste Antwort und die zweite Antwort sind interessant (und meiner Meinung nach verdienen sie nicht so viele Abwertungen), gelten jedoch aus den in den Kommentaren genannten Gründen nicht für die Frage.

Nick Alger
quelle
1
Wenn Ihre Matrix von dieser Form ist, ist TDMA die Bandmatrix, der Thomas-Algorithmus. Noch nicht 0-1, aber diese Funktion sollte ausgenutzt werden.
Evil
@EvilJS Die Matrix ist zufällig für das jeweilige Beispiel mit einem Streifen versehen. Im Allgemeinen wird es nicht gebändert. Ich habe ein weiteres Beispiel hinzugefügt, das nicht gebändert ist.
Nick Alger
Sie haben viele konstante Matrizen N x M, die binäre, reelle Vektoren sind und den optimalen Ausführungspfad während der Vorverarbeitungsphase pro Instanz vorberechnen möchten? Die Ausgabe einer solchen Operation ist Code mit fest codierten Operationen pro Matrix, und Sie möchten, dass die Methode dies tut? Mit pro Instanz meine ich pro Matrix. Ich überprüfe nur.
Evil
@EvilJS Bei dieser Frage handelt es sich um die Situation, in der es eine bekannte binäre Matrix , die zu einem späteren Zeitpunkt auf viele unbekannte reelle Vektoren angewendet wird. Basierend auf möchten wir einen Code vorberechnen, der so effizient wie möglich anwendet , damit wir später, wenn wir das , so schnell wie möglich berechnen können. In der speziellen Anwendung, die diese Frage motiviert, habe ich eine Handvoll solcher binärer Matrizen (tatsächlich 12), die für alle Zeiten festgelegt sind, während die Vektoren unvorhersehbar sind und von Eingaben des Benutzers des Programms abhängen. v i M M v i M v i v iMviMMviMvivi
Nick Alger
1
Über das Feld von zwei Elementen ist das Problem der Berechnung der minimalen XOR-Gatterschaltung, die eine gegebene lineare Transformation simuliert, NP-schwer. Siehe cstheory.stackexchange.com/a/32272/225
Ryan Williams,

Antworten:

5

Wenn es möglich ist, versuchen Sie, die bandierte tridiagonale Natur der Matrix auszunutzen.
Wenn die Matrix nur eine konstante Anzahl unterschiedlicher Werte enthält (was sicherlich binär ist), sollten Sie den Mailman-Algorithmus (von Edo Liberty, Steven W. Zucker, Technischer Bericht der Universität Yale Nr. 1402) ausprobieren: Über endliches Wörterbuch optimiert
Common Subexpression Elimination ist seit einiger Zeit bekannt als Multiple Constant Multiplication, aber das Herunterschalten auf Gate-Ebene ist eine Option - die hier verwendeten Muster können separat als Lösung verwendet oder mit anderen Methoden zusammengeführt werden, dem Artikel zur "Verbesserung der Common Subexpression Elimination" Algorithmus mit einem neuen Verzögerungsberechnungsverfahren auf Gate-Ebene "von Ning Wu, Xiaoqiang Zhang, Yunfei Ye und Lidong Lan, veröffentlicht in" Proceedings of the World Congress on Engineering and Computer Science 2013, Band II WCECS 2013, 23.-25. Oktober 2013, San Francisco, USA " Gate-Ebene CSE

Es gibt auch eine grobe, aber funktionierende Methode, um eine symbolische Matrix mit Konstanten zu generieren, einen Vektor mit Variablen zu erstellen und diese von Compilern an Static Single Assingment (SSA) anzuschließen, wodurch der Prozess des Schreibens von Matrizen von Hand automatisiert wird.

Neuer Algorithmus-Prototyp
Was Sie mit der laufenden Summe gemacht haben: Gibt 10 Operationen , und mit meiner anfänglichen Idee, Thomas zu verwenden, ist es äquivalent. Im Moment schreibe und teste ich immer noch neue Algorithmen, auch die Laufzeiten sind unangenehm , aber das erste Testergebnis gab mir eine überraschende Antwort:

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

Gibt 9 Operationen aus und definiert sie als + oder - ist 1 und = ist 0.

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

Dies ergibt 7 Operationen , mein Algorithmusergebnis ergibt: Das gibt 6 Operationen. Im Moment kann ich sagen, dass ich Hamming distance verwende, & und | bitweise Operationen, Zählen von Verwendungen und Erstellen von so etwas wie Cocke-Younger-Kasami (CYK) - "ein Parsing-Algorithmus für kontextfreie Grammatiken, benannt nach seinen Erfindern John Cocke, Daniel Younger und Tadao Kasami. Er verwendet Bottom-Up-Parsing und Dynamik Programmierung." - aus Wikipedia Dies ist die gleiche Technik, die ich zum Erstellen von Variablenblöcken verwende.

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

Böse
quelle
(Re rev5) PLZ geben Hinweis auf "immergrüne Methode". Was ist SSA? Dynamischer CYK-Algorithmus?
VZN
Ich habe diese Antwort mit dem Kopfgeld belohnt und in einer Bearbeitung meiner ursprünglichen Frage erklärt, warum.
Nick Alger
8

Dies hängt mit einer offenen Forschungsfrage zusammen, die als "Online Boolean Matrix-Vector Multiplication (OMv) -Problem" bekannt ist. Dieses Problem lautet wie folgt (siehe [1]): Wenn eine binäre Matrix und binäre Spaltenvektoren , müssen wir berechnen, bevor ankommt.M n v 1 , , v n M v i v i + 1n×nMnv1,,vnMvivi+1

Beachten Sie, dass das Problem aus der Frage etwas allgemeiner ist: Es erlaubt Matrizen und reelle Vektoren. Beachten Sie, dass das Problem mit Matrizen und Booleschen Vektoren "einfacher" ist, da es einen Sonderfall darstellt.n × nm×nn×n

Offensichtlich benötigt der naive Algorithmus für das Online-Boolesche Matrix-Vektor-Multiplikationsproblem (das nur die Standard-Matrix-Vektor-Multiplikation verwendet) die Zeit . Es gibt eine Vermutung (siehe zB [1]), dass dies nicht wirklich schneller als . (Im Einzelnen lautet diese Vermutung wie folgt: Es gibt keinen wirklich subkubischen Algorithmus, der das Online-Boolesche Matrix-Vektor-Multiplikationsproblem löst, dh es gibt keinen Algorithmus mit der Laufzeit für ).O ( n 3 ) O ( n 3 - & egr ; ) & egr ; > 0O(n3)O(n3)O(n3ε)ε>0

Es ist bekannt, dass Williams Algorithmus dieses Problem in der Zeit löst . Siehe [2] für weitere Details.O(n3/log2n)

Es wäre ein Durchbruch im Bereich der bedingten Untergrenzen, wenn man die obige Vermutung beweisen oder widerlegen könnte.

[1] Vereinheitlichen und Verstärken der Härte für dynamische Probleme über eine Online-Matrix-Vektor-Multiplikations-Vermutung. von Henzinger, Krinninger, Nanongkai und Saranurak
[ http://eprints.cs.univie.ac.at/4351/1/OMv_conjecture.pdf ]

[2] Matrix-Vektor-Multiplikation in subquadratischer Zeit: (Vorverarbeitung erforderlich). von Williams
[ http://dl.acm.org/citation.cfm?id=1283383.1283490 ]

Aktualisieren

Eine der Fragen in den Kommentaren lautete wie folgt: Wir kennen zur Kompilierungszeit. Können wir unseren Algorithmus nicht an anpassen , sodass das OMv-Problem (Vermutung) nicht zutrifft? Wir werden sehen, dass dies nicht der Fall ist, es sei denn, die OMv-Vermutung schlägt fehl.MMM

Die Beweisidee ist einfach: Nehmen wir an, wir könnten schnelle Algorithmen für alle Matrizen bis zu einer bestimmten Größe liefern (z. B. alle möglichen Fälle unterscheiden). Nach dieser bestimmten Größe verwenden wir Teilen und Erobern.

Hier sind die Details:
Fixiere einige , was (ohne Verlust der Allgemeinheit) eine Potenz von 2 und größer als 2 ist. Nun nehme an, dass für alle und alle Matrizen Wir kennen einen Algorithmus , der für alle Vektoren in einer wirklich subquadratischen Zeit berechnet , dh in der Zeit für einige . (Beachten Sie, dass dies einen individuellen Algorithmus für jede Matrix bis zur Größe .)n0Nnn0n×nMAn,MvMvO(n2ε)ε>0n0×n0

Nun werden wir OMv in wirklich subkubischer Zeit lösen:
Wenn wir eine binäre Matrix der Größe mit für einige und , verwenden wir eine Divisions- und Eroberungsstrategie. Wir teilen in vier Untermatrizen der Größen . Wenn , verwenden wir den Algorithmus , andernfalls nehmen wir eine Rekursion vor. (Da eine feste Zahl ist, können wir den richtigen Algorithmus in konstanter Zeit auswählen.)Mn×nn=2kkn>n0MM1,M2,M3,M42k1×2k12k1n0A2k1,Min0

Beachten Sie, dass wir höchstens Rekursionsschritte benötigen . Außerdem werden wir für Vektoren Berechnungen durchführen. Um alle Matrix-Vektor-Multiplikationen zu verarbeiten, benötigen wir also eine Gesamtberechnungszeit von .O(logn)nv1,,vnnO(n3εlogn)

Es ist bekannt, dass der Logarithmus langsamer wächst als jedes Polynom (insbesondere langsamer als jede Wurzel). Fixing einig mit , wir sehen , dass unsere Gesamtberechnung in wirklich subcubic Laufzeit (insbesondere in der Zeit ). Somit wäre die OMv-Vermutung falsch.ε~>0ε~<εO(n3ε~)

(Wenn die Größe und und keine Potenzen von 2 sind, gelten immer noch die Grenzen der Laufzeiten, da wir nur und auf die nächsten Potenzen von 2 erhöhen könnten .)Mm×nmnnm

Schlussfolgerung: Wenn Sie Groß- und Kleinschreibung in den Eingabematrizen verwenden könnten, um schnelle Algorithmen abzuleiten, könnten Sie die OMv-Vermutung verbessern.

tranisstor
quelle
Wie von author und vzn hervorgehoben, ist dies nicht der Fall, vector ist nicht binär, Matrix ist nicht erforderlich N x N, und author möchte Operationen vorberechnen, und es besteht keine Notwendigkeit für eine Online-Verarbeitung. Basierend auf Vermutungen ist das nicht genug. Beide Papiere sind irrelevant zu hinterfragen. Der Fall hier ist, eine Konstantenmatrix vorab zu berechnen, um eine minimale Anzahl von Operationen bereitzustellen. Es wird verschiedene Ansätze für vollständige, gebänderte, symmetrische Fälle geben.
Evil
@EvilJS: Wenn Sie eine M x N-Matrix und reelle Vektoren zulassen, wird das Problem nur schwieriger als das, was ich in der Antwort angegeben habe (dh die Online-Multiplikation von booleschen Matrixvektoren wird ein Sonderfall sein). Wenn Sie das allgemeinere Problem wirklich schneller lösen könnten als O (n ^ 3), würden Sie auch die Vermutung verbessern (was eine große Neuigkeit wäre!). Darüber hinaus sagt der Autor in einem Kommentar zu der Frage, dass die Vektoren zunächst unbekannt sind. Wenn Sie zuvor alle Vektoren gekannt haben, können Sie einfach eine schnelle Matrixmultiplikation verwenden (z. B. eine Version des Strassen-Algorithmus).
Tranisstor
Ich habe gerade auf den Fall "echter Vektor" hingewiesen. Schauen Sie sich die Thomas-Matrix an - nur der Sonderfall von Matrizen in O (n). Ich impliziere keinen allgemeinen Fall. Und wenn Matrix konstant sind und Vektoren bekannt sind, implementieren Sie keine Strassen-Hardcode-Antwort (
Evil
@ EvilJS: Ich bin nicht sicher, ob ich vollständig verstehe, was Sie sagen wollen. Natürlich können Sie für spezielle Matrizentypen wie die Thomas-Matrix eine erhebliche Beschleunigung erzielen, aber im Allgemeinen ist dies schwieriger. Vielleicht sollte ich auch darauf hinweisen, dass das von mir eingeführte Problem einen Vorverarbeitungsschritt in Betracht zieht (bevor ein Vektor eintrifft). Wenn Sie mir sagen könnten, wie Sie Ihren Algorithmus für jede Matrix, die ich Ihnen gebe, systematisch "hartcodieren" können, könnten Sie auch die Vermutung verbessern (da Sie diesen Hartcodierungsschritt als Vorverarbeitungsschritt eines Algorithmus implementieren könnten).
Tranisstor
stimmte zu, dass es funktioniert; Die zweite Referenz von Williams scheint jedoch überhaupt keine binären Matrizen zu berücksichtigen. Zu
Ihrer Information,
-2

Hierbei handelt es sich im Wesentlichen um CS auf Forschungsniveau. Das Problem wird in mindestens zwei Formen untersucht, und zwar in Form der Multiplikation von dünnen Matrizen (Beispielpapier, das gerade zitiert wurde). Außerdem wird der Spezialfall der "binären dünnen Matrizen" untersucht. Es ist bekannt, dass der zweite Fall mit der Optimierung von linearen Programmen zusammenhängt. Minimale Programme können auch wie DAGs mit zwei Arten von "Gattern" sein, Addition und Multiplikation, so dass einige Literatur zur Schaltungsminimierung damit in Verbindung gebracht werden kann und möglicherweise Software "von der Stange" für diesen Zweck angepasst werden könnte. hier ist eine spezifische ref am 2 nd Fall und auch die gleiche Frage auf cstheory mit einiger grundlegenden ersten empirischen Studie.

vzn
quelle
1
O(n)O(n2)
die refs sind, wie die titel andeuten, spärliche matrizen . Vielleicht haben Sie eine andere Definition als in den Zeitungen? Wenn Sie empfindlich auf eine genaue Definition von Sparsity reagieren (die meisten sind grob korreliert / nahezu austauschbar), sollte dies in der Frage angegeben werden.
vzn
1
Die Matrizen, die mich interessieren, sind dichte Matrizen. Übrigens, obwohl ich denke, dass dies meine Frage nicht vollständig beantwortet, schätze ich die Antwort.
Nick Alger
Ok, tut mir Leid! wurde durcheinander gebracht, erkannte nicht die genaue Frage. auf den oberflächlichen blick hat dein beispiel 2 weniger als ½ füllung & sah für mich "spärlich" aus & dachte, einiges von der spärlichen theorie wäre zumindest einigermaßen anwendbar. Grundsätzlich gilt: Je dichter die Matrix ist, desto weniger kann die Operation optimiert werden. Daher ist wahrscheinlich der größte Teil der Theorie über diese Art der Optimierung auf spärliche Matrizen ausgerichtet.
vzn
-3

Ich bin nicht sicher, ob dieses Problem genau untersucht wurde, aber diese Forschung ist verwandt und scheint ein vernünftiger Anhaltspunkt zu sein. es befasst sich mit der Hypergraph-Zerlegung für die Multiplikation mit dünner Matrix. binäre Matrizen sind ein Sonderfall dieses Ansatzes. Dieser Ansatz findet optimalere Strategien als die "gerade" Multiplikationsmethode. Weitere Optimierungen (innerhalb dieses Rahmens) sind möglicherweise basierend auf der Eigenschaft der binären Matrix möglich.

vzn
quelle
2
Ich verstehe nicht, was das mit der Frage zu tun hat. In diesem Artikel geht es um die Aufteilung der Matrixmultiplikation auf ein verteiltes System zur parallelen Berechnung, um den Umfang der Kommunikation zwischen Prozessoren zu minimieren. Was hat das mit dieser Frage zu tun? Die Frage scheint nichts über parallele Berechnung oder Kommunikation zwischen Prozessoren zu sagen. Ich empfehle Ihnen, Ihre Antwort zu bearbeiten, um den Zusammenhang deutlicher zu machen.
DW
Dies ist das gleiche Problem, und die Minimierung der parallelen Berechnung minimiert auch die Implementierung derselben Berechnungen durch einen einzelnen Prozessor. Zumindest schloss der Fragesteller parallele Implementierungen nicht aus.
vzn
1
Vielen Dank für den Link. Ich bin jedoch skeptisch gegenüber der Methode für dieses Problem, da sie die Tatsache nicht ausnutzt, dass die Matrixeinträge nur Nullen und Einsen enthalten, während diese Eigenschaft, soweit ich das beurteilen kann, sehr wichtig ist. Beispielsweise funktioniert der Algorithmus "Running Total" im ersten Beispiel nur, wenn alle Einträge ungleich Null in einer bestimmten Spalte der Matrix denselben Wert haben.
Nick Alger
NA Ihre Bemerkung / Ihr Einwand wird in der Antwort angesprochen. Eine weitere Optimierung ist wahrscheinlich mit der Eigenschaft 0/1 möglich. Diese Methode scheint die Gesamtzahl der Additions- / Multiplikationsoperationen unter dem Deckmantel der Parallelisierung zu minimieren. Die Additions- / Multiplikationsoperationen können auch als "Tore" in einer DAG angesehen werden, und die Technik minimiert Tore. Die erhebliche Komplexität des Papiers zeigt einige der inhärenten tieferen / wesentlichen Komplexität dieses Optimierungsprozesses. Wie bereits erwähnt, soll die Antwort für dieses schwierige Problem nicht endgültig sein, sondern nur "besser als nichts".
VZN