Tối ưu hóa tự động của phép nhân vectơ ma trận 0-1


22

Câu hỏi:

Có quy trình hoặc lý thuyết được thiết lập để tạo mã áp dụng hiệu quả phép nhân vectơ ma trận hay không, khi ma trận dày đặc và chỉ chứa các số 0 và số không? Lý tưởng nhất là mã được tối ưu hóa sẽ sử dụng có hệ thống các thông tin được tính toán trước đó để giảm công việc trùng lặp.

Nói cách khác, tôi có một ma trận và tôi muốn thực hiện một số tiền mã hóa dựa trên , điều đó sẽ làm cho tính toán hiệu quả nhất có thể khi sau này tôi nhận được vectơ .MMMvv

M là một ma trận nhị phân dày đặc hình chữ nhật được biết đến tại "thời gian biên dịch", trong khi là một vectơ thực không xác định chỉ được biết đến tại "thời gian chạy".v

Ví dụ 1: (cửa sổ trượt)

Hãy để tôi sử dụng một ví dụ nhỏ dễ dàng để minh họa quan điểm của tôi. Hãy xem xét ma trận, Giả sử chúng ta áp dụng ma trận này cho vectơ để có . Sau đó, các mục của kết quả là,

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

Thực hiện phép nhân vectơ ma trận chuẩn sẽ tính toán chính xác theo cách này. Tuy nhiên, rất nhiều công việc này là dư thừa. Chúng tôi có thể thực hiện cùng một phép tính ma trận với chi phí thấp hơn bằng cách theo dõi "tổng chạy" và cộng / trừ để có được số tiếp theo:

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

Ví dụ 2: (cấu trúc phân cấp)

Trong ví dụ trước, chúng ta chỉ cần theo dõi tổng số đang chạy. Tuy nhiên, thông thường người ta sẽ cần tạo và lưu trữ một cây kết quả trung gian. Ví dụ: hãy xem xét Người ta có thể tính toán w = Mv một cách hiệu quả bằng cách sử dụng một cây kết quả trung gian:w=Mv

M=[111111111111111111111111]
w=Mv
  1. Tính toán w5w7 và thêm chúng để có w3 .
  2. Tính toán w4w6 và thêm chúng để nhận w2 .
  3. Thêm và để nhậnw 3 w 1w2w3w1

Cấu trúc trong các ví dụ trên rất dễ nhìn thấy, nhưng đối với các ma trận thực tế mà tôi quan tâm, cấu trúc không đơn giản như vậy.

Ví dụ 3: (thứ hạng thấp)

Để làm sáng tỏ một số nhầm lẫn, ma trận thường không thưa thớt. Cụ thể, một phương pháp giải quyết vấn đề này cần có khả năng tìm ra các phương pháp hiệu quả để áp dụng ma trận trong đó các khối lớn chứa đầy các khối. Ví dụ, xem xét

M=[111111111111111111111111].

Ma trận này có thể được phân tách thành một sự khác biệt của hai ma trận hạng 1,

M=[111111111111111111111111111111][111111]

do đó, hành động của nó trên một vectơ có thể được tính toán hiệu quả bằng cách, w:=Mv

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

Động lực:

Tôi đang làm việc trên một phương pháp số để xử lý một số hình ảnh và có một số ma trận dày đặc với các cấu trúc khác nhau được cố định cho mọi thời đại. Sau đó, các ma trận này sẽ cần được áp dụng cho nhiều vectơ chưa biết sẽ phụ thuộc vào đầu vào của người dùng. Ngay bây giờ tôi đang sử dụng bút chì và giấy để đưa ra mã hiệu quả trên cơ sở từng ma trận, nhưng tôi tự hỏi liệu quy trình có thể được tự động hóa hay không.v tôi01vi

Chỉnh sửa: (phần tái bút)

Tất cả các câu trả lời ở đây cho đến nay (kể từ ngày 9/5/15) đều thú vị, nhưng không có câu trả lời nào thỏa đáng như tôi mong đợi. Có lẽ hóa ra đây là một câu hỏi nghiên cứu khó khăn, và không ai biết một câu trả lời hay.

