Vektorer, matriser, nätverk - några elementa

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