Insinööri (ylempi AMK) Mikko Pajula työskentelee asiantuntijana Lapin ammattikorkeakoulun Digitaaliset ratkaisut -osaamisryhmässä.

Sisältö

​Johdanto
Tavoite ja termistö
Data kaiken lähtökohtana
Tekoälyn arkkitehtuuri
Tokenisaatio
Tokenien vektorisointi
Mallin pysäyttäminen
Parempi tapa tokenisaatioon
Kalevalamallin arkkitehtuuri
Kouluttamisen laitteistovaatimuksista
Kalevalamallin koulutus
Lämpötilan vaikutus
Pohdinta
Hankkeesta
Lähteet


Johdanto 

Riittävän kehittynyt teknologia on erottamatonta taikuudesta.

Näin lausui brittiläinen tieteiskirjailija Arthur C Clarke vuonna 1962. (New Scientist 2025) Esimerkkinä tekniikat taikuudesta voisi antaa ihmisten kokemukset yli 160 vuotta sitten, kun höyryveturit alkoivat liikenteen Suomessa. Matka Hämeenlinnasta Helsinkiin lyhentyi 12 tunnista hevosella muutamaan tuntiin paljon tasaisemmalla kyydillä veturin vetämänä. Vaikkakin kyyti oli luultavasti paljon tärisevämpi kuin VR:n nykyiset sähköjunat. 

Ihmiset tulivat sankoin joukoin katsomaan tuota taianomaista teknologiaa, höyryveturia. Uusi ja hieno teknologia vuonna 1862 herätti myös huolta. Suuren nopeuden pelättiin aiheuttavan hulluutta. Epäiltiin, että kestääkö ihmisen mieli niin kovia nopeuksia. (Hämeen Sanomat 2025) 

Samaten autojen ilmestyminen katukuvaan herätti pelkoa uutta teknologiaa kohtaan. Auto nähtiin turhina rikkaiden leluina, jotka aiheuttavat tarpeettomasti vaaratilanteita. (Ladd 2008, 14–28) Nyt jos kyselisin ympäriltäni peloista mitä auto herättää ja kuinka taianomaiseksi tämä teknologia koetaan, niin luulenpa että vastaukset ovat että ”ei pelota yhtään” sekä ”eihän siinä ole mitään taianomasta”. 

2022 vuoden lopussa OpenAI julkaisi ChatGPT:n (Foote 2023). Tätä kirjoittaessa hieman yli kaksi vuotta sitten. Vertaisin tilannettamme samaan kuin yli sata vuotta sitten autojen ja höyryveturien ilmestyessä arkeen. Reaktiomme vaihtelevat kokemukseni mukaan välinpitämättömyydestä pelkoon. Olen kuullut tekoälytekniikkaa pidettävän merkityksettömänä leluna tai kaiken mullistavana, dystooppisena hirviönä. Pääosa mielipiteistä on kuulemani sekä lukemani mukaan toki välimaastossa, mutta paljon tekoälytekniikkaan koetaan mielestäni sisältyvän jotain mystistä, ehkä taikuutta jopa. Kutsutaanhan tekniikka tekoälyksi. 

Tekoälyn kanssa pohdin, että miten pääsisimme ensireaktiosta kohti samaa arkisuuden tunnetta, jota koemme autoja kohtaan. Arkisuuden mielentilaan on mielestäni hyvä päästä, jotta näemme tekniikan sellaisena kuin se on ja voimme realistisesti soveltaa tekniikkaa ja rakentaa arkemme näiden sovellusten avulla. Avaan tätä autovertauksella.

Kuvittele, että auto on ilmestynyt tekniikkana kaksi vuotta sitten. Ihmiset etsivät uudelle tekniikalle käyttötapoja ymmärtämättä sitä, rakentavat autoveneitä tai auton moottoria valjastetaan sähkön tuotantoon. On siis autohype. Tällaisessa hieman kaoottisessa tilanteessa mielestäni toimivimmat uuden teknologian sovelluskohteet jäävät huomiotta. Tuntuu, että teknologian mahdollisuuksia sekä rajoja ei ymmärretä riittävästi. Autohypen kanssa samaan aikaan lietsotaan pelkoa siitä, miten vauhti tekee hulluksi ja kaikki kuolevat auton, tuon rikkaiden lelun, alle. Pelon lieventämiseksi tehdyt säädökset, kuten mahdollinen vaatimus auton edellä liikkuvaan varoittajaan, jolla pitää olla punainen lippu. Näin säädettiinkin autojen kohdalla 1865 (Veteran Car Run 2025). Tällaisilla säädöksillä onnistuttaisiin vahingossa estämään autojen käyttö sellaisissa tarkoituksissa, missä tämä tekniikka olisi varsin toimiva. 

Tekoälytekniikan suhteen vaikuttaa siltä, että olemme tilanteessa, missä tekniikan mystisyys, jota hype ruokkii, ruokkii taas pelkoja. Pelot taas maalaavat mielikuvaa tekoälystä lähes kaikkivoipana tekniikkana, joka toki on hypeä nostattaville hyvää myyntimateriaalia mutta haittaa realistisen ymmärryksen leviämistä tekniikasta viemällä viestinnän ilmatilaa. Samalla huoli on jo johtanut lainsäätöön ja voi vielä johtaa laajempaan, mielestäni liian ennenaikaiseen rajoittamiseen. Ei pelkästään lailla rajoittamiseen, vaan enemmänkin henkiseen rajoittamiseen. Pelottelu riskeistä voi johtaa siihen, että emme esimerkiksi uskalla hyödyntää tekoälyä terveydenhoidossa, vaikka tekniikkana se voi tarjota paljon uusia konkreettisia mahdollisuuksia. 

Tarvitsisimme mielestäni realismia. Realismi saavutetaan mielestäni ymmärryksellä tekniikasta. Mitä se on, mihin se taipuu ja mihin se ei taivu. Autot ja veturit ovat vakiintunutta teknologiaa siten, että olemme nähneet niitä lapsesta asti ja mielestäni mitä merkittävimmin, meille on opetettu koulussa, miten nämä teknologiat toimivat. Taikuuden verhoa on raotettu ja salaisuudet on paljastettu. Tiedämme mihin auto tekniikkana pystyy ja mihin ei. Emme pelkää autoa ja löydämme tiedon avulla helposti toimiva käyttötapoja. Tämän kaiken takia näin tekoälyn boomiaikaa jo jokusen vietettyämme, olisi mielestäni viimeistään nyt aika tutustua tekoälyyn tarkemmin, kurkata hieman konepellin alle. 

Olen nähnyt toimivan höyryveturin. Kokemuksena höyryveturi on vaikuttava. Tekisi mieli sanoa, että taianomainen. Kun omalla kohdallani mietin, mikä tieto päässäni muuttaa höyryveturin mustasta pihisevästä pedosta arkiseksi laitteeksi, niin vastaus on tylsät kaaviokuvat kouluvihkoista sekä muutama minulle erittäin merkittävä yksityiskohta, jotka avaavat mysteerisen tekniikan. Höyrymoottorin toimintaa avatessa itselleni tärkeimpiä kohtia ymmärryksen saavuttamiseksi ovat höyryn paine ja kampiakselin olemassaolo. Paine on se edestakaista liikettä aiheuttava voima ja kampiakseli suorastaan maagisesti muuntaa edestakaisen liikkeen pyöriväksi liikkeeksi. 

Auton polttomoottorin kohdalla yleinen tieto sen toiminnasta auttaa meitä avaamaan polttomoottoriauton rajoituksia ja siten hahmottamaan sen käyttömahdollisuuksia. Miksi emme käytä autoa apuna kodin sähköntuotannossa? Koska kustannuslaskelma, jonka voimme tehdä vain, jos tunnemme tekniikan, luultavasti paljastaa idean kannattamattomaksi. Samalla tavalla tekoälyn kohdalla tekoälyn tekniikan tunteminen auttaa meitä hyötyhaitta -suhteen laskemisessa. 

Kukin meistä varmaankin kokee eri kohdat tekniikasta avaavina. Lakkaako polttomoottoriauto olemasta mystinen siinä vaiheessa, kun ymmärrät, että bensa räjähtää sylinteritilassa? Ehkä venttiilikoneiston ymmärtäminen selittää sinulle, miten räjähdys voidaan hallita. Tekoälyn kanssa olisin taipuvainen ajattelemaan ymmärtämisen prosessin olevan samanlainen. Ei riitä, että selittää pelkästään yleisellä tasolla mustan laatikon, jossa tapahtuu matriisimatematiikkaa. Tarvitaan avata muutamia kriittisiä yksityiskohtia, jotta saamme aivomme hyväksymään, että kysymys ei ole taikuudesta. 

Tavoite ja termistö 