Vì thời gian đã hết, tôi trao phần thưởng cho câu trả lời của EvilJS vì nó giải quyết đúng câu hỏi. Tuy nhiên, tôi muốn câu trả lời có giải thích rõ ràng và chi tiết hơn.

Câu trả lời của tranisstor tạo ra mối liên hệ giữa câu hỏi này và vấn đề Nhân vectơ ma trận Boolean (OMv) trực tuyến, nhưng kết nối không chính xác là câu hỏi này đang hỏi. Cụ thể, giả định sau đây không thực sự phù hợp (nhấn mạnh đậm của tôi),

Bây giờ giả sử rằng với tất cả và tất cả ma trận n × n M nn0n×nM chúng ta biết một thuật toán , rằng với tất cả các vectơ tính trong thời gian thực sự phụ, tức là trong thời gian cho một số . v M v O ( n 2 - ε ) ε > 0An,MvMvO(n2ε)ε>0

Có hay không tồn tại các thuật toán phụ cho tất cả các ma trận là trực giao với câu hỏi tìm một thuật toán cho một ma trận cụ thể càng nhanh càng tốt. Hầu hết các ma trận 0-1 trông giống như nhiễu ngẫu nhiên và (nếu tôi đoán) có lẽ không có thuật toán phụ. Tuy nhiên, thực tế là có những ma trận thực sự tồi tệ ngoài kia không ngăn tôi tìm ra thuật toán nhanh trên một ma trận tốt, ví dụ, ma trận "cửa sổ trượt".

câu trả lời vzn của, câu trả lời đầu tiên , câu trả lời thứ hai là thú vị (và theo ý kiến của tôi không xứng đáng để nhiều downvotes), nhưng họ không áp dụng cho câu hỏi vì lý do thảo luận trong các ý kiến đó.


1
Nếu ma trận của bạn thuộc dạng này, TDMA thì đây là ma trận băng, thuật toán Thomas. Chưa 0-1 nhưng tính năng này nên được khai thác.
Ác

@EvilJS ma trận tình cờ được băng cho ví dụ cụ thể. Nói chung, nó sẽ không được băng bó. Tôi đã thêm một ví dụ khác không phải là dải.
Nick Alger

Bạn có rất nhiều ma trận không đổi N x M là nhị phân, vectơ thực và muốn tính toán trước đường dẫn thực thi tối ưu trong giai đoạn tiền xử lý cho mỗi phiên bản? Đầu ra của hoạt động như vậy là mã với các hoạt động được mã hóa cứng trên mỗi ma trận và bạn muốn phương thức làm như vậy? Theo ví dụ tôi có nghĩa là mỗi ma trận. Chỉ cần kiểm tra.
Ác

@EvilJS Câu hỏi này là về tình huống có một ma trận nhị phân , sẽ được áp dụng cho nhiều vectơ thực chưa biết sau đó. Chỉ dựa trên , chúng tôi muốn tính toán trước một mã sẽ áp dụng hiệu quả nhất có thể, để sau này khi chúng tôi nhận được , chúng tôi có thể tính toán nhanh nhất có thể. Trong ứng dụng cụ thể thúc đẩy câu hỏi này, tôi có một số ma trận nhị phân như thế này (thực tế là 12) được cố định cho mọi thời đại trong khi các vectơv i M M v i M v i v iMviMMviMvivi không thể đoán trước được và phụ thuộc vào đầu vào từ người dùng chương trình.
Nick Alger

1
Trong lĩnh vực của hai yếu tố, vấn đề tính toán mạch cổng XOR tối thiểu mô phỏng một phép biến đổi tuyến tính đã cho là NP-hard. Xem cstheory.stackexchange.com/a/32272/225
Ryan Williams

Câu trả lời:


5

