Me Onervalla kehitämme Onerva Bottia eli keskustelevaa tekoälyä vanhushoivaan. Tällä kertaa pääset itse kokeilemaan tekoälyn kanssa juttelua! Teemme suomea ymmärtävän tekoälyn alusta loppuun ja upotamme sen verkkosivuun. Valitettavasti et pääse juttelemaan tekoälyn kanssa sote-politiikasta, mutta se ymmärtää, onko vastaus kysymykseen “Mites tänään sujuu?” positiivinen vai negatiivinen. Tai no, kuten tulet huomaamaan… Ymmärtää, jos sille on opetettu tarpeeksi samantyyllisiä lauseita.
Etkö jaksa lukea blogitekstiä, vaan haluat heti kokeilemaan? Mene silloin tänne, ja kokeile seuraavia lauseita sekä muutamaa omaa.
“Ihan tosi hyvin!” “No, ei kyllä mene kovin hyvin.” “Terve terve, ei tässä kovin kivasti mene tai oikeastaan ihan surkeasti.” “Huomenta päivää. Kyllä tässä pärjäilen ihan kohtalaisesti, tai no, itseasiassa melko kehnosti.” “No moi! Voin kyllä aivan surkeasti... paitsi että oikeasti sujuu kyllä oikein mainiosti.”
Älä kuitenkaan ylläty, jos tekoäly tulkitsee jonkin lauseen väärin, vaan lue eteenpäin, niin ymmärrät miksi.
Itseasiassa on hämmästyttävää, miten hyvin tekoäly ymmärtää eri vastauksia ottaen huomioon käytetyn neuroverkon koon, koulutusaineiston laadun sekä sen, että tekoäly toimii selaimessa – siis ilman pilveä tai palvelinta!
Jos et ole vielä lukenut blogisarjan aiempia osia (osa 1, osa 2, osa 3, osa 4), kannattaa tutustua ennen kuin jatkat eteenpäin, koska tulemme viittaamaan niihin alla. Rakennamme siis tällä kertaa luonnollista kieltä ymmärtävän tekoälyn (osa 1) luomalla aluksi koulutusaineiston (osa 4), sitten muutamme lauseet sanavektoreiksi (osa 2) ja lopulta rakennamme neuroverkon, jolla on työmuisti (osa 3).
Blogin osassa 4 keskustelimme siitä, että teköälyn kouluttamisessa laadukkaan koulutusaineiston hankkiminen on usein työlästä. Tarvitaan valtavia määriä tekstiesimerkkejä, jotka ihminen on tulkinnut tekoälylle sopivaksi koulutusdataksi. Yksi tapa helpottaa tätä prosessia on automatisoida se osittain antamalla koneen korvata sanoja ja lausahduksia niiden synonyymeillä tai antonyymeillä. Tällä tavoin voidaan luoda uutta koulutusaineistoa alkuperäisestä datasta. Samalla voidaan tasapainottaa eri tyyppisten vastausten jakaumaa. Harvinaisia vastaustyyppejä luodaan paljon lisää, kun taas yleisiä vastaustyyppejä vain vähän tai jopa karsitaan.
Bang! Ensimmäinen python-koodin pätkä, jossa määritellään lausetyypit (sentence_types).
def generate_sentence(self): sentence_types = [ "pos", "neg", "not_pos", "not_neg", "pos pos", "pos neg", ..., "not_pos pos", ..., "not_neg not_pos" ]
Tyyppi “pos” vastaa positiivista lausetta, esimerkiksi “hyvin menee”. Tyyppi “not_pos” on negatiivinen lause, jossa positiivinen ilmaus on kääntynyt negatiiviseksi “ei”-sanan vaikutuksesta, esimerkiksi “ei hyvin mene”. Yhdistelmä “not_pos pos” tarkoittaa näiden kahden lausetyypin yhdistelmää, jossa jälkimmäinen lause jää voimaan, esimerkiksi “ei hyvin mene, tai no, ihan kohtalaisesti”. Tyyppi “neg” on taas negatiivinen lause, esimerkiksi “huonosti mene”. Loput voitkin näistä loogisesti päätellä.
Joka kerta kun luodaan uusi lause, valitaan yksi näistä tyypeistä satunnaisesti:
sentence_type = np.random.choice(sentence_types)
Oletetaan, että tällä kertaa valittiin “pos”-tyypin lause.
def generate_positive(self): opt1 = [ "", "", "", "", "", "ihan", "melko", "oikein", "aika", "tosi", "ihan melko", "ihan kyllä", "kyllä tässä", "kyllä tässä ihan" ] adj = [ "hyvin", "mainiosti", "loistavasti", "oksti", "kohtalaisesti", "kivasti" ]
Positiivisen lauseen ydin on adjektiivi “adj”, joka on lista positiivisia synonyymejä, esimerkiksi “hyvin” ja “loistavasti”. Lisäksi on määritelty mahdollisia lisäsanoja “opt1”, jotka voivat esiintyä ennen adjektiivia. Jokaisella listan vaihtoehdolla on yhtä suuri mahdollisuus tulla valituksi, joten “ihan” tai “kyllä tässä ihan” esiintyvät 1/19 todennäköisyydellä ennen adjektiivia. Viisi tyhjää (“”) tarkoittavat, että on 5/19 todennäköisyys sille, että ylimääräistä sanaa ei lisätä adjektiivin eteen.
Tämä on nyt tietysti hyvin yksinkertaistettu versio synonyymien ja lisäsanojen luomisesta. Tässä on tavoiteltu luettavuutta tehokkuuden sijaan. Todellisuudessa kattavammat vaihtoehdot luodaan automaattisesti sääntöjen avulla, joissa sanoja yhdistellään ja korvataan eri todennäköisyyksin. Periaate on kuitenkin sama.
Lauseeseen tarvitaan myös (mahdollinen) verbi “verb” sekä lisäsanat “opt2” ja “opt3”, jonka jälkeen päästään luomaan positiivinen lause kahdesta vaihtoehtoisesta sanajärjestyksestä:
return np.random.choice([ opt1 + ' ' + adj + ' ' + opt2 + ' ' + verb + ' ' + opt3, opt2 + ' ' + verb + ' ' + opt1 + ' ' + adj + ' ' + opt3 ])
Tuloksena on esimerkiksi “ihan hyvin tässä menee”.
Vastaavasti kuin yllä kuvattu “pos” -tyypin lause, voidaan luoda myös muut lausetyypit “neg”, “not_pos” ja “not_neg”. Jos lauseen tyyppi on yhdistelmä “pos neg”, luodaan positiivinen ja negatiivinen lause, jotka yhdistetään esimerkiksi “tai no” lausahduksella yhdistelmälauseeksi “ihan hyvin menee tai no oikeastaan aika kehnosti”.
Nyt voimme luoda helposti laajan koulutusaineiston, esimerkiksi 10 000 lausetta, jonka käsin tuottamiseen olisi mennyt ikä ja terveys.
Läheskään kaikki luodut lauseet eivät ole hyvää suomenkieltä, esimerkiksi:
tosi loistavasti nyt kohtalaisesti nyt paitsi kovin surkeasti terve oksti kai tässä paitsi en pärjäile kyllä tässä huonosti no moi ei huonosti tänään terve en pärjäile kovinkaan surkeasti
Mutta lauseet ovat ymmärrettäviä, joka on tärkeintä tekoälyn koulutuksen kannalta. Tavoitehan on, että tekoäly osaa tulkita myös epätäydellisiä lauseita ja tilanteita, joissa puheesta tekstiksi -käännös ei ole onnistunut täydellisesti.
Seuraavaksi muutamme lauseet neuroverkolle sopivaan muotoon. Aluksi luomme sanavektorit (ks. osa 2):
word_to_index_map = { '': 0 } index_to_word_map = { 0: '' } next_word_index = 1 for sentence in sentences: words = sentence.split() for word in words: if not word in word_to_index_map: word_to_index_map[word] = next_word_index index_to_word_map[next_word_index] = word next_word_index += 1
Eli käymme kaikkien lauseiden kaikki sanat läpi ja lisäämme ne tietokantaan “word_to_index_map”. Tietokanta sisältää sanan ja sitä vastaavan sanavektorin (one-hot word vector). Seuraavaksi muunnamme lauseet jonoiksi sanavektoreita:
def sentence_to_wordvecs(sentence): words = sentence.split() indexed_sentence = [] for word in words: if word in word_to_index_map: indexed_sentence.append(word_to_index_map[word]) else: indexed_sentence.append(0) return np.array(indexed_sentence)
Nyt lauseemme ovat valmiita syötettäväksi neuroverkolle.
Rakennamme verkon käyttäen pythonia ja Keras-koneoppimiskirjastoa. Aloitamme luomalla ensimmäiseksi kerrokseksi sanojen upotuskerroksen (word embedding layer).
model = Sequential() model.add(Embedding(max_index, 4, input_length=max_length))
Blogin osassa 2 käytimme esikoulutettua 300-ulotteista FastTextiä upotusten tekemiseen, mutta yksikertaisuuden ja suorituskyvyn vuoksi käytämme nyt upostusta, joka opitaan koulutuksen aikana. Periaate on kuitekin sama eli tämä kerros tiivistää yksinkertaiset sanavektorit ainoastaan 4-ulotteisiksi sanojen upotusvektoreiksi.
Seuraavaksi lisäämme kaksi kerrosta kaksisuuntaisia lyhyen työmuistin neuroneita (ks. osa 3), jotka oppivat koulutuksen aikana tulkitsemaan lauseiden merkityksiä:
model.add(Bidirectional(LSTM(6,return_sequences=True))) model.add(Dropout(0.3)) model.add(Bidirectional(LSTM(2))) model.add(Dropout(0.3))
Ensimmäinen kerros muuntaa jonon sanojen upotusvektoreita kahdeksi uudeksi jonoksi 6-ulotteisia vektoreita. Yksi jono eteenpäin kulkevalle tiedolle ja toinen taaksepäin. Seuraava kerros koostaa nämä jonot kahdeksi 2-ulotteiseksi vektoriksi. Dropout -kerrokset pudottavat satunnaisesti sanoja/vektoreita pois lauseista estäen ylioppimista.
Lopulta lisäämme kerroksen jossa on kaksi neuronia. Ensimmäinen neuroni aktivoituu, jos vastaus on negatiivinen ja toinen, jos vastaus on positiivinen.
model.add(Dense(2, activation='sigmoid'))
Neuroverkko on nyt valmis, joten seuraavaksi koulutamme sen. Sitä varten tarvitsemme neuroverkon optimointialgoritmin koodinimeltään “Adam”. Koska koulutamme neuroverkosta luokittelijaa, käskemme Adamin minimoimaa “kategorista ristientropia”.
optimizer = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False) model.compile(optimizer, 'categorical_crossentropy', metrics=['accuracy'])
Ja sitten vaan koulutus käyntiin, syöttämällä neuroverkolle koulutusaineisto (x_train, y_train), muutama parametri ja testiaineisto (x_test, y_test):
model.fit( x_train, y_train, batch_size=batch_size, epochs=nepoch, validation_data=[ x_test, y_test ] )
Kun koulutus on valmis, tallennamme sen tiedostoon tulevaa käyttöä varten.
model.save('bilstm.h5')
Ja siinäpä se. Muutama sata riviä koodia ja kupponen kahvia koulutuksen valmistumista odotellessa.
Koulutuksen jälkeen voidaan testata verkkoa.
value = model.predict(indexed_sentences, batch_size=1)[0]
Tuloksena “value” on vektori, jossa on kaksi elementtiä. Jos lause oli negatiivinen, vektori on [1; 0] tai ainakin lähellä sitä. Ja jos lause on positiivinen, vektori on [0; 1]. Esimerkiksi
“ihan kivasti menee” => [ 0.001; 0.994 ] “ei kovin kivasti mene” => [ 0.930; 0.003 ]
Mutta jotta pääsemme kokeilemaan tekoälyä selaimessa, muunnetaan se tensorflow.js yhteensopivaksi verkoksi:
tensorflowjs_converter --input_format keras bilstm.h5 www
Nyt voimme ladata tekoälyn verkkosivulle (javascriptillä) ja tulkita lauseiden merkityksiä suoraan selaimessa:
tf.loadLayersModel('model.json') .then(model => { const input = tf.tensor2d([indexed_sentence], [1, max_length]) const prediction = model.predict(input); const value = prediction.dataSync(); });
Voit käydä täällä kokeilemassa, kuinka hyvin blogissa rakennettu tekoäly toimii.
Eihän se täydellinen ole. Ei lähelläkään. Vaikkapa “hyvin huonosti”, tulkitaan positiiviseksi! Miksi?
Ensinnäkin neuroverkko on hyvin pieni, alle tuhat muuttujaa, kun tyypillisissä tuotantotason verkoissa muuttujia on miljoonia. Voisimme helposti kasvattaa verkon kokoa ja antaa verkolle keskittymiskyvyn, mutta nämä toimet eivät yksinään paranna tekoälymme ymmärrystä yhtään. Miksi? Koska se osaa jo kaiken sille opetetun!
Ainoa tapa parantaa tekoälymme ymmärrystä on lisätä koulutusaineiston laajuutta. Suoraviivainen parannus olisi käyttää esikoulutettua sanojen upotusta, joka laajentaa koulutusaineistoa epäsuorasti. Parempia tuloksia saadaan kuitenkin suoraan laajentamalla lisäsanojen valikoimaa, lisäämällä synonyymejä ja antonyymeja, luomalla uusia lauserakenteita, lisäämällä neutraaleja lauseita, ottamalla huomioon kirjoitus-/litterointivirheet ja murteet… Mitähän vielä? Kerro meillekin.
Ja tietenkään tätä prosessia ei kannata alkaa käsin tekemään. Olemmekin kehittämässä oppivaa työkalua, jonka avulla ihminen voi tehokkaasti ohjata konetta luomaan laajoja koulutusaineistoja esimerkkien pohjalta.
Tämä blogisarja päättyy tähän tai ainakin jää hetkeksi tauolle. Ehdotuksia uusista aiheista otetaan toki vastaan. Jos toivot tarkempaa tietoa luonnollista kieltä ymmärtävien tekoälyjen kehittämisestä, niin ota toki yhteyttä!
P.S. Jos koodaaminen sujuu, haet koodit täältä ja testaa itse. Hyvä harjoitus on korjata “hyvin huonosti” lausahduksen tulkinta.
Se on helppo käyttää, se tuo turvallisuutta ja vähentää huolta hurjasti.
Katso videolta lisää: https://youtu.be/p20nSUQ3JzI
Lue miten tyytyväisiä Kuopion kaupungin kotihoito sekä asiakkaiden omaiset ovat Onervaan.
https://onervahoiva.fi/kuopion-kotihoito-ja-omaiset-tykastyivat-onervaan/
Me tykätään Onervasta todella paljon. Se helpottaa todella paljon työtä etenkin asiakkailla, joilla on paljon omaisia. Myös asukkaat tykkäävät kun näkevät kuvia esimerkiksi lastenlasten uudesta koirasta tai kuvia mökiltä.
Huoli äidin voinnista on aina läsnä mutta helppo viestittely hoitajien kanssa on ehdottoman positiivinen asia. Stressi vähenee kun tietämys lisääntyy. Kiitos kuuluu kaikille äitiä hoitaville!
Me Onervalla kehitämme Onerva Bottia eli keskustelevaa tekoälyä vanhushoivaan. Tässä blogisarjassa on aiemmin käsitelty asiaa yleisemmällä tasolla ja käymällä tarvittavien osien toimintaperiaatteita läpi (osa 2 ja osa 3). Tällä kertaa keskustelemme siitä, miksi tekoäly tarvitsee paljon laadukkaita koulutusesimerkkejä, miksi koulutusesimerkkien saatavuus on lähes aina ongelma ja kuinka voimme osittain ratkaista saatavuusongelmaa ”rikastamalla” koulutusaineistoa.
Aloitetaan esimerkillä.
Ihan hyvin
Hyvin menee
Ihan hyvin menee
Menee ihan hyvin
Ihan mukavasti
Mukavasti menee
Ihan mukavasti menee
Menee ihan mukavasti
Hyvin sujuu
Ihan hyvin sujuu
Sujuu oikein hyvin
No terve, kyllähän tässä ihan kohtuu hyvin sujuu
Käyttämällä vain muutamaa eri sanaa voimme vasta kysymykseen ”mites menee?” yli kymmenellä eri tapaa. Mitä pitemmäksi vastaus venyy sitä enemmän vaihtoehtoja kertyy. Jo alkutervehdyksiä kertyy helposti kymmeniä erilaisia ”huomenta”, ”päivää”, ”moi”, ”hei”, ”terve”, ”no terve”… Kun alkutervehdykset yhdistetään eri vaihtoehtoihin lausauhduksesta ”hyvin menee”, esimerkiksi ”mukavasti sujuu”, ”mainiosti menee”, ”hyvin kulkee”, …, niin saadaan satoja ellei tuhansia vaihtoehtoja. Ja kun tähän lisätään vielä pikku sanoja ”ihan”, ”aika”, ”oikein”, ”kyllähän”, ”tässä”… räjähtää yhdistelmien määrä miljooniin.
Ja yllä oleva esimerkki oli lyhyt, suora vastaus kysymykseen. Vastaushan voi olla muutama lause tai pitkäkin selitys, joka sisältää tietoa vaikkapa kivusta tai huolista. Pitkät selitykset nostavat tietysti erilaisten mahdollisten lauseiden yhdistelmien määrän tähtitieteellisiin lukemiin. Neuroverkon pitäisi oppia ne kaikki.
Sitten tarvitaan tietysti myös erilaisia loogisia rakenteita. Yksinkertaisin looginen muutos on lienee ”ei” sanan lisääminen eli negaatio. Neuroverkon näkökulmasta ”ei” lisää hieman vaihtoehtojen määrää, mutta ennen kaikkea se lisää päättelyn monimutkaisuutta. Eli ”hyvää” on positiivinen, mutta ”ei hyvää” on negatiivinen. Loogisuuden kannalta vielä hankalampi on ”ei tässä nyt niin huonosti mene, (pitkä selitys jostain aiheesta) tai no, eihän tässä hyvinkään mene”. Tässä lauseessa ”tai no” kumoaa kaiken aiemman eli sillä on pitkä ”looginen kantama”. Siitä kuinka neuroverkko oppii ymmärtämään tällaisia loogisia rakenteita, keskusteltiin tämän blogisarjan edellisessä osassa. Mutta jos kerta neuroverkko voi oppia ymmärtämään näitä lauseita, niin missä on ongelma? Ei kun treenaamaan? Miksi kouluttaminen on työlästä?
Ongelmana on että neuroverkko oppii juuri sitä mitä sille opetetaan.
Ikävänä esimerkkinä maailmalta löytyy vaikkapa Microsoftin Tay-tekoäly, joka oppi hetkessä Twitteristä käyttäytymään rasistisesti ja seksistisesti. Myös useat kasvontunnistusta tekevät keinoälyt toimivat hyvin valkoisille miehille, mutta huonosti tummille naisille. Miksi? Ovatko tekoälyt sisäsyntyisesti ilkeitä rasisteja? Ei, tekoäly ainostaan oppi koulutusaineistonsa mukaisesti. Twitterissä Tay ajautui ”huonoon seuraan” ja kasvontunnistuksia koulutettaessa valkoisten miesten dataa oli helpoiten saatavilla. Saatamme siis vahingossa siirtää tekoälylle ihmisten ennakkoluuloja tai datan vajaavaisuuksia, jos emme huolehdi koulutusaineiston laadusta.
Jos neuroverkko ei saa riittävän kattavaa koulutusaineistoa, se oppii päättelemään väärin.
Jos palaamme lauseiden pariin, niin ennen koulutusta kaikki sanat ovat neuroverkolle merkityksettömiä. Jos liian pienessä koulutusaineistossa on sattumalta sana ”aamu” usein positiivisten lausahdusten yhteydessä, yhdistää neuroverkko koulutuksensa aikana sanan ”aamu” positiiviseksi asiaksi, vaikka kielellisesti sanalla ei sitä merkitystä ole.
(Tosin kielikuvissa ”aamu” saattaa usein esiintyä positiivisenä asiana, joten sinäänsä huono esimerkki.)
Isompi ongelma on se, että yleensä eri tyyppisiä vastauksia on hyvin eri määrä ja tiettyä vastaustyyppiä esiintyy hyvin paljon enemmän kuin muita. Esimerkiksi ”ihan hyvin” -tyyppisiä vastauksia esiintyy selkeästi enemmän kuin ”ei tässä nyt niin huonosti mene, tai no, eihän tässä hyvin mene” -tyyppisiä vastauksia. Tämä on ongelma, sillä neuroverkko tarvitsisi kattavan ja tasapainoisen otoksen eri vastaustyypeistä. Itseasiassa neuroverkko tarvitsisi runsaasti juuri jälkimmäisen kaltaisia esimerkkejä, koska ne ovat loogisesti vaikeampia.
Mikä avuksi? Mistä saada tasapainoista valmista dataa? Luultavasti ei mistään.
Vähintäänkin data pitää analysoida ja eri vastaustyyppejä pitää tasapainottaa tavalla tai toisella. Mutta usein tämäkään ei riitä.
Osittain ongelmaan auttaa sanojen upotus -mentelmä, jossa käytetään hyväksi ohjaamatonta oppimista valtavalla datamassalla. Tästä keskusteltiin blogisarjan kakkososassa. Tällöin saadaan samankaltaisille sanoille samantyyppiset kontekstit (upotusvektorit), jotka toivottavasti tuottavat oikeanlaisia tulkintoja myös sanoille, joita omassa koulutusdatassamme ei ilmene. Tämä ei ole kuitenkaan täydellinen ratkaisu vaan ainoastaan pieni helpotus. Ja se auttaa vain sanojen osalta. Lauseet ja niiden logiikka on sen ulottumattomissa. Lisäksi useat upotukset luokittelevat ”hyvän” ja ”huonon” varsin lähelle toisiaan, koska niitä käytetään samankaltaisten sanojen kanssa, esimerkiksi ”ruoka oli hyvää” tai ”ruoka oli huonoa”. Lauseen merkityksen kannalta ne ovat vastakohtia eli ”positiivinen kommentti = kyllä” ja ”positiivinen kommentti = ei”.
No, onko ainoa vaihtoehto sitten kerätä 10 000 tai 100 000 tasapainoisesti jakautunutta vastausvaihtoehtoa? Ei toki.
Voimme käyttää hyväksi sanojen upotuksen ideaa, mutta tehdä sitä korkeammalla tasolla. Voimme käyttää synonyymejä ja antonyymejä sekä saman kategorian sanoja, mutta myös usemman sanan ilmaisuja. Voimme määritellä vaihtoehtoisia lisäsanoja ja ilmaisuja sekä poistaa ylimääräisiä sanoja. Voimme lisätä muista lähteistä otettua tekstiä edustamaan kysymyksen kannalta merkityksetöntä tekstiä. Voimme luoda uusia esimerkkejä aliedustettuihin vastaustyyppeihin ottamalla mallia yliedustettujen vastaustyyppien esimerkkeistä, mutta vaihtamalla niiden logiikka haluttuun vastaustyyppiin.
Eli itseasiassa käännämme alkuperäisen ongelman tavallaan eduksi. Luomme malliesimerkistä tuhansia tai miljoonia esimerkkejä yksinkertaisin toimenpitein.
Kuinka tämä toteutetaan käytännössä? Otetaan esimerkiksi ”hyvin menee”. Positiivinen vastaus, sille määrittelimme jo alussa useita vaihtoehtoja. Valitaan satunnaisesti joku sen vaihtoehto, vaikka ”sujuu mainioisti”. Lisätään satunnainen alkutervehdys ”no moi” ja muutama täytesana ”no moi, tänään sujuu oikein mainiosti”. Eli ”hyvin menee” oli runko, jonka ympärille voimme rakentaa helposti kymmeniä tuhansia lauseita. Vastaavasti voimme menetellä ”ei hyvin mene” ja ”… tai no, …” tyyppisille lauseille. Erityisesti luomme aliedustettuja ”… tai no, …” -tyyppisiä lauseita yhdistelemällä ”hyvin menee” ja ”ei hyvin mene” -tyyppejä.
Käytämme seuraavaa prosessia. Keräämme aitoja esimerkkejä. Analysoimme ne ja muodostamme mallilauseita (eli lauserunkoja). Luomme koneellisesti näiden pohjalta satunnaisesti satoja tuhansia esimerkkejä, joissa eri loogiset rakenteet ja vastaustyypit ovat tasapainossa. Lisäksi sopiviin mallilauseisiin lisätään wikipediasta tai vastaavasta lähteestä satunnaisia lauseita merkityksettömäksi tekstiksi.
Nyt voimme käyttää kymmeniä tai satoja tuhansia koneellisesti luotuja lauseita koulutuksessa ja testata neuroverkon toimivuutta aidoilla alkuperäisillä esimerkeillä. Kun aitoja esimerkkejä saadaan lisää, sieltä tunnistetaan uusia lauserunkoja – varsinkin niitä, joissa neuroverkko oli epävarma tai jotka luokiteltiin väärin. Tämän jälkeen voidaan heti luoda riittävä määrä esimerkkejä, jotta päästä kouluttamaan botille myös nämä uudet tuntemattomat lausetyypit Onko täydellinen ratkaisu? Ei. Onko riittävän hyvä? Todennäköisesti kyllä useimmissa tapauksissa.
Käsin lauseiden rikastaminen isossa mittakaavassa on tietysti varsin työlästä, mutta kehitämme käyttäjäystävällistä työkalua, jolla kuka tahansa pääsee rikastamaan lausedataa.
Eikö tätä voisi tehdä täysin koneellisesti? Emmekö voi käyttää samoja rikastamismenetelmiä (data augmentation) kuin äänelle tai kuville? Valitettavasti kieli on hyvin eri tyyppistä dataa kuin ääni tai kuva, jotka ovat ”matalan tason tiivistämätöntä tietoa todellisuudesta”. Ajattele vaikka valokuvaa pojasta. Kuvan tieto on värejä ja kirkkauksia kuvan eri pisteissä. Kieli taas on varsin korkean tason tietoa, sillä esimerkiksi sana ”poika” sisältää jo hyvin laajan tietokokonaisuuden: ihminen, lapsi, miespuolinen, nisäkäs, elollinen, todennäköisesti osaa juosta ja puhua, todennäköisesti kaksi jalkaa ja kättä sekä pää, …
Toisaalta samalla on hävitetty valtava määrä informaatiota. Kuvasta voi helposti tunnistaa kuka kuvassa on, mutta lauseesta ”kuvassa on poika” ei.
Lauseet ovat siis hyvin tiivistettyä tietoa, johon on kerätty asian kannalta oleellinen informaatio todellisuudesta ja jätetty valtava määrä informaatiota huomiotta.
Lauseen korvaaminen toisella samaa tarkoittavalla lauseella on varsin hankalaa ja yleisessä tapauksessa tarvitaan kielen varsin korkean tason ymmärtämistä – ja joskus jopa kontekstin ymmärtämistä – jos halutaan korvata lause toisella. Lisäksi eri toimialoilla saattaa olla omia tapoja ilmaista asioita. ”Lauri sukelsi” tarkoittaa varsin eri asiaa rannalla kuin jalkapallokentällä. Tämä aiheuttaa oman ongelmansa lauseiden korvaamiseen toisilla ja niiden siirtämisessä toimialasta toiseen.
Datan määrä ei siis ole ainoa asia mikä merkitsee koneoppimisessa. Vaikka koneoppiminen on varsin anteeksiantavaa datan laadun suhteen, laaduton data tuottaa edelleen laadutonta lopputulosta. Siksi laadun varmistaminen on tehtävä ennen opetuksen aloitusta ja huomioitava myös opetuksen ja testauksen aikana.
Datan laatua ja määrää voidaan lisätä rikastamalla dataa. Kielidatan osalta rikastaminen on varsin työlästä, muttei mahdotonta.
Tärkeintä on tarttua toimeen ja alkaa kerätä dataa mahdollisimman aikaisessa vaiheessa. Hyvillä työkaluilla datan kerääminen ja rikastaminen sujuu nopeammin.
Seuraavassa osassa rakennamme koodiesimerkein yksinkertaisen pitkän työmuistin neuroverkon, joka ymmärtää selkeää suomea.
Se on helppo käyttää, se tuo turvallisuutta ja vähentää huolta hurjasti.
Katso videolta lisää: https://youtu.be/p20nSUQ3JzI
Lue miten tyytyväisiä Kuopion kaupungin kotihoito sekä asiakkaiden omaiset ovat Onervaan.
https://onervahoiva.fi/kuopion-kotihoito-ja-omaiset-tykastyivat-onervaan/
Me tykätään Onervasta todella paljon. Se helpottaa todella paljon työtä etenkin asiakkailla, joilla on paljon omaisia. Myös asukkaat tykkäävät kun näkevät kuvia esimerkiksi lastenlasten uudesta koirasta tai kuvia mökiltä.
Huoli äidin voinnista on aina läsnä mutta helppo viestittely hoitajien kanssa on ehdottoman positiivinen asia. Stressi vähenee kun tietämys lisääntyy. Kiitos kuuluu kaikille äitiä hoitaville!
Me Onervalla kehitämme Onerva Bottia eli keskustelevaa tekoälyä vanhushoivaan. Ensimmäisessä osassa tätä blogisarjaa käsiteltiin asiaa yleisellä tasolla. Toisessa osassa kuvattiiin kuinka lauseet muutetaan neuroverkolle sopivaan muotoon käyttämällä sanojen upotusta (word embedding) ja mitä upotukset kertovat ”sanojen luonteesta”. Tässä osassa käydään läpi kuinka sanat muodostavat merkityksiä ja kuinka lauseen eri osat nivoutuvat yhteen neuroverkon työmuistin avulla.
Luonnollisen kielen ymmärtäminen vaatii, että tekoäly pystyy käsittelemään lauseiden eri osien välisiä yhteyksiä. Esimerkiksi jos vanhus vastaa kysymykseeen ”kuinka voitte tänään?”, seuraavasti
– Eipä tässä kurjuutta kummempaa, vähän päätä särkee…
(pitkä selitys naapurin kissasta)
– Vähän kyllä sydämestä ottaa… se tykyttää aikalailla…
– On tässä kyllä aika huono olo
Tekoälyn täytyy ymmärtää, että viimeinen lause kumoaa alun letkautuksen. Lisäksi sen pitää osata yhdistää ”se” sydämeen, mutta naapurin kissa pitäis jättää jotenkin huomiotta.
Tutkimalla viime aikaisia tieteellisiä artikkeleja päädyimme käyttämään kaksisuuntaisia pitkän työmuistin neuroverkkoja, joilla on keskittymiskyky. Huh, meniköhän suomennos ihan täydellisesti – no, mutta englanniksi siis ”bidirectional long short-term memory network” ja ”attention mechanism”. Avataanpa näitä hieman käsitteitä. Tässäkin tapauksessa lienee paras käyttää ihmisen ajatusprosessia esimerkkinä.
Neuroverkkoja olemme jo käsitelleet yleisesti blogin ensimmäisessä osassa ja on riittävää tietää, että niissä on keinotekoisia neuroneita, jotka reagoivat tietynlaisiin ärsykkeisiin eli signaaleihin tietyllä tapaa. Blogisarjan ensimmäisessä osassa käytimme esimerkkinä neuronia, joka aktivoituu, kun se havaitsee ääniaalloissa äännettä ”y” vastaavan taajuusyhdistelmän.
Tällä kertaa kuitenkin käsittelemme lauseita, jotka on muutettu sarjaksi sanojen upotusvektoreita, kuten blogisarjan toisessa osassa kuvattiin. Eli nyt ensimmäiset neuronit aktivoituvat sanan ja sen kontekstin mukaan.
Aloitetaan perehtymään keskittymiskyvyllisiin, kaksisuuntaisiin pitkän työmuistin neuroverkkoihin tutustumalla niiden työmuistiin. Lue seuraava teksti ja vastaa ”kysymykseen kenelle pallo jäi?”.
Lauri otti pallon käteen ja heitti sen koria kohti, mutta se pomppasi korin renkaasta maahan. Ville nappasi pallon ja syötti sen takaisin Laurille. Ville käveli vesipullonsa luo, otti sen käteensä ja joi.
Mielessäsi tapahtuu ainakin kolme vaihetta: 1) pallo on Laurilla, 2) pallo on Villellä, 3) pallo on Laurilla. Neuroverkolla on tässä jo kova homma. Ilman työmuistia tehtävä on lähes mahdoton yleisessä tapauksessa.
Ensimmäinen ongelma on sana ”se”. Sana ”se” on viittaus aikaisempaan sanaan, joten aikaisemmat sanat pitää muistaa. Jos neuroverkko ei osaa yhdistää sanaa ”se” toiseen sanaan, se vastaa on todennäköisesti, että pallo jäi Villelle, koska ”Ville nappasi pallon”. Tai ehkä se vastaa kuitenkin Lauri, koska ”Lauri otti pallon käteen” ja ilman työmuistia lauseiden järjestys menee helposti sekaisin.
Toinen ongelma on edelleen ”se”, sillä ensimmäinen ”se” viittaa palloon, mutta viimeinen ”sen” vesipulloon. Tilastollisesti ”se” viittaa kuitenkin useimmiten sanaan ”pallo” ja ilman työmuistia neuroverkko mahdollisesti ehdottaisi viimeisen ”sen” viittaavan palloon ja vastaisi pallon jääneen Villelle. Neuroverkon täytyy siis pystyä muistamaan mihin sanaan ”se” liittyy, mutta myös unohtamaan, että ”se” liittyi aiemmin palloon korvaamalla pallo työmuistissaan vesipullolla.
Neuroverkon työmuistille oleelliset ominaisuudet ovat siis edeltävien asioiden muistaminen, mutta yhtälailla unohtaminen (tarvittaessa).
Neuroverkon pitkä työmuisti viittaa siihen, että muistin kestoa ei ole rajoitettu, vaan asiat tallentuvat ja unohtuvat lähimuistin neuroneihin niihiin tulevien ärsykkeiden perusteella. Ilman ärsykkeeseen perustuvaa muistamista ja unohtamista neuroneihin tallentuva tieto ”väljähtyisi”, jos tarinassa olisi paljon asiaan liittymätöntä tietoa. Esimerkiksi jos yllä olevaan tekstiin lisättäisiin paljon kuvausta pallon ulkonäöstä, pallon liikkeistä ja henkilöiden reaktioista, kysymykseen vastaaminen muuttuisi vaikeammaksi tekstin pituuden kasvaessa ilman ärsykkeisiin perustuvaa työmuistia.
Ärsykkeisiin perustuva työmuisti mahdollistaa pitkäkestoisen muistin.
Pitkän työmuistin neuroneilla onkin normaalin syöte-vaste -reaktion lisäksi muista- ja unohda-reaktiot. (Itseasiassa syöte jakautuu normaaliksi syötteeksi, muista-portin syötteeksi, unohda-portin syötteeksi ja vaste-portin syötteeksi. Lue pitkän lähimuistin neuroneista lisää täältä.)
Entäpä kaksisuuntaisuus? Mihin sitä tarvitaan? Ei välttämättä mihinkään, mutta looginen päättely on tehokkaampaa, jos tieto voi kulkea kahteen suuntaan. Esimerkiksi kysymykseen ”kenelle pallo jäi?” saattaisi olla nopeinta vastata lukemalla tarina lopusta alkuun – ainakin jos se olisi pitempi tarina kokonaisesta koripallo pelistä. Eikö totta?
Lopulta pääsemme keskittymiskykyyn. Keskittymiskyky on meille ihmisille tärkeä, mutta millä tavoin me tai neuroverkot siitä hyödymme? Oleellista on että keskittymällä vähennetään tiedon kokonaismäärä, mutta kasvatetaan oleellisen tiedon osuutta merkittävästi. Eli kyse on jälleen tehokkuudesta.
Esimerkiksi näet valokuvan juhlista ja joku kysyy sinulta ”mitä tuolla tytöllä on kädessään?”. Todennäköisesti etsit vain tytöt ja katsot mitä heillä on kädessään. Helppoa eikö? Mutta olet jo käyttänyt keskittymiskykyä kaksi kertaa – ensin tyttöihin ja sitten käsiin. Ilman keskittymiskykyä joutuisit käymään kuvan jokaisen kohdan läpi, päättelemään mitä sillä kohdalla on ja muistamaan sen. Vasta kun olet käynyt läpi koko kuvan, voisit alkaa muistelemaan kaikista kuvassa näkyvistä asioista, missä kohdassa oli esine, joka oli käden välittömässä läheisyydessä, joka taas oli osa tyttöä. Kuulostaa aivan järjettömältä ja sitä se onkin. Siksi tarvitsemme keskittymiskykyä.
Neuroverkoissa keskittymiskyky mahdollistaa epäolennaisen tiedon käsittelemisen tehokkaasti jättämällä sen huomiotta tai pienentämällä sen vaikutusta, jolloin olennaisen tiedon käsittelyyn jää enemmän kapasiteettia.
Kuvaesimerkissä ihminen keskittyi ensin tyttöihin ja sitten heidän käsiinsä, myös neuroverkot voivat muodostaa hierarkisia keskittymiskykyjä. Esimerkiksi ensimmäisen tason keskittyminen voi tapahtua sanatasolla ja toisen tason keskittyminen lausetasolla. Alun ”kuinkas voitte tänään?” esimerkissä ”kissa” sanat saisivat hyvin pienen huomion, kun taas ”olo” sana saisi varmasti suuren. Lausetasolla kissaan liittyvät lauseet jätettäisiin vähälle huomiolle – paitsi jos kissan tekemiset vaikuttavat vastaajan oloon.
(Käytännössä keskittyminen tapahtuu siten, että tietyn neuronikerroksen vasteet syötetään yhdessä kysymyksen kontekstivektorin kanssa keskittymisneuroverkolle, joka tuottaa vasteille painokertoimet. Tärkeät asiat saavat suuren painokertoimen ja merkityksettömät asiat painottuvat nollaksi.)
Olemme nyt siis muuttaneet lauseet sanojen upotusvektoreiksi ja syöttäneet ne neuroverkolle, joka pystyy lähimuistinsa ansiosta tekemään loogisia päätelmiä lauseiden merkityksistä. Kaksisuuntaisuus ja keskittymiskyky tehostavat tiedon käsittelyä. Lopputuloksena neuroverkon vastekerroksen neuronit aktivoituvat lauseiden merkityksen mukaan, esimerkiksi, lause ”tosi hyvin menee” aktivoi ”vointi=hyvä” neuronin, kun taas alun esimerkki aktivoisi ”vointi=huono”, ”kipua=on” ja ”sydänoireita=on” neuronit.
Omasta mielestäni keskittymiskyvylliset pitkän lähimuistin neuroverkot ovat todella mielenkiintoisia ja omaavat valtavan potentiaalin. Niistä pystytään muodostamaan neuroverkkoja, jotka osaavat vastata kysymyksiin lukemansa/kuulemansa perusteella. Kuinka paljon mahdollisuuksia tällä onkaan? Siis puheeseen perustuvien käyttöliittymien lisäksi esimerkiksi erilaisten dokumenttien automaattisten analyysien ja tiivistelmien luomisessa, sekä niihin perustuvien ennusteiden luomisessa? Eikä tiedon tarvitse olla edes luonnollista kieltä, vaan data tai osa siitä voi olla vaikkapa jonkin sensorin tuottamaa dataa.
Keksitkö hyvän sovelluskohteen omasta taustastasi? Kerro meillekin.
Blogi sarjan seuraavassa osassa keskustelemme millaista koulutusaineistoa tarvitsemme, miten sitä saadaan ja rikastetaan. Sen jälkeen rakennamme koodiesimerkein yksinkertaisen pitkän työmuistin neuroverkon, joka ymmärtää selkeää suomea.
Se on helppo käyttää, se tuo turvallisuutta ja vähentää huolta hurjasti.
Katso videolta lisää: https://youtu.be/p20nSUQ3JzI
Lue miten tyytyväisiä Kuopion kaupungin kotihoito sekä asiakkaiden omaiset ovat Onervaan.
https://onervahoiva.fi/kuopion-kotihoito-ja-omaiset-tykastyivat-onervaan/
Me tykätään Onervasta todella paljon. Se helpottaa todella paljon työtä etenkin asiakkailla, joilla on paljon omaisia. Myös asukkaat tykkäävät kun näkevät kuvia esimerkiksi lastenlasten uudesta koirasta tai kuvia mökiltä.
Huoli äidin voinnista on aina läsnä mutta helppo viestittely hoitajien kanssa on ehdottoman positiivinen asia. Stressi vähenee kun tietämys lisääntyy. Kiitos kuuluu kaikille äitiä hoitaville!
Me Onervalla kehitämme Onerva Bottia eli keskustelevaa tekoälyä vanhushoivaan. Edellisessä osassa tätä blogisarjaa käsiteltiin asiaa yleisemmällä tasolla ja nyt mennään sitten jo vähän tieteeseen ja koodaukseen eli avataan vähän konepeltiä. Blogisarjan seuraavissa osissa edetään hiljalleen syvemmälle ja välillä tulee teknisiä termejä, mutta yritän selittää niitä tarpeen mukaan.
Onerva Botin tekoälyssä on kolme osaa: 1) puheesta tekstiksi (speech-to-text, STT), 2) merkityksen tai aikeen tunnistus lauseista (intent discovery) ja 3) keskustelun kulun ohjaus (dialog flow control).
Tällä hetkellä käytämme Googlen Cloud Speechia ensimmäisessä vaiheessa muuntamaan puheen tekstiksi. Tämä tullaan korvaamaan myöhemmin omalla ratkaisullamme, kunhan saamme kerättyä tarpeeksi puhetta. Tähän meillä on jo hyvät suunnitelmat. Se tehdään yhteistyönä, joukkoistuksen avulla ja vapaan lähdekoodin periaatteiden mukaisesti, mutta tästä enemmän myöhemmin. Päälle vielä ripaus omaa dataa suoraan hoiva-asiakkailta ja voilà!
Keskitytään tällä kertaa merkityksen ymmärtämiseen tekstistä. Merkityksen ymmärtäminen tekstistä eli luonnollista kieltä ymmärtävän (engl. natural language understanding, NLU) tekoälyn kehittäminen on haastava tekoälyongelma.
Onneksi meidän ei yleensä tarvitse luoda tekoälyä, joka ymmärtää kieltä yhtä laajasti kuin ihminen.
Esimerkiksi Onerva Botin osalta jokainen käyttötapaus rajataan suppeaksi kokonaisuudeksi, jolloin tekoälyn tarvitsee ymmärtää keskustelun merkitys vain rajatussa aihepiirissä. Rajattu aihepiiri mahdollistaa hyvän suorituskyvyn nykyisillä NLU-menetelmillä. Käyttötapauksia lisätään ja laajennetaan asteittain, jolloin niitä vastaava ongelma-avaruus kasvaa hallitusti hyvin määriteltyinä osaongelmina.
Ensimmäinen vaihe lauseiden merkityksen ymmärtämisessä on muuntaa lause neuroverkolle sopivaan muotoon. Neuroverkot käyttävät vektoreita, matriiseja ja tensoreita laskennassa eli ne käsittelevät lukuja. Lauseet muutetaan luvuiksi pilkkomalla ne sanoiksi ja muuttamalla jokainen sana vektoriksi. Neuroverkolle lause siis näkyy sarjana sanavektoreita.
Hei, tässä Onerva Botti. Kuinka voitte tänään? [100..00] [000..01] [001..00] … [010..00]
Mielenkiintoista on, että muutettaessa lauseet sanavektoreiksi tapahtuu melkoisesti sanojen ”luonteen ymmärtämistä”, jos käytetään hyväksi sanajen upotusta (word embedding).
Sanojen upotus on itsessään mielenkiintoinen koneoppimismenetelmä ja tutustutaan siihen seuraavaksi.
Yksinkertaisimmillaan sanoista saadaan vektoreita numeroimalla ne juoksevalla numeroinnilla eli sanat indeksoidaan. Kun sana esiintyy lauseessa, sitä vastaavassa sanavektorissa ovat kaikki muut elementit nollia, paitsi sanan indeksiä vastaava elementti, joka saa arvon yksi (one-hot vector). Esimerkiksi
kissa = [1,0,0,…, 0] koira = [0,1,0,…, 0] naukua = [0,0,1,…, 0]
Tällaisen informaatiotiheys on hyvin pieni eli se on harva ja informaatiosisältö on hyvin mitätön eli se ei kuvaa mitenkään sanojen ”luonnetta”. Siksi käytetään usein sanojen upotusta (word embedding), jossa indeksivektori muunnetaan upotusvektoriksi. Informaatiotiheys kasvaa, sillä upotusvektorin dimensio (elementtien määrä) on huomattavasti pienempi (~100) kuin indeksivektorin (~100 000).
Lisäksi upotusvektori sisältää tietoa sanan luonteesta. Esimerkiksi sana ”kissa” ja ”koira” ovat kielellisesti lähempänä toisiaan kuin ”kissa” ja ”kivi” tai ”aamu”, joten tavoitteena olisi, että ”kissan” ja ”koiran” upotusvektorit olisivat lähempänä toisiaan kuin ”kissan” ja ”kiven” tai ”aamun”. Esimerkiksi kuvitteellisessa kaksiulotteisen upotusvektorin tapauksessa voisi olla
kissa = [9, 8] koira = [8, 9] kivi = [5, 3] aamu = [2, 4]
Kuinka voimme opettaa tekoälylle sanojen luonteita?
Perusajatuksena on että lauseessa lähekkäiset sanat liittyvät jollain tavalla toisiinsa, esimerkiksi ”kissa naukuu” ja ”koira haukkuu”.
Kissa ja naukuminen liityvät toisiinsa ja kissa liittyy todennäköisemmin naukumiseen kuin haukkumiseen. Toisaalta samanlaisten sanojen kanssa esiintyvät sanat ovat samankaltaisia, esimerkiksi ”minulla on kissa lemmikkinä” ja ”minulla on koira lemmikkinä”, eli sekä kissa että koira ovat lemmikkejä.
Sanojen upotukseen tarkoitetussa Skip-Gram -menetelmässä lauseesta valitaan keskussana ja sitä ympäröivät sanat tiettyyn rajaan asti. Neuroverkkoa koulutetaan siten, että keskussana on syöte ja ympäröivät sanat ovat vaste. Esimerkiksi jos lause on ”kissa naukuu navetan katolla”, keskussana on ”kissa” ja ikkunan koko on kaksi, syöte – vaste -sanaparit ovat
kissa => naukuu kissa => navetan
jos keskussana on ”naukuu”, sanaparit ovat
naukuu => kissa naukuu => navetan naukuu => katolla
Kun neuroverkolle syötetään paljon tekstiä koulutusvaiheessa, alkaa sanojen välille muodostua kytkentöjä. Koska kissa voi naukua monessa eri paikassa, ”kissa” ja ”naukuu” tulevat kytkeytymään voimakkaammin kuin ”naukuu” ja ”navetta” ja neuroverkko oppii sanojen luonteita.
Kun koulutuksen jälkeen neuroverkolle syötetään sana ”kissa”, aktivoituu kissan upotusvektori, joka kuvaa sitä minkälaisten sanojen ympäröimänä eli minkälaisessa kontekstissa sana ”kissa” yleensä esiintyy.
(Itseasiassa Skip-Gram -upotusvektorit saadaan autoencoder-tyylisen neuroverkon pullonkaulana toimivasta lineaarisesta piiloneuronikerrosta. Lisää Skip-Gram -menetelmästä täällä.)
Upotusvektoreilla on myös mielenkiintoisia ominaisuuksia, jotka kuvaavat hyvin sitä, kuinka ne sisältävät tietoa sanojen luonteesta. Esimerkiksi niillä voidaan vastata kysymykseen ”jos kissa naukuu, niin mikä haukkuu?” laskemalla vektoreilla seuraavasti
”kissa” - ”naukuu” + ”haukkuu” = ”koira”
tai ”jos kuningas on mies, niin mikä on vastaava nainen”
”kuningas” - ”mies” + ”nainen” = ”kuningatar”.
Eli jo sanojen upostusvaiheessa tapahtuu merkkittävää ymmärtämistä ”sanojen luonteesta”, vaikkei se vielä lauseiden merkityksen tulkintaa riitäkkään.
Mutta miksi emme voisi oppia upotuksia lennosta samalla, kun koulutamme neuroverkkoa ymmärtämään lauseiden merkityksiä?
Hieno ominaisuus Skip-Grammin kaltaisille menetelmille on, että ne voidaan kouluttaa ohjaamattomalla oppimisella (unsupervised learning), kuten yllä on kuvattu. Eli ihminen vain antaa teksti koneelle ja kone oppii itsenäisesti upotukset. Tällöin voidaan käyttää valtavia datamassoja verrattuna ohjattuun oppimiseen, jota lauseiden merkitysten ymmärtäminen on. Ohjaamattomalla oppimisella saadaan siis helposti kattavia upotuksia.
Upotukset ovat yleensä uudelleenkäytettäviä. Facebook AI Research yksikön kehittämälle fastText -upotusmenetelmälle on saatavissa esikoulutettuja upotuksia, jotka on koulutettu julkisesti saatavilla olevilla massiivisilla tekstiaineistoilla, kuten Wikipedia ja Common Crawl. Tällöin upotusten laatu tai ainakin ”kattavuus” on hyvä ja ne ovat erinomaisia tapoja päästä nopeasti alkuun. Jos haluat kokeilla itse upotuksia ja niiden ominaisuuksia, niin tutustu fastTextiin ja sen valmiisiin upotuksiin, jotka löytyvät myös suomeksi.
Sivuhuomautuksena mainittakoon että Skip-Grammin kaltaisia menetelmiä voidaan käyttää myös esimerkiksi verkkokauppojen suositusten luomiseen, mutta myös moneen muuhun asiaan löytämään ”muita samanlaisia tai tähän liittyviä asioita”. Ja tämä voidaan tehdä ohjaamattomasti eli ihmisen ei tarvitse luokitella koulutettavia asioita.
Upotusten jälkeen voimme siirtyä koostamaan upotusvektoreista lauseita ja niiden merkityksiä ohjatulla oppimisella. Tästä enemmän seuraavassa osassa.
Lue myös tämän blogisarjan muut osat: Osa 1, Osa 2
Se on helppo käyttää, se tuo turvallisuutta ja vähentää huolta hurjasti.
Katso videolta lisää: https://youtu.be/p20nSUQ3JzI
Lue miten tyytyväisiä Kuopion kaupungin kotihoito sekä asiakkaiden omaiset ovat Onervaan.
https://onervahoiva.fi/kuopion-kotihoito-ja-omaiset-tykastyivat-onervaan/
Me tykätään Onervasta todella paljon. Se helpottaa todella paljon työtä etenkin asiakkailla, joilla on paljon omaisia. Myös asukkaat tykkäävät kun näkevät kuvia esimerkiksi lastenlasten uudesta koirasta tai kuvia mökiltä.
Huoli äidin voinnista on aina läsnä mutta helppo viestittely hoitajien kanssa on ehdottoman positiivinen asia. Stressi vähenee kun tietämys lisääntyy. Kiitos kuuluu kaikille äitiä hoitaville!
Me Onervalla kehitämme Onerva Bottia eli keskustelevaa tekoälyä vanhushoivaan. Botin on tietysti ymmärrettävä mitä hänelle puhutaan, jotta saadaan aikaan vastavuoroista keskustelua. Esimerkiksi aamuorientaatio päivään voisi alkaa seuraavasti:
Esimerkissä Onerva Botti ymmärsi ensimmäisestä vastauksesta kaksi asiaa: 1) vanhuksella on kaikki hyvin, paitsi 2) jalkaa kolottaa. Toisessa vastauksesta se ymmärsi, ettei hoitajaa tarvitse kutsua, joten se voi jatkaa orientaation seuraavaan vaiheeseen.
Kuinka tämä on mahdollista? Keskustellaan tästä tässä blogissa yleisellä tasolla ja mennään seuraavassa kovaan tieteeseen ja koodaukseen.
Aluksi botti ei tietenkään ymmärrä mitään. Meidän täytyy opettaa tekoälyä esimerkkien avulla. Käytännössä meidän pitää kerätä valtava määrä esimerkkilauseita, joille ihminen on antanut merkityksen. Yllä olevassa tapauksessa tekoälylle annettaisiin esimerkiksi ensimmäinen kysymys ja vastaus siihen sekä ihmisen päättelemät merkitykset eli ”vointi = hyvä” ja ”kipua = kyllä, missä = jalka”. Toisen kysymyksen osalta merkitys olisi ”avuntarve = ei”. Tyypillisessä tapauksessa esimerkkejä tarvitaan tuhansia tai kymmeniä tuhansia – riippuen siitä kuinka monimutkaista merkityksen päättely on.
Pelkät esimerkit eivät tietenkään riitä vaan oppimiseen tarvitaan matemaattisia menetelmiä, joita kutsutaan laajasti koneoppimiseksi. Yksi koneoppimisratkaisu on neuroverkko, joka pyrkii matkimaan aivojen/hermoston toimintaa.
Puhetta ymmärtäessään ihminen kuulee korvallaan puheesta erilaisia yhdistelmiä eri äänentaajuuksista. Korvan eri kohdissa hermosolut ovat herkkiä eri taajuuksille ja ne aktivoituvat taajuusyhdistelmien mukaan. Muodostuu signaali, joka lähtee etenemään hermosolujen muodostamassa verkostossa eteenpäin. Jokainen matkalla oleva hermosolu käsittelee signaalia jalostaen sitä korkeamman tason tiedoksi.
Korvan kuulemat taajuusyhdistelmät muodostavat äänteitä. Kun peräkkäiset äänteet yhdistyvät hermosolujen käsitellessä niitä, muodostuu niistä sanoja. Sanoja ihminen vertaa hermostoverkostoonsa tallentuneisiin eli muistissaan oleviin sanoihin sekä niiden merkityksiin. Lopulta sanat ja niiden merkitykset yhdistyvät lauseiksi ja lauseiden merkityksiksi. Nyt puheen aiheuttamat ilman värähtely ovat siis muuttuneet aivoissamme lauseiden merkityksiksi.
Joskus käy niin, ettemme tiedä jotain sanaa tai emme ymmärrä lauseen merkitystä. Näin käy usein lapsille tai vaikkapa uutta kieltä opetellessa. Kun joku kertoo meille oikean merkityksen, hermostomme pyrkii korjaamaan virheen ja opimme uutta. Usein tarvitaan monta toistoa ennen kuin opimme uuden asian. Näin on myös tekoälyn kanssa.
Tarvitaan miljoonia toistoja, jotta tekoäly oppi lauseista merkityksiä.
Aluksi botin neuroverkko ei siis ymmärrä mitään vaan se arvaa täysin satunnaisesti. Todennäköisesti arvaus on väärin, joten kerromme botille oikean vastauksen. Koulutusalgoritmi lähettää korjaussignaalin etenemään neuroverkossa ”taaksepäin” eli merkityksestä kohti äänentaajuuksia. Korjaussignaalin edetessä jokainen keinotekoinen hermosolu eli ”neuroni” korjaa omaa käyttäytymistään ja välittää korjauksen eteenpäin. Näin koko neuroverkon käyttäytyminen muuttuu hieman oikeaan suuntaan.
Kun ”yritys-erehdys-korjausta” toistetaan tuhansia tai miljoonia kertoja, neuroverkko alkaa oppia muistamaan tiettyjä rakenteita ja reagoimaan niihin tietyllä tavalla. Eri neuronit oppivat tunnistamaan erilaisia rakenteita signaalista. Jotkin neuronit oppivat tunnistamaan ”y” äänteen äänentaajuuksista. Ylemmän tason neuronit oppivat että äänteet ”h” ja ”y”, muodostavat tavun ”hy”. Ja seuraavat oppivat tunnistamaan sana ”hyvä”. Tätä vaihetta kutsutaan puheesta tekstiksi (speech-to-text).
Seuraavaksi neuronit oppivat yhdistelemään sanoja merkityksiksi. Esimerkiksi jotkin neuronit oppivat että sanat ”hyvä” ja ”päivä” tarkoittavat jotain positiivistä. Toiset neuronit oppivat että ”ei” ja ”hyvä” tarkoittavat huonoa. Kun lähestytään neuroneita, jotka ymmärtävät lauseiden merkitystä, neuronit oppivat esimerkiksi, että ”oli hyvä päivä” on positiivinen asia, mutta ”ei ollut hyvä päivä” on negatiivinen.
Yllä kuvattu tapahtumasarja on tietysti yksinkertaistus, mutta toimintaperiaate on aito. Lukuisten ”yritys-erehdys-korjausten” kautta neuroverkko oppii hiljalleen muistamaan puheen rakenteita eri tasoilla. Lopputuloksena on puheen merkityksen ymmärtävä tekoäly.
Miksi emme vain käytä sääntöjä?
”Oli hyvä päivä” on hyvä asia ja ”ei ollut hyvä päivä” on huono asia. Yksinkertaista, eikö?
Näinkin voi toki tehdä ja alkuun pääsee hyvin tällä – varsinkin jos vastaukset ovat yksinkertaisia ”ei” , ”joo”, ”ehkä”, ”yksi”, ”kaksi”, ”aa”, ”bee”…
Keskusteleva tekoäly tarvitsee kuitenkin paljon joustoa siihen kuinka asiat ilmaistaan. Mietipä vaikka kuinka monella tapaa voit vastata kysymykseen: ”mitä kuuluu?”. Tapoja on varmasti miljoonia. Neuroverkkojen etuna on että ne pystyvät ymmärtämään myös sellaisia lauseita, joita ne eivät ole koskaan nähneet, mutta niissä on samankaltaisuuksia lauseisiin, joilla se koulutettiin.
Neuroverkot oppivat siis yleistyksiä. Ne oppivat esimerkkien avulla kielen säännöt ilman että sääntöjä varsinaisesti kerrotaan niille.
Lisäksi esimerkkien avulla kouluttamisessa on etuna se, ettei kielen sääntöjä tarvitse kirjoittaa auki koodiksi. Tällöin kuka tahansa voi helposti kouluttaa tekoälyä. Hänen täytyy vain osata kertoa, että ”mitäpä tässä, ei ihmeitä” tarkoittaa että kaikki on hyvin (”vointi = hyvä”).
Neuroverkon kouluttaminen siis onnistuu keneltä tahansa, joka osaa tulkita lauseet merkityksiksi.
Aivan kuka tahansa ei kuitenkaan voi aloittaa neuroverkon kouluttamista, koska on lukuisia verkon rakenteeseen ja koulutusalgoritmeihin liittyviä asioita, joka pitää osata valita, testata ja tuunata. Tähän tarvitset asiantuntijaa, mutta tämän jälkeen koulutus on suoraviivaista lauseiden luokittelua.
Mietipä mitä kaikkea tekoälyllä, joka ymmärtää lauseiden tarkoituksia voisi tehdäkään? Tai entä keskustelevalla tekoälyllä? Maailmalla kieltä ymmärtävää tekoälyä on käytetty runsaasti eri tarkoituksissa. Ehkä näkyvimpänä näistä ovat Googlen, Applen ja Amazonin virtuaaliavustajat, mutta esimerkiksi uutisia lukevaa tekoälyä on käytetty ennustamaan pörssikursseja. Me taas kehitämme Onerva Bottia auttamaan vanhuksia ja hoivapalveluntarjoajia.
Mahdollisuudet ovat valtavat ja nyt on oikea hetki tarttua niihin, koska kaikki työkalut ovat viimein saatavilla. Jos kiinnostuit luonnollista kieltä ymmärtävän tekoälyn mahdollisuuksista, ota meihin yhteyttä. Katsotaan voimmeko tehdä jotain yhdessä.
Lue myös tämän blogisarjan muut osat: Osa 1, Osa 2
Se on helppo käyttää, se tuo turvallisuutta ja vähentää huolta hurjasti.
Katso videolta lisää: https://youtu.be/p20nSUQ3JzI
Lue miten tyytyväisiä Kuopion kaupungin kotihoito sekä asiakkaiden omaiset ovat Onervaan.
https://onervahoiva.fi/kuopion-kotihoito-ja-omaiset-tykastyivat-onervaan/
Me tykätään Onervasta todella paljon. Se helpottaa todella paljon työtä etenkin asiakkailla, joilla on paljon omaisia. Myös asukkaat tykkäävät kun näkevät kuvia esimerkiksi lastenlasten uudesta koirasta tai kuvia mökiltä.
Huoli äidin voinnista on aina läsnä mutta helppo viestittely hoitajien kanssa on ehdottoman positiivinen asia. Stressi vähenee kun tietämys lisääntyy. Kiitos kuuluu kaikille äitiä hoitaville!
Onervan viestintäpalvelun avulla voit konkreettisesti kehittää liiketoimintaasi, oli sitten kyse
Se on helppo käyttää, se tuo turvallisuutta ja vähentää huolta hurjasti.
Katso videolta lisää: https://youtu.be/p20nSUQ3JzI
Lue miten tyytyväisiä Kuopion kaupungin kotihoito sekä asiakkaiden omaiset ovat Onervaan.
https://onervahoiva.fi/kuopion-kotihoito-ja-omaiset-tykastyivat-onervaan/
Me tykätään Onervasta todella paljon. Se helpottaa todella paljon työtä etenkin asiakkailla, joilla on paljon omaisia. Myös asukkaat tykkäävät kun näkevät kuvia esimerkiksi lastenlasten uudesta koirasta tai kuvia mökiltä.
Huoli äidin voinnista on aina läsnä mutta helppo viestittely hoitajien kanssa on ehdottoman positiivinen asia. Stressi vähenee kun tietämys lisääntyy. Kiitos kuuluu kaikille äitiä hoitaville!
Suuntaamme Saksaan ensi viikolla osana meidän Saksan markkinakartoitusta, jonka aloitimme jo viime keväänä.
Osallistumme ensiksi Medica-messuille Dusseldorfissa 12.-14.11.2018.
Medica on yksi Euroopan suurimmista (jollei suurin) terveysalan tapahtuma, jonne lähdemme tapaamaan potentiaalisia asiakkaita sekä jälleenmyyjiä/jakelijoilta.
Medican jälkeen suuntaamme Berliiniin Frontiers Health -konferenssiin 15.-16.11.2018.
Frontiersissa keskitymme esittelemään Onerva-bottia eli puheohjattua virtuaaliassistenttia potentiaalisille sijoittajille ja yhteistyökumppaneille, joita haemme mukaan kehittämään bottia myös Saksan hoivamarkkinoille.
Se on helppo käyttää, se tuo turvallisuutta ja vähentää huolta hurjasti.
Katso videolta lisää: https://youtu.be/p20nSUQ3JzI
Lue miten tyytyväisiä Kuopion kaupungin kotihoito sekä asiakkaiden omaiset ovat Onervaan.
https://onervahoiva.fi/kuopion-kotihoito-ja-omaiset-tykastyivat-onervaan/
Me tykätään Onervasta todella paljon. Se helpottaa todella paljon työtä etenkin asiakkailla, joilla on paljon omaisia. Myös asukkaat tykkäävät kun näkevät kuvia esimerkiksi lastenlasten uudesta koirasta tai kuvia mökiltä.
Huoli äidin voinnista on aina läsnä mutta helppo viestittely hoitajien kanssa on ehdottoman positiivinen asia. Stressi vähenee kun tietämys lisääntyy. Kiitos kuuluu kaikille äitiä hoitaville!
Meidät valittiin maailman 500 parhaan korkean teknologian (ns. deeptech) yrityksen joukkoon ja kutsuttiin ensi maaliskuussa esittelemään kehittämäämme vanhushoivan virtuaaliavustajaa eli Onerva-bottia Hello Tomorrow -konferenssiin Pariisiin.
”Kisassa” oli mukana yli 4500 yritystä 119 eri maasta, joiden joukosta Onerva valittiin 500 parhaan joukkoon.
Mahtava juttu ja osoittaa, että kehittämme puheohjauksen ratkaisu on sekä asiakkaiden että teknologiakehitysyhteisön kannalta merkittävä.
Mutta mikä tämä Onerva-botti oikein on? Alla olevalla videolla kerromme hieman sekä meidän omaisviestintäpalvelusta että Onerva-botista. Siinä myös keskustelemme botin kanssa ja näytetään miten se käytännössä toimii vanhuksen apuna.
Linkki videoon kuvaa klikkaamalla tai tästä: //youtu.be/LBD_5P0QlSQ
Se on helppo käyttää, se tuo turvallisuutta ja vähentää huolta hurjasti.
Katso videolta lisää: https://youtu.be/p20nSUQ3JzI
Lue miten tyytyväisiä Kuopion kaupungin kotihoito sekä asiakkaiden omaiset ovat Onervaan.
https://onervahoiva.fi/kuopion-kotihoito-ja-omaiset-tykastyivat-onervaan/
Me tykätään Onervasta todella paljon. Se helpottaa todella paljon työtä etenkin asiakkailla, joilla on paljon omaisia. Myös asukkaat tykkäävät kun näkevät kuvia esimerkiksi lastenlasten uudesta koirasta tai kuvia mökiltä.
Huoli äidin voinnista on aina läsnä mutta helppo viestittely hoitajien kanssa on ehdottoman positiivinen asia. Stressi vähenee kun tietämys lisääntyy. Kiitos kuuluu kaikille äitiä hoitaville!