Koen, että olen oppinut parhaiten ymmärtämään höyrymoottorin toimintaa katsomalla dokumentteja, joiden tavoitteena on rakentaa oma höyrymoottori. Siinä on jotain luontevaa, että näkee kaiken lähtevän yksinkertaisesta toteutuksesta, joka vaatii lukuisia korjauksia tai parannuksia, ennen kuin laite toimii, lähdes välttävästi. Lukuisat korjaukset ja parannukset synnyttävät järjestelmän kompleksisuuden. Koen itse, että järjestelmät ovat monimutkaisia ei itseisarvosta, vaan siitä, että ne on saatu säädettyä toimiviksi. Esimerkiksi kahvipapujen murskauslaite voi olla periaatteessa yksinkertainen kaksiosainen laite, mutta jotta saadaan hyvää, tasalaatuista kahvipurua, tarvitaan monimutkaistuksia. Mielestäni monimutkaistuksien takana on siis optimoinnin tarve. Tällaisten järjestelmien selittämiseksi tarvitaan mielestäni selittää ensin ongelmat, mihin monimutkaistamiset yrittävät vastata. Sitten vasta ihmisen aivot suostuvat ymmärtämään, miksi järjestelmä on sellainen kuin se on. Koen, että ajattelemme, että mielestämme turhan monimutkainen, mutta hyvin mahdollisesti järjestelmän kehittäjät, oli se sitten tekoäly tai kahvimylly, ovat itsekin sen kokeneet, mutta eivät ole vain keksineet vähemmän monimutkaista tapaa saada yhtä hyvää laatua. Siksi koen, että meidän, arvon lukija, on syytä lähteä matkalle. Kokeillaan kouluttaa oma tekoäly. Ennen matkan aloittamista kohti oman tekoälymallin koulutusta, on hyvä selventää muutama termi, kuten tekoäly itse. 

Encyclopedia Britannican mukaan ”tekoäly (engl. artificial intelligence, AI) tarkoittaa digitaalisen tietokoneen tai tietokoneohjatun robotin kykyä suorittaa tehtäviä, jotka yleensä yhdistetään älykkäisiin olentoihin.” (Encyclopædia Britannica 2025) Tekoälyn määritelmä on mielestäni siis varsin lavea ja tulkinnalle altis. Tietotekniikassa tekoälyksi on nimetty ohjelmoidut järjestelmät, jotka tekevät jotain monimutkaista, kuten pelaavat shakkia (Encyclopædia Britannica 2025). Tekoäly-termin alle on myös liitetty kaikki koneoppimiseen liittyvät tekniikat. Koneoppiminen tarkoittaa taas, ehkä hieman kärjistäen, tietoteknistä järjestelmää, joka oppii datasta (Trends in Deep Learning Methodologies 2020). Eli toisin sanoen koneoppimisohjelmalle syötetään dataa, jonka perusteella ohjelma säätää toimintansa. Toimintaa ei siis ohjelmoida tarkoilla säännöillä, vaan tietokoneen säännöt muodostuvat datan perusteella. 

Kuvio1. Tekoälyn termit 

Koska aiomme tehdä tekoälyn kielimallina, tarkemmin määritettynä laajana kielimallina (Large Language Model), olemme automaattisesti koneoppimisen maailmassa, sillä laajat kielimallit ovat tekniikaltaan koneoppimista (Kuvio 1). Koska koneoppimista on ohjelma, joka oppii datasta, tarvitsemme dataa. Muuten ohjelma ei suoraan sanoen osaa yhtään mitään johtuen siitä, että tällainen koneoppimismalli tehdään datalla. 

Avataan vielä termit malli ja kielimalli sekä laaja kielimalli.  Malli-termillä kuvataan valmiiksi datan perusteella koulutettua tekoälyä. Asia voidaan tiivistää näin: Data syötetään algoritmille, joka kouluttaa datan perusteella tekoälymallin. Malli on käyttöön valmiiksi koulutettu tekoäly. Käytännössä voidaan ajatella mallin olevan käyttöön valmis tiedosto. Kielimalli taas on algoritmin ja tekstidatan avulla koulutettu valmis luonnollista kieltä tuottava tekoäly. Tyypillisesti malli antaa tuotokset tekstimuodossa. Laaja kielimalli on sama asia, mutta koulutukseen on käytetty valtavasti dataa (Merriam-Webster 2025). Tästä tyypillisesti seuraa, että mallin lopullinen koko on myös suuri. Koolla tarkoitan ihan sitä, kuinka monta megatavua valmis malli vie tilaa tietokoneen kovalevyltä. Laajan kielimallin määritelmässä siis sanotaan, että valtavasti dataa kertomatta mitään tarkkaa rajaa, milloin kielimalli muuttuu laajaksi. Itse ajattelen sen niin, että jos malli osaa tuottaa luonnollista kieltä, niin sitä varten on tarvinnut kerätä paljon dataa, jotta luonnollisuuden piste saavutetaan. Tästä seuraa, että malli, joka tuottaa ymmärrettävää tekstiä, on mielestäni automaattisesti laaja kielimalli.    

Kuvio 2. Kouluttamisen ja käyttämisen ero 

Oman tekoälymme, eli laajan kielimallin valmistaminen tarvitsee dataa, joten datan hankinta on luonnollinen alku oman mallin valmistamiselle. Prosessi menee yleistäen siten, että data syötetään valitsemaamme algoritmiin, joka kouluttaa mallia. Kielimallit koulutetaan datalla, joka toimii koulutuksessa mallina oikeille vastauksille. Algoritmi syöttää mallille jotain tekstiä ja odottaa mallin vastaavan tietyllä tavalla. Mitä enemmän väärin malli vastaa, sitä enemmän algoritmi säätää sen mallin sisällä olevia parametreja siihen suuntaan, että seuraavalla kerralla malli vastaa todennäköisemmin mallivastauksen mukaisesti. Tällaista valmiiden vastausten avulla kouluttamista kutsutaan ohjatuksi koneoppimiseksi. Malli koulutuksessa ikään kuin joutuu vastaamaan tuhansiin kokeisiin ja aina kokeiden välissä sen arvoja säädetään enemmän kohti oikeita vastauksia. Lopulta koulutuksen päätteeksi malli osaa vastata kokeeseen riittävän oikein. Kun malli on koulutettu, eli käynyt tämän algoritmikoulun läpi, sitä voidaan alkaa käyttämään (Kuvio 2). 

Kuvio 3. Generatiivisten ja diskriminatiivisten mallien ero 

Koen, että on tarpeen vielä avata termi generatiivinen tekoäly. Generatiivinen on koneoppimisen jaottelutavan toinen osa. Generatiivisen tekoälyn toinen vaihtoehto on diskriminatiivinen tekoäly. Diskriminatiivinen tekoäly tyypillisesti datan perusteella muodostaa päätösrajat (Ruamviboonsuk ym. 2024, 473–485), eli Kuvion kolme esimerkissä malli päättää kuvan pikselien pohjalta, onko kuvassa kissa tai koira. Generatiivinen tekoäly taas pyrkii, luokittelin sijasta muodostamaan uutta dataa käyttäjän syötteen perusteella (Ruamviboonsuk ym. 2024, 473–485). Kuvion kolme Esimerkin tapauksessa malli tuottaa kissakuvan käyttäjän syötteestä ”kissa”. Laaja kielimalli luokitellaan generatiiviseksi tekoälyksi, sillä malli ei pyri luokittelemaan käyttäjän syötetekstiä, vaan tuottamaan sen pohjalta uutta tekstiä. 

Data kaiken lähtökohtana 

Mielestäni ymmärtämisessä olennaista on tarjota opetushetkellä opetetulle tiedolle samalla myös konteksti. Oman tekoälyn koulutuksen oppimisessa lähestyn tätä kertomalla teoriaa kussakin kohdassa, missä kyseinen teoria on merkityksellistä. Oman mallin koulutuksen etenemme esimerkiksi siten, että datan keruun vaiheessa ei ole vielä tarpeen kertoa mallin tiedostokoon vaikutuksista. Siitä kerrotaan, jos koosta kertominen osoittautuu tarpeelliseksi. Tällä hetkellä olemme etsimässä dataa. Murehdimme muista asioista myöhemmin. 

Jatkakaamme kohti oman tekoälyn koulutusta. Sen valmistamisessa on syytä lähteä liikkeelle datasta. Data on kaiken avain kielimallin kouluttamisessa, koska kielimalli on koneoppimista, mikä taas oli, kuten aiemmin määriteltiin, ohjelma, joka oppii datasta. Ensin pitää siis hankkia dataa, mutta millaista dataa? 

Kielimallin koulutuksessa perustavanlaatuisin data pelkkää tekstiä. Tarvitsemme siis yksinkertaisimmillaan mitä tahansa valmista tekstiä. Kuten laajan kielimallin määritelmässä sanottiin, laajuus -termi tulee valtaisan datanmäärän käytöstä koulutuksessa, niin voidaan olettaa, että mitä enemmän dataa, sitä parempi malli. Kuitenkin näin ensimmäistä kertaa mallin koulutusta käsitellessä voisimme valita rajallisemman määrän dataa koulutukseen, jotta datan etsiminen sekä lataaminen olisi helpompaa. Teemme myös omasta mallista tiedostokooltaan pienemmän, jotta koulutus ei kestä liian kauan. Hyväksymme sen, että mallista ei välttämättä tule mitä vaikuttavinta. Pidämme mielessä, että parempi malli saadaan aikaiseksi skaalaamalla kaikki samat vaiheet suuremmiksi. Kerätään enemmän dataa ja suurennetaan mallin kokoa. 

Kalevala on Elias Lönnrotin keräämien kansanrunojen yhdistelmäteos (Kalevalaseura 2025). Mielestäni Kalevala on teoksena oivallinen datalähde oman mallimme koulutukseen. Syitä on useita: Kalevalaisen runomuodon oppiva tekoäly on itsessään mielenkiintoinen ajatus. Runomuodon tuottaminen vaatimattomalla tekoälyllä voi antaa anteeksi virheitä taiteellisuuden ja luovan ilmaisun oikeudella. Kalevalassa teksti on erittäin säännönmukaista rivipituudeltaan, mikä voi osoittautua hyödylliseksi. Viimeisenä ja mitä tärkeimmin, Kalevala löytyy kokonaisuudessaan internetistä ilmaiseksi. 

 Ensimmäinen runo 
