Strassen algoritm
Inom linjär algebra är Strassen -algoritmen , uppkallad efter Volker Strassen , en algoritm för matrismultiplikation . Den är snabbare än standardmatrismultiplikationsalgoritmen för stora matriser, med en bättre asymptotisk komplexitet, även om den naiva algoritmen ofta är bättre för mindre matriser. Strassen-algoritmen är långsammare än de snabbaste kända algoritmerna för extremt stora matriser, men sådana galaktiska algoritmer är inte användbara i praktiken, eftersom de är mycket långsammare för matriser av praktisk storlek. För små matriser finns det ännu snabbare algoritmer.
Strassens algoritm fungerar för vilken ring som helst , som plus/multiplikera, men inte alla semiringar , som min-plus eller boolesk algebra , där den naiva algoritmen fortfarande fungerar, och så kallad kombinatorisk matrismultiplikation.
Historia
Volker Strassen publicerade denna algoritm först 1969 och bevisade därmed att generella matrismultiplikationsalgoritmen inte var optimal. Strassen-algoritmens publicering resulterade i mer forskning om matrismultiplikation som ledde till både asymptotiskt lägre gränser och förbättrade beräkningsmässiga övre gränser.
Algoritm
Låt , vara två kvadratiska matriser över en ring , till exempel matriser vars poster är heltal eller de reella talen. Målet med matrismultiplikation är att beräkna matrisprodukten . Följande beskrivning av algoritmen antar att alla dessa matriser har storlekar som är två potenser (dvs. A , är inte av typen , de "saknade" raderna och kolumnerna kan fyllas med nollor för att få matriser med storlekar av två potenser -- även om verkliga implementeringar av algoritmen inte gör detta i praktiken.
Strassen-algoritmen delar upp , och i lika stora blockmatriser
med . Den naiva algoritmen skulle vara:
Denna konstruktion minskar inte antalet multiplikationer: 8 multiplikationer av matrisblock behövs fortfarande för att beräkna matriserna, samma antal multiplikationer som behövs när man använder standardmatrismultiplikation.
Strassen-algoritmen definierar istället nya matriser:
använder endast 7 multiplikationer (en för varje ) istället för 8. Vi kan nu uttrycka i termer av :
Vi upprepar denna divisionsprocess rekursivt tills submatriserna degenererar till tal (element i ringen . Om, som nämnts ovan, den ursprungliga matrisen hade en storlek som inte var en potens av 2, så kommer den resulterande produkten att ha noll rader och kolumner precis som och , och dessa kommer då att tas bort vid denna tidpunkt för att få den (mindre) matris vi verkligen ville ha.
Praktiska implementeringar av Strassens algoritm byter till standardmetoder för matrismultiplikation för tillräckligt små submatriser, för vilka dessa algoritmer är mer effektiva. Den särskilda övergångspunkten för vilken Strassens algoritm är mer effektiv beror på den specifika implementeringen och hårdvaran. Tidigare författare hade uppskattat att Strassens algoritm är snabbare för matriser med bredder från 32 till 128 för optimerade implementeringar. Det har dock observerats att denna övergångspunkt har ökat under de senaste åren, och en studie från 2010 fann att även ett enda steg av Strassens algoritm ofta inte är fördelaktigt på nuvarande arkitekturer, jämfört med en mycket optimerad traditionell multiplikation, tills matrisstorlekarna överskrider 1000 eller mer, och även för matrisstorlekar på flera tusen är fördelen vanligtvis marginell i bästa fall (cirka 10 % eller mindre). En nyare studie (2016) observerade fördelar för matriser så små som 512 och en fördel runt 20 %.
Winograd form
Det är möjligt att minska antalet matristillägg genom att istället använda följande form som upptäckts av Winograd:
där u = (c - a) (C - D), v = (c + d) (C - A), w = aA + (c + d - a) (A + D - C). Detta minskar antalet matrisadditioner och subtraktioner från 18 till 15. Antalet matrismultiplikationer är fortfarande 7, och den asymptotiska komplexiteten är densamma.
Asymptotisk komplexitet
Översikten av algoritmen ovan visade att man kan komma undan med bara 7, istället för de traditionella 8, matris-matris-multiplikationer för sub-blocken av matrisen. Å andra sidan måste man göra additioner och subtraktioner av block, även om detta inte är av betydelse för den övergripande komplexiteten: Att lägga till matriser av storlek kräver endast operationer medan multiplikation är betydligt dyrare (traditionellt additions- eller multiplikationsoperationer).
Frågan är då hur många operationer man behöver för Strassens algoritmer, och hur detta jämförs med standardmatrismultiplikationen som tar ungefär (där ) aritmetiska operationer, dvs en asymptotisk komplexitet .
Antalet additioner och multiplikationer som krävs i Strassen-algoritmen kan beräknas enligt följande: låt vara antalet operationer för en matris. Sedan genom rekursiv tillämpning av Strassen-algoritmen ser vi att , för någon konstant som beror på antalet tillägg som utförs vid varje tillämpning av algoritmen. Därför dvs den asymptotiska komplexiteten för multiplicering av matriser med storlek som använder Strassen-algoritmen är . Minskningen av antalet aritmetiska operationer kommer dock till priset av en något minskad numerisk stabilitet , och algoritmen kräver också betydligt mer minne jämfört med den naiva algoritmen. Båda initialmatriserna måste ha sina dimensioner expanderade till nästa potens av 2, vilket resulterar i att man lagrar upp till fyra gånger så många element, och de sju hjälpmatriserna innehåller vardera en fjärdedel av elementen i de expanderade.
Strassens algoritm måste jämföras med det "naiva" sättet att göra matrismultiplikationen som skulle kräva 8 istället för 7 multiplikationer av delblock. Detta skulle då ge upphov till den komplexitet man förväntar sig av standardmetoden: . Jämförelsen av dessa två algoritmer visar att asymptotiskt är Strassens algoritm snabbare: Det finns en storlek så att matriser som är större multipliceras mer effektivt med Strassens algoritm än den "traditionella " sätt. Det asymptotiska påståendet innebär dock inte att Strassens algoritm alltid är snabbare även för små matriser, och i praktiken är detta faktiskt inte fallet: För små matriser överväger kostnaden för ytterligare tillägg av matrisblock besparingarna i antalet multiplikationer. Det finns också andra faktorer som inte fångas upp av analysen ovan, såsom skillnaden i kostnad på dagens hårdvara mellan att ladda data från minnet till processorer kontra kostnaden för att faktiskt utföra operationer på denna data. Som en konsekvens av dessa typer av överväganden används Strassens algoritm vanligtvis bara på "stora" matriser. Denna typ av effekt är ännu mer uttalad med alternativa algoritmer som den av Coppersmith och Winograd : Även om den är asymptotiskt ännu snabbare, är övergångspunkten så stor att algoritmen används i allmänhet inte på matriser man möter i praktiken.
Rang eller bilinär komplexitet
Den bilinjära komplexiteten eller rangordningen för en bilinjär karta är ett viktigt begrepp i den asymptotiska komplexiteten av matrismultiplikation. Rangen för en bilinjär karta över ett fält F definieras som (något av en missbruk av notation )
Med andra ord är rangordningen för en bilinjär karta längden på dess kortaste bilinjära beräkning. Förekomsten av Strassens algoritm visar att rangordningen för matrismultiplikation inte är mer än sju. För att se detta, låt oss uttrycka denna algoritm (vid sidan av standardalgoritmen) som en sådan bilinjär beräkning. När det gäller matriser består de dubbla utrymmena A * och B * av kartor in i fältet F inducerade av en skalär dubbelpunktsprodukt , (dvs i detta fall summan av alla poster i en Hadamard-produkt .)
Standardalgoritm | Strassen algoritm | ||||||
1 | |||||||
2 | |||||||
3 | |||||||
4 | |||||||
5 | |||||||
6 | |||||||
7 | |||||||
8 | |||||||
Det kan visas att det totala antalet elementära multiplikationer som krävs för matrismultiplikation är tätt asymptotiskt bundet till rangordningen , dvs , eller mer specifikt, eftersom konstanterna är kända, . En användbar egenskap hos rangordningen är att den är submultiplikativ för tensorprodukter , och detta gör det möjligt att visa att matrismultiplikation kan åstadkommas med högst elementära multiplikationer för alla . (Denna -faldiga tensorprodukten av -matrismultiplikationskartan med sig själv — en :e tensorpotentialen — realiseras genom det rekursiva steget i den visade algoritmen.)
Cachebeteende
Strassens algoritm är cache-omedveten . Analys av dess cache- beteendealgoritm har visat att det uppstår
cache missar under dess exekvering, förutsatt att en idealiserad cache av storlek (dvs. med rader med längden ).
Implementeringsöverväganden
Beskrivningen ovan anger att matriserna är kvadratiska och storleken är en potens av två, och att stoppning ska användas om det behövs. Denna begränsning tillåter att matriserna delas på mitten, rekursivt, tills gränsen för skalär multiplikation nås. Begränsningen förenklar förklaringen och analysen av komplexitet, men är faktiskt inte nödvändig; och i själva verket kommer utfyllnad av matrisen enligt beskrivning att öka beräkningstiden och kan enkelt eliminera de ganska snäva tidsbesparingar som erhålls genom att använda metoden i första hand.
En bra implementering kommer att observera följande:
- Det är inte nödvändigt eller önskvärt att använda Strassen-algoritmen ner till gränsen för skalärer. Jämfört med konventionell matrismultiplikation, adderar algoritmen en avsevärd arbetsbelastning i addition/subtraktion; så under en viss storlek är det bättre att använda konventionell multiplikation. Således behöver till exempel en inte utfyllas till eftersom den skulle kunna delas upp till matriser och konventionell multiplikation kan sedan användas på den nivån.
- Metoden kan verkligen tillämpas på kvadratiska matriser av vilken dimension som helst. Om måtten är jämn delas de på mitten enligt beskrivningen. Om dimensionen är udda tillämpas nollutfyllnad med en rad och en kolumn först. Sådan stoppning kan appliceras på-the-fly och lättjefullt, och de extra raderna och kolumnerna kasseras när resultatet bildas. Anta till exempel att matriserna är . De kan delas så att den övre vänstra delen är och den nedre högra delen är . Varhelst operationerna kräver det, är dimensionerna nollutfyllda till först. Notera till exempel att produkten endast används i den nedre raden av utdata, så det krävs bara att den är rader hög; och därför behöver den vänstra faktorn som används för att generera den bara vara rader hög; följaktligen finns det inget behov av att fylla den summan till rader; det är bara nödvändigt att fylla till kolumner för att matcha .
Vidare finns det inget behov av att matriserna är kvadratiska. Icke-kvadratiska matriser kan delas på mitten med samma metoder, vilket ger mindre icke-kvadratiska matriser. Om matriserna är tillräckligt icke-kvadratiska kommer det att vara värt besväret att reducera den initiala operationen till fler kvadratiska produkter, med enkla metoder som i huvudsak är till exempel:
- En produkt med storleken kan göras som 20 separata operationer, arrangerade för att bilda resultatet;
- En produkt med storleken kan göras som 10 separata operationer, summerade för att bilda resultatet.
Dessa tekniker kommer att göra implementeringen mer komplicerad, jämfört med att bara utfylla till en tvåkraftsruta; Det är dock ett rimligt antagande att alla som genomför en implementering av Strassen, snarare än konventionell multiplikation, kommer att prioritera beräkningseffektivitet högre än på enkelheten i implementeringen.
I praktiken kan Strassens algoritm implementeras för att uppnå bättre prestanda än konventionell multiplikation även för små matriser, för matriser som inte alls är kvadratiska och utan att kräva arbetsyta bortom buffertar som redan behövs för en högpresterande konventionell multiplikation.
Se även
- Beräkningskomplexitet av matematiska operationer
- Eliminering av Gauss–Jordan
- Coppersmith–Winograd-algoritm
- Z-ordnings matrisrepresentation
- Karatsuba-algoritm för att multiplicera n -siffriga heltal i istället för i tid
- Toom-Cook-algoritmen , en snabbare generalisering av Karatsuba-algoritmen som tillåter rekursiv dela-och-härska-nedbrytning i mer än 2 block åt gången
- Gauss komplexa multiplikationsalgoritm multiplicerar två komplexa tal med 3 reella multiplikationer istället för 4
- Thomas H. Cormen , Charles E. Leiserson , Ronald L. Rivest och Clifford Stein . Introduktion till algoritmer, andra upplagan. MIT Press och McGraw-Hill, 2001. ISBN 0-262-03293-7 . Kapitel 28: Avsnitt 28.2: Strassens algoritm för matrismultiplikation, s. 735–741.
- Knuth, Donald (1997). Konsten att programmera, seminumeriska algoritmer . Vol. II (3:e upplagan). Addison-Wesley. ISBN 0-201-89684-2 .
externa länkar
- Weisstein, Eric W. "Strassens formler" . MathWorld . (Innehåller även formler för snabb matrisinversion )
- Tyler J. Earnest, Strassens algoritm för mobilbredbandsmotorn