Автоматизована оптимізація множення матричного вектора 0-1


22

Питання:

Чи існує встановлена ​​процедура чи теорія для генерування коду, яка ефективно застосовує множення матричного вектора, коли матриця щільна та заповнена лише нулями та одиницями? В ідеалі оптимізований код використовував би систематизовану раніше обчислену інформацію для зменшення дублювання роботи.

Іншими словами, у мене є матриця і я хочу зробити попередні обчислення на основі , які зроблять обчислення максимально ефективними, коли згодом я отримаю вектор .MMМvv

М являє собою прямокутну щільну двійкову матрицю, яка відома в "час компіляції", тоді як - невідомий реальний вектор, який відомий лише у "час виконання".v

Приклад 1: (розсувне вікно)

Дозвольте скористатися простим невеликим прикладом, щоб проілюструвати свою думку. Розглянемо матрицю, Припустимо, ми застосуємо цю матрицю до вектора щоб отримати . Тоді записи результату:

М=[11111111111111111111].
vш=Мv
ш1=v1+v2+v3+v4+v5ш2=v2+v3+v4+v5+v6ш3=v3+v4+v5+v6+v7ш4=v4+v5+v6+v7+v8

Виконання стандартного множення матричного вектора буде обчислено саме таким чином. Однак багато цієї роботи є зайвою. Ми могли б зробити те саме обчислення матриць за меншими витратами, відстежуючи "загальну кількість" і додаючи / віднімаючи, щоб отримати наступне число:

ш1=v1+v2+v3+v4+v5ш2=ш1+v6-v1ш3=ш2+v7-v2ш4=ш3+v8-v3

Приклад 2: (ієрархічна структура)

У попередньому прикладі ми могли просто відслідковувати пробіг. Однак зазвичай потрібно створити і зберігати дерево проміжних результатів. Наприклад, розглянемо Можна обчислити ефективно, використовуючи дерево проміжних результатів:w=Mv

М=[111111111111111111111111]
ш=Мv
  1. Compute і , і додати їх , щоб отримати .w 7 w 3ш5ш7ш3
  2. Compute і , і додати їх , щоб отримати .w 6 w 2ш4ш6ш2
  3. Додайте і щоб отриматишш2w 1ш3ш1

Структуру в наведених вище прикладах легко зрозуміти, але для власне матриць, які мене цікавлять, структура не така проста.

Приклад 3: (низький ранг)

Щоб усунути деяку плутанину, матриці, як правило, не рідкі. Зокрема, метод вирішення цієї проблеми повинен вміти знаходити ефективні методи застосування матриць, де великі блоки заповнені ними. Наприклад, розглянемо

М=[111111111111111111111111].

Цю матрицю можна розкласти як різницю двох матриць рангу-1,

М=[111111111111111111111111111111]-[111111]

тому його дію на вектор можна обчислити ефективно, w 1ш: =Мv

ш1=v1+v2+v3+v4+v5+v6ш2=ш1ш3=ш2-v5-v6ш4=ш3ш5=ш4.

Мотивація:

Я працюю над числовим методом для деякої обробки зображень, і є кілька великих щільних матриць з різними структурами, які фіксуються на весь час. Пізніше ці матриці потрібно буде застосувати до багатьох невідомих векторів які залежатимуть від введення користувача. Зараз я використовую олівцем і папером, щоб придумати ефективний код на матричній основі, але мені цікаво, чи можна процес автоматизувати.v i0-1vi

Редагувати: (постскрипт)

Усі відповіді, які зараз є тут (станом на 5.05.2015), цікаві, але жодна відповідь на це питання не задоволена, як я сподівався. Напевно, виявляється, що це важке дослідницьке питання, і ніхто не знає гарної відповіді.

Оскільки час минув, я присуджую винагороду за відповідь EvilJS, оскільки вона стосується правильного питання. Однак я хочу, щоб відповідь містила більш чіткі та детальні пояснення.

Відповідь tranisstor пов'язує це запитання з проблемою Інтернет-булевої матриці-векторного множення (OMv), але з'єднання не є саме тим, що задається цим питанням. Зокрема, таке припущення не відповідає дійсності (сміливий акцент у мене),