Mieleni minun tekevi,
aivoni ajattelevi
lähteäni laulamahan,
saa’ani sanelemahan,
sukuvirttä suoltamahan,
lajivirttä laulamahan.
Sanat suussani sulavat,
puhe’et putoelevat,
kielelleni kerkiävät,
hampahilleni hajoovat. 

Yllä 1894 vuoden Kalevalan aloitus. Kalevalan saa internetistä itselleen useasta eri sivustosta. Hain itse sen lönnroot.net- sivulta, jossa kirja oli miellyttävän helpossa txt-formaatissa. Kirjan alussa sanotaan: ”Tämän e-kirjan on tuottanut Tapio Riikonen yhteistyössä Projekti Gutenbergin ja Suomalaisen Kirjallisuuden Seuran kanssa.” (Projekti Lönnrot 2025). Mallia kouluttaessa pitäkäämme siis mielessä kaikki valtaisaa määrää pyyteetöntä työtä tehneet ihmiset, joiden digitoimalle tai esimerkiksi Wikipedian tapauksessa, tuottamaan dataan, tekoälymallien koulutus nojaa. 

Kuvio 4. Datasets for Large Language Models (Liu ym. 2024) 

Saimme itse datan erittäin helposti. Kalevala ei enää ole tekijänoikeussuojattu ja vapaaehtoiset ovat sen digitoineen ja laittaneet verkkoon kaikille saatavaksi. Tämä helppous voi johtaa siihen, että jatkossa, uutta ja parempaa tekoälyä kouluttaessa, aliarvioimme datavaatimuksen ja sen hankkimisen helppouden. Tekoälymalleja kouluttaessa datalähteitä on useita (Kuvio 4), joista valitaan omaan koulutustavoitteisiin sopivimmat. Huomaa kuvasta valtavat tiedostokoot. Koot ovat giga- tai teratavuissa. Vastaavasti Kalevala tekstitiedostona vie 0,72 megatavua levytilaa. Tuleva mallimme koulutetaan siis niin pienellä datalla, että sitä tuskin voi kutsua laajaksi kielimalliksi, mutta periaate on sama kuin suuremmissa malleissa. 

Tekoälyn arkkitehtuuri 

Kuvio 5. Mallin koulutus 

Pieni määrä dataa sopii pienelle mallille. Pieni malli määritetään päättämällä tulevan mallin arkkitehtuuri. Helpoin tapa toteuttaa oma pieni malli on valita GPT-2-rakenne, mutta pienennettynä (Hugging Face 2025a). Kalevala-mallin arkkitehtuuri tulee olemaan itse asiassa huomattavasti pienennetty. Pienentäminen on mahdollista koneoppimisen maailmassa siten, että arkkitehtuurit koostuvat tyypillisesti toistuvista rakenteista, vähän kuin moduuleista. Arkkitehtuuria valitessa voidaan siis päättää, että meidän mallissamme tulee olemaan 4 moduulia, mutta tyypillisessä GPT-2 mallissa on 16–48 moduulia. Moduulit ovat tekniseltä termiltään transformers-blokkeja. Jokaisessa palikassa on sisällä kertoimia, joiden lukuja koulutuksessa säädetään kohdilleen, jotta malli tulee vastaamaan mahdollisimman hyvin. Koska mallin osaaminen tallentuu kertoimiin, voidaan kertoimet ajatella muistina. Kertoimen määrää käytetään kuvaamaan mallin kokoa. Ja koska moduulit sisältävät paljon kertoimia, ja moduulien määrää voi säädellä, niin siksi on olemassa saman nimisistä malleista eri versioita, kuten GPT-2-small, GPT-2-medium. Kertoimien tekninen termi on parametri, jota käytämme jatkossa tässä tekstissä. Kalevala-malli, jolle voimme antaa lempinimen GPT-K, koko verrattuna OpenAI:n malliperheeseen alla taulukossa. (Li 2025) 

Malli Parametrimäärä 
GPT-Knoin 3 miljoonaa 
GPT-2124 M – 1,5 miljardia
GPT-3175 miljardia 
GPT-4Ei julkistettu (~1 biljoona on arvio) 

GPT-3 malli on siis noin 58 000 kertaa suurempi kuin GPT-K. Mallin kokoa käytetään karkealla tasolla laadun mittarina, mutta se ei kerro koko totuutta. Pienempi malli pystyy olemaan paljonkin parempi kuin suurempi malli. Koska koulutusvaiheessa malli aloittaa elämänsä siten, että parametrit, eli kertoimet ovat satunnaisia lukuja, on malli koulutuksen alussa täysin kykenemätön mihinkään. Vasta koulutus säätää parametrit siten, että malli tuottaa koherenttia tekstiä. Mutta koulutuksen alussa olevalla mallilla on ihan yhtä monta parametria kuin koulutuksen lopussa. Koulutuksen aloittanut malli on parametreissä samankokoinen kuin koulutuksen päättänyt malli, mutta täysin kelvoton. Koulutusprosessi siis määrittää mielestäni jopa enemmän laatua kuin koko. 

Koulutuksen laatuun vaikutetaan tyypillisesti kahdella tavalla. Ensimmäinen tapa on säätää koulutuksen pituutta. Kalevalamallin kohdalla koulutus tapahtuu siten, että mallille näytetään Kalevalaa ja sen odotetaan vastaavan siten, miten Kalevalassa lukee. Jos malli vastaa väärin, mallin parametrejä säädetään enemmän siihen suuntaan, että malli vastaisi seuraavalla kerralla todennäköisemmin oikein. Kalevalaa tentataan mallilta useita kertoja ja joka kerralla malli vastaa vähän lähemmäs oikeaa. Koulutuksen pituutta säädetään siten, että valitaan määrät, kuinka usein Kalevala käydään läpi. Kouluttamattoman mallin täysi kykenemättömyys paljastaa koulutuksen pituuden merkityksen. Yhdellä Kalevalan läpikäymisellä malli on lähes yhtä huono, mutta useammalla kerralla malli alkaa lähestyä toivottua tulosta. Kuitenkaan liian usein kouluttaminenkaan ei ole toivottua. Jos mallia kouluttaa liikaa, niin se vastaa liian tarkalleen Kalevalan mukaisesti. Emme halua Kalevalaa identtisesti toistavaa mallia, vaan tekoälyn, joka vastaa kalevalatyylillä. 

Toinen tapa on muokata koulutusdataa. Voimme säätää sitä, kuinka hyvää dataa on käytetty ja kuinka paljon. Jos Kalevala olisi tuhat kertaa pidempi, mallistamme tulisi luultavasti huomattavasti parempi. Datan lisäämisen lisäksi vaa’assa painaa myös datan laatu. Kalevalamallin tapauksessa voisimme lisätä dataa esimerkiksi toisesta kirjasta. Hella Wuolijoen kirja Niskavuoren naiset lisääminen dataan voi auttaa mallia, mutta se voi myös ohjata tekoälyämme liikaa pois kalevalamitasta. 

Tokenisaatio 

Tähän mennessä olemme siis päättäneet, että mallin arkkitehtuuri on itse määritetty pieni GPT-malli, koska koulutusdatamme on vain yksi kirja, Kalevala. Olemme valmis etenemään kohti kouluttamista. Kuitenkin ennen koulutusta on tehtävä päätös: Millaisina paloina käsittelemme tekstin? Tapoja paloitella on useita. Yksi tapa on paloitella teksti sanoiksi, toinen tapa on paloitella tavuiksi ja kolmas tapa on paloitella merkeiksi. Muitakin palottelutapoja on olemassa. Paloittelua kutsutaan alan kielessä tokenisaatioksi. Käytän jatkossa termiä tokenisaatio, mutta mielestäni paloittelu olisi intuitiivisempi. Yksittäisen palan kohdalla voimme käyttää termiä token. (Mielke ym. 2021) 

Syy tutustua tokenisointiin on tarpeellista, jotta voidaan ymmärtää, mitä tekoälylle syötetään sisään ja mitä sen odotetaan antavan vastaukseksi. Ajatelkaamme, varsin tyypillisesti, tekoäly mustana laatikkona. Musta laatikko on täynnä parametreja, jotka prosessoivat syötteen ja palauttaa vastauksen. Mutta millaisen syötteen ja millaisen vastauksen? ChatGPT:ta ja muita tekoälyjä käyttäneet, voisivat kuvitella, että syöte on: 

Syöte: ”Mieleni minun tekevi”
Vastaus: ”aivoni ajattelevi” 

Tämä on melkein näin, mutta tarkemmin määritettynä käyttäjän teksti tokenisoidaan mallille valitulla paloittelutekniikalla. Tämä tokenisoitu syöte lähetetään mallille. Syötteemme, jos käytämme sanakohtaista tokenisaatiota: 

Sanakohtaisesti tokenisoitu syöte: ”Mieleni”, ”minun”, ”tekevi” 

Mutta mitä malli palauttaa? Kun malli saa syötteenä listan tokenisoitua tekstiä, malli palauttaa koulutukseensa pohjautuen listan todennäköisyyksiä sille, mikä seuraava token voisi olla todennäköisin syötteen perusteella. Tämän todennäköisyysarvion malli tekee jokaiselle tokenille, mitä koulutusdatassa esiintyy. Toisin sanoen tässä esimerkissä, missä tokenisaatiotekniikka on sanakohtainen, malli palauttaa todennäköisyyden jokaiselle sanalle, mikä koulutusaineistossa esiintyi. Näin siis kielimalli toimii. Kielimalli ennustaa todennäköisyyden kullekin tokenille, eli esimerkissä kullekin sanalle sanastossa. Palautusmuoto on siis lista numeroita, Mitä suurempi numero, sitä todennäköisempi token. (Cho ym. 2024) 

