Optimalisasi otomatis perkalian vektor matriks 0-1

22

Pertanyaan:

Apakah ada prosedur atau teori yang mapan untuk menghasilkan kode yang secara efisien menerapkan perkalian matriks-vektor, ketika matriks padat dan diisi hanya dengan nol dan satu? Idealnya, kode yang dioptimalkan akan membuat penggunaan sistematis informasi yang dihitung sebelumnya untuk mengurangi duplikasi pekerjaan.

Dengan kata lain, saya memiliki matriks dan saya ingin melakukan beberapa perhitungan berdasarkan , yang akan membuat komputasi seefisien mungkin ketika saya nanti menerima vektor .MMMvv

M adalah matriks biner padat persegi panjang yang dikenal pada "waktu kompilasi", sedangkan adalah vektor nyata yang tidak diketahui yang hanya dikenal pada "run time".v

Contoh 1: (jendela geser)

Biarkan saya menggunakan contoh kecil yang mudah untuk menggambarkan poin saya. Pertimbangkan matriksnya, Misalkan kita menerapkan matriks ini ke vektor untuk mendapatkan . Maka entri dari hasilnya adalah,

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

Melakukan perkalian matriks-vektor standar akan menghitung dengan cara ini. Namun, banyak dari pekerjaan ini yang mubazir. Kita bisa melakukan perhitungan matriks yang sama dengan biaya lebih murah dengan melacak "running total", dan menambahkan / mengurangi untuk mendapatkan nomor berikutnya:

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

Contoh 2: (struktur hierarkis)

Pada contoh sebelumnya, kita bisa melacak total yang berjalan. Namun, biasanya orang perlu membuat dan menyimpan pohon hasil menengah. Sebagai contoh, pertimbangkan

M=[111111111111111111111111]
Seseorang dapat menghitung w=Mv efisien menggunakan pohon hasil antara:
  1. Hitung w5 dan w7 , dan tambahkan mereka untuk mendapatkan w3 .
  2. Hitung w4 dan w6 , dan tambahkan mereka untuk mendapatkan w2 .
  3. Tambahkan dan untuk mendapatkanw 3 w 1w2w3w1

Struktur dalam contoh di atas mudah dilihat, tetapi untuk matriks yang sebenarnya saya tertarik, strukturnya tidak begitu sederhana.

Contoh 3: (peringkat rendah)

Untuk menjernihkan kebingungan, matriks pada umumnya tidak jarang. Secara khusus, metode yang memecahkan masalah ini harus dapat menemukan metode yang efisien untuk menerapkan matriks di mana blok besar diisi dengan yang. Sebagai contoh, pertimbangkan

M=[111111111111111111111111].

Matriks ini dapat didekomposisi sebagai perbedaan dari dua matriks peringkat-1,

M=[111111111111111111111111111111][111111]

jadi aksinya pada vektor dapat dihitung secara efisien dengan, w 1w:=Mv

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

Motivasi:

Saya sedang mengerjakan metode numerik untuk beberapa pemrosesan gambar, dan ada beberapa matriks padat besar dengan struktur berbeda yang diperbaiki untuk semua waktu. Nanti matriks-matriks ini perlu diterapkan pada banyak vektor tidak dikenal yang akan bergantung pada input pengguna. Saat ini saya menggunakan pensil-dan-kertas untuk menghasilkan kode efisien berdasarkan per-matriks, tapi saya bertanya-tanya apakah prosesnya dapat otomatis.v i01vi

Edit: (tambahan)

Semua jawaban di sini sejauh ini (per 9/5/15) menarik, tetapi tidak ada yang menjawab pertanyaan dengan memuaskan seperti yang saya harapkan. Mungkin ternyata ini adalah pertanyaan penelitian yang sulit, dan tidak ada yang tahu jawaban yang bagus.