Тепер припустимо, що для всіх і всіх матриць n × n M нн0н×нМ ми знаємо алгоритм , що для всіх векторів обчислює по-справжньому підквадратичний час, тобто за час для деяких . v M v O ( n 2 - ε ) ε > 0Ан,МvМvО(н2-ε)ε>0

Існує чи ні існують підквадратичні алгоритми для всіх матриць, ортогональне питання пошуку алгоритму для певної матриці, яка є максимально швидкою. Більшість матриць 0-1 виглядають як випадковий шум і (якщо б я здогадувався), ймовірно, не мають підквадратичних алгоритмів. Однак той факт, що там дійсно погані матриці, не заважає мені знайти швидкий алгоритм на хорошій матриці, наприклад, матриці "ковзаючого вікна".

Відповіді vzn, перша відповідь , друга відповідь цікаві (і, на мою думку, не заслуговують такої кількості голосів), але вони не стосуються питання з причин, обговорених у коментарях.


1
Якщо ваша матриця такої форми, TDMA - це смугова матриця, алгоритм Томаса. Ще немає 0-1, але цю функцію слід використовувати.
Зло

@EvilJS матриця, як правило, пов'язана для конкретного прикладу. Взагалі, це не буде смуга. Я додав ще один приклад, який не пов'язаний.
Нік Алгер

У вас багато постійних матриць N x M, які є двійковими, реальними векторами, і хочете попередньо обчислити оптимальний шлях виконання під час етапу попередньої обробки на екземпляр? Вихід такої операції - це код з жорстко закодованими операціями на матрицю, і ви хочете, щоб метод це зробив? Під екземпляром я маю на увазі матрицю. Просто перевіряю.
Зло

@EvilJS Це питання стосується ситуації, коли існує одна відома двійкова матриця , яка буде застосована до багатьох невідомих реальних векторів v i пізніше. Виходячи лише з M , ми хочемо попередньо обчислити код, який застосовуватиме M якомога ефективніше, щоб згодом, коли ми отримаємо v i , ми могли обчислити M v i як можна швидше. У конкретному додатку, що мотивує це питання, у мене є кілька таких двійкових матриць (фактично 12), які фіксуються на весь час, тоді як вектори v i є непередбачуваними та залежать від входу користувача програми.MviMMviMvivi
Нік Алгер

1
Над полем двох елементів проблема обчислення мінімальної ланцюга затвора XOR, що імітує задане лінійне перетворення, є важкою для NP. Дивіться cstheory.stackexchange.com/a/32272/225
Райан Вільямс,

Відповіді:


5

Якщо можливо, спробуйте скористатися смуговим тридіагональним характером матриці.
В іншому випадку, якщо матриця містить лише постійну кількість чітких значень (що, безумовно, є двійковим), слід спробувати алгоритм Mailman (Едо Ліберті, Стівен В. Цукер з технічного звіту університету Єльського університету № 1402): оптимізований за обмеженим словником
Поширене усунення субекспресії відомий деякий час, як множинне постійне множення, але перехід до рівня воріт - це варіант - використовувані тут шаблони можна використовувати окремо як рішення або об'єднати з іншими методами, документ для цього "Покращення загального усунення суб-вирази Алгоритм з новим методом обчислення затримки на рівні воріт Нін Ву, Сяоцян Чжан, Юнфеєм Є. та Лідонг Ланом опублікований у "Матеріали Всесвітнього конгресу з інженерних та комп'ютерних наук 2013 Vol II WCECS 2013, 23-25 ​​жовтня 2013 р., Сан-Франциско, США " Ворота на рівні рівнів воріт

Існує також сильний, але робочий метод, щоб генерувати символьну матрицю з константами, векторними зі змінними та підключати її до статичного єдиного асоціації (SSA) від компіляторів, який автоматизує процес написання матриць вручну.

новий прототип алгоритму
Що ви зробили з поточною сумою: Дає 10операцій, і з моєї початкової ідеї використовувати Thomas це еквівалентно. Поки що я все ще пишу і тестую новий алгоритм, також час виконаннянеприємний, але перший результат тестування дав мені дивовижну відповідь:

ш1=v1+v2+v3+v4+v5ш2=ш1+v6-v1ш3=ш2+v7-v2ш4=ш3+v8-v3


Що дає 9операцій, визначаючи їх як + або - дорівнює 1, а = 0.