Sanakohtaisesti tokenisoitu syöte: ”Mieleni”, ”minun”, ”tekevi”
Vastaus: 0,98 0,87 0,50 0,12, 0,02 … 

Vastauksesta saadaan luettava siten, että valitaan todennäköisin token ja palautetaan se. Jos oletamme, että todennäköisin token on esimerkin tapauksessa sana ”aivoni”, niin vastaus on: 

Sanakohtaisesti tokenisoitu syöte: ”Mieleni”, ”minun”, ”tekevi”
Vastaus: ”aivoni” 

Tässä tulee kaksi havaintoa. Ensimmäisenä se, että malli ei vastaakaan lausemuodossa, vaan yhden tokenin. Mutta miten saisimme mallin vastaamana pidemmin? Toinen havainto on se, että entä jos emme valitsisikaan aina todennäköisintä vastausta? 

Ensimmäiseen havaintoon ratkaisu on pohjimmiltaan yksinkertainen. Ajamme mallin uudestaan, mutta tällä kertaa otamme viimeisimmän vastauksen mukaan mallin syötteeseen. 

Sanakohtaisesti tokenisoitu syöte: ”Mieleni”, ”minun”, ”tekevi”, ”aivoni”
Vastaus:  ”ajattelevi” 

Ajamme siis mallin useita kertoja, kunnes saamme haluamamme vastauksen. Jotta saamme vastauksen ” aivoni ajattelevi”, malli on siis ajettava kaksi kertaa. 

Toinen havainto oli, että onko tarpeen aina valita todennäköisin vastaus. Käytännössä vastaus on, että tämä ei tarvitse olla näin. Mallin tarjoamaa tulosta päinvastoin säädetään haluamaamme suuntaan valitsemalla välillä muitakin kuin pelkästään todennäköisin vastaus. Syy voi esimerkiksi olla se, että malli vastaa liian tylsästi, jos valitaan vain todennäköisin vastaus. Mutta jos valitaan välillä hieman epätodennäköisempiä tokeneita, voi mallin vastaus olla luovempi ja mielenkiintoisempi. Lisäksi tällä tavalla mallin vastaukseen lisätään mahdollisuus vastata aina hieman eri tavalla, vaikka syöte olisi sama. Esimerkissämme tämä voisi tarkoittaa seuraavia eri vastauksia: 

Sanakohtaisesti tokenisoitu syöte: ”Mieleni”, ”minun”, ”tekevi”
Vastauksia mallia ajettaessa useasti: ”näillä”, ”poloisilla”, ”Pohjan”, ”peltojen”,  … 

Sanakohtaisesti tokenisoitu syöte: ”Mieleni”, ”minun”, ”tekevi”
Vastauksia mallia ajettaessa useasti: ”yksin”, ”hyryttelevi” 

Koska malli palauttaa listan todennäköisyyksiä, meidän ei tarvitse päättää todennäköisyyksistä valitsemisen logiikkaa koulutuksen aikana, vaan voimme säätää sitä milloin vain koulutuksen jälkeen. Kielimalleissa tälle todennäköisyyksien joukosta valitsemiselle on olemassa oma erillinen todennäköisyysparametri, jota säätämällä lisätään tai vähennetään satunnaisuutta vastaukseen. Tätä parametria kutsutaan lämpötilaksi. Mitä suurempi lämpötila, sitä rohkeammin valitaan myös epätodennäköisempiä tokeneita. Mitä pienempi lämpötila, sitä enemmän valitaan vain todennäköisin tai sitä lähellä olevat tokenit. Kalevalamallia tehdessä voimme valita sopivan lämpötilan mallin koulutuksen jälkeen, joten murehtikaamme sitä vasta siinä vaiheessa. 

Tokenien vektorisointi 

Tekstin tokenisaation lisäksi on myös yksi taustalla oleva muunnosprosessi, joka on mielestäni hyvä tietää. Paloitellun tekstin tokenit muunnetaan numeroiksi, koska tietokoneet ovat ytimessään laskukoneita. (Infrasity Learning 2023) 

Jokainen yksittäinen token muunnetaan useiksi numeroiksi, ei pelkästään yhdeksi numeroksi. Eli sanakohtaisessa tokenisaatiossa, jokaisella sanalla on numeerinen esitystapa, joka koostuu useasta numerosta. Tällaista numerolistaa kutsutaan vektoriksi. Jos numeroita on esimerkiksi 24, niin tämän sanan vektori on 24-uloitteinen. Samassa mallissa kaikki tokenit esitetään yhtä pitkinä, eli jokainen token muunnetaan 24-uloitteiseksi vektoriksi. Tätä tokeneiden numeroiksi muuntamista kutsutaan vektorisoinniksi. Mallin syötteemme tarkemmin ottaen ei ole siis: 

”Mieleni”, ”minun”, ”tekevi”  

Ennen mallille tokeneiden syöttämistä, tokenit vektorisoidaan seuraavasti: 

”Mieleni” → [0,2 0,2 0,9 0,4 … ] 
”minun” → [0,7 0,4 0,4 0,9 … ] 
”tekevi” → [0,1 0,3 0,6 0,8 … ] 

Malli palauttaa vastauksena todennäköisyydet jokaiselle tuntemalleen tokenille, eli koko sanastolle. Todennäköisyydet sille, että miten todennäköisesti kyseinen token tulee syötteen jälkeen. Vastaus voi esimerkiksi olla: 

0,98 0,87 0,50 0,12, 0,02 … 

Tekoälymalli siis saa syötteenä taulukon numeroita. Mutta monen sarakkeen laajuinen taulukko? Kuinka monella numerolla token vektorisoidaan? Päätös vektorin pituudesta tehdään mallin arkkitehtuuria päätettäessä. Mitä pidempi lista numeroita edustaa tokeneita, niin sitä enemmän informaatiota mallille tarjotaan. Lyhyt vektori voi johtaa informaation menettämiseen, mutta liian pitkä vektori tekee mallista isomman. Kompaktilla koolla on etunsa. 

Hallusinaatio 

Malli siis tuottaa pidempiä tekstejä aiemmin tuottaviensa tokeneiden jatkeeksi. Tekoälymallimme saa joka suorituksessa listan tokeneita tietämättä eroa ihmisen kirjoittamien tokeneiden ja itse aiemmin tuottamien tokeneiden välillä. Tämä voi johtaa ilmiöön, joka on nimetty hallusinoinniksi. Ymmärtääksemme hallusinaatiota, voimme ajatella asiaa kahdella tavalla. Todennäköisyyksien kautta ja mielikuvaharjoittelulla. Todennäköisyyksien kautta ajatellessa miettikäämme mallin palauttamaa listaa eri tokeneiden todennäköisyyksistä. Joskus voi tulla tilanne vastaan, että todennäköisyydet johtavat kierteeseen. Kalevalan tapauksessa esimerkki voisi olla: 

Väinämöinen vanha tietäjä, 
tietäjä iänikuinen, 
iänikuinen vanha tietäjä, 
vanha tietäjä Väinämöinen, 
Väinämöinen vanha tietäjä, 
tietäjä vanha Väinämöinen, 
vanha Väinämöinen tietäjä… 

Toinen tapa ajatella hallusinaatiota on mielikuvaharjoittelu. Kuvitelkaamme olevamme kielimalleja. Voit kokeilla tätä itse. Kirjoita itsellesi jokin lause syötteeksi ja ainut asia mitä vastaat, on seuraava todennäköinen sana. Esimerkiksi jos annan itselleni lauseeksi ”Olipa kerran synkkä”, niin vastaan ”ja”. kirjoita tämä lauseen jatkeeksi. Tässä on uusi syötteemme. Keksi sitten seuraava todennäköinen token, eli mielestäsi todennäköisin sana kirjoittamaasi tekstin jatkeeksi. Mallin tulos voisi edetä esimerkiksi seuraavasti: 

Olipa kerran synkkä ja myrskyinen yö jolloin kissa päätti matkustaa kertomukseen jolla … 

Hallusinaatiolla viitataan tilanteisiin, milloin mallin palauttama teksti on järjetöntä tai faktuaalisesti virheellistä (IBM 2023). Tekemässämme mielikuvaharjoitteessa, missä kuvittelemme olevamme kielimalli, emme välitä mistään oikeudellisesta, emme kontekstista, emme vastauksemme seurauksista. Keksimme vain lennosta sanoja lauseen jatkeeksi. Tämä voi johtaa erikoisiin tuloksiin, joita myös hallusinaatioksi kutsutaan. 

Mallin pysäyttäminen 

Kerrataanpa hieman. Nyt tiedämme, että tekoälyä käytettäessä, malli ennustaa yhden tokenin kerrallaan. Jos valitsemme koulutustekstin pilkkomiseen, jota myös tokenisaatioksi kutsutaan, sanakohtaisen tekniikan niin malli palauttaa kaikkien tietämiensä sanojen todennäköisyyden olla seuraava token syötelistan jälkeen. Syötelista taas on lause, mikä mallille syötetään, tokenisoituna, Eli lausekohtaisessa tokenisaatiossa jokainen sana leikataan irti lauseesta listaksi, tokeneiksi. Jotta saamme vastauksena listan, otamme säätämämme lämpötilan perusteella jonkin mallin ehdottamista tokeneista ja lisäämme sen syötteen perään ja ajamme mallin uudelleen. Toistamalla tätä saamme niin monta tokenia, meidän tapauksessamme sanoja, mallilta kuin haluamme. 

