Neurala nätverk och språk Henli807!1 Neurala nätverk och språkigenkänning Henrik Linnarsson Linköping University
Neurala nätverk och språk Henli807!2 RNN, LSTM och språkigenkänning Inledning Idag är språkigenkänning något vi tar för givet och något som får allt större plats i vår vardag i och med att fler enheter blir kompatibla med dem. Varje smartphone är utrustad med en så kallad assistent som kan interageras med via talat språk, exempel på assistenter av detta slag är Siri, Google Assistent, Cortana och Alexa. Grunden för att dessa assistenter ska fungera är att de kan höra samt förstå vad användaren säger till dem. Detta kallas för språkigenkänning och denna artikel förklarar hur det fungerar med hjälp av neurala nätverk. RNN och LSTM Kort om neurala nätverk Neurala nätverk består av perceptroner, dessa är cellerna i nätverket genom vilka all data passerar. Varje perceptron tar emot data, input, och sänder ut data, output. Input som ges till en perceptron kommer har formen av en vektor vilket är en samling värden (Rohrer, 2017). Varje värde tas emot via en vikt som multiplicerar det givna värdet. Produkterna från samtliga inputvärden och vikter summeras och ifall denna summa överstiger ett tröskelvärde som perceptronen har så sänds en output, annars sker inget alls. Detta tröskelvärde definieras av en tröskelfunktion, även kallas aktiveringsfunktion, vilken kan se ut på många olika vis. Detta beskrivs mer i detalj senare. Det neurala nätverket består av många perceptroner av detta slag och ofta flera lager utav dem, ett inputlager, ett outputlager och något antal dolda lager mellan in- och outpulagret. Feedforward och varför det inte räcker till Ett neuralt nätverk som tar in information och returnerar någon ny information efter att informationen passerat genom nätverket kallas för feedforward-nätverk (FF). Med dessa kan vi utifrån given data få en output från nätverket som på något vis beskriver input som blev given nätverket. Detta kan handla om att exempelvis känna igen en handskriven bokstav som den bokstav det är. Vi kan använda FF för att uttala oss om det rådande tillståndet vid tidpunkt t för den variabel v som vi är intresserade av utifrån den input vi har. Dock så kan vi inte använda oss av FF för att förutse ett kommande tillstånd vid tidpunkt t+1 utifrån tidigare tillstånd (edureka!, 2017). Den output som vi får utifrån vår input är oberoende av output från tidigare tillstånd, dessa har inget med varandra att göra. Således kan vi inte utifrån ett ord i en mening förutse det kommande ordet i meningen. För att göra detta behövs en annan typ av nätverk än FF.
Neurala nätverk och språk Henli807!3 Recurrent Neural Network (RNN) Recurrent Neural Network (RNN) tillåter oss att förutse tillstånd utifrån indatan i ett tidigare tillstånd. Vi kan utifrån indatan i tillstånd t1 förutse tillståndet i t4 eller något annat tillstånd (Raval, 2017b; Rohrer, 2017). I ett RNN så behålls output från föregående tillstånd, t-1, och används som input i den aktuella tidpunkten t tillsammans med eventuell ny data, vilket i sin tur ger en ny output. På detta vis fortsätter nätverket att generera output med föregående output som input så länge som vi önskar det. Den nya informationen tillsammans med informationen från föregående tidpunkt ges till nätverket i form av vektorer. Bild 1. Recurent neural network Träna RNN Vi vill träna vårt RNN för att få det att generera korrekt output och minimera eventuella fel. När vi tränar nätverket justeras dess vikter så att outputen från nätverket matchar den förväntade outputen, vilken kan vara angiven i en yttre standard som ett facit. Denna träning av nätverket görs med hjälp av metoden gradient descent och backpropagation. Träningen görs för varje tidssteg och kallas därför för backpropagation through time (BTT). När vi använder oss av gradient descent så räknar vi ut felet för vårt nätverk, detta är skillnaden mellan det värde nätverket genererade och det förväntade värdet. Vi får detta värde genom att subtrahera det förväntade värdet ifrån det som nätverket gav. Vi vill alltid ha ett positivt felvärde och kvadrerar därför denna differens. e = (Actual output - Model output) ^ 2 = error
Neurala nätverk och språk Henli807!4 I gradient descent vill vi se hur stort fel som generas beroende på värdet av vikten. När vi gör gradient descent så utgår utgår vi ifrån felfunktionen som visar hur stort fel som genereras av nätverket givet de viktvärden som råder. För att förstå hur detta fungerar börjar vi med att kolla på en nod. Inledningsvis sätter vi ett slumpmässigt värde på vikten hos noden som ska tränas och ser sedan hur pass stort felet är i slutet av nätverket. Felet säger oss alltså hur stort fel vi får ifall noden har den vikten som den har. När vi sett storleken på felet för ett visst viktvärde så räknar vi ut gradienten för den punkten i felfunktionen, vilket görs genom att räkna ut tangenten i punkten. Gradienten beskriver förändringsgraden hos punkten vi räknar på. Är värdet på felet stigande, sjunkande eller stillastående? I vilken riktning är storleken på felet påväg om vi ökar vikten? För att hitta det lägsta möjliga felet går vi i motsatt riktning av gradienten. Det innebär att om gradienten är positiv i den aktuella punkten, att felet blir större ju högre värde vikten har, så undersöker vi hur stor felet är för ett lägre värde på vikten. Och om gradienten är negativ, felet blir mindre ju högre vikt man har, så undersöker vi felvärdet för en punkt med högre värde på vikten. (de/dw) = förändring hos felet i förhållande till förändring i vikten n = inlärningsparameter/steglängdsfaktor w = vikten e = (Actual output - Model output) ^ 2 = felet (error) < Kvadratfelet Δw = n(de/dw) = vad vikten ska uppdateras med w = w + Δw = uppdatering av vikten Bild 2. Backpropagation genom nätverket
Neurala nätverk och språk Henli807!5 Bild 3. Gradient descent Varje nod påverkas av de föregående noderna och påverkar således de noder som ligger efter sig. För att veta hur mycket felet påverkas av att en specifik vikt ändras så räknar vi ut gradienten för alla noder från outputlagret tillbaka till den nod vars vikt vi ändrat och multiplicerar dessa med varandra. Gradient descent börjar med outputvärdet i nätverket och jobbar sig sedan bakåt i nätverket nod för nod (Raval, 2017a). När vi tränar nätverket börjar vi i det yttersta lagret av noder, outputlagret och justerar dess vikter. Vi går sedan bakåt i nätverket, backpropagate, och justerar vikterna där. Eftersom noderna i nätverket påverkar varandra är det viktigt att inte förändra vikterna drastiskt utan det behöver göras försiktigt och träningen av nätverket kan ta många tusen rundor för att nå lägsta möjliga felvärde. Problem för RNN och backpropagation Ett problem för backpropagation är att när det görs över många tidssteg så kan gradienten till slut bli oerhört liten vilket innebär att vikten knappt uppdateras alls. När vikten inte längre kan uppdateras ordentligt blir det svårt att träna nätverket och nå ett lägre felvärde. Detta problem kallas för vanishing gradient
Neurala nätverk och språk Henli807!6 (edureka!, 2017). Detta fel händer inte bara vanliga FF där backpropagation används utan även RNN. Orsaken är de så kallade squashing functions som tar emot värden och beroende på värdets storlek returnerar ett nytt värde inom ett betydligt mindre spann, ofta mellan 0 och 1 eller -1 och 1. När detta görs och många steg i nätverket multipliceras med varandra så kan gradienten till slut vara näst intill icke existerande. Ett sätt att lösa detta på för RNN är att använda en typ av RNN som kallas Long Short Term Memory (edureka!; Gibiansky, 2014). RNN har även problem med att minnas saker över längre tid. Den kan ta in information från föregående tidpunkt för att göra en bedömning i rådande tidpunkt, men när informationen som är relevant för den aktuella tidpunkten ligger långt bak i tiden så är inte vanliga RNN till hjälp. Detta kallas för problem of long term dependencies (Colah, 2015). Det kan sägas att RNN bara har ett korttidsminne, men eftersom vi ofta vill basera vår output på mer än bara det föregående tillståndet så behöver vi en annan typ av nätverk. Även detta problem kan lösas med LSTM. Long Short Term Memory (LSTM) Long Short Term Memory (LSTM) är en form av RNN men gör det möjligt att lösa problemet med kort minne och problemet med vanishing gradient. En LSTM-cell har till skillnad från en RNN-cell flera komponenter och med hjälp av dessa kan vi åstadkomma fler funktioner än vi annars kunnat göra. Det är tack vare dessa olika interna delar som LSTM kan hålla saker i minnet över längre tid. Innan vi går igenom de olika delarna av LSTM-cellen är behöver vi förstå hur information är representerad i cellen och hur den hanteras i de olika stegen. Vektorer I RNN och LSTM representeras all information med hjälp av vektorer som beskriver olika tillstånd hos variabler. En vektor är inget mer än en samling av värden (Rohrer, 2017). Dessa värden kan beskriva sannolikheter för saker, intensitet, styrka, riktning, vilket av olika alternativ som är sant/inte sant (ex. vilken veckodag det är. One hot coding), och så vidare (Rohrer, 2017; Russel & Norvig, 2010; Serrano, 2017). Vektorerna används i nätverket för att sända vidare information och de olika delarna av cellen interagerar med denna information på olika vis, de kommer bland annat att adderas och multipliceras med varandra. Additionen av vektorer går till så att elementen i de vektorer som ska adderas blir adderade till det motsvarande värdet på elementet i den andra vektorn, element för element. Ex. addition A = [1, 2, 3] B = [4, 5, 6]
Neurala nätverk och språk Henli807!7 A + B = [1+4, 2+5, 3+6] = [5, 7, 9] Vid multiplikationen går det till på liknande vis, element multipliceras med sin motsvarande element en den andra vektorn, element för element. Ex. multiplikation C = [1, 0,5, 0] D = [1, 1, 0,7] C x D = [1x1, 0,5x1, 0x0,7] = [1, 0,5, 0] Cell state och Hidden state Ytterligare ett centralt begrepp för LSTM är cell state vilket är den information som sänds från cell till cell och på vilken de olika funktionerna appliceras. Cell state kan ses som långtidsminnet i algoritmen, det är här som information bevaras och förändras över tid (Raval, 2017b). Informationen är som nämnt representerad med vektorer. Hidden state är också en output från varje cell men denna innehåller inte all information som behövs framöver likt cell state och kan istället ses som arbetsminnet för nätverket (Raval, 2017b). Här finns saker som är relevanta just för stunden. Gates Vår LSTM-cell består av tre huvudsakliga delar, ofta kallade gates (egen översättning till svenska: portar). Varje gate fyller en specifik funktion i cellen och tillsammans möjliggör de att cellen kan minnas information över lång tid, avgöra vad som inte behöver minnas och ge output som antas stämma för stunden. Varje gate består av multiplikation av elementen i vektorer som beskrivet tidigare vilket möjliggör att vissa värden stängs ute medan andra släpps igenom, därav namnet gate (Raval, 2017b; Rohrer, 2017). Dessa gates är i sig själva egna nätverk bestående av ett enda lager, en enda perceptron, som tränas för att genomföra dess funktion. Varje gate har en vikt som justeras för att minimera felet från gaten vilket görs via gradient descent. Gate 1. Forget gate I forget gate avgörs det vad som ska lagras i cellens långtidsminne, cell state, och vad som inte ska minnas (Raval, 2017b). Gaten består av en activation function som avgörs nivån av aktivering utifrån inputsignalen och här används en variant som heter sigmoid function, vilket är en typ av squashing function. Vad en squashing function gör är ett en tar ett värde som en input och returnerar ett värde som befinner sig mellan två bestämda värden för att på så vis normalisera och håller värden under kontroll så att inget växer sig för stort (Rohrer,
Neurala nätverk och språk Henli807!8 2017). Sigmoidfunktionen specifikt returnerar värden mellan 0 och 1. Ju större ett värde är desto närmre 1 kommer det returnerade värdet att vara och ju mindre det är desto närmre 0 kommer det att vara. Denna funktion att få värden mellan 0 och 1 möjliggör en slags bedömning för vad som ska minnas och vad som ska glömmas bort. Om något får värdet 0 kommer det att bli helt bortglömt och om något får 1 så kommer det att minnas helt och hållet. När värdena passerat genom sigmoidfunktionen så multipliceras de med värdena i cell state vilket gör att cell state kommer att uppdateras i enlighet med vad som ska minnas alternativt glömmas. De element som multipliceras med 0 kommer som förklarat tidigare att glömmas helt medan de som multipliceras med 1 förblir oförändrade. wf = Vikt ht-1 = Output från föregående cell state xt = Den nya informationen bt = Bias σ = Sigmoid ct-1 = Cell state ft = σ(wf [ht-1, xt] + bt) = Vad som returneras av sigmoidfunktionen. ft x ct-1- = Uppdatering av cell state genom multiplicering av ft och ct-1. Gate 2. Input gate Input gate hanterar vilken ny information som ska tilläggas till cell state utifrån föregående output och den nya informationen. Denna funktion består av två stycken squashing functions, en sigmoidfunktion precis som i forget gate men även en Tanh function vilken likt sigmoid normaliserar värden men istället för att returnera värden mellan 0 och 1 så returnerar denna värden mellan -1 och 1. Värdena från Tanhfunktionen och simgoidfunktionen multipliceras med varandra för att sedan adderas till cell state som nu uppdateras från att vara ct-1 x ft till att vara ct (se bild 3.), det gällande tillståndet för stunden vilket kommer att sändas vidare till nästa cell. Input gate kallas även för save gate eftersom att den avgör vilken information som ska spara till cell state och vilken som inte ska det. it = σ(wi[ht-1, xt] + bi)
Neurala nätverk och språk Henli807!9 Gate 3. Output gate Den tredje gaten är output gate vilken bedömer vad som kommer att returneras som output ur cellen. I detta steg multipliceras informationen från cell state som passerat genom en tanhfunktion med information som passerat genom en sigmoidfunktion. Sigmoidfunktionen här har i uppgift att bedöma som ska ges som output i hidden state. Medan cell state är långtidsminnet där allt vi vill minnas finns sparat så är hidden state snarare ett arbetsminne där vi har det som för stunden är relevant. Cell state och hidden state utgör cellens två output. ot = σ(w[ht-1, xt] + bo) Bild 4. LSTM-cell LSTM och språkigenkänning LSTM används för många olika syften och appliceringsområden där man arbetar med sekvenser av data och vill att nätverket ska kunna minnas saker från tidigare. Eftersom LSTM kan minnas saker över längre tid så presterar de bättre än vanliga RNN (Raval, 2017a). Bland annat används LSTM för språkigenkänning, alltså för att avgöra vad som muntligt sägs. För att göra detta behövs dock några till delar som kompletterar LSTMcellerna. Bidirectional RNN Eftersom att LSTM kan hålla information i minnet och på så vis minnas kontexten så är den lämplig vid språkigenkänning eftersom den vet bättre vad som troligtvis kommer att
Neurala nätverk och språk Henli807!10 sägas i en mening utifrån vad som har sagts innan. Tänker vi oss ett exempel där en man berättar om sin resa till Spanien och i sin avslutande mening säger: Jag talar nu helt flytande så kan ett LSTM-nätverk minnas kontexten som är Spanien och då förstå att det är ordet Spanska som söks. Dock så påverkas inte bara sannolikheten för vad som sägs vid tidpunkt t av vad som har sagts innan utan det som sägs efter påverkar också sannolikheten för vad som sägs vid t (Gibiansky, 2014). För att ta nytta av detta används så kallade bidirectional RNN. Dessa är nätverk som till går åt motsatt håll i tiden. Från det senaste i sekvensen till det första. De två nätverket gående åt var sitt hål interagerar inte med varandra vilket innebär att de inte påverkar varandra. Dock så är de båda med och påverkar vilket output som ges, alltså påverkas outputen i tidpunkt t både av vad som har sagts och vad som kommer att sägas (Graves, Mohamed, & Hinton). Och tack vare att vi använder LSTM kan vi använda beroenderelationer som sträcker sig långt över tid för att avgöra vad som är det mest sannolikt korrekta outputen. Akustisk model & lingvistisk model För att kunna bedöma vad som sagts behövs även en akustisk modell. Funktionen som en akustisk modell fyller är att den kan känna igen olika fonem, den minsta ljudbyggstenen av ett ord. Modellen kan ta emot en signal och avgöra vilket fonem det är den har uppfattat (Gibiansky, 2014). Detta görs genom ett eget neuralt nätverk vilket även behöver tränas. Den lingvistiska modellen kan utifrån de fonem som den akustiska modellen uppfattat tolka om det till de tecken som används i det mänskliga språket. Detta behövs eftersom fonemen i sig inte säger vilka ord det är som har uppfattats, bara vilka olika ljud som har uppfattats. Den lingvistiska modellen klassificerar alltså fonemen till språkliga enheter (Gibiansky, 2014). Sammanfattning Neurala nätverk tillåter oss att sända in information i ett nätverk för att få ut output av en visst slag, exempelvis tal till text eller bild till namn. Dessa nät kan tränas för att prestera bättre och detta görs med backpropagation och gradient descent. När vi vill kunna lagra information i minnet i nätverket för att kunna göra kommande bedömningar så fungerar inte ett vanligt feedforward-nätverk utan vi använder oss istället av recurrent neural networks där outputen från den föregående tidpunkten ht-1 används som input tillsammans med ny information i det aktuella tidpunkten ht. RNN får problem med vanishing gradient vilket orsakas av att man multiplicerar gradienten genom alla noder vilket kan leda till att värdet blir väldigt litet och på så vis hindrar att noderna kan tränas och uppdatera sina vikter. RNN lider även av att inte kunna hålla information i minnet över längre tid och använda sig att beroenderelationer som sträcker
Neurala nätverk och språk Henli807!11 sig över lång tid. Dessa problem med RNN kan man lösa med LSTM som är en variant av RNN fast med fler interna funktioner. De interna funktionerna i LSTM utgörs av så kallades gates som hanterar var sin funktion, minne, input och output. I samband med dessa gates finns aktiveringsfunktioner av typen squashing functions som tar in värden och returnerar nya värden mellan 0 och 1 alternativt -1 och 1. Träning av LSTM ändrar på vikterna i nätverket så att cellerna lär sig vad som ska glömmas, kommas ihåg, tas emot och sändas vidare. Att träna nätverket görs genom att försiktigt uppdatera vikterna med gradient descent och det görs många tusen gånger för att få vikterna rätt inställda. LSTM används inom många områden bland annat språkigenkänning där nätverket utgör basen för ett nätverk som kan omvandla talat språk till text. Detta görs tillsammans med bidirectional recurrent neural networks, en akustisk och en lingvistisk modell.
Neurala nätverk och språk Henli807!12 Referenser Colah, C. (2015). Understanding LSTM Networks. Retrieved from http://colah.github.io/ posts/2015-08-understanding-lstms/ edureka! (Producer). (2017, 22 aug). Recurrent Neural Networks (RNN) RNN LSTM Deep Learning Tutorial Tensorflow Tutorial Edureka. Retrieved from https:// www.youtube.com/watch?v=y7qrile- Zlc&index=1&list=PLYg58GLuMZLwkBef6nozpwMDGeH12byEw&t=561s Gibiansky, A. (2014). Speech Recognition with Neural Networks. Retrieved from http:// andrew.gibiansky.com/blog/machine-learning/speech-recognition-neural-networks/ Graves, A., Mohamed, A.-r., & Hinton, G. Speech recognition with deep recurrent neural networks. Retrieved from http://www.cs.toronto.edu/~fritz/absps/rnn13.pdf Raval, S. (Producer). (2017a, 2 apr). Backpropagation in 5 Minutes. Retrieved from https:// www.youtube.com/watch?v=q555kfifucm Raval, S. (Producer). (2017b, 9 aug). LSTM Networks - The Math of Intelligence (Week 8). Retrieved from https://www.youtube.com/watch? v=9zhrxe5pqgy&index=8&list=plyg58glumzlwkbef6nozpwmdgeh12byew&t= 1451s Rohrer, B. (Producer). (2017, 27 jun). Recurrent Neural Networks (RNN) and Long Short- Term Memory (LSTM). Retrieved from https://www.youtube.com/watch? v=wcunpb-5eyi&index=2&list=plyg58glumzlwkbef6nozpwmdgeh12byew& t=535s Russel, S. J., & Norvig, P. (2010). Artificial Intelligence - A modern approach (Third ed.). New Jersey: Pearson Education. Serrano, L. (Producer). (2017, 18 aug). A friendly introduction to Recurrent Neural Networks. Retrieved from https://www.youtube.com/watch? v=unmqtionrfg&index=4&list=plyg58glumzlwkbef6nozpwmdgeh12byew