Annabella Peng

För att ge en ordentlig introduktion till Gaussiska kärnor kommer veckans inlägg att börja lite mer abstrakt än vanligt. Denna abstraktionsnivå är inte strikt nödvändig för att förstå hur Gaussiska kärnor fungerar, men det abstrakta perspektivet kan vara extremt användbart som en källa till intuition när man försöker förstå sannolikhetsfördelningar i allmänhet. Så här är det: Jag kommer att försöka bygga upp abstraktionen långsamt, men om du någonsin blir hopplöst vilse, eller om du helt enkelt inte orkar mer, kan du hoppa ner till rubriken där det står ”Den praktiska delen” i fetstil – Där kommer jag att övergå till en mer konkret beskrivning av algoritmen för den gaussiska kärnan. Om du fortfarande har problem, oroa dig inte för mycket – De flesta av de senare inläggen på den här bloggen kommer inte att kräva att du förstår Gaussiska kärnor, så du kan bara vänta på nästa veckas inlägg (eller hoppa över till det om du läser det här senare).

Håll dig till minnet att en kärna är ett sätt att placera ett datarum i ett mer tredimensionellt vektorrum, så att datarummets skärningspunkter med hyperplan i det mer tredimensionella rummet bestämmer mer komplicerade, böjda beslutsgränser i datarummet. Det viktigaste exemplet som vi tittade på var kärnan som skickar ett tvådimensionellt datarum till ett femdimensionellt rum genom att skicka varje punkt med koordinaterna (x,y) till den femdimensionella punkten med koordinaterna (x,y,x^2, y^2, y^2, x^y). Om vi vill ge oss själva ännu mer flexibilitet kan vi välja en ännu högre dimensionell kärna, till exempel genom att skicka punkten (x,y) till punkten (x,y,x^2, y^2, x^y, x^y, x^3, x^2y, xy^2, y^3) i ett nydimensionellt rum.

Den här veckan kommer vi att gå bortom högre dimensionella vektorrum och gå till oändligt dimensionella vektorrum. Du kan se hur den niodimensionella kärnan ovan är en förlängning av den femdimensionella kärnan – vi har i princip bara lagt till ytterligare fyra dimensioner i slutet. Om vi fortsätter att lägga till fler dimensioner på detta sätt får vi allt högre och högre dimensionella kärnor. Om vi skulle fortsätta att göra detta ”för evigt” skulle vi få oändligt många dimensioner. Observera att vi bara kan göra detta i abstrakt form. Datorer kan bara hantera ändliga saker, så de kan inte lagra och bearbeta beräkningar i oändligt dimensionella vektorrum. Men vi låtsas för en stund att vi kan det, bara för att se vad som händer. Sedan översätter vi saker och ting tillbaka till den finita världen.

I detta hypotetiska oändligt dimensionella vektorrum kan vi lägga till vektorer på samma sätt som vi gör med vanliga vektorer, genom att bara lägga till motsvarande koordinater. I det här fallet måste vi dock lägga till oändligt många koordinater. På samma sätt kan vi multiplicera med skalarer, genom att multiplicera var och en av de (oändligt många) koordinaterna med ett givet tal. Vi definierar den oändliga polynomkärnan genom att skicka varje punkt (x,y) till den oändliga vektorn (x,y,x^2, y^2, x^y, x^3, x^2y, xy^2, y^3, x^4,\ldots). I synnerhet kommer varje monomial i variablerna x och y, såsom x^7y^42 eller y^{10,000} att dyka upp i en av posterna i denna kärna, möjligen mycket långt ner i sekvensen.

För att återgå till beräkningsvärlden kan vi återfå vår ursprungliga femdimensionella kärna genom att helt enkelt glömma bort alla poster utom de fem första. Faktum är att det ursprungliga femdimensionella rummet finns i detta oändligt dimensionella rum. (Den ursprungliga femdimensionella kärnan är vad vi får genom att projicera den oändliga polynomkärnan in i detta femdimensionella rum.)

Ta nu ett djupt andetag, för vi ska ta detta ett steg längre. Tänk för ett ögonblick på vad en vektor är. Om du någonsin gått en kurs i matematisk linjär algebra kommer du kanske ihåg att vektorer officiellt definieras i termer av deras additions- och multiplikationsegenskaper. Men jag tänker tillfälligt ignorera det (med ursäkt till alla matematiker som läser detta.) I datorvärlden tänker vi vanligtvis på en vektor som en lista med siffror. Om du har läst så här långt är du kanske villig att låta den listan vara oändlig. Men jag vill att du ska tänka på en vektor som en samling tal där varje tal tilldelas en viss sak. Till exempel tilldelas varje nummer i vår vanliga typ av vektor en av koordinaterna/detaljerna. I en av våra oändliga vektorer är varje nummer tilldelat en plats i vår oändligt långa lista.