Mutta mistä tiedämme, että milloin mallin jatkuva uudelleenajaminen tulee pysäyttää? Jos kuvittelemme käyttävämme mallia manuaalisesti siten että jokaisen uuden tuotetun tokenin jälkeen päätämme itse haluammeko jatka, niin toki tämä toimisi. Ihmisinä osaamme huomata, että nyt saimme sopivan lauseen kasaan ja voisimme helposti päättää olla jatkamatta. Käyttämämme tekoälyt eivät kuitenkaan kysy jokaisen sanan kohdalla, milloin lopettaa. Miten mallia käyttäessä saamme mallin lopettamaan suorittamisen automaattisesti? Tähän on kaksi keinoa. Ensimmäinen ja helpompi keino on, että emme pysäytä mallia, vaan annamme mallin pysähtyä vasta kun mallille ei mahdu antamaan pidempää syötettä. Toinen keino on kehittää jokin stop-merkin vastine. 

Ensimmäinen keino muodostuu mallin luonnollisista rajoista. Muistamme, että malli saa syötteenä tokenit, jotka vektorisoidaan. Malli siis saa tavallaan numerotaulukon syötteenä, jossa jokainen rivi vastaa yhtä tokenia. Jos ihmisen antama syöte on esimerkiksi kolme tokenia, niin syötämme mallille kolme riviä numeroita. Seuraavalla suorituskerralla malli saa syötteenä neljä riviä numeroita. Käyttäjän syöte ja mallin itse aiemmin generoima syöte. Kun toistamme tätä, niin numerotaulukko pitenee rivi kerrallaan. Kolme riviä, neljä riviä, 10 riviä, 35 riviä ja niin edelleen. Jossain on oltava raja? 

Tällainen raja onkin olemassa. Mallit eivät ole kykeneväisiä prosessoimaan ääretöntä määrää numeroita. Mallin syötteelle tulee sen arkkitehtuuria valitessa, asettaa jokin kokoraja. Voimme asettaa kokorajaksi esimerkiksi 128 riviä numeroita. Tällöin malli pystyy käyttäjän syöttämän, kolmen tokenin lisäksi, tuottamaan 125 uutta tokenia, kunnes raja tulee vastaan ja mallin suorittaminen pysähtyy. Esimerkissämme saisimme tuotettua siis 125 uutta kalevala-riimuista sanaa alkusyötteemme lisäksi. Tämä myös tarkoittaa sitä, että mallimme kykenee ”näkemään” maksimissaan 128 sanaa. Tätä suurempaa tekstimäärää sille ei voi syöttää suoraan. Tästä maksimisyötekoosta käytetään nimeä konteksti-ikkuna. 

Tekoälymallien konteksti-ikkunat on hyvä pitää mielessä niitä käyttäessä. Jos annamme tekoälylle syötteenä esimerkiksi kokonaisen kirjan, malli ei välttämättä ole kykeneväinen näkemään sitä kerralla, jos konteksti-ikkuna on lyhyempi kuin kirjan pituus. Yksi tyypillinen tapa mahdollistaa käyttäjälle kyky syöttää konteksti-ikkunaa pidempi teksti, vaikka malli sitä ei voisikaan kerralla nähdä, on syöttää mallille sisään vain kaikki viimeisimmät tekstit, mitkä malliin mahtuu. Sitä mukaa kun malli generoi uutta tekstiä, syötteestä poistetaan vastaavasti ”vanhimpia” tekstejä. Eli mallin konteksti-ikkuna ikään kuin liukuu syötetyn tekstin päällä kohti generoitua tekstiä. Tätä voisi verrata siihen, että lukiessamme kirjaa, peittäisimme paperilla vanhinta luettua tekstiä sitä mukaa kun etenemme tarinassa. Tällainen liukuvan konteksti-ikkunan tekniikka johtaa tilanteisiin, missä malli ei vastaa mitään faktuaalista, kun kysytään jotain mitä tapahtui tekstin alkupäässä, koska mallilla ei enää ole alkupään tekstejä syötteen mukana. Jos syötettyä tekstiä ei ole käytetty sattumoisin koulutuksessa, niin mallilla ei ole kirjan alkupäästä mitään tietoa, joten tekoäly on täysin kykenemätön vastaamaan kysymykseen oikein. 

Toinen keino pysäyttää malli on kehittää jokin stop-merkin roolia toimittava mekanismi. Liukuvan konteksti-ikkunan tapauksessa tästä tulee erittäin kriittistä, koska tällainen mekanismi voi teoriassa toimia loputtomiin. Stop-merkki tehdään lisäämällä uusi aivan erityislaatuinen token, jota koulutusaineistoissa ei valmiiksi ole. Tehkäämme itse siitä tällainen: 

<eos> 

Kehittämämme uudessa tokenissa, mikä lisätään sanastoon, on kulmasulkeiden sisällä eos-teksti, mikä on lyhenne englannin kielen lauseesta ”End Of Sequence”. Käytämme tätä esimerkkinä, koska tällainen lopetustoken on käytössä osassa kielimalleja. (Inside Machine Learning 2024) Tämä lopetustoken on tekoälylle samanlainen token kuin muutkin sanaston tokenit. Lopetustoken siis voi olla ehdotettu mallin toimesta todennäköisenä tai ei. Tämä riippuu täysin koutusdatasta. Meidän täytyy siis lisätä näitä lopetustokeneita koulutusdataan sopiviin kohtiin, jotta malli voi oppia generoimaan niitä vastaavasti sopivissa kohdissa. Kalevalan tapauksessa voisimme laittaa niitä dataan seuraavasti: 

Mieleni minun tekevi,<eos>
aivoni ajattelevi<eos>
lähteäni laulamahan,<eos>
saa’ani sanelemahan,<eos>
sukuvirttä suoltamahan,<eos>
lajivirttä laulamahan.<eos> 

Muokkaamalla Kalevala-tiedostoamme seuraavasti, oletamme, että malli tulee generoimaan suhteellisen luotettavasti lopetustokenin joka rivin jälkeen. Tällöin malli lopettaisi suhteellisen luotettavasti joka rivin päätteeksi. Koen kuitenkin, että haluaisin mallin tuottavan yhtä riviä pidemmän Kalevala-tyylisen runon. Mielestäni tälle datalle sopivampi ratkaisu olisi asettaa lopetustoken Kalevalaan jokaisen pisteen jälkeen. 

Mieleni minun tekevi,
aivoni ajattelevi
lähteäni laulamahan,
saa’ani sanelemahan,
sukuvirttä suoltamahan,
lajivirttä laulamahan.<eos> 

Nyt koulutusdata vuorostaan suosisi sen todennäköisyyttä, että malli tuottaa lopetustokenin pisteen jälkeen, mutta ei jokaisen rivinvaihdon yhteydessä. Selvennettävää on vielä, että tekoäly ei itse päätä taianomaisesti lopettamista. Mallille lopetustokenin generointi on täysin verrattavissa minkä tahansa muun tokenin generoinille. Mallin generointi pysäytetään ohjelmallisesti, jos viimeisin generoitu token on lopetustoken. 

Parempi tapa tokenisaatioon 

Käytimme esimerkkinä sanakohtaista tokenisaatiota koska sanat tuntuvat luontevilta paloilta ajatella, millä muodostaa pidempiä tekstejä. Kuitenkin kaikki, jotka ovat koskaan kielioppia opiskelleet, tietävät, että merkityksen välittämiseksi eri riitä pelkkien sanojen asettelu oikeaan järjestykseen. Sanoja myös taivutetaan. Erityisesti Suomen kielen kohdalla pelkkä sanojen asettelu ei välttämättä ole toimivin tapa luoda tekstiä. Suomen kieli on agglutinatiivinen kieli, eli merkityksiä voidaan ”liimata” sanaan käyttämättä eri sanoja (Gunner 2024). Jos tekoälymme käsittelee vain sanoja niin sanasto, mistä malli voi ainoastaan valita sopivimman tekstin jatkon, tarvitsee olla valtaisan kokoinen. Sanastossa tulee olla esimerkiksi kaikki tuoli-sanan variaatiot, kuten tuolissani, tuolissanikohan, puutuoli ja niin edelleen. Yhdyssanatkin luokitellaan sanakohtaisessa tokenisaatiossa yhdeksi tokeniksi. Suomen kielen kohdalla tämä voi tarkoittaa sitä, että mallin on vaikea oppia arvioimaan sopivinta sanaa kuhunkin lauseeseen, koska mikään yksittäinen tarkka sanamuoto tai yhdyssana ei esiinny niin usein sellaisenaan koulutusaineistossa kuin englannissa. Mitä enemmän token, eli tässä tapauksessa sana, toistuu aineistossa, sitä paremmin malli osaa yleistää sen käyttöä, eli ehdottaa tätä tokenia käytettäväksi sopivassa yhteydessä. 