Karena waktu telah habis, saya memberikan hadiah untuk jawaban EvilJS karena ini menjawab pertanyaan yang tepat. Namun, saya berharap jawabannya berisi penjelasan yang lebih jelas dan terperinci.

Jawaban tranisstor membuat hubungan antara pertanyaan ini dan masalah Online Boolean Matrix-Vector Multiplication (OMv), tetapi koneksi tidak persis apa yang ditanyakan pertanyaan ini. Secara khusus, asumsi berikut ini tidak benar-benar cocok (penekanan berani saya),

Sekarang asumsikan bahwa untuk semua dan semua matriks n × n M nn0n×nM kita tahu algoritma , bahwa untuk semua vektor menghitung dalam waktu yang benar-benar subquadratic, yaitu dalam waktu untuk beberapa . v M v O ( n 2 - ε ) ε > 0An,MvMvO(n2ε)ε>0

Apakah ada atau tidak algoritma subquadratic untuk semua matriks adalah ortogonal untuk pertanyaan menemukan suatu algoritma untuk matriks tertentu yang secepat mungkin. Sebagian besar matriks 0-1 terlihat seperti noise acak dan (jika saya menebak) mungkin tidak memiliki algoritma subquadratic. Namun, fakta bahwa ada matriks yang benar-benar buruk di luar sana tidak mencegah saya menemukan algoritma cepat pada matriks yang baik, misalnya, matriks "sliding window".

jawaban vzn ini, jawaban pertama , jawaban kedua yang menarik (dan menurut saya tidak layak begitu banyak downvotes), tetapi mereka tidak berlaku untuk pertanyaan karena alasan yang dibahas dalam ada komentar.

Nick Algeria
sumber
1
Jika matriks Anda dari formulir ini, TDMA ini adalah matriks band, algoritma Thomas. Belum 0-1 tetapi fitur ini harus dieksploitasi.
Evil
@ EvilJS, matriks kebetulan saja di-banded untuk contoh tertentu. Secara umum itu tidak akan di-banded. Saya telah menambahkan contoh lain yang tidak di-band.
Nick Alger
Anda memiliki banyak matriks konstan N x M yang merupakan biner, vektor nyata, dan ingin melakukan precompute path eksekusi optimal selama tahap preprocessing per instance? Output dari operasi tersebut adalah kode dengan operasi hardcoded per matriks dan Anda ingin metode melakukannya? Maksud saya per matriks. Hanya mengecek.
Evil
@ EvilJS Pertanyaan ini adalah tentang situasi di mana ada satu matriks biner diketahui , yang akan diterapkan pada banyak vektor nyata yang tidak diketahui di lain waktu. Berdasarkan saja, kami ingin melakukan precompute kode yang akan menerapkan seefisien mungkin, sehingga nanti ketika kami menerima , kami dapat menghitung secepat mungkin. Dalam aplikasi tertentu yang memotivasi pertanyaan ini saya memiliki beberapa matriks biner seperti ini (12 sebenarnya) yang diperbaiki untuk semua waktu sedangkan vektor tidak dapat diprediksi dan bergantung pada input dari pengguna program. v i M M v i M v i v iMviMMviMvivi
Nick Alger
1
Atas bidang dua elemen, masalah komputasi sirkuit XOR-gerbang minimum yang mensimulasikan transformasi linear tertentu adalah NP-hard. Lihat cstheory.stackexchange.com/a/32272/225
Ryan Williams

Jawaban:

5

