LINKÖPINGS UNIVERSITET Innehåll 1. Inledning... 2 2. Terminologi... 3 3. Allmänt om Word2Vec... 3 4. Continous Skip-gram model... 4 Word2Vec Högkvalitativa vektorrepresentationer av ord tränat på stora mängder data 2016-01-07 4.1 Hierarchical softmax... 5 4.2 Negative Sampling... 5 4.3 Subsampling av frekventa ord... 6 7. Tillämpning och implementation... 6 7.1 Exempel på tillämpningar... 6 7.2 Test av implementationen i Python 2.7... 7 8. Avslutning... 9 9. Personlig reflektion... 9 10. Litteraturförteckning... 10, 1
1. Inledning 2. Terminologi Inom Natural Language Processing finns stora problem med hög beräkningskomplexitet. De senaste åren har det kommit ett genombrott och en möjlighet att träna neurala nät på stora mängder rå data för att komma åt så precisa representationer av ord som möjligt. Genombrottet gjordes på Google av en forskargrupp som leds av Tomas Mikolov och kommer att beskrivas och diskuteras. Denna rapport är en undersökning och sammanfattning av två av Mikolovs artiklar. Den första (Mikolov, Chen, Corrado, & Dean, 2013) introducerar Word2Vec och två modeller. Den andra artikeln (Mikolov, Sutskever, Chen, Corrado, & Dean, 2013) avhandlar en av modellerna, skip-gram. Word2Vec-implementationen i Python 2.7 (Gensim) har även undersökts och kod finns bifogat. Både skip-gram och CBOW har använts för att träna två modeller, men fokus i rapporten är på skip-gram. En vektor kan enligt olika discipliner beskrivas på olika sätt. Enligt användningen i denna rapport kan en vektor beskrivas som en ordnad sekvens av värden. För enkelhetens skull kan läsaren tänka sig en lista med värden. En vektor existerar i vektorrum med n dimensioner (Russel & Norvig, 2013, s. 1055-1056). Korpus är en stor samling språkliga data i textform som används av forskare i lingvistik. Texter som finns i en korpus kan vara antingen transkriberat tal eller vanlig text. Vanligt för en korpus är att texterna är av naturligt språkbruk (Kann, 2006). 3. Allmänt om Word2Vec På Google har ett forskarlag (Mikolov, Chen, et al., 2013) utvecklat två modeller för bearbetning av naturligt språk genom text som går under paraplytermen Word2Vec. Den är uppbyggd av C-kod och har öppen källkod. Även textfiler som krävs för att testa precision finns i öppen källkod. Studiens huvudtes är att mycket stora obearbetade datamängder (som innehåller flera miljarder ord) kan användas för att kontinuerligt skapa ordrepresentationer. Representationerna är högkvalitativa ordvektorer som skapas med en av de två modellerna som introduceras i artikeln. Inom tidigare Natural Language Processing-arkitekturer har ordrepresentationer tränats på hundratals miljoner ord med lägre dimensionalitet på vektorerna (50-100) än Word2Vec (300 dimensioner). Den största rapporterade datamängden Word2Vec har tränas på är 30 miljarder token. Utöver att ha tränats på mindre datamängder så har tidigare modellarkitekturer som använder vektorer hög beräkningskomplexitet jämfört med Word2Vec. Modellerna i Word2Vec tränas genom stokastisk gradientsökning och backpropagation. Likt människor predicerar vilket ord som kommer näst i en mening kan man lära ett neuralt nätverk att förutsäga ett ord givet kontextord P(W C), samt kontext givet ett ord P(C W). Dessa två representerar Word2Vecs två modeller; Continous Bag of Words (CBOW) som förutsäger ord givet kontextord respektive Skip-gram som förutsäger kontext givet ord (Mikolov, Chen, et al., 2013a). Skip-gram kommer att undersökas vidare senare i rapporten. Båda modellerna bygger på att ord kan representeras genom högkvalitativa ordvektorer med egenskaper. De är utmarkerade i vektorrummet. Om sträckan mellan två vektorer är liten 2 3
indikerar detta semantisk och/eller syntaktisk relation mellan dessa. Sträcka mellan ordvektorer i vektorrummet mäts i cosinusavstånd (eng. cosine distance). Ord som ofta förekommer tillsammans i träningskorpusen kommer att vara inprickade nära varandra i vektorrummet (Ghodsi, 2015a, 2015b). Det finns många olika sorters likheter mellan ord (Mikolov, Chen, et al., 2013), till exempel finns det skillnader mellan syntaktiska relationer. Med anledning av detta kan kvaliteten på ordvektorerna inte utforskas endast genom att generera ord som är mest lika ett antal exempelord, vilket tidigare forskning inom ämnet gjort. Istället, för att undersöka kvaliteten av ordvektorerna, kan en fråga ställas: What is the word most that is similar to small in the same sense as biggest is similar to big? (formen beskrivs hädanefter som A is to B as C is to D ). För att svara på denna fråga kan enkla algebraiska beräkningar göras på respektive ords vektorer; X = vektor( biggest ) vector( big ) + vector( small ). Vektorn som är mest lik och således närmast X bör vara smallest om representationerna mellan ord är högkvalitativa och vältränade vektorer. Om beräkningarna ger samma svar som de faktiska semantiska och syntaktiska relationerna i språket kan man anta att vektorerna är av hög kvalitet. Ett precisionstest beskrivs i studierna (Mikolov, Chen, et al., 2013; Mikolov, Sutskever, et al., 2013) som är i formen A is to B as C is to D med semantiska och syntaktiska relationer. Prestation på testet beskrivs i procent. Bearbetning av stora mängder träningsdata är väsentligt och därför låg beräkningskomplexitet prioriteras framför exakta representationer i Word2Vec (Mikolov, Chen, et al., 2013). 4. Continous Skip-gram model Som tidigare nämnt predicerar skip-gram modellen kontext givet ett ord (w(t)). Indata till modellen är en one-hot vektor. Det innebär att vektorn har samma längd som ordlistan med värdet 0 vid alla index utom det aktuella ordets index, där värdet är 1. One-hot vektorer leder till att användaren skapar träningsexempel från ren text och således finns en näst intill oändlig mängd möjlig träningsdata (Minnaar, 2015). Kontext, vilket motsvarar window i Gensim, är ett mått på hur många ord före och efter ordet (w(t)) som är kontexten. Om window=10 prediceras 5 ord innan (w-1, w-2, etc.) och 5 ord efter (w+1, w+2, etc.). Utdata från skip-gram modellen är vektorer som representerar ordets kontext, givet en längd på kontexten. Vid högre värden på window ökar kvaliteten på ordvektorerna, men som en konsekvens ökar beräkningskomplexiteten. En utjämning för relationen mellan ord (w(t-n)) som ligger nära respektive långt bort från w(t) görs genom att sampla mindre från orden långt bort vid träning. 4 Värden på window bör dock inte vara långt över 10 eftersom relationen mellan ord blir svagare ju längre bort de är från varandra. Varje ord (w) används som en input till en loglinjär klassificerare (Mikolov, Chen, et al., 2013). Med logistisk regression ämnar skip-gram maximera antal par i mängden D (Mikolov, Chen, et al., 2013). Formellt beskrivet är skip-gram modellens inlärningsmål att maximera där c är window. Den genomsnittliga logaritmiska sannolikheten p(w t+j w t) definieras av softmax-funktionen, vilken har stor beräkningskomplexitet (termernas storlek varierar från 10 5 till 10 7 )(Mikolov, Sutskever, et al., 2013). 4.1 Hierarchical softmax Ett alternativ till softmax-funktionen som har lägre beräkningskomplexitet är hierarchical softmax. Funktionen bygger ett binärt träd vars löv (W) representerar utdata-lagret. En stig till löven tilldelar sannolikheter till orden (W). I artikeln har Huffman-träd använts, vilket är en bra struktur för snabb inlärning (Mikolov, Sutskever, et al., 2013). 4.2 Negative Sampling Trots att hierarchial softmax har lägre beräkningskomplexitet ger den inte vektorer med högst kvalitet när den används med skip-gram. Studien (Mikolov, Sutskever, et al., 2013) visade att negative sampling med skip-gram (SGNS) gav högst precision på syntaktiska och semantiska A is to B as C is to D -test 1, 61 % (med samma resultat för subsampling 10-5 och kortare körtid). Negative sampling är en log-linjär funktion som gör om den objektiva funktionen till ett klassificeringsproblem med två klasser; D och D, där D är ett dataset innehållande par (w, c) som existerar i korpus och D innehåller par som inte finns i korpus. Klassificeraren bedömer således P(z=1 (w,c)) samt P(z=0 (w,c)). Negative sampling ämnar maximera P(z=1 (w,c)) och maximera P(z=0 (w,c)) för negativa par. De negativa paren är slumpmässigt utvalda och bygger på antagandet att slumpmässiga par (w, c) sannolikt inte finns i korpus (Ghodsi, 2015a, 2015b). I Gensim är negative sampling en variabel till 1 Testet finns på https://word2vec.googlecode.com/svn/trunk/questions-words.txt 5
gensim.models.word2vec.word2vec som heter negative (Rehurek, 2015). Värdet på negative anger antal negativa par per positivt par och bör vara mellan 5-20 för mindre storlek på korpus och 2-5 för större korpus (Mikolov, Sutskever, et al., 2013). 4.3 Subsampling av frekventa ord Några exempel på vanliga ord i en korpus på engelska är in, a och the. Dessa kan förekomma flera hundra miljoner gånger i en korpus, vilket leder till att dessa antas vara mindre viktiga än de ovanliga orden. De anses ha lägre informationsvärde. Genom subsampling av frekventa ord jämnas obalansen mellan vanliga och ovanliga ord ut. Det leder till att ovanliga ords vektorer får högre kvalitet. Utöver det förkortas även träningstiden och större mängd data kan testas. Vilka ord som ska subsamplas bestäms från formeln där f(w i) är frekvensen av ord w i och t är det valda gränsvärdet. Alla ord vars frekvens överskrider gränsvärdet subsamplas (Mikolov, Sutskever, et al., 2013). 7. Tillämpning och implementation 7.1 Exempel på tillämpningar Med anledning av att ordvektorerna har både syntaktiska och semantiska egenskaper kan dessa användas för att förbättra nuvarande tillämpningar av olika modeller inom naturliga språk. Några exempel är maskininlärning, informationssökning och fråga-svar-system. På grund av vektorernas kvalitet, men främst på grund av låg beräkningskomplexitet kan Word2Vec sannolikt möjliggöra framtida tillämpningar för naturligt språk (Mikolov, Chen, et al., 2013). 7.2 Test av implementationen i Python 2.7 Jag har testat Word2Vecs modell i Gensim (Rehurek, 2015) för att träna ett neuralt nät med skip-gram modellen. Min träningsdatamängd är de första 10 9 byte av Wikipedia, text8.txt 2. Jag har använt mig av gensim.models.word2vec.text8corpus som är en funktion som itererar över meningarna i text8. Gensim är ett bibliotek till Python 2.7 och kräver en C-kompilator. Jag använde mig av Visual C++ 2008 och Cython för att kompilera Gensim och därmed kunde jag använda mig av den optimerade C-koden som tillåter multitrådning. Detta tillät att variabeln workers>1. Både skip-gram och CBOW kallas på i samma funktion, Word2Vec, med olika variabler. Som default används skip-gram (sg=1) och hierarchial softmax (hs=1). Eftersom det har visats i en studie (Mikolov, Sutskever, et al., 2013) att skip-gram med negative sampling (SGNS) får högst kvalitet på vektorerna testade jag det. Jag testade med olika värden på variablerna, men alltid med skip-gram. Som mest fick jag 50,9 % träffsäkerhet på testet med syntaktiska och semantiska relationer som beskrevs tidigare i rapporten. Mina värden 3 var då size=200, window=8, alpha=0.05, min_count=5, workers=12, iter=15, hs=0, negative=25. Alphavärdets minimum är som default 0,0001, vilket ledde till att jag valde ett något högre värde att börja med. min_count=5 innebär att alla ord med lägre frekvens i hela korpusen ignoreras, vilket var runt 2 % av korpusen. workers=12 innebär att koden körs parallelliserat med 12 trådar. iter=15 innebär att testet körs 15 gånger (epoker) över hela korpusen. När negative=15 fick Mikolov, Sutskever, Chen, Corrado och Dean (2013) 61 % träffsäkerhet på ett test med syntaktiska och semantiska relationer. Noterbart är att det inte är beskrivet att testet är detsamma som finns med öppen källkod som jag har använt mig av. Med en större mängd testdata är det möjligt att jag skulle få högre träffsäkerhet, men i skrivande stund har inte min dator prestanda nog att klara det. Jag har också testat CBOW-modellen 4 med vilken jag fick 49,6 % träffsäkerhet på testet. 2 Finns att ladda ned här: http://mattmahoney.net/dc/text8.zip 3 Mer om detta i TrainingK.py. 4 Modellen har tränats av TrainingJ.py. 6 7
Utöver att skapa modeller och testat deras träffsäkerhet har jag undersökt andra relationer i språket 5. Metoderna jag använde mig av finns i Word2Vec i Gensim. Metoden most_similar svarar på frågeformen beskriven i del 3: A is to B as C is to D. 8. Avslutning Den första artikeln (Mikolov, Chen, et al., 2013) introducerar modellerna och den andra artikeln (Mikolov, Sutskever, et al., 2013) vidareutvecklar skip-gram modellen och lägger till en implementation av frasanalys (skip-phrase). I den första artikeln är vektorerna endast ett ord, men i den andra artikeln beskrivs hur vissa ord som förekommer oftare tillsammans än med andra ord kan bearbetas som en enhet. Ett exempel på detta är New York som behandlas som new_york istället för separat. Tidigare har det funnits metoder för att representera ord som kontinuerliga vektorer, till exempel en neural network language model (NNLM) som bygger på en vektorrepresentation av ord samt en statistisk språkmodell. Modellen har ett icke-linjärt dolt lager och uppbyggt av ett feed-forward nät. Projektionslagret är linjärt. Det finns fler modeller som bygger på denna, men alla har de samma problem; hög beräkningskomplexitet vid träning av modellen (Mikolov, Chen, et al., 2013). När Word2Vec beskrivs i relation till andra modeller i artiklarna finns det, enligt mig, alltid ett jämförande resonemang kring Word2Vec och tidigare modeller. Word2Vec beskrivs som överlägset i och med sin lägre beräkningskomplexitet och därmed möjlighet att tränas på större mängder data. I den andra artikeln (Mikolov, Sutskever, et al., 2013) jämförs skip-phrase och tre andra liknande arkitekturer (med öppen källkod) som alla har tränats på ungefär 30 miljarder token. Som jämförelse skrivs tre token ut som är närmast fem ovanliga token. Två modeller saknade ordet i sin ordlista, och endast skip-phrase kunde bearbeta fraser. Skip-phrase hade överlägset bäst kvalitet på ordrepresentationerna. Mikolov, Sutskever, Chen, Corrado och Dean (2013) attributerar detta till att skip-gram modellen brukar använda denna mängd token för inlärning som jämfört med de andra modellernas vanliga träningsmängd är två till tre gånger större. Åter igen, enligt min tolkning, beskriver författarna skip-gram modellen som överlägsen givet uppenbara bevis, vilket är figur 6 i artikeln, trots att det saknas ett objektivt mått på prestation. Däremot är tidsåtgång för en körning av modellen rapporterat och skip-gram har betydligt mindre tidskomplexitet. 9. Personlig reflektion 5 Kod till detta är Queries.py. När jag har skrivit kod, försökt installera c-kompilator, läst artiklar och testat min kod har jag lärt mig mycket om hur Word2Vec faktiskt fungerar och olika möjliga användningsområden. Vikten av parallellisering och att hålla beräkningskomplexiteten låg har gått upp för mig när jag har testat kod utan parallellisering och med dimensionen på vektorerna satta till 1000. 8 9
10. Litteraturförteckning Ghodsi, A. (2015a). Lec [3,1]: Deep Learning, Word2vec. Retrieved January 1, 2016, from https://www.youtube.com/watch?v=tsegsdvjjua Ghodsi, A. (2015b). Lec [3,2]: Deep Learning, Word2vec. Retrieved January 1, 2016, from https://www.youtube.com/watch?v=nuiruembaju Kann, V. (2006). Korpusar. Retrieved January 7, 2016, from http://sprakteknologi.se/vad-aersprakteknologi/lexikon/korpusar Mikolov, T., Chen, K., Corrado, G., & Dean, J. (2013). Efficient Estimation of Word Representation in Vector Space. In ICLR. Mikolov, T., Sutskever, I., Chen, K., Corrado, G., & Dean, J. (2013). Distributed Representations of Words and Phrases and their Compositionality. In NIPS. Minnaar, A. (2015). Word2Vec Tutorial Part I: The Skip-Gram Model. Retrieved January 7, 2016, from http://alexminnaar.com/word2vec-tutorial-part-i-the-skip-gram-model.html Rehurek, R. (2015). Deep learning with word2vec. Retrieved January 7, 2016, from http://radimrehurek.com/gensim/models/word2vec.html Russel, S., & Norvig, P. (2013). Artificial Intelligence (3rd ed.). New Jersey: Pearson Education. 10