Mallin käyttämät sanat muodostetaan koulutusaineistosta. Ja kuten aiemmin käsiteltiin, malli palauttaa sanaston mittaisen listan todennäköisyyksiä, eli kuinka todennäköisesti kukin token tulisi seuraavaksi. Suomen kielen kohdalla laajalla koulutusaineistolla tämä voi tarkoittaa valtavan kokoista sanastoa, mikä suoraan vaikuttaa mallin kokoon sitä kasvattavaksi, kuitenkaan laatua parantamatta. Suomen kielessähän voisi olla jopa loputon sanasto, kun yhdyssanat lasketaan yhdeksi sanaksi. Kuitenkin koulutusaineisto on rajallinen, niin voisimme ajatella, että sanaston kooksi tulisi esimerkiksi 50 000 tokenia. Tällöin malli palauttaa 50 000 pitkän numerolistan. Samalla tämä sanaston pituuden takia paisunut malli ei koostaan huolimatta ole kykeneväinen keksimään uusia yhdyssanoja koska niitä ei ole sanastossa. 

Kalevala-mallissa sanakohtaisella tokenisaatiolla sanaston koko olisi 21 004 uniikkia sanaa, kun tokenisaatiossa sanat Väinämöinen ja Väinämöisen, luokitellaan eri sanoiksi. Kalevala on 68 289 sanaa pitkä, joka kertoo, miten paljon kirjassa on uniikkeja sanoja tai taivutuksia suhteessa koko tekstin pituuteen. 

Valitkaamme mallillemme siis soveltuvampi tokenisaatiotaktiikka. Kokeillaan merkkikohtaista tokenisaatiota. Merkkikohtaisessa tokenisaatiossa kielimalli generoi yhden merkin kerrallaan. Sanastona toimii tavallaan sama kuin näppäimistön eri vaihtoehdot kirjoittaessa. Eli malli ikään kuin naputtaa kirjaimen, numeron tai erikoismerkin kerrallaan. Toinen vaihtoehto olisi ollut käyttää kielimalleissa yleisesti esiintyvää Byte Pair Encoding -tokenisaatiota (BPE), joka etäisesti näyttää tuottavan tavutuksen kaltaista tulosta, mutta tekniikkana ei ole sama asia kuin tavutus. BPE:ssa tilastollisesti aloitetaan pelkistä merkeistä. Tokenisaatioprosessissa merkeistä muodostetaan yhdistelmiä, joiden yleisyyttä koulutusaineistossa testataan. Jos merkkiyhdistelmä on yleisesti esiintyvä, se lisätään sanastoon jo siellä olevien perusmerkkien lisäksi. (Oduguwadamilola 2023) 

Valtsimme merkkikohtaisen tokenisaation, koska tämä voi olla luonteva niin pienen koulutusaineiston, kuin Kalevalan, kanssa. Kalevala on runomuotoista ja voi sisältää taiteellista vapautta sanojen taivuttamisessa. Merkkikohtainen tokanenisaatio voi tarjota samaa kykyä luovuuteen. Riskinä tässä on se, että malli ei käytä meille kielessä esiintyviä luontevia osia, kuten juurimuotoja. Merkkikohtaisen tokenisaation mallimme voi esimerkkinä kirjoittaa Vänämöisen nimen väärin. Toisaalta tämä voi olla mielenkiintoista. Jatkakaamme merkkikohtaisella tokenisaatiolla. Kalevalan tapauksessa tämä tarkoittaa sitä, että saamme pienennettyä tunnettujen tokenien pituudeksi sanakohtaisen tokenisaation 21 004 tokenista Merkkikohtaiseen 55 tokeniin. 

!”’*,-.:;?AEHIJKLMNOPRSTUVYadeghijklmnoprstuvyÄäö 

Yllä kaikki Kalevala-mallin tuntemat tokenit, eli kaikki uniikit merkit, mitä Kalevalassa käytetään. Tokenien listaa kutsutaan ehkä hieman hämmentävästi sanastoksi, vaikka se koostuu merkeistä. Toinen nimi voisi olla aakkoset, mutta tokenit sisältävät myös erikoismerkkejä, joten ymmärrän itse, miksi sanasto-termi on käytössä aakkosten (myös harhaanjohtava) tai tokenilistan (erittäin kankea ilmaisu teknisellä jargonilla) sijasta. 

Merkkikohtaisen tokenisaation käyttö aiheuttaa mielenkiintoisesti myös uuden lieveilmiön. Jos mallimme konteksti-ikkuna on 128 tokenia, malli kykenee 128 sanan sijasta vastaanottamaan vain merkkiä. 128 merkkiä voi olla esimerkiksi 20 sanaa. Jos siis syötämme mallillemme 15 sanaa käyttäjän toimesta, malli pystyy ilman liukuvaa konteksti-ikkunaa generoimaan vain viisi uutta sanaa ennen kuin konteksti-ikkunan täyttäminen pysäyttää suorittamisen. Merkkikohtaisen tokenisaation käyttö siis voi vaatia konteksti-ikkunan kasvattamista esimerkiksi 256 merkkiin. Tarvittaessa tätäkin voidaan suurentaa. 

Kalevalamallin arkkitehtuuri 

Lopultakin tiedämme riittävästi, että voimme muodostaa mallin arkkitehtuurin. Osaamme määrittää Kalevala GPT-K -mallimme tokenisaatiotekniikan, konteksti-ikkunan koon ja meillä on alustava käsitys siitä, että mallin kokoa voidaan säätää asettamalla moduulien kokoa. Meillä on myös käsitys siitä, että tokeneita numeerisessa muodossa esittävien numerolistojen, eli vektorien pituutta voidaan säätää ja se vaikuttaa suorassa suhteessa mallin kokoon. Voisimme siirtyä kokeilemaan kielimallin koulutusta seuraavilla parametreillä: 

Tokenisaatio: Merkkikohtainen tokenisaatio 
Konteksti-ikkuna: 256 tokenia, eli merkkiä 
Parametrien määrä: Noin 3 miljoonaa 
Token-vektorin pituus: 256 numeroa 

Mallin lämpötila, eli karkeasti ajatellen luovuus, voidaan säätää kouluttamisen jälkeen. Datana käytämme Kalevalaa, joten nyt meillä on mallin arkkitehtuuri sekä koulutusdata valmiina. Emme lisää Kalevalaan lopetustokeneita. Aloittakaamme yksinkertaisesta, eli mallista, joka jatkaa generointia, kunnes konteksti-ikkuna on täynnä. 

Kielimallin koulutuksesssa käydään tarvittaessa koulusaineisto useaan kertaan läpi. Eli vertauskuvallisesti tenttaamme mallia koko aineiston mitalla ja sitä mukaa hienosäädämme mallin parametreja. Kalevala-datan kanssa on oletettavaa, että koulutuksessa tarvitsee koko Kalevala käydä läpi useaan kertaan. Kielimallien koulutuksessa tällaista datasetin kokonaan läpikäymistä sanotaan Epochiksi. Olemme melkein valmiita kouluttamaan mallin, mutta tarvitsemme vielä tietokoneen kouluttamista varten. 

Kouluttamisen laitteistovaatimuksista 

Menemättä tarkemmin matematiikkaan kielimallin sisällä, voin kuitenkin todeta, että se koostuu luvuista, joita säädetään koulutuksessa. Kielimallia käyttäessä ne muuntavat käyttäjän syötteen tokenien todennäköisyyslistaksi. Matemaattisen operaationa mallin sisällä koulutuksessa sekä käytössä on paljon kertomista. Numerotaulukoiden kertomista keskenään noin laajasti yleistäen. (Vaswani ym. 2017) Tällaisessa matematiikassa nopeudessa pärjää erityisesti tietokoneen näytönohjain. Näytönohjain, eli tietokoneen osa, joka piirtää kuvan ruudulle. Näytönohjain laskee 3D-pelien maailman ruudulle, on luotu nopeaan ja mikä olennaisinta, valtaisaan määrään rinnakkaisten kertolaskujen suorittamiseen. 3D-peliä pelatessa näytönohjain laskee 3D-pelimaailmasta 2D-kuvan pelaajan ruudulle kymmeniä kertoja sekunnissa jokaisen pikselin kohdalle. Noin miljoonan pikselin laskeminen joka kerta noin joka sadas sekunninosa vaatii valtaisan määrän nopeaa kertolaskukykyä. Näytönohjain tekee tämän suurella määrällä rinnakkaisia laskimia, jotka ovat erikoistuneet tällaiseen yksinkertaisen matematiikan nopeaan suorittamiseen. 

Entä prosessori? Yleistäen voitaisiin ajatella prosessorin, joka normaalisti mielletään tietokoneen viralliseksi laskimeksi, olevan yleislaskin, joka kykenee sekä yksinkertaiseen kertolaskuun, että myös paljon monimutkaisimpiin operaatioihin. Prosessori siis on tavallaan hyvä suorittamaan monia asioita, mutta näytönohjaimeen verrattuna paljon hitaampi, kun lasketaan suuri määrä yksinkertaisia laskuja. Näytönohjain on erikoistunut tällaiseen nopeaan yksinkertaisten laskujen laskemiseen pelikäyttöön. Nämä ominaisuudet tekevät näytönohjaimesta prosessoria paljon paremman myös kielimallin koulutuksessa, mikä myös koostuu, suurestä määrää yksinkertaisia laskuoperaatioita. Voidaan sanoa, että 3D-pelaaminen on suuresti tukenut tekoälyn nousua. Näytönohjaimien kehittyminen on tukenut rinnakkaislaskentaan erikoistuneen laskentayksikön kehittymistä ja yleistymistä. (Parvini 2024) 

