AI får bättre resultat än 80% av svenskar* på vårt språktest för högre utbildning
*WIP preliminärt
Nedan följer flera interaktiva demos där ni kan testa modellerna själva.
ORD
Modellen tror: lärare vid högskola
MEK
Modellen tror: prokrastinera – aktivt
LÄS
Modellen tror: Avsaknaden av forskning som har konkret koppling till lärarnas undervisningssituation.
soon
DJUPA NEURALA NÄTVERK FÖR HÖGSKOLEPROVET ETT TEST AV AI PÅ DEN SPRÅKFÖRSTÅELSE SOM KRÄVS FÖR HÖGRE UTBILDNING
GENOMBROTTET INOM AI: TRANSFORMERS
September 2019 vaknar jag hög som ett hus efter en nyckelbensoperation och tar upp telefonen. I mitt feed ser jag att det kommit en ny modell(Albert, A lite Bert) som slår snittmänniskan i läsförståelseuppgfiter på Engelska för Högstadie och gymnasieelever i Kina. Detta fick mitt höga huvud att flumma ännu mer. Vad var möjligheterna? Tänk om jag höll på med detta? Jag måste göra detta!
Genombrottet kom ifrån en modell skapad för maskinöversättning och dess fortsättningar i form av GPT och Bert. De nya modellerna fullständigt krossade många av ledartavlorna som forskare tävlar om på olika uppgifter. Jag hade gjort lite experiment på Engelska men det var Svenska som var mest intressant och det fanns inga bra modeller.
I November, någorlunda återhämtad startade jag en resa för att utforska vad de senaste genombrotten inom Artificiella Neurala Nätverk för språkförståelse innebar för mitt språk, Svenska. Vad som fascinerade mig mest var inte de höga resultaten på text och meningsklassificering, utan att de klarade av att göra tester på läsförståelse. Trots att implementeringarna är otroligt lika på en teknisk nivå så är det väldigt spännande när det verkar ha uppstått en annan typ av läsförståelse än den vi har men som fortfarande kan "resonera" (mönsterigenkänning) över texter och svara på frågor. Detta var extremt spännande, vad innebar det för mig? Hur fungerar det? Vad spottar den ut? Finns det några likheter med hur vi gör det?
Vad gjorde det möjligt för AI att gå om snittsvensken?
Möjligheten
De nya modellerna tränades på enorma mängder data i relation till de experiment jag gjort tidigare som mestadels var på Svenska Wikipedia som är relativt smått. De modeller som kom tränades på 16GB, 38GB, 140GB+. Tidigare så tränade man ofta på rader eller meningar men nu var det hela texter som gäller. Jag fick bygga om hela mitt dataset från grunden. Inget liten uppgift att göra ensam. Allt som allt kom jag upp i ca 100GB. Om man antar att 1MB är 250 A4-sidor så skulle man komma till Seoul, Sydkorea från Stockholm. Givet att man skrev ut texten till 25 miljoner blad och började placera dem efter varandra. Om man antar att det skulle ta i snitt 1.7 minuter att läsa en sida för en människa skulle det ta över 80 år av konstant läsning. Detta är för de små modellerna.
Som tur är finns det mycket resurser tillgängliga. Den största resursen är CommonCrawl som innehåller dumpar av internet. Efter att ha städat datan hittade jag ungefär 16GB på min första dump. Riksdagen delar väldigt mycket texter och detta lades snabbt och enkelt till. OPUS och dess undertexter från filmer och Wikipedia åkte med. Senare tillkom även Oscar. Allt som allt kom jag upp i ungefär 100GB.
För att träna dem här nya stora modellerna krävs det väldigt mycket beräkningsskraft. För min lilla arbetstation med ett RTX2080-grafikkort skulle det förmodligen ta flera år att träna en modell riktigt bra. För att kunna träna behövdes en superdator. Google har tagit fram en ny typ av hårdvara som kallas för Tensor Processing Unit(TPU) som är speciellt framtagen för att träna modeller. Dessa tillhandahålls fritt genom Tensorflow Research Cloud. Som bas-medlem i Tensorflow research cloud får man tillgång till ett gäng med TPUer. Tillräckligt för att köra "småskaliga" experiment i den här världen. Det är tack vare TPU-access som jag kunnat göra detta.
Öppenhet
Internationellt sett är forskningen inom NLP(Natural Language Processing) otroligt öppen. Allt går som ett skenande lokomotiv. Det är fruktansvärt hetsigt att hänga med. Som tur är delas mycket modeller, data och kod. Till och med företag som Google delar väldigt mycket och är en stor del till varför mycket av detta händer just nu. Det här passar mig perfekt som älskar att plocka sönder saker i bitar istället för att ändlöst repetera grunderna tills de sitter utan att få se helheten.
Vad skall jag börja plocka isär? Jag frågar de som gjorde Albert, om jag kunde få se deras kod på hur de löste RACE(Föreberedande uppgifter för de kinesiska högskoleprovet) och två dagar senare trillade ett par filer in i Github. Nötandet börjar...
HUR LÄR MAN EN AI SVENSKA?
Tokenization
En bilfärja lämnade lilla varholmen
[ "en", "bil", "##fär", "##ja", "lämnade", "lilla", "var", "##holmen" ]
Ser den ord? bokstäver? Modellen får se "tokens", en token kan vara en bokstav, del av ett ord eller ett helt ord. Att dela in texter i tokens har sina för- och nackdelar. Det största problemet och fördelen är att dessa modeller tittar på hur alla tokens i en text påverkar varandra("Attention"). Om alla tokens bara var bokstäver i exemplet ovan så blir det 19 och i längre texter skulle detta kräva extremt mycket datorkraft, om vi istället kollar på ord så är det enbart 5. Skulle vi spara alla ord så får vi dels en gigantisk mängd tokens att lagra, dels så missar vi en del kontext som kunde vara användbar. Med nuvarande tokenization får vi 8, en bättre trade-off. T.ex så kan man gissa att ["vilken token som helst", "##holmen"] handlar om en plats vid vatten även om modellen aldrig sett "burholmen" förut i en annan text. Därför skapar man ett Vocab med ett begränsat antal tokens. Desssutom begränsar man det totala antalet tokens en modell kan se.
Klurigheter
I Svenskan har vi vansinnigt många olika sammansatta ord t.ex "långtidslagring" och "förtidsröstning". Detta blir snabbt ett problem med hur nuvarande algoritmer söker tokens, som inte
alls är anpassde efter detta. De tokens som modellen får se blir ofta dåligt anpassade och en annorlunda böjning av ett del-ord kan kasta om alla tokens som blir av det hela sammansatta ordet. Det blir dessutom dubbletter om det är i början
eller i ett ord, T.ex. så ses "holmen" och "##holmen" som helt olika tokens. Ni kan testa själva nedan i demon.
Lösningar
Dels så pågår det mycket forskning på "Attention", det som gör det svårt att titta på längre sekvenser och vissa framsteg har gjorts. Men sen kan man även ha ett smartare system för hur man
tokenizar. Detta forskas det lite på och är delvis ett problem som kanske fokuseras på i andra germanska språk än Engelska som Tyska. Jag har själv en hel del idéer som jag skulle vilja utforska. Jag antar att fler personer eventuellt jobbar
på att ta fram olika lösningar redan. Sen kan det helt enkelt och delvis vara så att det krävs mer beräkningskraft som löser sig med tiden och detta bara blir temporära quickfix för att kompensera för nutidens långsamma datorer sett ut ett
framtidssperspektiv. Need m0ar compute.
Tokenization
Result:31
Modellen
Embeddings
Modellen börjar med att skapa embeddings, en sorts representation av vad en token har för betydelse. Som exempel så försöker den placera "avtal" och "kontrakt" nära varandra, förmodligen så
ligger "jurist" i närområdet om den är bra tränad.
Transformer
Sen så går dessa representationer igenom flera transformer-lager. Ett transformer-lager lär sig ställa frågor ("attention") från varje token på alla andra tokens. Ett exempel skulle kunna vara
"vem skapade kontraktet". En basmodell har ofta 12 sådana här "frågor per lager". Svaret på dessa frågor slås ihop och går igenom ett neuralt nätverk som skapar en ny representation för tokensen som kan gå vidare till nästa lager. En
basmodell har ofta 12 lager. Ökar man heads och lager så ökar man antalet mönster som modellen kan plocka upp. Ofta så har kända modeller olika namn men det brukar vara variationer på detta eller träningsmetod som skiljer dem åt. T. ex. så har GPT3
96 heads och 96 lager med en variant på attention-mekanismen som ger den bättre möjlighet att titta på lite längre texter(2048 tokens).
Model
Lära sig svenska
Uppgift
För att lära en modell Svenska måste man ha en uppgift som den kan träna på. En uppgift där man kan se om den har fel. För att den skall kunna lära sig så bra som möjligt behöver man extrema
mängder uppgifter. Därför är det bäst att komma på uppgifter som fungerar på vilken text som helst. Tidigare har detta varit att ta bort tokens och sedan låta modellen gissa vilken token som skall vara där. Antingen i mitten av en mening
eller att gissa nästa token i en text. Om man gissar en token i mitten av texterna blir den bra på att förstå texter. Om man tränar den på att gissa nästa token blir den bra på att skriva texter.
Effektivare
Den metod som utvecklats av Clark et al. (Stanford, Google) går ut på att ha en modell som byter ut tokens i texter mot snarlika ord. Sedan har man en annan modell som gissar vilket ord som är utbytt. Detta leder till att modellen får en svårare uppgift som dessutom innebär att den måste ha mer koll på varje ord, vilket ger bättre feedback. Detta leder till att modellen kräver betydligt mindre resurser att träna och är betydligt mer energivänlig och därmed miljövänligare än tidigare metoder. Denna metod valde jag.
Nedan kan ni se outputen från modellen. Desto större tal desto mer tror modellen att det är utbytt.
Pre-training
Testa kunskaperna på högskoleprovet
Målet är att träna modellen på att kunna göra uppgifter som liknar högskoleprovet och sedan testa den på högskoleprovet. Alltså inte att träna den på högskoleprov och sedan testa den på några den inte sett. Detta som ett test på generaliseringspotentialen som de nya modellerna har. Till exempel så är en återkommande fråga på högskoleprovet, "vad säger författaren i den första paragrafen?". Jag vill se om modellen har en sådan generell förståelse att man inte skall behöva träna den på att lära sig små knep för att få bra resultat på just högskoleprovet.
ORD
Definition
Den här uppgiften liknar mer någon form av givet ett ord, en kombination av ord eller en fras välj det mest lika i betydelse. Det är inte så lätt som att bara ha lista på ord, för här
förekommer ordspråk och annat.
Träning
Den får läsa orden från svenska wiktionary. Jag använder en cosine similarity loss. Splittar 80 / 10 / 10 och får ~0.91 i cosine pearson
Reflektion
Det som är intressant med denna uppgift är att man kan se hur modellen/metoden generaliserar utöver listan på synonymer som enbart består av ett ord till att klara av fraser och även ord
som inte är med i synonymlistan. När jag testade modellen på 3 högskoleprov fick jag runt 84% rätt på orden. Jag testade även sen att köra standardsättet för encoders och fick som bäst runt 89%. Jag använder dock inte resultatet därifrån då
jag använde 3 högskoleprov som ett dev set och detta blir fusk. Det jag vill göra är att träna den på att ganska generellt lösa liknande uppgifter som HP och bara använda HP som ett sluttest. Det som är intressant förutom generalisering är
att denna uppgift är förmdligen ett väldigt bra mått på hur bra modellen delar upp tokens. Rätt delord -> mer generalisering.
MEK
Definition
Läs en text som har flera tomma platser, i dessa platser kan ett eller flera ord vara. Välj från 4 alternativ vilket som är bäst.
Träning
Här gjorde jag ingen träning alls. Modellen har redan från sin basförståelse av svenska en riktig talang för detta! Ni kan ovan testa att se vad modellen spottar ut när ni byter ut olika
ord. Även om den tror att det ordet ni bytt ut kan vara där så blir den generellt sätt mer osäker på orden runt omkring. Så genom att titta på en ruta runt orden har man en ganska bra grund för om orden är utbytta. Detta gav 78% rätt på 3
prov.
Reflektion
Här finns mycket man förmodligen kan hämta. Dels genom att träna den på att hitta utbytta ord i texter med extremt hög kvalité och inte random-sidor från internet. Man skulle sedan kunna
lägga på en klassificerare och träna den på att välja rätt alternativ. Detta går dock lite emot syftet, att testa hur bra den generaliserar på högskoleprovet.
LÄS
Definition
Läs en text och en fråga. Välj svar från 4 alternativ vilket som är bäst.
Träning
Här kommer det svåra. Högskoleprovet är förmodligen den största datamängden som finns på läsförståelse som ligger uppe. Kanske att det finns för nationella prov eller hos något företag som
erbjuder träningsmaterial för detta. Jag valde att titta på vad det fanns för material på Engelska. jag tränade en modell på att översätta från Engelska till Svenska. Den modellen fick översätta läsförståelseuppgifter på engelska. Sedan
tränade jag en Svensk modell på att göra uppgifterna. Koden för att träna i Tensorflow har jag lagt upp på Huggingface github. Det bästa resultatet jag fick med denna metoden var 1.0. Jag tror det finns en del att hämta genom att använda
bättre data och använda en större modell tyvärr var detta både resurskrävande i form av compute men även i tid. Jag hoppas kunna fortsätta experimentera med detta framöver. Det finns en modell på Engelska, UnifiedQA. Den är tränad på T5, en
modell som finns i "extrema" storlekar. De tränade en modell att göra väldigt breda läsförståelseuppgifter, Jag gör tester med deras 3B-variant i fortsättningen och översätter med en modell som matar in de svenska texterna på engelska för att
se var gränsen verkar gå.
Reflektion
Den största begränsningen här är data och modellstorlek. Läsförståelse kräver mycket av modellen. Ju fler mönster modellen kan hitta desto bättre resultat. Om man har många exempel på de
mönster som krävs för att göra uppgiften ökar också chansen. Det jag hade möjlighet att göra var i princip en modell med 12 lager baserade på mina dåvarande kunskaper om träning. Jag började experimentera med att ge mig in i hur man kan få
plats och optimera för större modeller. Att använda UnifiedQA 11B skulle ev. höja accuracyn med ca 5%.
Om man kollar på resultatet nedan så verkar det fortfarande vara bättre att ev. träna en mindre modell på svenska och fortfarande slå den stora engelska med översättning. Skall bli spännande att se om jag fortsätter! Man skall även ta i beaktning att de engelska uppgifterna på hp är av enklare karaktär jämfört med de svenska.