Strassen algoritmus

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. november 22-én felülvizsgált verziótól ; az ellenőrzések 20 szerkesztést igényelnek .

Strassen algoritmusát gyors mátrixszorzásra tervezték . Volker Strassen fejlesztette ki 1969-ben, és a Karatsuba mátrixszorzási módszerének általánosítása.

A hagyományos , időben futó mátrixszorzó algoritmustól eltérően (a képlet szerint ) , a Strassen-algoritmus időben szorozza a mátrixokat , ami nagy sűrűségű mátrixokon erősít.

Annak ellenére, hogy a Strassen-féle algoritmus aszimptotikusan nem a leggyorsabb a meglévő gyors mátrixszorzó algoritmusok közül, könnyebben programozható és hatékonyabb viszonylag kis mátrixok szorzásakor, így a gyakorlatban ez a leggyakrabban használt.

Az algoritmus leírása

Ha ugyanazokat a nulla sorokat és oszlopokat adjuk hozzá a mátrixokhoz , akkor a szorzatuk egyenlő lesz az azonos hozzáadott sorokkal és oszlopokkal rendelkező mátrixszal. Ezért csak a méretű mátrixok jöhetnek számításba , más eseteket pedig nullák hozzáadásával lehet erre redukálni, ami csak megduplázódhat.

Legyenek méretű mátrixok . A -mátrixokból származó méretű blokkmátrixokként ábrázolhatók:

A blokkszorzás elve alapján egy mátrixot a szorzatukban fejeznek ki

ahol a jobb oldalon nyolc méretű mátrix szorzata található . Mivel a mátrixok egy gyűrűt alkotnak , így a jobb oldal kiszámítására bármely olyan -mátrixok szorzására szolgáló algoritmus alkalmas , amely csak összeadást, kivonást és szorzást használ. Strassen a következő algoritmust javasolta hét szorzással:

Minden szorzás elvégezhető rekurzív módon ugyanazzal az eljárással, és az összeadást triviálisan, elemek hozzáadásával. Ezután a rekurzív reláción keresztül megbecsüljük az algoritmus futási idejét :

Megvalósítási példa

Az alábbiakban egy példa az algoritmus Pythonban való megvalósítására, amely a NumPy könyvtárat használja az almátrixok gyors felvételéhez. A fő funkció a strassen_mul. Feltételezzük, hogy minden mátrix négyzet alakú, típussal ábrázolva, numpy.arrayméretük pedig 2 hatványa.

Kis mátrixméretek esetén a közvetlen szorzás gyorsabb, mint a Strassen-algoritmus az utóbbiban található nagyszámú összeadás miatt. Az ilyen méretek határa az elemek összeadási és szorzási idejének arányától függ, ezért a hardverkörnyezettől függően változhat. A kódban a konstans felelős a célért TRIVIAL_MULTIPLICATION_BOUND.

itertoolsból import termék import numpy as np _ def split_to_2x2_blocks ( mátrix ): visszatérési lista ( térkép ( lambda sor : np . hsplit ( sor , 2 ), np . vsplit ( mátrix , 2 ) )) def strassen_mul_2x2 ( lb , rb ): d = strassen_mul ( lb [ 0 ][ 0 ] + lb [ 1 ][ 1 ], rb [ 0 ][ 0 ] + rb [ 1 ][ 1 ]) d_1 = strassen_mul ( lb [ 0 ][ 1 ] - lb [ 1 ][ 1 ], rb [ 1 ][ 0 ] + rb [ 1 ][ 1 ]) d_2 = strassen_mul ( lb [ 1 ][ 0 ] - lb [ 0 ][ 0 ], rb [ 0 ][ 0 ] + rb [ 0 ][ 1 ]) bal = strassen_mul ( lb [ 1 ][ 1 ], rb [ 1 ][ 0 ] - rb [ 0 ][ 0 ]) jobb = strassen_mul ( lb [ 0 ][ 0 ], rb [ 0 ][ 1 ] - rb [ 1 ][ 1 ]) felső = strassen_mul ( lb [ 0 ][ 0 ] + lb [ 0 ][ 1 ], rb [ 1 ][ 1 ]) alsó = strassen_mul ( lb [ 1 ][ 0 ] + lb [ 1 ] [ 1 ], rb [ 0 ][ 0 ]) return [[ d + d_1 + bal - fent , jobb + felül ], [ bal + lent , d + d_2 + jobb - lent ]] def trivial_mul ( bal , jobb ): magasság , mid_size = bal . alak közepes méretű , jobb = jobb . formák eredmény = np . nullák (( magasság , szélesség )) a sorhoz , oszlophoz , a termék közepéhez ( * térkép ( tartomány , [ magasság , szélesség , mid_size ])): eredmény [ sor ][ oszlop ] += bal [ sor ][ mid ] * jobb [ közép ][ oszlop ] vissza az eredményt TRIVIAL_MULTIPLICATION_BOUND = 8 def strassen_mul ( left , right ): assert ( left . shape == right . shape ) assert ( left . shape [ 0 ] == left . shape [ 1 ]) ha marad . shape [ 0 ] <= TRIVIAL_MULTIPLICATION_BOUND : return trivial_mul ( balra , jobbra ) assert ( balra . alak [ 0 ] % 2 == 0 ) return np . blokk ( strassen_mul_2x2 ( * térkép ( split_to_2x2_blocks , [ balra , jobbra ]))) )