Voisimme kouluttaa mallimme prosessorilla, mutta käytämme näytönohjainta, koska se mahdollistaa kouluttamisen kymmeniä tai jopa satoja kertaa nopeammin. Tällä on merkitystä, jos koulutus nopealla näytönohjaimellakin kestäisi 10 tuntia, niin prosessorilla se voi kestää kymmeniä päiviä. Mallin koulutukseen haluamme siis näytönohjaimen. Hyvältä näytönohjaimelta kaipaamme kahta asiaa: Nopeutta ja suurta näytönohjaimen muistin kokoa. Jos näytönohjain on kaksi kertaa nopeampi kuin toinen näytönohjain, voidaan arvioida, että saamme 10 tunnin koulutuksen viiteen tuntiin. Vielä tärkeämpää on riittävä määrä näytönohjaimen omaa muistia (VRAM). Syy siihen on se, että koko kielimalli tyypillisesti ladataan näytönohjaimen muistiin koulutuksen ajaksi, jotta sen parametreja on nopein säätää koulutuksessa. Näytönohjaimen laskuyksikkö hakee parametrit omasta muististaan ja tallentaa ne sinne takaisin. Koska kielimallit voivat olla niin isoja, eli sisältää valtavan määrän parametreja, niin tarvitaan myös paljon näytönohjaimen omaa muistia. (Choi & Lee 2021, 10377) 

On olemassa tapoja paloitella laskentaa, mutta yleisesti ottaen mitä enemmän näytönohjainmuistia, sitä isompia malleja voidaan kouluttaa siedettävässä ajassa. Onneksi meidän GPT-K Kalevalamalli on sen verran pieni, että vanhempikin pelinäytönohjain pitäisi riittää. Näytönohjaimista kiinnostuneille kerrottakoon, että koulutus tullaan tekemään Nvidia Geforce GTX 1080 näytönohjaimella, jossa on kahdeksan gigatavua näytönohjainmuistia. 

Kalevalamallin koulutus 

Nyt meillä on data, mallin arkkitehtuuri sekä tietokone.  Koulutetaan ensin Kalevala kerran, eli koulutus tehdään yhdellä epochilla. Koulutus kestää yhdeksän sekuntia ja mallin tiedostokooksi tulee 12,3MB. Mallia tuskin voidaan kutsua laajaksi kielimalliksi. Näytönohjainmuistia koulutus vei alle kaksi gigatavua. Käytetyssä näytönohjaimessa oli kahdeksan gigatavua muistia, joten tilaa olisi vielä kouluttaa suurempikin malli. Asetetaan tokenien valinnan lämpötilaksi sopivasti vaihtelevuutta ja kokeillaan mallia seuraavasti: 

Syöte: Lemminkäinen sanoiksi laittoi, 

Malli generoima teksti syötteen kanssa
Lemminkäinen sanoiksi laittoi, 
ksauhenisiene kosaisene vehessiken, 
ta, 
tat lennsuuksin vanehen pituuta ken kan sallennello käällin panäin i kuoiti n t ksuoselen selauorkona nilin kanemivotanä i, 
läi, llä loikoinätai t koineni si, 
a, 
vene selena, 
htanakänel 

Tulos on ei vaikuta, mutta on lupaava. Merkkikaaoksen keskeltä on rakentumassa jotain ymmärrettävää. Jatketaan siis koulutusta. Hypätään suoraan 40 epochiin, eli koulutetaan Kalevala 40 kertaa. Mallin koko ei tästä muutu, sillä koulutus vain säätää parametrejä. Tällä kertaa koulutus kesti kuusi minuuttia ja 21 sekuntia. Syötetään sama aloitusteksti. 

Syöte: Lemminkäinen sanoiksi laittoi, 

Mallin generoima teksti syötteen kanssa

Lemminkäinen sanoiksi laittoi, 
sukahutti Suomen sortti. 
Kävin kielti kesäisen: 
minne polois miehen miekka 
suuren pahan pahalle. 
Veti suuri notkemahan, 
ve’en päästä paljoinka 
päästä palkkalaisen palan, 
sanan virkkoi, noin nimesi: 
”En lie tämän tänne poika, 

Voimme todeta, että olemme onnistuneesti kouluttaneet oman Kalevalakielimallin GPT-K. Kun ottaa huomioon, että koulutusdata muodostuu vain yhdestä kirjasta sekä mallin koko on erittäin pieni, voimme olla tyytyväisiä mallin suorituskykyyn. Kaikki, mitä malli ”tietää” on pelkkä Kalevala. Siihen suhteuttaen, koen että odotukset eivät tulekaan olla liian korkealla. 

Lämpötilan vaikutus 

Valmiiksi koulutetulla mallilla voimme kokeilla, miten lämpötilan säätö generoinnissa vaikuttaa tulokseen. Kokeillaan ensin arvolla, mikä tarkoittaa todella alhaista lämpötilaa. Malli siis ei suuremmin vaihda pois todennäköisimmästä seuraavasta tokenista. 

Syöte: Mieleni minun tekevi, 

Mallin generoima teksti syötteen kanssa: 
Mieleni minun tekevi, 
kanssa kaunihin kaotti: 
”Oi Ukko, ylijumala! 
Tuota tänne tultuani, 
kanna kaiken karjani! 
Kun ei tuota tultuani, 
kun ei tuotane tulevani, 
kun ei kuulu kumottavani, 
kun ei kuulu kumottavani, 
kun ei kuulu kumottavani, 
kaunis kaunis katso 

Vähäinen joustavuus todennäköisen tokenin valinnassa, eli lämpötila vaikuttaa malliin siten, että valitaan lähes aina pelkästään todennäköisin token. Malli ei jatkanutkaan Kalevalan alkurunoa, mutta alkoi toistamaan itseään. Kaiken kaikkiaan tulos ei ollut toivotun kaltainen. Tällaisten vastausten takia kielimalleissa ei aina valita pelkästään todennäköisintä, vaan käytetään suurempaa lämpötila-arvoa. Tässä sama syöte, mutta suurempi lämpötila: 

Syöte: Mieleni minun tekevi, 

Mallin generoima teksti syötteen kanssa
Mieleni minun tekevi, 
ajoi tähän pääsnyttävi. 
Siitä kohta kolmannella 
tuuli tungeiksi tulevi, 
vaimo valkeavi: 
”Oi Ukko, ylijumala! 
Tule, täällä tästämä tarvo, 
tämän inhalla iällä, 
kanna on kaunis katosi 
viittä veen Lemminkäisen! 
Jos ei suuri suuri piekkana 

Kalevala-mallissa suurempi lämpötila mielestäni auttaa tuottamaan parempaa runomittaa. Hieman leikkisästi voisi todeta, että voimme nyt kerätä itse kansanrunoja tietokoneellisesti, ilman pitkää vaellusta Karjalan kunnaille. 

Pohdinta 

Väitin ennen matkamme aloittamista, että poistaaksemme mystiikka tekoälyn ympäriltä on tarpeellista yrittää ymmärtää ja tuntea tekniikkaa tekoälyn takana. Koin, että mieluisin tapa oppia tuntemaan riittävällä tasolla tekoälyä on edetä vaihe kerrallaan ja kuten koulussa itse sähkömoottoria rakentaessa, kokeilla tehdä oma pieni kielimalli. Vaikka emme muistakaan sähkömoottorista, miten virta tarkalleen saikaan sen pyörimisliikkeen aikaiseksi, meillä on muistikuva, että siihen liittyi magneettikenttä ja koemme tällainen moottori ei ole taianomainen, outo tai pelottava. Teimmehän sellaisen itse lapsena. Ei sellainen ole enää mystistä. 

Matkan päämääränä oli kasata oma kielimalli valmiista paloista ja saada se tuottamaan tekstiä. Tällaisen tekstigeneraattorin rakentaminen ei ole lainkaan mahdotonta ja mystistä. Tarvitsimme tämän tuloksen saavuttamiseksi tietokoneen, dataa ja muutaman asetuksen säätämisen. 

Suurempi työ alkaisi tästä. Kuten koulussa kootun sähkömoottorin tapauksessa, matkaa siitä on sähköautossa käytettävään moottoriin, mutta periaate on sama. Suuri työ kielimallin valmistamisessa samalle tasolle kuin kaupalliset kielimallit ovat tällä hetkellä, on mielestäni verrattavissa samaan, kuin aloittaa sähköauton sähkömoottoreita valmistavaksi yrittäjäksi. Periaate voi olla sama, mutta mallin huomattava parannus tarvitsee aikaa, osaamista ja rahaa. Tarvitaan suuri määrä optimointia, jotta mallista saadaan tuotantokelpoinen. Optimointi on kuitenkin mielestäni se monimutkaisuuden pääsyy taustalla, ei niinkään perusperiaate. Jos toteuttaa vaikka sata optimointia kielimallille vuoden aikana, niin onhan sen toiminnan selittäminen vaikeampaa ilman historiaa siitä, miksi kukin optimointi tehtiin. Monimutkaiseen mielestäni siis ajaudutaan. 

Voimme myös edetä kielimallin koulutuksessa kotonakin, käyttäen vaikka lasten pelikoneen hienoa näytönohjainta. Tästä eteenpäin seuraavana tekona voisimme tyhjästä kouluttamisen sijaan ladata internetistä muiden harrastajien valmiiksi kouluttamia tai suurten yritysten avoimeen käyttöön vapauttamia malleja. Saisimme siis internetistä mallitiedoston, jossa on arkkitehtuuri valmiiksi päätettynä ja mikä tärkeintä, mallin parametrit ovat jo koulutettu jollain valtaisalla aineistolla siten, että malli tuottaa jo kelvollista tekstiä. Tällaista mallia voidaan käyttää koulutuksen pohjana, jolloin meidän ei tarvitse kuin lisäkouluttaa sillä datalla, mitä malli ei vielä hallitse. Tällaista tapaa jatkaa kouluttamista koulutetun mallin päälle, kutsutaan hienosäädöksi (fine tuning). (Hugging Face 2025b) 

