Vektorer, matriser, nätverk - några elementa Innehåll: Vektorer Radvektorer och kolumnvektorer Operationer med vektorer Input- och outputvektorer i neurala nätverk Utvikning om kompetitiva nät Matriser Operationer med matriser (Matris)multiplikation mellan vektorer och matriser Sammanfattning Vektorer En vektor är en ordnad uppsättning av positiva eller negativa tal. Den kan tolkas som en punkt i ett koordinatsystem (med lika många dimensioner som antalet komponenter i vektorn), eller ännu bättre, som den riktade sträckan mellan origo och denna punkt. Fig. 1 (tvådimensionella vektorer): Fig. 2 (tredimensionella vektorer): Radvektorer och kolumnvektorer Ordningen mellan elementen i en vektor kan framställas horisontellt (en radvektor) eller vertikalt (en kolumnvektor). Exempel på det senare är: 2 1 3 Denna vektor är, så länge vi inte inför matrisoperationer, likvärdig med (2,1,3). (Observera att vi på den här Web-sidan skriver såväl kolumnvektorer som matriser i form av tabeller. Anledningen är att parenteser över flera rader är svårt att skriva i HTML...Vi hoppas kunna rätta till denna typografiska brist i ett senare skede.) Operationer med vektorer Addition av vektorer sker genom komponentvis addition. Detta motsvarar att man lägger vektorerna "efter varann" i koordinatsystemet. Exempelvis är (1,1) + (-1,0) = (0,1). Ordningen spelar ingen roll vid vektoraddition. Rita gärna in (-1,0) + (1,1), i den ordningen, i figuren! Fig 3 (vektoraddition): Skalär multiplikation av vektorer betyder att man multiplicerar komponentvis och lägger samman produkterna. Vi använder här symbolen * för denna operation. Således är: (1,1) * (2,1) = 1 ¥ 2 + 1 ¥ 1 = 3. Vektorerna måste ha samma komponentantal vid skalär multiplikation. Ordningen mellan vektorerna spelar däremot ingen roll, inte heller - som vi definierar operationen här - om de är rad- eller kolumnvektorer. Not: Skalär multiplikation kan definieras på många alternativa sätt, t.ex. via matrismultiplikation. I det senare fallet blir distinktionen mellan rad- och kolumnvektorer väsentlig redan vid skalär multiplikation. Vi gör på ett enklare sätt! Man kan geometriskt bevisa, att den skalära produkten v1 * v2, definierad som summan av de komponentvisa produkterna enligt ovan, av två vektorer i planet är lika med l(v1) · l(v2) · cos a, där l(v) är längden av vektorn v (som kan beräknas från komponenterna med Euklides? sats) och a är vinkeln mellan v1 och v2. Cos (cosinus) a är som bekant förhållandet a/h mellan den närliggande katetern och hypotenusan i en rätvinklig triangel med en vinkel a: I en del framställningar definieras för övrigt skalärprodukten mellan vektorerna v1 och v2 som l(v1) · l(v2) · cos a, och då kan man istället bevisa att skalärprodukten kan beräknas genom komponentvis multiplikation följd av addition över resultaten. Av den geometriska tolkningen av skalärprodukt följer flera intressanta saker. Eftersom cos a har maximum (=1) vid a = 0° och är 0 vid a = 90°, så är skalärprodukten av två vektorer med given längd maximal när de har samma riktning och har värdet 0 när de bildar rät vinkel mot varann (dvs är ortogonala). Betrakta vektorerna v, v1, v2 och v3 i följande diagram: Tillämpning av den aritmetiska tolkningen av skalärprodukt ger vid handen att v * v1 = 1, v * v2 = ÷2/2, v * v3 = 0 och v * v4 = -1. Verifiera gärna att detta stämmer med den geometriska tolkningen (obs att cos 45° = ÷2/2)! I figuren ovan har vi att göra med normerade eller normaliserade vektorer, dvs de har alla längden 1. Skalärprodukten av en vektor v1 med en normaliserad vektor v är lika med längden av den vinkelräta projektionen av v1 på v. När både v1 och v är normaliserade gäller alltså att skalärprodukten = cosinus för vinkeln mellan vektorerna, och att den har maximum då vektorerna är identiska. En annan faktor som i det allmänna fallet bestämmer en skalärprodukts storlek är uppenbarligen vektorernas längd. Input- och outputvektorer i neurala nätverk Antag ett enlagrat feed-forward-nätverk med 3 inputenheter och 2 outputenheter. Vi kan avbilda detta på två olika sätt: Fig. 4 (Vanligt nätverksdiagram av feed-forward-nät): I detta diagram tänks signalflödet strömma uppifrån och ned. Vi har en inputvektor i = (x1, x2, x3) av aktiviteter i inputenheterna, och en outputvektor o = (x4, x5) av aktiviteter i outputenheterna. Fig. 5 (Förenklat Hinton-diagram av feed-forward-nät): I Hinton-diagrammet tänks aktiviteten först gå horisontellt från inputenheterna till vänster, därefter "fångas upp" vid korsningarna och sedan gå ner till outputenheterna. Detta beteckningssätt gör det enklare att få plats med vikterna i diagrammet. Här betecknar wij vikten på förbindelsen från enhet Xi till enhet X j. (Observera att många framställningar "vänder" på såväl Hinton-diagrammet som beteckningarna för vikterna.) Nätverket räknar ut nettoinput x_in j till en outputenhet X j så här: först multipliceras, för varje enhet Xi som bidrar till aktiveringen av X j, aktiviteten xi med vikten wij; därefter summeras alla bidragen. Nettoinput till varje enskild outputenhet blir därför skalärprodukten mellan inputvektorn och den viktvektor som hör till outputenheten ifråga (dvs den kolumnvektor som ligger rakt ovanför enheten i diagrammet). Kom nu ihåg att resultatet av en vektormultiplikation är beroende av vinkeln mellan vektorerna! När en inputvektor multipliceras med ett nätverks viktvektorer kommer storleken av nettoinput till de olika enheterna således att bero dels av respektive viktvektorernas längd, dels av deras riktning i förhållande till inputvektorn. Vid normaliserade vektorer fås maximal respons då inputvektorn och viktvektorn är identiska. Utvikning om kompetitiva nät I många så kallade "kompetitiva" nätverk låter man det maximala svaret på en inputvektor i en population linjära enheter definiera "vinnaren" för denna input. (Detta kan realiseras genom att alla enheter i populationen inhiberar varandra efter det att de fått input; ofta hoppar man dock över denna realisering.) Under förutsättning att man arbetar med normaliserade vektorer, eller en approximation av detta villkor, kommer vinnaren att ha en viktvektor som ligger nära inputvektorn i en geometrisk mening. Om vektorerna inte alls är normaliserade utan tillåts ha godtyckliga värden gäller inte denna regel. Genom någon lämpligt vald algoritm kan man sedan ändra viktmatrisen i det kompetitiva nätet så att den aktuella vinnaren blir ännu bättre på att svara på denna input. Slutresultatet blir att olika enheter i en viss mening "representerar" olika inputs; i allmänhet kommer flera inputs att representeras av samma enhet. Inputmängden har då på ett åskådligt sätt "kodats in" i populationen av neuron. Ett alternativ (som alltså inte är matematiskt likvärdigt) är att låta den vinnande enheten för en viss input definieras som den vars viktvektor ligger närmast inputvektorn i rummet, oftast då mätt som euklideiskt avstånd. Den algoritm som ändrar viktmatrisen kan då helt enkelt består i att "dra" viktvektorn för vinnaren närmare inputvektorn ifråga. I många nätverk, t.ex. SOM och LVQ, ingår också andra manipulationer i algoritmen. Det är viktigt vid kodningen av data till kompetitiva nätverk att man tänker på vilka faktorer det är som bestämmer storleken av en respons på en input! Matriser En matris är en tvådimensionell struktur av tal, t ex: 231 110 En matris kan sägas bestå av radvektorer arrangerade i en kolumn. I det här fallet är det två stycken trekomponents radvektorer, nämligen (2,3,1) och (1,1,0). Men matrisen kan också beskrivas som kolumnvektorer arrangerade i en rad. I det här fallet är det tre stycken tvåkomponents kolumnvektorer. Vår matris sägs vara en (2,3)-matris eftersom den har två rader och tre kolumner. Förväxla inte beteckningen (2,3) här med en vektor eller med beteckningarna på matrisens element! En radvektor med n komponenter kan uppfattas som en (1,n)-matris, en kolumnvektor med n komponenter som en (n,1)-matris. Elementen i en matris betecknas med dubbelindices, där den första siffran står för raden och den andra för kolumnen där elementet hör hemma. Om matrisen ovan får heta A är således a11=2, a21=1 och a23=0. Observera att något element a32 inte existerar i A. Ett allmänt beteckningssätt för en (m,n)-matris är: a11 a12 .... a1n a21 a22 .... a2n .... am1 am2 .... amn vilket man ibland helt enkelt sammanfattar som (amn). Operationer med matriser Två matriser med samma dimensioner kan adderas genom att motsvarande komponenter adderas. Således är 2 3 1 1 -1 -1 + 3 2 0 1 1 0 = 5 5 1 2 0 -1 Observera villkoret att dimensionerna måste vara lika; en (2,3)-matris kan alltså inte adderas med en (3,4)-matris. Ordningen mellan matriserna spelar ingen roll vid addition. Multiplikation av matriser, som vi här symboliserar med det vanliga multiplikationstecknet ¥, kan enklast definieras genom att elementet aij i den resulterande matrisen skall vara lika med skalärprodukten av radvektor i från den första matrisen och kolumnvektor j från den andra. Det här innebär att raderna i den första matrisen måste ha lika många komponenter som kolumnerna i den andra, eller, med andra ord, att det måste finnas lika många kolumner i den första som rader i den andra. Låt oss försöka utföra 2 3 1 1 1 0 ¥ 3 0 1 1 1 5 -1 0 2 -2 1 -3 Vi har en (2,3)-matris och en (3,4)-matris, så dimensionsvillkoret är uppfyllt. Elementet a11 i den resulterande matrisen skall vara (2,3,1) * (3,1,2) = 2 ¥ 3 + 3 ¥ 1 + 1 ¥ 2 = 11. Vilket blir det sista elementet i matrisen? Rimligen vektorprodukten av andra raden i den första matrisen med fjärde kolumnen i den andra, alltså (1,1,0) * (1,0,-3) = 1. Detta är element a24. Den resulterande matrisen har 2 rader och 4 kolumner; den är en (2,4)-matris som närmare bestämt ser ut så här: 11 13 0 -1 4 5 0 1 Kontrollera gärna att detta stämmer! En (m,p)-matris A kan alltså multipliceras med en (p,n)-matris B, och resultatet blir en (m,n)-matris. Men om m <> n går det ändå inte att multiplicera B med A, i den ordningen. I exemplet ovan hade man ju då behövt multiplicera radvektorer ur matris 2 (med fyra komponenter) med kolumnvektorer ur matris 1 (med två komponenter), och det går inte. Ordningen mellan matriserna är alltså väsentlig vid multiplikation! Även i de fall då det går att genomföra operationen åt båda hållen är A ¥ B i allmänhet <> B ¥ A. (Matris)multiplikation mellan vektorer och matriser Fortsättningsvis skall vi uppfatta vektorer som specialfall av matriser. Det blir då viktigt att hålla reda på vad som är rad- respektive kolumnvektorer. Om en radvektor med n komponenter ses som en (1,p)-matris, förstår man att den kan matrismultipliceras med en (p,n)-matris. Resultatet blir en (1,n)-matris, dvs en ny radvektor. Exempelvis är 1 2 0 ¥ 1 0 1 1 0 1 = 3 2 Varje komponent i resultatvektorn är skalärprodukten av den ursprungliga radvektorn och en kolumn i matrisen. Ett specialfall är när (den andra) matrisen är en (p,1)-matris, dvs en enstaka kolumnvektor. Vi får då ett (1,1)-matris, som innehåller vektorernas skalärprodukt. Det som händer i ett enkelt feed-forward-nätverk när det beräknar nettoinput till outputenheterna är just att inputvektorn skalärmultipliceras med alla kolumnerna av vikter (jfr ovan) - med andra ord är det fråga om en multiplikation av en vektor (inputvektorn) med hela matrisen av vikter. Observera att vi formellt betraktar inputvektorn som en radvektor när vi multiplicerar in den i matrisen (se uttrycket ovan), även om vi representerar den vertikalt i det vanliga Hinton-diagrammet! För en mer pedagogisk representation av de matematiska förhållandena, se Figur 8 nedan. Ett matematiskt likvärdigt alternativ, som man ser i många framställningar, är för övrigt att "högermultiplicera" viktmatrisen med inputvektorn, uppfattad som en kolumnvektor. I en linjär associator är dessutom aktiviteten i en enhet = dess nettoinput; här blir därför inputvektorn ¥ viktmatrisen = outputvektorn. Låt oss sätta in värdena från vår lilla multiplikation ovan i ett Hinton-diagram för att se hur det hela fungerar. Fig. 6 (Enkelt Hinton-diagram av linjär associator): Det enda som inte riktigt tycks stämma med den vektor- och matristerminologi som vi infört är numreringen av komponenter och kolumner. Outputvektorn har två komponenter, men de numreras inte från 1 till 2, utan från 4 till 5. Och var är till exempel den första kolumnen, som borde vara w11-w31, i viktmatrisen? Lägg märke till att vi hittills bara tittat på ett nätverk där input- och outputenheter är separerade, dvs det finns ingen feedback. Man kan i och för sig numrera om enheterna i ett sådant nät genom att använda separata symboler för outputenheterna, och det görs ofta. I vårt fall kunde man t.ex. kalla dem Y1 och Y2; då skulle vi ju få en matris vars kolumner var "rätt" numrerade". Men istället blir det fel på ett annat ställe, nämligen i viktbeteckningarna, eftersom w11 inte längre är vikten hos en förbindelse från ett visst element till samma element! De här egenheterna kan sägas bero på att vi "egentligen" opererar med större matriser, där vissa element är lika med noll. Vi kan visa detta i ett fullständigt Hinton-diagram, dvs ett där alla enheter är med både på input- och outputsidan. Nettoinput till inputenheterna (dvs de enheter som får extern input), samt alla vikter utom de på förbindelserna från inputenheter till outputenheter, har värdet 0. Fig. 7. Fullständigt Hinton-diagram för ett (3,2)-feed-forwardnät Man inser lätt att det går bra att betrakta det som händer i detta nätverk som en skalär multiplikation av den "fullständiga inputvektorn" (x1,x2,x3,x4,x5) med hela viktmatrisen inklusive alla dess nollor. På grund av nollorna i rad 4-5 kan lika gärna betrakta (x1,x2,x3,0,0) som den fullständiga inputvektorn. På grund av nollorna i kolumn 1-3 får vi en nettoinput <> 0 bara i enheterna 4 och 5. Resultatet blir den "fullständiga outputvektorn" (0,0,0,x4,x5). Det fullständiga Hinton-diagrammet har också följande vackra variant. Vi tittar på det helt allmänna fallet där det inte är bestämt att vissa vikter skall vara noll, dvs där alla förbindelser är i princip tillåtna. Fig. 8 (Fullständigt Hintondiagram för 5 enheter, snygg variant): Aktivitetssflödets riktning har som vanligt symboliserats med pilar. Fördelen med detta illustrationssätt är att man bara behöver rita varje neuronal enhet en gång, även när det finns feedback och man alltså inte kan använda det förenklade Hinton-diagrammet. Likaså avbildar man på ett pedagogiskt sätt det förhållandet, att såväl input- som outputvektorn skall uppfattas som radvektorer. Vad som däremot inte framgår så tydligt i Figur 8 är att vissa neuron kan ha "extern input". För att få det hela att gå ihop kan man föreställa sig denna externa input som betingad av att vissa neuron har en mycket speciell aktiveringsfunktion x j(t) = f(x_in j(t)). Närmare bestämt är aktiviteten i dessa neuron helt oberoende av x_in j! Sammanfattning Vi kan nu sammanfatta det ovan sagda som följer. Låt x(t) och x_in(t) vara aktivitetsvektorn respektive vektorn av nettoinputs i ett nätverk vid tiden t, båda uppfattade som radvektorer eller (1,n)-matriser, och låt w vara viktmatrisen. Då gäller att: x_in(t+1) = x(t) ¥ w I det allmänna fallet har vi en aktiveringsfunktion f (som kan skilja sig mellan olika enheter): x(t) = f(x_in(t)) varför x(t+1) = f(x(t) ¥ w) I de enklaste lineära nätverken är f identitetsfunktionen, dvs x(t) = x_in(t) och alltså x(t+1) = x(t) ¥ w Början av sidan Tillbaka till sidan Artificiella Neurala Nätverk - en kort introduktion Helge Malmgren 98-10-14