Jika memungkinkan cobalah untuk mengeksploitasi sifat matriks tridiagonal berpita.
Kalau tidak, jika matriks hanya berisi sejumlah nilai berbeda (yang pasti biner), Anda harus mencoba algoritma Mailman (oleh Edo Liberty, Steven W. Zucker Dalam laporan teknis universitas Yale # 1402): dioptimalkan melalui kamus terbatas
Eliminasi Subekspresi Umum diketahui untuk beberapa waktu seperti Multiplikasi Konstan Berganda, tetapi turun ke level gerbang adalah pilihan - pola yang digunakan di sini dapat digunakan secara terpisah sebagai solusi atau digabung dengan metode lain, makalah untuk "Meningkatkan Eliminasi Sub-ekspresi Umum" ini Algoritma dengan Metode Komputasi Tingkat Gerbang Baru "oleh Ning Wu, Xiaoqiang Zhang, Yunfei Ye, dan Lidong Lan diterbitkan dalam" Prosiding Kongres Dunia Teknik dan Ilmu Komputer 2013 Vol II WCECS 2013, 23-25 ​​Oktober 2013, San Francisco, AS " CSE tingkat gerbang

Ada juga metode kasar tetapi bekerja, untuk menghasilkan matriks simbolik dengan konstanta, vektor dengan variabel dan hubungkan ke Static Single Assingment (SSA) dari kompiler, yang mengotomatiskan proses penulisan matriks dengan tangan.

prototipe algoritma baru
Apa yang Anda lakukan dengan menjalankan jumlah: Memberikan 10 operasi , dan dengan ide awal saya untuk menggunakan Thomas itu setara. Untuk saat ini saya masih menulis dan menguji algoritma baru, juga runtime yang buruk , tetapi hasil tes pertama memberi saya jawaban mengejutkan:

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

Yang memberi 9 operasi , mendefinisikannya sebagai + atau - adalah 1, dan = adalah 0.

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

Ini menghasilkan 7 operasi , hasil algoritme saya memberikan: Yang memberi 6 operasi Untuk saat ini saya dapat mengatakan bahwa saya menggunakan jarak Hamming, & dan | operasi bitwise, menghitung penggunaan dan membuat sesuatu seperti Cocke-Younger-Kasami (CYK) - "algoritma penguraian untuk tata bahasa bebas konteks, dinamai menurut penemunya, John Cocke, Daniel Younger dan Tadao Kasami. Ia menggunakan penguraian bottom-up dan dinamis pemrograman. " - dari Wikipedia Ini adalah teknik yang sama yang saya gunakan untuk membangun blok variabel.

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

Jahat
sumber
(re rev5) tlg beri ref pada "metode evergreen". juga, apa itu SSA? Algoritma dinamis CYK?
vzn
Saya telah memberikan hadiah untuk jawaban ini, dan menjelaskan mengapa dalam sebuah pengeditan untuk pertanyaan awal saya.
Nick Alger
8

Ini terkait dengan pertanyaan penelitian terbuka, yang dikenal sebagai masalah "Online Boolean Matrix-Vector Multiplication (OMv)". Masalah ini berbunyi sebagai berikut (lihat [1]): Diberikan biner matriks dan vektor kolom biner , kita perlu menghitung sebelum tiba.M n v 1 , , v n M v i v i + 1n×nMnv1,,vnMvivi+1

Perhatikan bahwa masalah dari pertanyaannya adalah agak lebih umum: Hal ini memungkinkan untuk matriks dan vektor bernilai real. Perhatikan bahwa masalah dengan matriks dan vektor Boolean "lebih mudah", karena menyajikan kasus khusus.n × nm×nn×n

Jelasnya, algoritma naif untuk masalah Penggandaan Matriks-Vektor Boolean Online (yang hanya menggunakan perkalian vektor-vektor-standar) membutuhkan waktu . Ada dugaan (lihat misalnya [1]) bahwa ini tidak dapat dilakukan dengan lebih cepat daripada . (Secara lebih rinci, dugaan ini berbunyi sebagai berikut: Tidak ada algoritma yang benar-benar subkubis, yang memecahkan Masalah Penggandaan Boolean Matriks-Vektor Online, yaitu tidak ada algoritma dengan waktu berjalan untuk ).O(n3)O(n3)O(n3ε)ε>0

Diketahui bahwa algoritma Williams memecahkan masalah ini dalam waktu . Lihat [2] untuk lebih jelasnya.O(n3/log2n)

Ini akan menjadi terobosan di bidang batas bawah bersyarat, jika seseorang dapat membuktikan atau membantah dugaan di atas.

[1] Menyatukan dan Memperkuat Kekerasan untuk Masalah Dinamis melalui Dugaan Penggandaan Matriks-Vektor Online. oleh Henzinger, Krinninger, Nanongkai dan Saranurak
[ http://eprints.cs.univie.ac.at/4351/1/OMv_conjecture.pdf ]

[2] Penggandaan matriks-vektor dalam waktu sub-kuadrat: (diperlukan beberapa preprocessing). oleh Williams
[ http://dl.acm.org/citation.cfm?id=1283383.1283490 ]

Memperbarui

Salah satu pertanyaan dalam komentar adalah sebagai berikut: Kita tahu pada waktu kompilasi. Tidak bisakah kita menyesuaikan algoritme agar sesuai dengan , sehingga masalah OMv (dugaan) tidak berlaku? Kita akan melihat bahwa ini bukan masalahnya, kecuali dugaan OMv gagal.MM

Gagasan buktinya sederhana: Asumsikan kita dapat memberikan algoritma cepat untuk semua matriks hingga ukuran tertentu (mis. Membedakan semua kasus yang mungkin). Setelah ukuran tertentu ini kami menggunakan membagi dan menaklukkan.

Berikut detailnya:
Perbaiki beberapa , yang (tanpa kehilangan sifat umum) adalah kekuatan 2 dan lebih besar dari 2. Sekarang asumsikan bahwa untuk semua dan semua matriks kita tahu suatu algoritma , yang untuk semua vektor menghitung dalam waktu yang benar-benar subquadratic, yaitu dalam waktu untuk beberapa . (Perhatikan bahwa ini memungkinkan algoritma individu untuk setiap matriks hingga ukuran .) n n 0 n ×n0Nnn0n×nMAn,MvMvO(n2ε)ε>0n0×n0

Sekarang kita akan menyelesaikan OMv dalam waktu yang benar-benar subkubik:
Diberikan matriks biner ukuran , di mana untuk beberapa dan , kita menggunakan strategi membagi dan menaklukkan. Kami membagi menjadi empat dengan ukuran . Jika , maka kita menggunakan algoritma , jika tidak, kita akan muncul kembali. (Karena adalah angka tetap, kita dapat memilih algoritma yang benar dalam waktu yang konstan.)n × n n = 2 k k n > n 0 M M 1 , M 2 , M 3 , MMn×nn=2kkn>n0MM1,M2,M3,M42k1×2k12k1n0A2k1,Min0

Perhatikan bahwa kita akan membutuhkan paling banyak langkah rekursi . Juga, untuk vektor , kami akan menghitung . Jadi, untuk memproses semua perkalian matriks-vektor, kita akan membutuhkan total waktu komputasi .n v 1 , , v n n O ( n 3 - ε log n )O(logn)nv1,,vnnO(n3εlogn)

Sudah diketahui bahwa logaritma tumbuh lebih lambat dari pada polinomial manapun (khususnya lebih lambat dari semua root). Memperbaiki beberapa dengan , kita melihat bahwa perhitungan total kami berjalan dalam waktu yang benar-benar subkubik (khususnya, dalam waktu ). Dengan demikian, dugaan OMv akan salah. ˜ ε <εO(n3- ˜ ε )ε~>0ε~<εO(n3ε~)

(Jika memiliki ukuran dan dan bukan kekuatan 2, maka batas-batas pada waktu berjalan masih berlaku, karena kita bisa saja meningkatkan dan ke kekuatan berikutnya 2.)m × n m n n mMm×nmnnm

Kesimpulan: Jika Anda dapat menggunakan perbedaan huruf pada matriks input untuk mendapatkan algoritma cepat, maka Anda dapat meningkatkan dugaan OMv.

tranisstor
sumber
Seperti yang ditunjukkan oleh penulis dan vzn, ini bukan kasusnya, vektor bukan biner, Matriks tidak diperlukan N x N, dan penulis ingin menghitung operasi sebelumnya, dan tidak perlu pemrosesan online. Berdasarkan dugaan saja tidak cukup. Kedua makalah tidak relevan untuk dipertanyakan. Kasus di sini adalah untuk precompute matrix konstan untuk menyediakan jumlah operasi minimal. Akan ada kemungkinan pendekatan yang berbeda untuk kasus penuh, banded, simetris.
Evil
@ EvilJS: Jika Anda mengizinkan matriks M x N dan vektor bernilai riil, maka masalahnya semakin sulit daripada yang saya berikan dalam jawaban (yaitu Penggandaan Matriks-Vektor Boolean Online akan menjadi kasus khusus). Jika Anda dapat memecahkan masalah yang lebih umum benar-benar lebih cepat daripada O (n ^ 3), maka Anda juga akan membuat perbaikan pada dugaan (yang akan menjadi berita besar!). Selanjutnya, penulis mengatakan dalam komentarnya terhadap pertanyaan bahwa vektor pada awalnya tidak diketahui. Jika Anda tahu semua vektor sebelumnya, Anda bisa menggunakan perkalian matriks cepat (misalnya versi algoritma Strassen).
tranisstor
Saya baru saja menunjuk penulis kasus "vektor nyata". Lihatlah matriks Thomas - hanya kasus khusus dari matriks dalam O (n). Saya tidak menyiratkan kasus umum. Dan jika Matriks konstan dan vektor diketahui Anda jawaban hardcode tidak menerapkan Strassen; (
Evil
@ EvilJS: Saya tidak yakin saya sepenuhnya mengerti apa yang Anda katakan. Tentu saja, untuk jenis matriks khusus seperti matriks Thomas Anda bisa mendapatkan kecepatan yang signifikan, tetapi secara umum ini lebih sulit. Mungkin saya juga harus menunjukkan bahwa masalah yang saya perkenalkan mempertimbangkan langkah preprocessing (sebelum ada vektor). Jika Anda bisa memberi tahu saya cara sistematis "meng-hardcode" algoritme Anda untuk matriks apa pun yang saya berikan kepada Anda, Anda juga bisa memperbaiki dugaan tersebut (karena Anda bisa menerapkan langkah hardcoding ini sebagai langkah preprocessing dari suatu algoritma).
tranisstor
setuju itu bekerja; namun ref kedua oleh williams tampaknya tidak mempertimbangkan matriks biner sama sekali khususnya. fyi dia punya slide di sini
vzn
-2

ini pada dasarnya adalah penelitian tingkat CS, masalahnya dipelajari dalam setidaknya dua samaran, salah satu dari perkalian matriks jarang (contoh makalah yang baru saja dikutip), dan juga kasus khusus "matriks biner jarang" juga dipelajari. 2 nd kasus yang diketahui terkait dengan mengoptimalkan program garis lurus. program minimal mungkin juga seperti DAG dengan dua jenis "gerbang", penjumlahan dan perkalian, sehingga beberapa literatur minimisasi sirkuit dapat terhubung dengan ini, dan mungkin perangkat lunak "off the shelf" dapat disesuaikan untuk tujuan tersebut. di sini adalah ref tertentu pada 2 nd kasus dan juga pertanyaan yang sama pada cstheory dengan beberapa studi dasar empiris awal.

ay
sumber
1
Saya hanya membaca sekilas tautannya, tetapi sejauh ini saya skeptis karena dua alasan. 1) Matriksnya tidak jarang. Seringkali jumlah nonzeros hampir sama dengan jumlah nol, namun sering ada cara untuk menghasilkan algoritma untuk matriks dengan nonzeros, berdasarkan pola. 2) Makalah ini tampaknya didasarkan pada hanya menggunakan penambahan dan perkalian sebagai "gerbang" biner dasar, tetapi dalam pengalaman saya penting juga untuk menggunakan pengurangan. Ini akan membutuhkan termasuk gerbang biner pengurangan, atau gerbang unary "kalikan dengan -1". O ( n 2 )O(n)O(n2)
Nick Alger
referensi aktif, seperti yang ditunjukkan judul, matriks jarang . mungkin Anda memiliki definisi berbeda dari yang ada di koran? jika Anda peka terhadap definisi yang tepat dari sparsity (sebagian besar berkorelasi kasar / hampir dapat dipertukarkan) itu harus dinyatakan dalam pertanyaan.
vzn
1
Matriks yang saya minati adalah matriks padat. Ngomong-ngomong, meskipun saya pikir ini tidak sepenuhnya menjawab pertanyaan saya, saya menghargai jawabannya.
Nick Alger
baiklah, maaf! bingung, tidak menyadari pertanyaan yang tepat. pada pandangan sepintas contoh Anda # 2 memiliki kurang dari ½ isi & tampak "jarang" bagi saya & pikir beberapa teori jarang akan setidaknya agak berlaku. pada dasarnya semakin padat matriks, semakin sedikit operasi dapat dioptimalkan, jadi mungkin sebagian besar teori tentang jenis optimasi ini berorientasi pada matriks jarang.
vzn
-3

tidak yakin apakah masalah ini telah dipelajari secara tepat tetapi penelitian ini terkait & tampaknya memimpin / memulai yang masuk akal. itu terlihat pada dekomposisi hypergraph untuk perkalian matriks jarang. matriks biner adalah kasus khusus dari pendekatan ini. pendekatan ini akan menemukan strategi yang lebih optimal daripada metode perkalian "lurus". optimasi lebih lanjut (dalam kerangka ini) dimungkinkan berdasarkan properti matriks biner.

ay
sumber
2
Saya tidak mengerti apa hubungannya dengan pertanyaan ini. Makalah itu adalah tentang multiplikasi matriks partisi antara sistem terdistribusi, untuk komputasi paralel, untuk meminimalkan jumlah komunikasi antar-prosesor. Apa hubungannya dengan pertanyaan ini? Pertanyaannya sepertinya tidak menyebutkan apa-apa tentang komputasi paralel atau komunikasi antar-prosesor. Saya mendorong Anda untuk mengedit jawaban Anda untuk membuat koneksi lebih eksplisit.
DW
afaik masalah yang sama dan meminimalkan komputasi paralel juga meminimalkan implementasi prosesor tunggal dari perhitungan yang sama. setidaknya, si penanya tidak mengesampingkan implementasi paralel.
vzn
1
Terima kasih atas tautannya. Namun saya skeptis terhadap metode untuk masalah ini karena tidak memanfaatkan fakta bahwa entri matriks hanya berisi nol dan satu, sedangkan properti ini sangat penting, sejauh yang saya tahu. Sebagai contoh, algoritma "running total" dalam contoh pertama hanya akan bekerja jika semua entri bukan nol dalam kolom tertentu dari matriks memiliki nilai yang sama.
Nick Alger
NA pengamatan / keberatan Anda dibahas dalam jawabannya. optimasi lebih lanjut mungkin dimungkinkan menggunakan properti 0/1; metode ini tampaknya meminimalkan # total operasi penjumlahan / perkalian dengan kedok paralelisasi. operasi penambahan / perkalian juga dapat dilihat sebagai "gerbang" dalam DAG dan teknik meminimalkan gerbang. kompleksitas substansial dari makalah ini mengungkapkan beberapa kompleksitas inheren yang lebih dalam / substansial dari proses optimasi ini. seperti yang dinyatakan jawaban tidak dimaksudkan untuk menjadi pasti pada masalah yang sulit ini, hanya "lebih baik daripada tidak sama sekali".
vzn