Toinen oppimisen ja kokeilun suunta voisi olla koulutta Kalevala-malli vastaamaan chat-tyylisesti kysymykseen, eikä vain jatkamaan sille syötettyä tekstiä. Tällöin meidän pitäisi hankkia kysymys-vastauspari-data ja oppia käyttämään muitakin erityistokeneita kuin lopetustoken <eos>. Toisaalta voisimme kokeilla käyttää jo tällaiseen kysymys-vastaus-periaatteeseen koulutettua mallia pohjalla ja opettaa sille Kalevalaa suoraan sellaisenaan lähes täsmälleen kuin tässä tekstissä. Malli tuskin unohtaa sille aiemmin opetettua chat-tyyliä. Parametrejahan vain säädetään kohti Kalevala-tyyliä. 

Mallin koulutus itse tarjoaa rajapinnan eettiseen sekä ympäristölliseen pohdintaan. Kalevamallin hieman yli kuuden minuutin koulutuksen aikana näytönohjain laski noin 80 % teholla. Nvidia GTX 1080 käyttää arviolta 180W sähköä käydessään täydellä teholla ja huomioitavaa on, että tämä malli on kooltaan hyvin pieni. Kouluttaminen vie sähköä. Eettisestä näkökulmasta taas lukija on voinut ehkä huomata, että jos koulutamme Kalevalasta oman kielimallin, voisimme samoin kouluttaa kielimallin vihapuheeseen tai vaikka kiusaamiseen. Tällaista koulutusdataa internetistä on saatavilla. Tarkempi ympäristövaikutuksen ja eettisen pohdinnan katselmointi vaatisi oman erillisen katsauksen, mutta mielestäni on hyvä ymmärtää mallin tekniikkaa ja kouluttamisprosessia, jotta voi lähestyä keskustelua etiikasta ja ympäristöystävällisyydestä järkevästi.  

Tekoäly on mielestäni paradoksaalista. Tekoälyn varoitetaan tuhoavan sivilisaatiomme yhtä aikaa, kun teknologia koetaan käänteentekevänä ja meillä on moraalinen imperatiivi toteuttaa tekniikan hyvä lupaukset. (Harari 2024, 38) Samalla tekoäly on myös konkreettinen tekniikka, laite, Kalevalaa suoltava, tokeneita arpova kielimalli. Lönnrotille meidän kielimallimme voisi vaikuttaa liki taikuudelta, mutta meille, jos yhtään onnistuin, tämän matkan jälkeen jopa lievästi banaalilta. Koen itse, että tekoäly on näitä kaikkea yhtä aikaa, aivan kuten auto. Auto voi olla tylsä rautamöykky tai ihmiskuntaa muuttava yksilönvapauden perusta. Tämä on juuri se, miksi itse koen, että tekoäly on hauskinta tekniikkaa tietotekniikassa vuosikymmeniin. Voimme toki olla etenemässä kohti jotain kyseenalaista tulevaisuutta. Riittääkö, että pidämme mielessä kultaisen säännön, että päämäärä ei kuitenkaan oikeuta keinoja. 

Taipumus luoda voimakkaita asioita, joista juontuu tahattomia seurauksia, ei alkanut höyrykoneen tai tekoälyn vaan uskonnon keksimisestä. Profeetat ja teologit ovat toistuvasti mananneet esiin väkeviä henkiä, joiden piti tuoda rakkautta ja iloa, mutta jotka silloin tällöin peittivätkin maailman vereen.

(Harari 2024, 11)

Hankkeesta 

Kirjoitus on toteutettu hankkeessa Tekoäly matkailun myynti- ja markkinointiprosessien tukena. Hankkeen tavoitteena on tuottaa syvällistä ymmärrystä tekoälyn vaikutuksista matkailualan innovaatioihin ja asiakaskokemukseen. Toimilla edesautetaan matkailuyrittäjiä ja -toimijoita hyödyntämään tekoälyteknologioita rohkeammin myynnissä ja markkinoinnissa, perustuen käytännössä testattuihin ratkaisuihin. 

Aikataulu 1.9.2024 – 31.3.2027 

Budjetti 454 474 € 

Lähteet 

AP News. 2023. How Nvidia became an AI giant. Kirj. Parvini, S. Viitattu 20.5.2025. https://apnews.com/article/nvidia-artificial-intelligence-ai-gaming-1acc94ebbe6a59f728742ca20b3532cf 

Choi, H. & Lee, J. 2021. Efficient use of GPU memory for large-scale deep learning model training. Applied Sciences, 11(21), 10377. Viitattu 20.5.2025. https://doi.org/10.3390/app112110377 

Cho, A., Kim, G. C., Karpekov, A., Helbling, A., Wang, Z. J., Lee, S., Hoover, B. & Chau, D. H. 2024. Transformer Explainer: Interactive Learning of Text-Generative Models. Viitattu 20.5.2025. https://doi.org/10.48550/arXiv.2408.04619 

Encyclopædia Britannica. 2025. Artificial Intelligence. Viitattu 20.5.2025. https://www.britannica.com/technology/artificial-intelligence 

Foote, K. D. 2023. A Brief History of Large Language Models. Viitattu 20.5.2025. https://www.dataversity.net/a-brief-history-of-large-language-models/ 

Gunner, J. 2024. What Is an Agglutinative Language? Definition and 5 Examples. Viitattu 20.5.2025. https://blog.rosettastone.com/agglutinative-language/ 

Harari, Y. N. 2024. Tietoverkkojen lyhyt historia. Suom. Tapani Kilpeläinen. Helsinki: Bazar. 

Hämeen Sanomat. 2025. [Artikkelin otsikko]. Viitattu 20.5.2025. https://www.hameensanomat.fi/paikalliset/4840094 

Hugging Face. 2025a. OpenAI GPT2. Viitattu 20.5.2025. https://huggingface.co/docs/transformers/en/model_doc/gpt2 

Hugging Face. 2025b. Fine-tuning. Viitattu 20.5.2025. https://huggingface.co/docs/transformers/en/training 

IBM. 2023. What Are AI Hallucinations? Viitattu 20.5.2025. https://www.ibm.com/think/topics/ai-hallucinations 

Infrasity Learning. 2023. Demystifying Large Language Models and Word Vectors. Viitattu 20.5.2025. https://dev.to/infrasity-learning/demystifying-large-language-model-word-vectors-ai-297n 

Inside Machine Learning. 2024. Special Tokens for Finetuning LLMs. Viitattu 20.5.2025. https://inside-machinelearning.com/en/special-tokens/ 

Kalevalaseura. 2025. Mikä on Kalevala? Viitattu 20.5.2025. https://kalevalaseura.fi/mika-on-kalevala/ 

Ladd, B. 2008. Autophobia: Love and Hate in the Automotive Age. Chicago: University of Chicago Press. Viitattu 20.5.2025. https://press.uchicago.edu/Misc/Chicago/467412.html 

Li, S. 2025. Understanding the Evolution of ChatGPT: Part 2 — GPT-2 and GPT-3. Viitattu 20.5.2025. https://medium.com/data-science/understanding-the-evolution-of-chatgpt-part-2-gpt-2-and-gpt-3-77a01ed934c5 

Liu, Y., Cao, J., Liu, C., Ding, K. & Jin, L. 2024. Datasets for Large Language Models: A Comprehensive Survey. Viitattu 20.5.2025. https://arxiv.org/abs/2402.18041 

Merriam-Webster. 2025. Large language model. Viitattu 20.5.2025. https://www.merriam-webster.com/dictionary/large%20language%20model 

Mielke, S. J., Alyafeai, Z., Salesky, E., Raffel, C., Dey, M., Gallé, M., Raja, A., Si, C., Lee, W. Y., Sagot, B. & Tan, S. 2021. Between Words and Characters: A Brief History of Open-Vocabulary Modeling and Tokenization in NLP. Viitattu 20.5.2025. https://arxiv.org/abs/2112.10508 

New Scientist. 2025. Clarke’s three laws. Viitattu 20.5.2025. https://www.newscientist.com/definition/clarkes-three-laws/ 

Oduguwadamilola. 2023. Byte-Pair Encoding, The Tokenization Algorithm Powering Large Language Models. Viitattu 20.5.2025. https://medium.com/@oduguwadamilola40/byte-pair-encoding-the-tokenization-algorithm-powering-large-language-models-5055fbdc0153 

Projekti Lönnrot. 2025. Projekti Lönnrot. Viitattu 20.5.2025. http://www.lonnrot.net/ 

Ruamviboonsuk, P., Arjkongharn, N., Vongsa, N., Pakaymaskul, P. & Kaothanthong, N. 2024. Discriminative, generative artificial intelligence, and foundation models in retina imaging. Taiwan Journal of Ophthalmology, 14(4), 473–485. Viitattu 20.5.2025. https://journals.lww.com/tjop/fulltext/2024/14040/discriminative,_generative_artificial.3.aspx 

Trends in Deep Learning Methodologies. 2020. Trends in Deep Learning Methodologies. Viitattu 20.5.2025. https://www.sciencedirect.com/book/9780128222263/trends-in-deep-learning-methodologies 

Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., Kaiser, Ł. & Polosukhin, I. 2017. Attention is all you need. Viitattu 25.5.2025. https://arxiv.org/abs/1706.03762 

Veteran Car Run. 2025. History of the Run. Viitattu 20.5.2025. https://www.veterancarrun.com/history-of-the-run