Nếu có thể hãy cố gắng khai thác tính chất ba cực của dải ma trận.
Mặt khác, nếu ma trận chỉ chứa một số lượng giá trị riêng biệt không đổi (chắc chắn là nhị phân), bạn nên thử thuật toán Mailman (của Edo Liberty, Steven W. Zucker Trong báo cáo kỹ thuật của trường đại học Yale # 1402): được tối ưu hóa từ điển hữu hạn
Loại bỏ Subexpression phổ biến được biết đến trong một thời gian như Phép nhân nhiều hằng số, nhưng đi xuống mức cổng là một tùy chọn - các mẫu được sử dụng ở đây có thể được sử dụng riêng biệt như một giải pháp hoặc hợp nhất với các phương pháp khác, bài viết này "Cải thiện loại bỏ biểu thức phụ chung Thuật toán với phương pháp tính toán độ trễ cổng mới "của Ning Wu, Xiaoqiang Zhang, Yunfei Ye và Lidong Lan được xuất bản trong" Kỷ yếu của Hội nghị khoa học máy tính và kỹ thuật thế giới 2013 Vol II WCECS 2013, 23-25 ​​tháng 10 năm 2013, San Francisco, Hoa Kỳ " Cổng CSE

Ngoài ra còn có phương pháp thô nhưng hoạt động, để tạo ma trận tượng trưng với các hằng số, vectơ với các biến và cắm nó vào Assingment tĩnh (SSA) từ các trình biên dịch, tự động hóa quá trình viết ma trận bằng tay.

nguyên mẫu thuật toán mới
Những gì bạn đã làm với tổng chạy: Cung cấp 10

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

thao tác và với ý tưởng ban đầu của tôi để sử dụng Thomas, điều đó là tương đương.
Cho đến bây giờ tôi vẫn đang viết và thử nghiệm thuật toán mới, thời gian chạy cũng khó chịu , nhưng kết quả thử nghiệm đầu tiên đã cho tôi câu trả lời đáng ngạc nhiên:

tmp1=v2+v3+v4+v5w1=v1+tmp1w2=tmp1+v6w3=w2+v7v2w4=w3+v8v3

cấp 9 thao tác , xác định chúng là + hoặc - là 1 và = là 0.

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

Điều này mang lại 7 thao tác , kết quả thuật toán của tôi đã cho: Cung cấp 6 thao tác Bây giờ tôi có thể nói rằng tôi đang sử dụng khoảng cách Hamming, và | hoạt động theo bitwise, đếm số lần sử dụng và tạo ra thứ gì đó như Cocke, Younger, Kasami (CYK) - "thuật toán phân tích cú pháp ngữ pháp không ngữ cảnh, được đặt theo tên của các nhà phát minh của nó, John Cocke, Daniel Younger và Tadao Kasami. lập trình. " - từ Wikipedia Đây là kỹ thuật tương tự tôi sử dụng để xây dựng các khối biến.

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


(re rev5) xin vui lòng giới thiệu về "phương pháp thường xanh". Ngoài ra, SSA là gì? Thuật toán động CYK?
vzn

Tôi đã trao phần thưởng cho câu trả lời này và giải thích lý do tại sao trong bản chỉnh sửa cho câu hỏi ban đầu của tôi.
Nick Alger

8

Điều này có liên quan đến một câu hỏi nghiên cứu mở, được gọi là "Bài toán nhân vectơ ma trận Boolean trực tuyến (OMv)". Vấn đề này đọc như sau (xem [1]): Cho một nhị phân ma trận và vectơ cột nhị phân , chúng ta cần tính trước khi xuất hiện.M n v 1 , ... , v n M v i v i + 1n×nMnv1,,vnMvivi+1

Lưu ý rằng vấn đề từ câu hỏi có phần tổng quát hơn: Nó cho phép các ma trận và các vectơ có giá trị thực. Quan sát rằng vấn đề với ma trận và vectơ Boolean là "dễ dàng hơn", vì nó trình bày một trường hợp đặc biệt.n × nm×nn×n

Rõ ràng, thuật toán ngây thơ cho bài toán Nhân vectơ ma trận Boolean trực tuyến (chỉ sử dụng phép nhân vectơ ma trận chuẩn) cần có thời gian . Có một phỏng đoán (xem ví dụ [1]) rằng điều này không thể được thực hiện nhanh hơn . (Chi tiết hơn, phỏng đoán này diễn ra như sau: Không tồn tại thuật toán subcubic thực sự, giải quyết vấn đề nhân vectơ ma trận Boolean trực tuyến, tức là không có thuật toán nào có thời gian chạy cho ).O ( n 3 ) O ( n 3 - ε ) ε > 0O(n3)O(n3)O(n3ε)ε>0

Được biết, thuật toán của Williams giải quyết vấn đề này trong thời gian . Xem [2] để biết thêm chi tiết.O(n3/log2n)

Nó sẽ là một bước đột phá trong lĩnh vực giới hạn dưới có điều kiện, nếu người ta có thể chứng minh hoặc bác bỏ những phỏng đoán trên.

[1] Thống nhất và tăng cường độ cứng cho các vấn đề động thông qua một phỏng đoán nhân vectơ ma trận trực tuyến. bởi Henzinger, Krinninger, Nanongkai và Saranurak
[ http://eprints.cs.univie.ac.at/4351/1/OMv_conjecture.pdf ]

[2] Phép nhân vectơ ma trận trong thời gian bậc hai: (một số tiền xử lý cần thiết). bởi Williams
[ http://dl.acm.org/citation.cfm?id=1283383.1283490 ]

Cập nhật

Một trong những câu hỏi trong các ý kiến ​​như sau: Chúng tôi biết tại thời điểm biên dịch. Chúng tôi không thể điều chỉnh thuật toán của mình cho phù hợp vớiMMM , vì vậy vấn đề OMv (phỏng đoán) không áp dụng? Chúng ta sẽ thấy rằng đây không phải là trường hợp, trừ khi phỏng đoán OMv thất bại.

Ý tưởng bằng chứng rất đơn giản: Giả sử chúng ta có thể đưa ra các thuật toán nhanh cho tất cả các ma trận lên đến một số kích thước nhất định (ví dụ: phân biệt tất cả các trường hợp có thể). Sau kích thước nhất định này, chúng tôi sử dụng phân chia và chinh phục.

Dưới đây là chi tiết:
Khắc phục một số , trong đó (không mất tính tổng quát) là lũy thừa 2 và lớn hơn 2. Bây giờ giả sử rằng với tất cả và tất cả ma trận chúng ta biết một thuật toán , với tất cả các vectơ tính trong thời gian thực sự phụ, tức là trong thời gian cho một số . (Lưu ý rằng điều này cho phép một thuật toán riêng cho mỗi ma trận có kích thước .) n n 0 n × n M A nn0Nnn0n×nM vMvO( n 2 - ε )ε>0 n 0 × n 0An,MvMvO(n2ε)ε>0n0×n0

Bây giờ chúng ta sẽ giải OMv trong thời gian cận lâm sàng thực sự:
Cho ma trận nhị phân có kích thước , trong đó đối với một số và , chúng ta sử dụng chiến lược chia và chinh phục. Chúng tôi chia thành bốn mô hình con có kích thước . Nếu , thì chúng tôi sử dụng thuật toán , nếu không, chúng tôi sẽ lặp lại. (Vì là một số cố định, chúng tôi có thể chọn thuật toán chính xác trong thời gian không đổi.)n × n n = 2 k k n > n 0 M M 1 , M 2 , M 3 , M 4 2 k - 1 × 2 k - 1 2 k - 1n 0 A 2 k - 1 , M i n 0Mn×nn=2kkn>n0MM1,M2,M3,M42k1×2k12k1n0A2k1,Min0

Lưu ý rằng chúng ta sẽ cần nhiều nhất các bước đệ quy . Ngoài ra, với vectơ , chúng tôi sẽ tính toán. Do đó, để xử lý tất cả các phép nhân vectơ ma trận, chúng ta sẽ cần tổng thời gian tính toán là .O(logn)nv1,,vnnO(n3εlogn)

Người ta biết rằng logarit phát triển chậm hơn bất kỳ đa thức nào (đặc biệt là chậm hơn bất kỳ gốc nào). Khắc phục một số bằng , chúng tôi thấy rằng tổng số tính toán của chúng tôi đang chạy trong thời gian thực sự dưới cấp (đặc biệt là trong thời gian ). Do đó, phỏng đoán OMv sẽ sai.ε~>0ε~<εO(n3ε~)

(Nếu có kích thước và và không phải là lũy thừa của 2, thì giới hạn về thời gian chạy vẫn được áp dụng, vì chúng ta có thể tăng và lên các lũy thừa tiếp theo là 2.)Mm×nmnnm

Kết luận: Nếu bạn có thể sử dụng các phân biệt trường hợp trên ma trận đầu vào để rút ra các thuật toán nhanh, thì bạn có thể cải thiện phỏng đoán OMv.


Như tác giả và vzn đã chỉ ra, đây không phải là trường hợp, vectơ không phải là nhị phân, Ma trận không cần thiết N x N và tác giả muốn tính toán trước các hoạt động và không cần xử lý trực tuyến. Dựa vào phỏng đoán là không đủ. Cả hai giấy tờ đều không liên quan đến câu hỏi. Trường hợp ở đây là tính toán trước ma trận hằng để cung cấp số lượng hoạt động tối thiểu. Sẽ có những cách tiếp cận khác nhau cho các trường hợp đầy đủ, có dải, đối xứng.
Ác

@EvilJS: Nếu bạn cho phép bất kỳ ma trận M x N và vectơ có giá trị thực nào, thì vấn đề sẽ trở nên khó khăn hơn so với câu tôi đưa ra trong câu trả lời (ví dụ: Phép nhân vectơ ma trận Boolean trực tuyến sẽ là một trường hợp đặc biệt). Nếu bạn có thể giải quyết vấn đề chung chung thực sự nhanh hơn O (n ^ 3), thì bạn cũng sẽ cải thiện phỏng đoán (đó sẽ là một tin tức lớn!). Hơn nữa, tác giả nói trong một bình luận cho câu hỏi rằng các vectơ ban đầu không rõ. Nếu bạn đã biết tất cả các vectơ trước đó, bạn chỉ có thể sử dụng phép nhân ma trận nhanh (ví dụ: một phiên bản của thuật toán Strassen).
tranisstor

Tôi chỉ chỉ trường hợp tác giả "vector thực". Nhìn vào ma trận Thomas - chỉ trường hợp đặc biệt của ma trận trong O (n). Tôi không ngụ ý trường hợp chung. Và nếu Ma trận là hằng số và các vectơ được biết thì bạn trả lời mã cứng không thực hiện Strassen; (
Evil

@EvilJS: Tôi không chắc là tôi hoàn toàn hiểu những gì bạn đang cố nói. Tất nhiên, đối với các loại ma trận đặc biệt như ma trận Thomas, bạn có thể tăng tốc đáng kể, nhưng nói chung điều này khó hơn. Có lẽ tôi cũng nên chỉ ra rằng vấn đề tôi đã giới thiệu không xem xét một bước tiền xử lý (trước khi bất kỳ vectơ nào xuất hiện). Nếu bạn có thể cho tôi biết làm thế nào để "mã hóa cứng" thuật toán của bạn cho bất kỳ ma trận nào tôi đưa cho bạn, bạn cũng có thể cải thiện phỏng đoán (vì bạn có thể thực hiện bước mã hóa này như một bước tiền xử lý của thuật toán).
tranisstor

đồng ý nó hoạt động; tuy nhiên lần giới thiệu thứ 2 của williams dường như không xem xét ma trận nhị phân nào cả. fyi anh ấy đã trượt ở đây
vzn

-2

Đây thực chất là CS cấp độ nghiên cứu, vấn đề được nghiên cứu trong ít nhất hai chiêu bài, một trong những phép nhân của ma trận thưa thớt (ví dụ như bài báo vừa trích dẫn), và cũng là trường hợp đặc biệt của "ma trận thưa thớt nhị phân" cũng được nghiên cứu. 2 nd trường hợp được biết đến có liên quan đến việc tối ưu hóa các chương trình đường thẳng. các chương trình tối thiểu cũng có thể giống như các DAG với hai loại "cổng", phép cộng và phép nhân, vì vậy một số tài liệu giảm thiểu mạch có thể kết nối với điều này và có thể phần mềm "ngoài giá" có thể được điều chỉnh cho mục đích này. đây là một giới thiệu cụ thể về trường hợp thứ 2 và cũng là câu hỏi tương tự về cstheory với một số nghiên cứu thực nghiệm ban đầu cơ bản.


1
O(n)O(n2)

các ref được bật, như các tiêu đề chỉ ra, ma trận thưa thớt . có lẽ bạn có một số định nghĩa khác với những gì trong bài báo? nếu bạn nhạy cảm với một định nghĩa chính xác về độ thưa thớt (hầu hết có mối tương quan gần như / gần như có thể thay thế cho nhau) thì nên nêu trong câu hỏi.
vzn

1
Ma trận tôi quan tâm là ma trận dày đặc. Nhân tiện, mặc dù tôi không nghĩ rằng điều này giải quyết đầy đủ câu hỏi của tôi, tôi đánh giá cao câu trả lời.
Nick Alger

được rồi xin lỗi! bị lẫn lộn, không nhận ra câu hỏi chính xác. về mặt chữ thảo, ví dụ số 2 của bạn có ít hơn ½ điền và trông "thưa thớt" đối với tôi và cho rằng một số lý thuyết thưa thớt ít nhất sẽ được áp dụng. về cơ bản ma trận càng dày đặc, hoạt động có thể được tối ưu hóa càng ít, vì vậy có lẽ hầu hết lý thuyết về loại tối ưu hóa này được định hướng xung quanh ma trận thưa thớt.
vzn

-3

không chắc vấn đề này đã được nghiên cứu chính xác chưa nhưng nghiên cứu này có liên quan & có vẻ như là một hướng dẫn / bắt đầu hợp lý. nó nhìn vào phân rã siêu dữ liệu để nhân ma trận thưa thớt. ma trận nhị phân là một trường hợp đặc biệt của phương pháp này. phương pháp này sẽ tìm ra nhiều chiến lược tối ưu hơn phương pháp nhân "thẳng". tối ưu hóa hơn nữa (trong khung này) có thể có thể dựa trên thuộc tính ma trận nhị phân.


2
Tôi không thấy điều này có liên quan đến câu hỏi. Bài báo đó là về phân vùng nhân ma trận giữa một hệ thống phân tán, để tính toán song song, để giảm thiểu lượng giao tiếp giữa các bộ xử lý. Điều đó có liên quan gì đến câu hỏi này? Câu hỏi dường như không đề cập bất cứ điều gì về tính toán song song hoặc giao tiếp giữa các bộ xử lý. Tôi khuyến khích bạn chỉnh sửa câu trả lời của bạn để làm cho kết nối rõ ràng hơn.
DW

afaik cùng một vấn đề và giảm thiểu tính toán song song cũng giảm thiểu việc thực hiện bộ xử lý đơn của các phép tính tương tự. ít nhất, người hỏi không loại trừ việc thực hiện song song.
vzn

1
Cảm ơn vi đương link. Tuy nhiên, tôi nghi ngờ về phương pháp cho vấn đề này vì nó không lợi dụng thực tế là các mục ma trận chỉ chứa số không và số không, trong khi tính chất này rất quan trọng, theo như tôi có thể nói. Ví dụ: thuật toán "tổng chạy" trong ví dụ đầu tiên sẽ chỉ hoạt động nếu tất cả các mục nhập khác trong một cột đã cho của ma trận có cùng giá trị.
Nick Alger

NA quan sát / phản đối của bạn được giải quyết trong câu trả lời. tối ưu hóa hơn nữa có thể có thể sử dụng thuộc tính 0/1; phương pháp này dường như giảm thiểu tổng số # các phép toán cộng / nhân dưới vỏ bọc song song. các hoạt động cộng / nhân cũng có thể được xem là "cổng" trong DAG và kỹ thuật này là tối thiểu hóa các cổng. độ phức tạp đáng kể của bài báo cho thấy một số độ phức tạp sâu hơn / đáng kể vốn có của quá trình tối ưu hóa này. như đã nêu câu trả lời không nhằm mục đích dứt khoát về vấn đề khó khăn này, chỉ là "tốt hơn không có gì".
vzn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.