Men vad sägs om detta: Vad skulle hända om vi definierade en vektor genom att tilldela varje punkt i vårt (ändligt dimensionella) datarum ett nummer? En sådan vektor väljer inte ut en enda punkt i datarummet, utan när du väl har valt denna vektor, om du pekar på någon punkt i datarummet, ger vektorn dig ett nummer. Egentligen har vi redan ett namn för detta: Något som tilldelar varje punkt i datarummet ett nummer är en funktion. Vi har faktiskt tittat mycket på funktioner på den här bloggen, i form av täthetsfunktioner som definierar sannolikhetsfördelningar. Men poängen är att vi kan tänka oss dessa densitetsfunktioner som vektorer i ett oändligt dimensionellt vektorrum.

Hur kan en funktion vara en vektor? Jo, vi kan addera två funktioner genom att bara addera deras värden i varje punkt. Detta var det första schemat vi diskuterade för att kombinera fördelningar i förra veckans inlägg om blandningsmodeller. Densitetsfunktionerna för två vektorer (gaussiska klot) och resultatet av att addera dem visas i figuren nedan. Vi kan multiplicera en funktion med ett tal på ett liknande sätt, vilket skulle resultera i att göra den totala densiteten ljusare eller mörkare. I själva verket är detta båda operationer som du förmodligen har haft mycket övning med i algebraundervisningen och kalkyleringen. Så vi gör inget nytt ännu, vi tänker bara på saker och ting på ett annat sätt.

addvectors

Nästa steg är att definiera en kärna från vårt ursprungliga datarum till detta oändligt dimensionella rum, och här har vi många valmöjligheter. Ett av de vanligaste valen är Gaussian blob-funktionen som vi har sett några gånger i tidigare inlägg. För den här kärnan väljer vi en standardstorlek för de gaussiska blobs, dvs. ett fast värde för avvikelsen \sigma. Sedan skickar vi varje datapunkt till den gaussiska funktionen som är centrerad på den punkten. Kom ihåg att vi tänker på var och en av dessa funktioner som en vektor, så den här kärnan gör vad alla kärnor gör: Den placerar varje punkt i vårt ursprungliga datarum i ett högre (i själva verket oändligt) dimensionellt vektorrum.

Nu kommer problemet: För att föra tillbaka saker och ting till beräkningsvärlden måste vi plocka ut ett ändligt dimensionellt vektorrum som sitter i det här oändligt dimensionella vektorrummet och ”projicera” det oändligt dimensionella rummet in i det ändligt dimensionella underrummet. Vi väljer ett finitdimensionellt rum genom att välja ett (ändligt) antal punkter i datarummet och sedan ta det vektorrum som spänns upp av de gaussiska klumparna med centrum i dessa punkter. Detta är motsvarigheten till den vektortakt som definieras av de fem första koordinaterna i den oändliga polynomkärnan, enligt ovan. Valet av dessa punkter är viktigt, men vi återkommer till det senare. För tillfället är frågan hur vi projicerar?

För ändligt dimensionella vektorer är det vanligaste sättet att definiera en projektion genom att använda punktprodukten: Detta är det tal som vi får genom att multiplicera motsvarande koordinater för två vektorer och sedan addera dem tillsammans. Så till exempel är punktprodukten av de tredimensionella vektorerna (1,2,3) och (2,.5,4) 1 \cdot 2 + 2 \cdot .5 + 3 \cdot 4 = 15.

Vi skulle kunna göra något liknande med funktioner genom att multiplicera de värden som de tar på motsvarande punkter i datamängden. (Med andra ord multiplicerar vi de två funktionerna med varandra.) Men vi kan då inte addera alla dessa tal eftersom det finns oändligt många av dem. Istället tar vi en integral! (Observera att jag glänser över en massa detaljer här, och jag ber återigen om ursäkt till alla matematiker som läser detta). Det fina här är att om vi multiplicerar två gaussiska funktioner och integrerar så blir talet lika med en gaussisk funktion av avståndet mellan centrumpunkterna. (Även om den nya gaussiska funktionen kommer att ha ett annat avvikelsevärde.)