тмp1=v2+v3+v4+v5ш1=v1+тмp1ш2=тмp1+v6ш3=ш2+v7-v2ш4=ш3+v8-v3

ш1=v1+v2+v3+v4+v5+v6ш2=ш1ш3=ш2-v5-v6ш4=ш3ш5=ш4.

Це дає 7 операцій , результат мого алгоритму дав:
Що дає 6операцій На даний момент я можу сказати, що я використовую дистанцію Hamming, & і | побітові операції, підрахунок звичаїв та створення чогось на кшталт Кокка - Молодшого - Касамі (CYK) - "алгоритм розбору для безконтекстних граматик, названих на честь його винахідників, Джона Кокка, Даніеля Молодшого та Тадао Касамі. У ньому використовується синтаксичний аналіз і знизу" програмування ". - з Вікіпедії Це та сама методика, яку я використовую для побудови блоків змінних.

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


(revv5) PLZ дають посилання на "вічнозелений метод". також, що таке SSA? Динамічний алгоритм CYK?
vzn

Я нагородив нагороду за цю відповідь і пояснив чому в редакції мого оригінального запитання.
Нік Алгер

8

n×nMnv1,,vnMvivi+1

m×nn×n

O(n3)O(n3)O(n3ε)ε>0

O(n3/log2n)

Це було б проривом у область умовних нижчих меж, якби можна було довести або спростувати вищенаведену гіпотезу.