Továbbfejlesztés

Strassen volt az első, aki megmutatta a mátrixok szabványosnál hatékonyabb szorzásának lehetőségét. Munkájának 1969-es publikálása után megkezdődött a gyorsabb algoritmusok aktív keresése. Napjaink aszimptotikusan leggyorsabb algoritmusa az 1987-ben javasolt és 2011-ben az [1] szintre továbbfejlesztett Coppersmith-Winograd algoritmus , amely lehetővé teszi a mátrixok szorzását műveletekben [ 1] . Ennek az algoritmusnak nincs gyakorlati jelentősége, mivel a csillagászatilag nagy konstans az aritmetikai komplexitás becslésében. A mátrixszorzás aszimptotikusan korlátozó sebességének kérdése nem megoldott. Létezik Strassen sejtése, hogy kellően nagy esetén létezik egy algoritmus két méretű mátrix megszorzására olyan műveletekben, ahol egy előre megadott pozitív szám tetszőlegesen kicsi. Ez a sejtés pusztán elméleti érdeklődésre tarthat számot, mivel a mátrixok mérete, amelyekhez valóban kicsi, láthatóan nagyon nagy.

A nagy mátrixok szorzására szolgáló leggyorsabb és legstabilabb gyakorlati algoritmus megalkotásának kérdése szintén megoldatlan marad.

Winograd-Strassen algoritmus

A Strassen-algoritmusnak van egy olyan módosítása, amely 7 szorzást és 15 összeadást igényel (a szokásos Strassen-algoritmus 18 helyett).

A mátrixok blokk-almátrixokra vannak felosztva, ahogy fentebb látható.

A köztes elemek kiszámítása megtörténik

A mátrixelemek kiszámítása a következőképpen történik:

A probléma jelenlegi állása

A Strassen-algoritmus egy bilineáris algoritmus, együtthatói a Brent -egyenletek köbrendszerének gyökerei . [2] A <2x2x2> egzakt algoritmusok osztályánál ez egy minimális probléma, melynek megoldása lehetővé teszi a szorzások számának csökkentését a mátrixelemek gyűrűjében. [3] [4] Az új algoritmusok megtalálásának problémája, hogy a Brent-rendszer nemlineáris, az ismeretlenek és egyenletek száma (ezek a számok nem esnek egybe) gyorsan nő a mátrixok méretével, és csak a nagy nullák száma kötelező.

2013-ban ezeknek a problémáknak a részleges leküzdése után sikerült megtalálni az első gyakorlati bilineáris mátrixszorzási algoritmust, amely aszimptotikusan gyorsabb, mint a Strassen-algoritmus. [5] Szmirnov algoritmusa <3x3x6; 40> megszoroz egy 3x3-as mátrixot egy 3x6-os mátrixszal, 54 helyett 40 szorzást használva. Aszimptotikus komplexitása . (Az algoritmus tenzoros szorzása önmagával az argumentumok ciklikus eltolásával, az <54x54x54; 64000> négyzetmátrixok ugyanolyan bonyolultságú algoritmusához vezet). A szorzás valódi felgyorsításához jelentős optimalizálás szükséges - sok párhuzamos számítás eltávolítása lineáris formában.

Ma (2022) ez aszimptotikusan a leggyorsabb gyakorlati bilineáris algoritmus mátrixelemek tetszőleges mezőjére .

2022. október 5-én a DeepMind az AlphaZero neurális hálózati algoritmust használva számos új algoritmust talált különböző dimenziójú mátrixok szorzására. Azonban ezek sebessége egy tetszőleges mező esetén messze van az ismert legjobb algoritmusok sebességétől. Tehát a 4X4-es mátrixokhoz a Strassen-algoritmus 49 szorzást igényel, az AlphaTensor pedig talált egy olyan algoritmust, amely 47 szorzást igényel, de ez csak a mezőben működik . [6] [7]

Jegyzetek

  1. 1 2 A matematikusok legyőzték a Coppersmith-Winograd akadályt . lenta.ru (2011. december 12.). Hozzáférés dátuma: 2011. december 12. Az eredetiből archiválva : 2012. február 5.
  2. RPBrent. Algoritmusok mátrixszorzásokhoz// Computer Science Dept. Jelentés CS 157, Stanford University, 1970.
  3. A mátrixszorzás összetettsége. Áttekintés//Cybernetic. Gyűjtemény. 1988. szám. 25. S. 139-236.
  4. Landsberg JM Geometria és a mátrixszorzás összetettsége // Bull. amer. Math. szoc. 2008. V.45. P. 247-284.
  5. A. V. Smirnov, „A bilineáris komplexitásról és a mátrixszorzás gyakorlati algoritmusairól”, Zh. Vychisl. matematika. és mat. Fiz., 53:12 (2013), 1970–1984; Comput. Math. Math. Phys., 53:12 (2013), 1781–1795
  6. ↑ Új algoritmusok felfedezése az AlphaTensor segítségével  . www.deepmind.com . Letöltve: 2022. október 6.
  7. Alhussein Fawzi, Matej Balog, Aja Huang, Thomas Hubert, Bernardino Romera-Paredes. Gyorsabb mátrixszorzó algoritmusok felfedezése megerősítéses tanulással   // Természet . – 2022-10. — Vol. 610 , iss. 7930 . — P. 47–53 . — ISSN 1476-4687 . - doi : 10.1038/s41586-022-05172-4 .

Irodalom