Pytanie:
Czy istnieje ustalona procedura lub teoria generowania kodu, która skutecznie stosuje mnożenie macierzy-wektora, gdy matryca jest gęsta i wypełniona tylko zerami i zerami? Najlepiej byłoby, gdyby zoptymalizowany kod systematycznie wykorzystywał wcześniej obliczone informacje w celu ograniczenia powielania pracy.
Innymi słowy, mam macierz i chcę wykonać pewne wstępne obliczenia na podstawie , które sprawią, że obliczenie będzie możliwie najbardziej wydajne, gdy później otrzymam wektor .
przeciwko jest prostokątną gęstą macierzą binarną znaną w „czasie kompilacji”, natomiast jest nieznanym wektorem rzeczywistym znanym tylko w „czasie wykonywania”.
Przykład 1: (okno przesuwne)
Pozwól, że użyję łatwego, małego przykładu, aby zilustrować mój punkt widzenia. Rozważmy macierz, Załóżmy, że zastosujemy tę macierz do wektora aby uzyskać . Następnie wpisy wyniku to:
Wykonanie standardowego mnożenia macierzy i wektora spowoduje obliczenie dokładnie w ten sposób. Jednak wiele z tych prac jest zbędnych. Możemy wykonać to samo obliczenie macierzy przy mniejszym koszcie, śledząc „sumę bieżącą” i dodając / odejmując, aby uzyskać następną liczbę:
Przykład 2: (struktura hierarchiczna)
W poprzednim przykładzie możemy po prostu śledzić bieżącą sumę. Jednak zwykle trzeba stworzyć i przechowywać drzewo wyników pośrednich. Na przykład rozważmy Można efektywnie obliczyć przy użyciu drzewa wyników pośrednich:
- Oblicz i i dodaj je, aby uzyskać .
- Oblicz i i dodaj je, aby otrzymać .
- Dodaj i aby uzyskaćw 3 w 1
Struktura w powyższych przykładach jest łatwa do zauważenia, ale w przypadku rzeczywistych macierzy, którymi jestem zainteresowany, struktura nie jest taka prosta.
Przykład 3: (niska ranga)
Aby wyjaśnić pewne zamieszanie, matryce na ogół nie są rzadkie. W szczególności metoda rozwiązująca ten problem musi być w stanie znaleźć wydajne metody stosowania macierzy, w których duże bloki są wypełnione jednymi. Rozważmy na przykład
Macierz ta może być rozłożona jako różnica dwóch macierzy rangi 1,
więc jego działanie na wektorze można efektywnie obliczyć, w 1
Motywacja:
Pracuję nad metodą numeryczną do przetwarzania obrazów i istnieje kilka dużych gęstych matryc o różnych strukturach, które są ustalone na zawsze. Później te macierze będą musiały zostać zastosowane do wielu nieznanych wektorów które będą zależeć od danych wejściowych użytkownika. W tej chwili używam ołówka i papieru, aby wymyślić skuteczny kod dla każdej matrycy, ale zastanawiam się, czy proces można zautomatyzować.v i
Edycja: (postscript)
Wszystkie dotychczasowe odpowiedzi (z 15 września 2015 r.) Są interesujące, ale żadna z nich nie odpowiada tak zadowalająco, jak się spodziewałem. Prawdopodobnie okazuje się, że jest to trudne pytanie badawcze i nikt nie zna dobrej odpowiedzi.
Od upływu czasu nagradzam nagrodę za odpowiedź EvilJS, ponieważ odpowiada ona na właściwe pytanie. Chciałbym jednak, aby odpowiedź zawierała bardziej jasne i szczegółowe wyjaśnienia.
Odpowiedź tranisstora tworzy związek między tym pytaniem a problemem Online Moolean Matrix-Vector Multiplication (OMv), ale związek nie jest dokładnie tym, o co pyta to pytanie. W szczególności poniższe założenie nie pasuje (moje śmiałe podkreślenie),
Załóżmy teraz, że dla wszystkich i wszystkich macierzy n × n M A n , M v M v O ( n 2 - ε ) ε > 0 znamy algorytm , że dla wszystkich wektorów oblicza w czasie naprawdę subkwadratowym, tj. W czasie dla niektórych .
To, czy istnieją algorytmy subkwadratowe dla wszystkich macierzy, jest ortogonalne wobec pytania o znalezienie algorytmu dla konkretnej macierzy, który jest tak szybki, jak to możliwe. Większość matryc 0-1 wygląda jak losowy szum i (jeśli miałbym zgadywać) prawdopodobnie nie ma algorytmów subkwadratowych. Jednak fakt, że istnieją naprawdę złe matryce, nie przeszkadza mi w znalezieniu szybkiego algorytmu na dobrej matrycy, na przykład macierzy „przesuwanego okna”.
Odpowiedzi vzn, pierwsza odpowiedź , druga odpowiedź są interesujące (i moim zdaniem nie zasługują na tak wiele ocen), ale nie odnoszą się do pytania z powodów omówionych w komentarzach tam.
źródło
Odpowiedzi:
Jeśli to możliwe, spróbuj wykorzystać pasmową trójosiową naturę matrycy.
W przeciwnym razie, jeśli matryca zawiera tylko stałą liczbę różnych wartości (co z pewnością jest binarne), powinieneś wypróbować algorytm Mailmana (autor: Edo Liberty, Steven W. Zucker W raporcie technicznym uniwersytetu Yale nr 1402): zoptymalizowany w stosunku do skończonego słownika
Wspólna eliminacja podwyrażeń jest znana od pewnego czasu, jak wielokrotne stałe zwielokrotnianie, ale zejście do poziomu bramki jest opcją - stosowane tutaj wzorce mogą być użyte osobno jako rozwiązanie lub połączone z innymi metodami, artykuł na ten temat „Poprawianie wspólnej eliminacji podwyrażeń” Algorytm z nową metodą obliczania opóźnienia na poziomie bramy ”autorstwa Ning Wu, Xiaoqiang Zhanga, Yunfei Ye i Lidonga Lan opublikowanych w„ Proceedings of the World Congress on Engineering and Computer Science 2013 Vol II WCECS 2013, 23–25 października 2013 r., San Francisco, USA „ Poziom bramy CSE
Istnieje również prymitywna, ale działająca metoda, aby wygenerować macierz symboliczną ze stałymi, wektor ze zmiennymi i podłączyć go do statycznego pojedynczego przypisania (SSA) z kompilatorów, który automatyzuje proces ręcznego pisania macierzy.
nowy prototyp algorytmu
Co zrobiłeś z sumą bieżącą: Daje 10 operacji i przy moim początkowym pomyśle korzystania z Thomasa jest to równoważne. Na razie piszę i testuję nowy algorytm, również środowiska wykonawcze są nieprzyjemne , ale pierwszy wynik testu dał mi zaskakującą odpowiedź:
Który daje 9 operacji , definiując je jako + lub - wynosi 1, a = wynosi 0.
Daje to 7 operacji , wynik mojego algorytmu dał: Co daje 6 operacji Na razie mogę powiedzieć, że używam odległości Hamminga, i | operacje bitowe, liczenie zastosowań i tworzenie czegoś takiego jak Cocke – Younger – Kasami (CYK) - „algorytm analizujący dla gramatyki bezkontekstowej, nazwany na cześć jego wynalazców, Johna Cocke'a, Daniela Youngera i Tadao Kasami. Wykorzystuje oddolną analizę i dynamikę programowanie." - z Wikipedii To ta sama technika, której używam do budowania bloków zmiennych.
źródło
Jest to związane z otwartym pytaniem badawczym, znanym jako „problem online mnożenia macierzy i wektorów (OMv)”. Problem ten brzmi następująco (patrz [1]): Biorąc pod uwagę binarną macierz M i n binarnych wektorów kolumn v 1 , … , v n , musimy obliczyć M v i zanim nadejdzie v i + 1 .n×n M n v1,…,vn Mvi vi+1
Zauważ, że problem z pytania jest nieco bardziej ogólny: pozwala na macierze i wektory o wartościach rzeczywistych. Zauważ, że problem z macierzami n × n i wektorami boolowskimi jest „łatwiejszy”, ponieważ stanowi szczególny przypadek.m×n n×n
Najwyraźniej naiwny algorytm dla Online Boolean Matrix-Vector Multiplication (który wykorzystuje tylko standardowe mnożenie macierzy-wektorów) zajmuje czas . Istnieje przypuszczenie (patrz np. [1]), że nie można tego zrobić naprawdę szybciej niż O ( n 3 ) . (Bardziej szczegółowo, ta hipoteza wygląda następująco: Nie istnieje tak naprawdę podklubowy algorytm, który rozwiązuje Online Mnożenie Boolean Matrix-Vector Multiplication, tj. Nie ma algorytmu z czasem działania O ( n 3 - ε ) dla ε > 0 ).O(n3) O(n3) O(n3−ε) ε>0
Wiadomo, że algorytm Williamsa rozwiązuje ten problem w czasie . Więcej informacji znajduje się w [2].O(n3/log2n)
Byłby to przełom w dziedzinie warunkowych dolnych granic, gdyby można było udowodnić lub obalić powyższą hipotezę.
[1] Ujednolicanie i wzmacnianie twardości dla problemów dynamicznych za pomocą internetowego przypuszczenia mnożenia macierzy i wektorów. autorzy: Henzinger, Krinninger, Nanongkai i Saranurak
[ http://eprints.cs.univie.ac.at/4351/1/OMv_conjecture.pdf ]
[2] Mnożenie wektora macierzowego w czasie subkwadratowym: (wymagane jest wstępne przetwarzanie). autor: Williams
[ http://dl.acm.org/citation.cfm?id=1283383.1283490 ]
Aktualizacja
Jedno z pytań w komentarzach było następujące: Znamy w czasie kompilacji. Czy nie możemy dostosować naszego algorytmu do M , aby problem OMv (przypuszczenie) nie miał zastosowania? Przekonamy się, że tak nie jest, chyba że hipoteza OMv zawiedzie.M M
Pomysł dowodowy jest prosty: Załóżmy, że możemy podać szybkie algorytmy dla wszystkich macierzy do pewnego określonego rozmiaru (np. Rozróżnienie wszystkich możliwych przypadków). Po tym pewnym rozmiarze używamy podziału i podboju.
Oto szczegóły:n0∈N n≤n0 n×n M An,M v Mv O(n2−ε) ε>0 . (Zauważ, że pozwala to na indywidualny algorytm dla każdej matrycy do rozmiaru )n0×n0
Napraw niektóre , które (bez utraty ogólności) są potęgą 2 i większą niż 2. Teraz załóżmy, że dla wszystkich n ≤ n 0 i wszystkich n × n macierzy M znamy algorytm A n , M , że dla wszystkich wektorów v oblicza M v w czasie naprawdę subkwadratowym, tj. w czasie O ( n 2 - ε ) dla niektórych ε > 0
Teraz rozwiążemy OMv w naprawdę podokubicim czasie:M n×n n=2k k n>n0 M M1,M2,M3,M4 2k−1×2k−1 , następnie używamy algorytmu A 2 k - 1 , M i , w przeciwnym razie powracamy. (Ponieważ n 0 to pewna stała liczba, możemy wybrać prawidłowy algorytm w stałym czasie).2k−1≤n0 A2k−1,Mi n0
Biorąc pod uwagę macierz binarną o rozmiarze n × n , gdzie n = 2 k dla niektórych k i n > n 0 , stosujemy strategię dziel i zwyciężaj. Dzielimy M na cztery podmaciesze M 1 , M 2 , M 3 , M 4 o rozmiarach 2 k - 1 × 2 k - 1 . Jeśli 2 k - 1
Zauważ, że będziemy potrzebować co najwyżej kroków rekurencji. Również dla n wektorów v 1 , … , v n , będziemy n obliczeń. Zatem do przetworzenia wszystkich multiplikacji macierz-wektor potrzebujemy całkowitego czasu obliczeń O ( n 3 - ε log n ) .O(logn) n v1,…,vn n O(n3−εlogn)
Dobrze wiadomo, że logarytm rośnie wolniej niż jakikolwiek wielomian (w szczególności wolniej niż jakikolwiek pierwiastek). Naprawiając niektóre pomocą ˜ ε < ε , widzimy, że nasze całkowite obliczenia działają w czasie naprawdę subububowym (w szczególności w czasie O ( n 3 - ˜ ε ) ). Zatem przypuszczenie OMv byłoby błędne.ε~>0 ε~<ε O(n3−ε~)
(Jeśli ma rozmiar m × n oraz m i n nie są potęgami 2, wówczas nadal obowiązują granice czasów pracy, ponieważ możemy po prostu zwiększyć n i m do następnych potęg 2).M m×n m n n m
Wniosek: Jeśli możesz użyć rozróżnienia wielkości liter na macierzach wejściowych w celu uzyskania szybkich algorytmów, możesz poprawić hipotezę OMv.
źródło
jest to zasadniczo CS na poziomie badawczym, problem badany jest w co najmniej dwóch postaciach, jednym z mnożenia rzadkich macierzy (przykładowo przytoczona praca), a także badany jest szczególny przypadek „binarnych rzadkich macierzy”. W 2 nd przypadek jest znany być związane z optymalizacją programów liniową. minimalne programy mogą być również podobne do DAG z dwoma rodzajami „bramek”, dodawania i mnożenia, więc niektóre literatury minimalizacji obwodów mogą się z tym łączyć i być może oprogramowanie „z półki” może być dostosowane do tego celu. tutaj jest odniesienie do drugiego przypadku, a także to samo pytanie o cstheory z pewnymi podstawowymi wstępnymi badaniami empirycznymi.
Reprezentowanie rzadkich macierzy binarnych jako programów prostych dla szybkiego mnożenia macierzy-wektorów / Neves, Araujo
Szybki rzadki łańcuch / boolean matrycowy produkt / cstheory
źródło
nie jestem pewien, czy problem ten został dokładnie zbadany, ale te badania są powiązane i wydają się rozsądnym początkiem / początkiem. patrzy na rozkład hipergraphowy dla rzadkiego mnożenia macierzy. macierze binarne są szczególnym przypadkiem tego podejścia. takie podejście znajdzie bardziej optymalne strategie niż „prosta” metoda mnożenia. dalsze optymalizacje (w tym zakresie) mogą być możliwe na podstawie właściwości macierzy binarnej.
źródło