[1] Об'єднання та посилення твердості для динамічних проблем за допомогою онлайн-матриці множення матриці-вектора. автор: Henzinger, Krinninger, Nanongkai та Saranurak
[ http://eprints.cs.univie.ac.at/4351/1/OMv_conjecture.pdf ]

[2] Множення матричного вектора в підквадратичний час: (потрібна деяка попередня обробка). автор Williams
[ http://dl.acm.org/citation.cfm?id=1283383.1283490 ]

Оновлення

MM

Ідея доказу проста: Припустимо, ми могли б дати швидкі алгоритми для всіх матриць до певного розміру (наприклад, розрізняючи всі можливі випадки). Після цього певного розміру ми використовуємо ділимо і перемагаємо.


n0Nnn0n×nMAn,MvMvO(n2ε)ε>0n0×n0


Mn×nn=2kkn>n0MM1,M2,M3,M42k1×2к-12к-1н0А2к-1,Мiн0

О(журналн)нv1,,vnnO(n3εlogn)

ε~>0ε~<εO(n3ε~)

Mm×nmnnм

Висновок: Якщо ви могли використовувати розрізнення випадків на вхідних матрицях для отримання швидких алгоритмів, то ви могли б покращити гіпотезу OMv.


Як вказував автор та vzn, це не так, вектор не є двійковим, матриця не потрібна N x N, і автор хоче перерахувати операції, і немає необхідності в онлайновій обробці. Виходячи з гіпотез недостатньо. Обидва документи не мають значення для питання. Тут справа в тому, щоб попередньо обчислити постійну матрицю для забезпечення мінімальної кількості операцій. Можливі різні підходи для повних, смугових, симетричних випадків.
Зло

@EvilJS: Якщо ви дозволите будь-яку матрицю M x N і реальні значення векторів, то проблема стає просто важче, ніж та, яку я дав у відповіді (тобто Інтернет-булеве множення матриці-вектора буде особливим випадком). Якби ви могли вирішити більш загальну проблему по-справжньому швидше, ніж O (n ^ 3), ви також зробили б покращення припущення (що було б великою новиною!). Крім того, автор говорить у коментарі на питання, що вектори спочатку невідомі. Якби ви заздалегідь знали всі вектори, можете просто скористатися швидким множенням матриць (наприклад, версія алгоритму Страссена).
треністор

Я щойно вказав авторам на випадок "реального вектора". Подивіться на матрицю Томаса - лише особливий випадок матриць в O (n). Я не маю на увазі загального випадку. А якщо матриця є постійною, а вектори відомі, то відповідь на жорсткий код не реалізуйте Strassen; (
Зло,

@EvilJS: Я не впевнений, що повністю розумію, що ти намагаєшся сказати. Звичайно, для спеціальних типів матриць, як матриця Томаса, можна отримати значну швидкість, але загалом це важче. Можливо, я також повинен зазначити, що проблема, яку я ввів, розглядає крок попередньої обробки (до появи будь-якого вектора). Якщо ви могли б сказати мені, як систематично "жорстко кодувати" свій алгоритм для будь-якої матриці, яку я вам даю, ви також можете покращити припущення (оскільки ви могли реалізувати цей крок жорсткого кодування як крок попередньої обробки алгоритму).
треністор

погодився, це працює; однак, другий вигляд Вілліама, здається, взагалі не розглядає бінарні матриці. fyi він має слайди тут
vzn

-2

це по суті дослідницький рівень рівня CS, проблема вивчається щонайменше у двох образах, одна з множення малих матриць (приклад щойно цитується у папері), а також вивчається також окремий випадок "двійкових розріджених матриць". 2 - й випадок , як відомо, пов'язані з оптимізацією програм прямолінійні. мінімальні програми можуть також бути схожими на DAG з двома типами "воріт", додавання та множення, тому деяка література з мінімізації схем може з'єднуватися з цим, і, можливо, програмне забезпечення "з полиці" може бути адаптоване за цією метою. ось конкретний вих на 2 - м випадку , а також і те ж питання про cstheory з деякими основними початковим емпіричним дослідженням.


1
О(н)О(н2)

рефлекси введені, як вказують заголовки, рідкісні матриці . можливо, у вас є якесь інше визначення, ніж ті, що в документах? якщо ви чутливі до точного визначення обмеженості (більшість є приблизно кореляційними / майже взаємозамінними), це слід зазначити у запитанні.
vzn

1
Матриці, які мене цікавлять, - це щільні матриці. До речі, хоча я не думаю, що це повністю відповідає моєму питанню, я ціную відповідь.
Нік Алгер

добре вибач! змішався, не зрозумів точного питання. у короткому погляді ваш приклад №2 має менше ½ заповнення & виглядав "розрідженим" для мене, і я подумав, що деякі з розріджених теорій будуть принаймні дещо застосовними. в основному, чим щільніша матриця, тим менше може бути оптимізована операція, тому, ймовірно, більшість теорій щодо такого типу оптимізації орієнтована на рідкісні матриці.
vzn

-3

не впевнений, чи вивчена ця проблема точно, але це дослідження пов'язане & здається розумним приводом / початком. він розглядає розкладання гіперграфа для розрідженого множення матриць. двійкові матриці є окремим випадком такого підходу. такий підхід знайде більш оптимальні стратегії, ніж метод "прямого" множення. подальша оптимізація (в цьому рамках) може бути можливою на основі властивості бінарної матриці.


2
Я не бачу, що це стосується питання. У цій статті йдеться про множення матричного розподілу між розподіленою системою для паралельних обчислень, щоб мінімізувати кількість міжпроцесорного зв'язку. Що це стосується цього питання? Здається, питання не згадує нічого про паралельні обчислення чи міжпроцесорні комунікації. Я рекомендую вам відредагувати свою відповідь, щоб зробити з'єднання більш явним.
DW

afaik це та сама проблема, а мінімізація паралельних обчислень також мінімізує реалізацію одного процесора тих самих обчислень. принаймні, запитуючий не виключав паралельних реалізацій.
vzn

1
Дякую за посилання Однак я скептично ставлюсь до методу цієї проблеми, оскільки він не скористався тим, що матричні записи містять лише нулі та одиниці, тоді як ця властивість є дуже важливою, наскільки я можу сказати. Наприклад, алгоритм "загальний запуск" у першому прикладі буде працювати лише у тому випадку, якщо всі ненульові записи у заданому стовпці матриці мають однакове значення.
Нік Алгер

NA ваше спостереження / заперечення розглянуто у відповіді. подальша оптимізація, ймовірно, можлива за допомогою властивості 0/1; цей метод, мабуть, мінімізує загальну кількість операцій додавання / множення під виглядом паралелізації. Операції додавання / множення також можуть розглядатися як "ворота" в DAG, і техніка мінімізує ворота. істотна складність роботи розкриває деяку властиву глибшій / суттєвій складності цього процесу оптимізації. як зазначена відповідь не має на меті бути остаточним у цій складній проблемі, просто "краще, ніж нічого".
vzn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.