Linköpings universitet 729G43 NEURAL MASKINÖVERSÄTTNING Moa Wallin
Inledning Manuell översättning är en mycket tidskrävande process som kräver stor kunskap och bred kompetens och behovet av översättning är större än vad mänskliga översättare någonsin skulle kunna hinna med. Att istället låta en maskin sköta översättningen underlättar avsevärt, inte minst då man är i behov av en snabb översättning. Idag erbjuds en uppsjö av olika översättningsprogram och Googles kända översättningstjänst Google Translate har exempelvis numera stöd för över 100 språk och nyttjas av miljontals människor dagligen. Utöver att hjälpa människor att förstå information på främmande språk i vardagen, har även maskinöversättning en kommersiell betydelse. Det blir allt viktigare för företag och liknande att kunna tillhandahålla information på flertalet språk i takt med att nationaliteter och språkkunskaper hos tillgängliga läsare breddas och att kunna erbjuda användare ett gränssnitt eller en instruktionsmanual på deras egna modersmål kan väga tungt i att locka människor till att nyttja en produkt. Att hitta en maskinöversättningsmetod som genererar korrekta översättningar är alltså någon eftersträvansvärt, men som tyvärr är mycket svårt att uppnå. Den senaste ansatsen kring maskinöversättning nyttja neurala nätverk och har redan på mycket kort tid ersatt tidigare system hos bland annat stora företag som Google och Facebook. Terminologi Under rapporten förekommer ett antal termer som läsaren bör vara införstådd i för att kunna tillägna sig övrig information och fakta i rapporten. Nedan presenteras därför en mängd termer och en kortare tillhörande förklaring för att underlätta för läsandet. MT: abbreviation av maskinöversättning (eng. machine learning). Deep learning: en typ av maskininlärningsmetod som använder neurala nätverk med flera dolda lager. Korpus (pl. korpora): en stor mängd språkliga data, antingen skriftlig text eller transkriberat tal. I denna uppsats refereras dock endast till korpora med skriven text. En korpus som innehåller texter på fler än ett språk kallas för en parallell korpus (Weisser, 2016). Sequence-to-sequence learning (seq2seq): handlar om att träna modeller att omvandla sekvenser i en domän till sekvenser i en annan domän. Tekniken har främst används inom
maskinöversättning och i detta fall representerar de två domänerna ett källspråk respektive ett målspråk. Upplägg och avgränsningar Följande rapport ämnar redogöra för de grundläggande principerna som ligger bakom neural maskinöversättning. Då flera olika angreppssätt existerar inom ansatsen kommer denna rapport att avgränsas till att endast innefatta neural maskinöversättning med vanilla recurrent neural networks av typen vanilla long short-term memories. Först ges läsaren en kort bakgrund över tidigare tekniker inom maskinöversättning. Därefter ges en översiktlig beskrivning av principen bakom neural maskinöversättning för att sedan gå djupare in i de olika delområdena som bygger upp ett neuralt maskinöversättningssystem. Slutligen has för avsikt att koppla samman teorierna och ge en diskussion kring ämnet i allmänhet.
Tidigare maskinöversättningssysten Maskinöversättning var ett av de tidigare tilltänkta användningsområdena för datorer, men utvecklingen av fungerande maskinöversättningssystem har dock varit långt ifrån bekymmersfri (Hutchins, 2007). Det visade sig vara svårare än vad som först hade förväntats att skapa ett system som generera en acceptabel översättning av en text mellan två språk, och det är inte förrän det senaste decenniet som maskinöversättningen på riktigt fått sitt uppsving (Russel & Norvig, 2014). En av de tidiga teknikerna för maskinöversättning var den regelbaserade översättningen (RBMT). Denna teknik baseras på lexikon och manuellt utvecklade lingvistiska regler som systemet sedan översätter en text utifrån. Fördelarna med RBMT är att tekniken inte kräver tillgång till parallella korpora. En annan fördel är att utvecklarna av systemet har total kontroll och enkelt kan lokalisera eventuella buggar och förstå vad som orsakar ett fel. Problemet med RBMT är att mänskligt språk inte alltid följer bestämda regler utan det förekommer massvis med undantag och dialektala variationer för att inte tala om den påverkan kontexten har för betydelsen av ett ord. Den regelbaserade översättningen producerar därmed ofta undermåliga översättningar som saknar språkligt flyt och som i slutändan ändå kräver mänskligt redigerande. Sedan flera år tillbaka har istället den dominerande maskinöversättningstekniken varit den statistiska maskinöversättningen (SMT). Som namnet antyder använder sig SMT av statistik och sannolikheter, istället för grammatiska regler, för översättning. Genom att träna probabilistiska modeller efter statistik i stora parallella korpora kan ett SMT-system avgöra vilken översättning som mest troligt är korrekt. Denna typ av översättning är dock alltså beroende av tillgång till mängder av parallella korpora och för de stora språken, så som engelska och spanska, är det oftast inte ett problem att finna parallella översättningar. För många andra språk existerar det dock helt enkelt inte tillräckligt med texter för att producera fullgoda översättningar genom SMT (Lopez, 2008). Under de senaste åren har stora förändringar skett inom MT i och med att den nya tekniken neural maskinöversättning (NMT) anammats av flertalet stora företag. Den statistiska maskinöversättningen framstår fortfarande vara dominant, men brukandet av NMT verkar ständigt ökar i popularitet och efterfrågan, och är således ett mycket aktuellt ämne.
Neural maskinöversättning (NMT) Övergripande beskrivning Tekniken hos NMT frångår den tidigare dominerande statistiska ansatsen och använder istället deep learning med stora neurala nätverk för att möjliggöra översättning mellan olika språk. De neurala nätverken i NMT bildar en så kallad encoder-decoder-arkitektur bestående av recurrent neural networks. Med encoder-decoder-arkitektur menas att NMT-systemet innefattar en kodare (eng. encoder) som läser in en källsats och summerar denna genom att skapa en vektor bestående av en sekvens med unika siffror som representerar satsens mening, dess innebörd. En kodare skapar alltså en enda vektor som output ur en input-sekvens. Denna vektor går sedan igenom en avkodare (eng, decoder) som i sin tur tar in vektorn som input och avkodar till orginalsatsen igen. Men istället för att avkoda satsen på källspåket igen tränas istället en avkodare att avkoda på ett annat språk istället, ett så kallat målspråk. En avkodare producerar alltså en output-sekvens ur en enskild input-vektor (Stanford University School of Engineering, 2017). Som nämnt används så kallade recurrent neural networks (RNN), både som kodare och avkodare. Dessa RNN förekommer dock även i sin tur i olika former, så som long short-term memory (LSTM) eller gated recurrent unit (GRU). Denna uppsats kommer dock endast att fokusera på NMT där LSTM används och övriga metoder kommer således att utelämnas. För att förstå principerna bakom tekniken hos ett NMT och det ovan beskrivna krävs en del kunskaper som ämnas klargöras i kommande stycken. Allmänt om neurala nätverk Den mänskliga hjärnan innehåller flera miljarder neuroner som genom förbindelser till varandra skapar ett komplext nätverk. Ett enskilt neuron utför endast en mycket enkel uppgift genom att reagera på en input-signal, men tillsammans kan ihopkopplade neuroner utföra oerhört komplexa uppgifter på väldigt kort tid. Anslutningen mellan neuroner kallas synaps och har till uppgift att föra vidare elektrokemiska signaler. Då ett neuron mottar en total signal som är större än synapsens tröskelvärde leder det till att neuronen avfyras och sänder vidare den elektrokemiska signalen till dess grann-neuroner och så vidare (Zou, Han & So, 2008).
Det var med vårt biologiska nervsystem som inspiration som de så kallade artificiella neurala nätverken (hädanefter ANN) utvecklades. Likväl bör uppmärksammas att ANN för den sakens skull inte utgör en modell av den mänskliga hjärnan. Hjärnans komplexitet är alltför stor för att dagens artificiella neurala nätverk skulle kunna efterlikna alla dess funktioner. ANN är däremot ett mycket användbart och starkt verktyg inom artificiell intelligens, som genom träning på stora mängder data kan hitta mönster och på så sätt lära sig lösa problem (Russell & Norvig, 2014). Som motsvarighet till hjärnans neuroner består ANN av ett antal noder som är ordnade i skilda lager. Det förekommer alltid minst två stycken lager - ett för input och ett för output. För att lösa okomplicerade uppgifter kan ett enkelt nätverk bestående av endast dessa två lager räcka, men de flesta uppgifter kräver dock även att ett eller flera så kallade dolda lager införs mellan input-lagret och output-lagret. Ett ANN med flera dolda lager kallas för ett djupt neuralt nätverk (DNN) (se figur 1) och krävs för maskinöversättning (Russell & Norvig, 2014). Precis som namnet avslöjar går det inte att observera vad som sker i de dolda lagren, utan de utgör vad som brukar benämnas en svart låda. Figur 1. Exempel på visualisering av ett djupt neuralt nätverk (Nielsen, 2015). Som synes i figur 1 binds noderna i ett ANN samman med hjälp av länkar som har till uppgift att föra vidare en aktivering. Varje länk mellan två noder har alltså även en tillhörande vikt, ofta kallad parameter, som avgör styrkan hos förbindelsen. En nod mottar därmed flera olika input från närliggande noder och ger varje en vikt som förändras då nätverket lär sig. Denna
förmåga att kunna korrigera parametrarna under träningsperioden är ett av ANNs nyckelelement. Likt hos de biologiska neurala nätverken existerar även en tröskel i form av en aktiveringsfunktion som avgör huruvida signalen ska sändas vidare eller inte alltså hur stor summan av alla vikter måste vara för att noden ska föra vidare informationen till nästkommande lager. Aktivering i ett lager avgör följaktligen aktivering i nästa lager. Aktiveringsfunktionen kan vara en hård tröskelfunktion där neuronen genererar en positiv signal då summan överstiger 0 och en negativ signal då den är mindre än 0 alltså: f(x) = 0 () * < 0 1 () * 0 Den aktiveringsfunktion som dock främst används inom maskinöversättning är den logistiska funktionen, även kallad sigmoidfunktion (se figur 2.) (Russell & Norvig, 2012). Figur 2. Den logistiska funktionen (Russell & Norvig, 2012). Till skillnad från den hårda tröskelfunktionen har den logistiska funktionen som synes en mjukare kurva och följaktligen ett mer kontinuerligt spann av värden mellan 0 och 1. Istället för att ha 0 som en tröskel för aktivering används följande matematiska funktion: f(x) =../0 12 Detta innebär att allt eftersom aktiveringen x går mot - går funktionen mot 0 och vice versa då x går mot + så går funktionen mot 1. Detta ger den logistiska funktionen fördelen i att den är differentierbar överallt vilket förenklar inlärning av det neurala nätverkets vikter.
Denna rapport kommer inte att gå djupare in på hur denna träning går till men kort sagt används bakåtpropagering (eng. back propagation) från output-lagret och bakåt i nätverket där vikterna med hjälp av gradientsökning (eng. gradient descent) modifieras för att minska felet och för att träna ett neuralt nät att korrekt kunna klassificera input (Russell & Norvig, 2012). Ytterligare en aktiveringsfunktion som ibland används inom NMT, och som således förekommer senare i denna rapport, är den hyperboliska funktionen tangens hyperbolicus (hädanefter tanh). Istället för mellan 0 och 1, som hos den logistiska funktionen, har tanh ett spann på -1 till 1. Vad en nod i ett ANN sedan genererar för output beräknas kort sagt genom att multiplicera den input som mottas i input-lagret med en viktvektor, summera resultaten och applicera en aktiveringsfunktion på summan (se figur 3.). Figur 3. En enkel modell av en nod i ett ANN. Den matematiska funktionen för detta är följande: y = f(* 5 * 6 5 + b) x representerar alltså input och w är vikterna. f är aktiveringsfunktionen. I ekvationen betecknat b och även i figur 3 förekommer något som kallas bias. Vad denna bias gör är att lägga till ett värde i summan av input som låter oss förflytta en funktion vertikalt. Genom att ha en positiv bias förflyttas funktionen åt höger på y-axeln och vice versa, alltså till vänster,
då bias är negativ. Möjligheten att göra detta kan behövas för att finna en lösning i flertalet problem. Vanligtvis rör sig information i ett ANN framåt från input-lagret till output-lagret utan möjlighet att backa, vilket kallas feed-forward network (FNN). Nätverket har således inget minne av tidigare uträkningar, utan hanterar varje input oberoende av tidigare input, och givet samma input kommer nätverket att producera samma output. Denna modell fungerar utmärkt till vissa typer av uppgifter där input har bestämd storlek. När det kommer till språk skiljer sig dock självfallet längden på satser och således storleken på input. Likaså kräver maskinöversättning möjlighet att inkludera någon slags minne då ett element i sekvensen kan vara beroende av tidigare. Som tidigare nämnt används alltså istället för FNN främst så kallade recurrent neural networks (hädanefter RNN) inom NMT. Recurrent Neural Networks (RNN) RNN innehåller loopar vilket möjliggör flödet av information att färdas tillbaka i nätverket. Likaså kan nätverket ta input av en arbiträr längd. Detta innebär implicit att input inte bara består av vad nätverket för tillfället varseblir, utan även vad nätverket tidigare varseblivit. Det beslut ett RNN fattar vid en tidpunkt t påverkar således det beslut som kommer att fattas vid en senare tidpunkt t+1. Figur 4. Modell av RNN och hur den vecklas ut till ett fullt nätverk (LeCun, Bengio & Hinton, 2015). I figur 4 demonstreras en allmän modell för RNN och hur ett RNN kan skrivas ut för en komplett sats som en kedja av feed-forward networks. I den utvecklade modellen existerar en nod i det dolda lagret för varje ord i satsen. En sats med fyra ord ger således ett dolt lager med fyra noder. * 9 står för input, alltså en vektor som representerar ett ord i satsen, vid tidssteget t. Det som i modellen i figur 4 benämns som : 9 kan liknas vid ett kort minne, det vill säga ett
dolt, internt tillstånd som beräknas baserat på det förra dolda tillståndet samt den input som mottas vid nuvarande tidssteg t. Detta dolda minne kommer dock hädanefter att istället benämnas h 9. Slutligen representerar < 9 output vid tidssteget t. Denna output beräknas enbart utefter h 9, som alltså används för att räkna ut sannolikheten för nästa ord (Liu, Yang, Li & Zhou, 2014). Input utgör alltså en sammanlänkning av * 9 och h 9. Detta demonstreras på ett ytterligare, möjligen mer påtagligt sätt, i figur 5. Som synes används parametrarna U, V och W, som representerar viktmatriserna, i varje tidssteg. Detta visar på hur ett RNN utför samma uppgift, men med olika input vid varje tidssteg. Figur 5. Modell av RNN (Liu, Yang, Li & Zhou, 2014). Observera att modellen i denna modell till skillnad från modellen i figur 2 använder h för det dolda tillståndet och y för output istället för s respektive o. Principen är dock densamma. Ekvationen för hur information sparas i det dolda tillståndet, h 9, ser ut som följande: h 9 = s (Uh 9=. + W* 9 ) Som tidigare avser * 9 input vid tidpunkt t och h 9=. är som tidigare det dolda tillståndet vid föregående tidssteg. s avser sigmoid som aktiveringsfunktion. För att återgå till den utvecklade modellen av RNN i figur 4 syns hur modellen genererar output vid varje tidssteg. Inom maskinöversättning är detta dock inte något som eftersträvas, utan man vill endast ge output först efter att hela texten, det vill säga all input, har setts. Endast det slutliga dolda tillståndet används då för att göra en förutsägelse. För att repetera innehåller dock NMT två RNN där den första RNN kodar en sekvens till en enskild vektor och den andra avkodar vektorn till en sekvens ånyo. Den första RNN går således från
många till en och den andra från en till många (Bahdanau, Cho & Bengio, 2015) (se figur 6.). Figur 6. Modell av encoder-decoder-arkitekturen med två RNN (Geitgey, 2016). Som tidigare nämnt används bakåtpropagering för att träna vikterna i ett neuralt nätverk, men då RNN innehåller loopar måste även varje tidssteg länkas till nästa. En utvidgad typ av bakåtpropagering som kallas gradient backprogagation through time (BPTT) används då istället. I dessa konventionela RNN, även kallade vanilla RNN, innebär det att information i nätverket passerar genom flera lager och således flera steg av multiplikation vilket kan leda till problem. Om gradienten är mindre än 1 minskar gradientvärdet successivt och kommer allt närmre 0 allt eftersom vi propagerar bakåt, och alltså multiplicerar med gradienten, genom varje lager (se figur 7). Detta problem kallas the vanishing gradient problem. Den motsatta effekten uppstår då gradienten är större än 1 och benämns då istället the exploding gradient problem. Gradienten behöver således vara 1 för att problemet inte ska uppstå och detta är något som sällan förekommer. Figur 7. Illustration av vanishing gradient problem (Graves et al., 2009). Problemet med gradienten som försvinner eller exploderar gör alltså att RNN inte kan lagra information och lära sig under en längre tid, något som krävs för att korrekt klassificera den sekventiella input som används vid MT. Då en sats ofta består av flertalet ord kan det innebära långa dependenslängder (eng. long-term dependencies), alltså ett längre avstånd
mellan viss input och då information om denna input i fråga behövs för att göra en förutsägelse (Grosse, 2017). Ett exempel på vad som avses med en lång dependenslängd kan noteras i följande sats: Katten som jag såg när jag gick över gatan igår var svart. För en människa är det inte svårt att komma ihåg och förstå det är katten som nämns i inledningen av satsen som är svart, trots att flertalet andra ord befinner sig mellan ordet katten och ordet svart. För ett RNN är detta dock inte lika problemfritt utan mycket svårt, exempelvis i jämförelse med satsen katten är svart som inte har denna långa dependenslängden. Vad som behövs vid maskinöversättning är då ett sätt för nätverket att minnas långa dependenser genom att kunna minnas gradientvärdet vid bakåtpropagering. En lösning på detta problem är att införa RNN-varianten long short-term memory, som alltså är speciellt effektiv vid maskinöversättning. Nästa stycke ämnar beskriva den grundläggande strukturen hos LSTM. Long short-term memory (LSTM) LSTM avser alltså lösa gradientproblemen hos RNN genom att, för att kort sammanfatta, avgöra vad som ska behållas i minnet och vad som ska raderas. Detta gör LSTM till det självklara valet vid maskinöversättning där, som påvisats i föregående stycke, data ofta innehåller dessa långa temporala dependenser. En LSTM-enhet innehåller till skillnad från vanilla RNN fler interna strukturer. De kan se ut på olika sätt men den vanligaste typen av LSTM-enhet, vanilla LSTM, har ett minnesblock som innehåller minnesceller och tre så kallade portar (eng. gates) (se figur 8.). Minnescellen har som namnet antyder till uppgift att minnas information och agerar som ett långtidsminne. Portarna, likt noder i ett ANN, agerar utifrån de signaler de mottar genom att antingen vara stängda eller öppna (ha värdet 0 respektive 1). De tre portarna som existerar i LSTM-blocket är en input-port, en output-port och en forget-port. Figur 8. Modell av ett minnesblock i vanilla LSTM.
Input-porten avgör huruvida ny inkommande information får komma in. Är input-porten öppen ändrar denna inkommande information minnescellens tillstånd och skriver över den information som befinner sig där. Output-porten avgör huruvida minnescellens tillstånd ska föras vidare till resten av nätverket och andra minnesceller. Forget-porten i sin tur ser till så att cellens tillstånd återställs då allt innehåll har använts och inte är av betydelse längre (Greff et al., 2017). De tre portarnas ekvationer för att räkna ut huruvida de ska vara öppna eller stängda ser ut som följande: Input-porten: ( 9 = s(h I * [h 9=., * 9 ] + M I ) Output-porten: < 9 = s(h O * [h 9=., * 9 ] + M O ) Forget-porten: ) 9 = s(h R * [h 9=., * 9 ] + M R ) Notera hur dessa ekvationer liknar ekvationerna för att beräkna output i en nod i ett ANN. De är uppbyggda på samma sätt och är som små neurala nätverk. Vi har input från nuvarande tidssteg, * 9, och i form av det dolda tillståndet i förra tidssteget, h 9=.. Denna input multipliceras med en viktvektor och slutligen adderas en bias, b. Då vi i det här fallet vill ha siffror mellan 0 och 1 används den logistiska funktionen som aktiveringsfunktion och betecknas som s. Under träning lär sig minnesblocket vilka portar som ska vara öppna respektive stängda alltså vad minnescellen ska minnas och vad som ska glömmas. Detta görs likt hos ANN genom att vikterna justeras genom gradientssökning. Beroende på input-portens och forgetportens värden uppträder alltså en minnescell på olika sätt. Nedanstående ekvation visar hur minnescellens, alltså S 9, tillstånd ändras: S 9 = ) 9 * S 9=. + ( 9 * tanh(h V * [h 9=., * 9 ] + M V ) Observera hur istället för sigmoid så används den hyperboliska funktionen som aktiveringsfunktion. Som tidigare nämnt har den hyperboliska funktionen ett spann mellan -1 och 1 så genom att använda sig av den övervinns the vanishing gradient problem.
Till slut ska det avgöras vilket det slutgiltiga output som ska skickas vidare till andra minnesblock blir och detta beräknas enligt följande formel: h 9 = < 9 * tanh(s 9 ) Sammanfattning Denna rapport har visat hur neural maskinöversättning frångår tidigare översättningsmetoder genom att använda en modell med en kodare, som ur en sats på ett språk kan skapa en vektor för att representera satsens mening, och en avkodare som utifrån nämnda vektor kan återskapa satsen och dess innebörd fast på ett annat språk. För att kunna genomföra detta används RNN, ofta av typen LSTM, där nätverket innehar en form av minne vilket möjliggör att systemet kan tränas end-to-end. Diskussion Neural maskinöversättning är fortfarande en mycket ny metod, men trots det har den under de få år som den har funnits redan anammats av flertalet stora företag som ersättare av andra typer av maskinöversättningsmetoder. År 2016 lanserades exempelvis Microsofts Bing Translator som använder tekniken och sedan dess har jättar inom maskinöversättning som Google Translate och Facebook successivt ersatt tidigare översättningssystem med NMT. Google har för sitt översättningssystem utvecklat en egen typ av NMT kallad GNMT. Vid översättning mellan exempelvis engelska och franska samt engelska till spanska presterade detta system avsevärt mycket bättre och reducerade antalet översättningsfel med hela 60% jämfört med den tidigare frasbaserade översättningsmetoden (Wu, Schuster, Chen, Le, Norouzi, 2016). Neural maskinöversättning är dock långt ifrån en problemfri metod. Ett av de stora problemen med NMT är att det är en mycket dyr metod rent beräkningsmässigt som kräver stora mängder träningsdata och mycket tid för inlärning. Dessutom uppstår problem med mer ovanliga ord som NMT-systemet inte har kunnat träna på. Ett annat betydande problem ligger i svårigheterna att finna och korrigera eventuella buggar då den större delen av beräkningen sker i de dolda lagren som alltså utgör en så kallad svart låda.
Avslutningsvis kan konstateras att det fortfarande förekommer problem och begås signifikanta misstag vid översättning även med denna typ av metod. Mycket arbete återstår följaktligen för att skapa en maskinöversättningsmetod som kan mäta sig med mänsklig översättning. Dock framstår NMT ha en lovande tid framför sig där förhoppningsvis stora framsteg görs för att tackla de återstående problemen.
Referenser Bahdanau, D., Cho, K., Bengio, Y. (2015) Neural Machine Translation by Jointly Learning to Align and Translate. Published as a conference paper at ICLR. Geitgey, A., (2016-08-21). Machine Learning is Fun Part 5: Language Translation with Deep Learning and the Magic of Sequences. Hämtad från https://medium.com/@ageitgey/machine-learning-is-fun-part-5-language-translationwith-deep-learning-and-the-magic-of-sequences-2ace0acca0aa [2017-01-10] Graves, A., Liwicki, M., Fernandez, S., Bertolami, R., Bunke, H., Schmidhuber, J. (2008). A Novel Connectionist System for Unconstrained Handwriting Recognition. Greff, K., Srivastava, R. K., Koutník, J., Steunebrink, B. R., Schmidhuber, J. (2017). LSTM: A Search Space Odyssey. IEEE Transactions on Neural Networks and Learning Systems, 28(10), 2222-2232. Grosse, R. (2017) Lecture 15: Exploding and Vanishing Gradients. Hämtad från http://www.cs.toronto.edu/~rgrosse/courses/csc321_2017/readings/l15%20explodin g%20and%20vanishing%20gradients.pdf [2017-01-09] Hutchins, J. (2007). Machine translation: a concise history. In C. S. Wai (Ed.) Computer Aided Translation: Theory and Practice. Chinese University of Hong Kong. LeCun, Y., Bengio, Y. & Hinton, G. (2015) Deep learning. Nature, 521, 436-444. Liu, Y., Yang, N., Li, M., Zhou, M. (2014). A recursive recurrent neural network for statistical machine translation. 52nd Annual Meeting of the Association for Computational Linguistics (pp. 1491-1500). Lopez, A. (2008). Statistical machine translation. ACM Computing Surveys, 40 (3), art nr 8. University of Edinburgh, UK.
Nielsen, M. A. (2015) Neural Networks and Deep Learning, Determination Press. Hämtad från http://neuralnetworksanddeeplearning.com/chap5.html [2017-01-08] Russell, S., & Norvig, P. (2014). Artificial Intelligence - a Modern Approach. Edinburgh: Pearson Education Limited. Sutskever, I., Vinyals, O., & Le, Q. V. (2014) Sequence to sequence learning with neural networks. Advances in Neural Information Processing System, 4, 3104 3112. Stanford University School of Engineering. (2017, August). Lecture 10 Recurrent Neural Networks [Video]. Hämtad från https://www.youtube.com/watch?v=6niqtuyfzlq Weisser, M. (2016) Practical Corpus Linguistics An Introduction to Corpus-Based Language Analysis. Hoboken: Wiley-Blackwell.