Med andra ord omvandlar den gaussiska kärnan punktprodukten i det oändligt dimensionella rummet till en gaussisk funktion av avståndet mellan punkterna i datarummet: Om två punkter i datarummet ligger nära varandra kommer vinkeln mellan de vektorer som representerar dem i kärnutrymmet att vara liten. Om punkterna är långt ifrån varandra kommer motsvarande vektorer att vara nära ”vinkelräta”.

Den praktiska delen

Så, låt oss gå igenom vad vi har hittills: För att definiera en N-dimensionell gaussisk kärna väljer vi först N punkter i datarummet. Vi kan sedan beräkna kärnans koordinater för varje punkt i datarummet genom att beräkna dess avstånd till var och en av dessa valda datapunkter och ta den gaussiska funktionen av avstånden.

För att bättre förstå hur denna kärna fungerar kan vi ta reda på hur skärningen mellan ett hyperplan och datarummet ser ut. (Detta är vad man gör med kärnor för det mesta i alla fall.) Minns att ett plan definieras av en ekvation av formen a_1 x_1 + a_2 x_2 + \cdots + a_N x_N = b där (x_1,\ldots,x_N) är koordinaterna för punkten (i det mer högdimensionella kärnutrymmet) och a_1,\ldots,a_N är parametrar som definierar hyperplanet. Om vi använder en gaussisk kärna så mäter värdena (x_1,\ldots,x_N), tack vare vår version av punktprodukten, avstånden till våra N valda punkter. Beslutsgränsen är alltså den uppsättning punkter för vilka den gaussiska funktionen av avstånden till dessa N punkter uppfyller denna ekvation.

Det är fortfarande ganska svårt att packa upp, så låt oss titta på ett exempel där vart och ett av värdena a_1,\ldots,a_K är antingen 1 eller -1. Då kommer nära varje datapunkt med etiketten a_i = 1 värdet x_i att vara mycket nära 1, medan de andra värdena x_j kommer att vara små, så summan a_1 x_1 + a_2 x_2 + \cdots + a_N x_N kommer att vara positiv. På samma sätt kommer summan att vara negativ i närheten av en punkt med a_i = -1. Om b = 0 kommer alltså beslutsgränsen att skilja de positiva punkterna från de negativa punkterna. I själva verket kommer den att utforma ett område som påminner om de gaussiska bollar som definierar kärnan. Ett exempel visas till vänster i figuren nedan, där färgerna anger om koefficienterna är positiva eller negativa. Som du kan se ser resultatet ut ungefär som en slät version av algoritmen för närmaste grannar.

gaussianclassif

Om vi justerar parametrarna a_1,\ldots,a_K får detta effekten att storleken på de gaussiska bollarna runt punkterna förändras, och flyttar därmed beslutsgränsen mot eller bort från dem, som till höger i figuren. Om en koefficient ändras från positiv till negativ kommer beslutsgränsen att flyttas från den ena sidan av en punkt till den andra. Om vi har en märkt datamängd (som kan eller inte kan sammanfalla med N-punkterna som definierar den gaussiska kärnan) motsvarar träningen av en linjär klassificeringsalgoritm (t.ex. SVM eller logistisk regression) i kärnutrymmet att flytta runt denna beslutsgräns, inom de begränsningar som definierats ovan, för att maximera hur många av datapunkterna som befinner sig på den rätta sidan.

Detta ger oss alltså mer flexibilitet när det gäller att välja beslutsgränsen (eller åtminstone en annan typ av flexibilitet), men slutresultatet kommer att vara mycket beroende av de N vektorer som vi väljer. Om vi väljer för många (t.ex. om vi låter N-punkterna som definierar kärnan vara desamma som datapunkterna) kommer vi att riskera överanpassning, på samma sätt som algoritmen för närmaste granne tenderar att leda till överanpassning. Vad vi egentligen vill ha är ett litet antal punkter som är jämnt fördelade i hela uppsättningen, helst så att varje N punkt ligger nära de flesta punkterna i samma klass.

Att hitta en sådan samling punkter är ett mycket annorlunda problem än vad vi har fokuserat på i inläggen hittills på den här bloggen, och faller under kategorin oövervakad inlärning/beskrivande analys. (I samband med kärnor kan det också betraktas som urval/utveckling av funktioner). I de kommande inläggen kommer vi att byta växel och börja utforska idéer i den här riktningen.

Lämna ett svar

Din e-postadress kommer inte publiceras.