Na bedně vítězů v umělé inteligenci

Určitě víte, že můj hlavní obor je umělá inteligence. Tento červen a červenec se mi naskytla výborná příležitost poměřit se s ostatními lidmi v tomto oboru a zjistit, jestli modely a metody, na kterých pracujeme snesou porovnání se světovou špičkou.

O soutěži…

Soutěž Multi-label classification of printed media articles to topics probíhala na serveru kaggle.com od 2. června do 15. července. Mě samotného na tuto soutěž upozornil kolega krátce po jejím začátku, v pátek 6. června. První, co mě napadlo, když jsem nad soutěží uvažoval bylo: „zajímavé, ale zabere to spoustu času“. A nakonec jsem asi ani v jednom nespletl.

Když bych měl krátce shrnout o čem soutěž byla, tak řeknu, že o tom co nejlépe určit o jakém tématu je každý z 35.000 článků, v řečtině. Delší popisek bude o něco zajímavější: předmětem soutěže bylo udělat počítačový model, který bude automaticky určovat témata ke vstupní reprezentaci řeckých novinových článků získaný pomocí skenování a OCR. Řečtinu jsem se dokonce ani učit nemusel, protože každý z článků byl už předzpracován do podoby „hromady čísel“. Jen pro představu jak taková podoba vypadá:

58,152 833:0.032582 1123:0.003157 1629:0.038548 ...

Odtud je vidět, že tento článek má dvě témata očíslovaná 58 a 152 a vyskytují se v něm slova očíslovaná jako 833, 1123, 1629 a další.

Takto připravených článků bylo k dispozici 65.000 a cílem bylo připravit model, který ke zbylým 35.000 článků doplní, jaká témata se v nich vyskytují.

To, jak moc dobře model určuje témata, se zjistí jednoduše. Pro zbylé články (35 tisíc) se každý ze soutěžících určí témata, výsledek se uloží do souboru a nahraje se na server kaggle.com. Ten porovná tato témata s tím, jaká témata pro tyto články určil člověk a spočítá skóre, které může být od 0 do 1 a čím vyšší číslo, tím lepší model.

Každý den bylo možné na kaggle.com nahrát dva výsledky a porovnat si s ostatními, jak moc dobře se (ne)vede. Celý vtip ale spočíval v tom, že číslo, které člověk viděl se zakládalo jen asi na 25.000 článcích, výsledné pořadí v soutěži se vyhodnotilo po jejím skončení a podle skóre na zbývajících 10.000 článcích se ustanovilo pořadí.

Pro výherce na prvním místě bylo připraveno celých 680 dolarů, ale, jak se nakonec ukázalo, o peníze vůbec nešlo a celá soutěž byla slušná porce zábavy a poměřování.

Moje soutěžení..

Protože jsem v červnu obhájil disertační práci, ve které jsem používal podobné metody, které se hodily do této soutěže, řekl jsem si, že je vyzkouším použít a pokud dostanu dobré výsledky, budu v soutěži pokračovat. Takže jsem přes první víkend spočítal jednoduchý model nulového úsilí a v pondělí jsem jej nahrál na Kaggle. K mému milému překvapení jsem rázem byl na pátem místě a to rozhodlo… Na první příčky přece jen něco chybělo, ale nebylo toho tolik, aby to nestálo za pokus.

Tak jsem začal každým dnem zlepšovat původní model. Ukázalo se, že měsíc na vytvoření nového postupu je tak akorát, nechá se během něj udělat spoustu práce, ale zase času není tolik, aby človek prohledával všechny postranní uličky na cestě k výslednému řešení…

Abych jen trochu přiblížil, jak se soutěž vyvíjela, uvedu vždy datum a průběžné skóre:
9.6. — 0.70321
11.6. — 0.73554
16.6. — 0.75425
20.6. — 0.77176
24.6. — 0.77490
30.6. — 0.78003 (první, kdo překonává hranici 78%)
3.7. — 0.78444
6.7. — 0.79023 (opět první, kde překonal 79%)
10.7. — 0.79307
15.7. — 0.79558 (finální skóre)

Pro mě byl průběh o to dramatičtější, že jsem zrovna během soutěže měl naplánovány dvě jednotýdenní zahraniční dovolené (Rakousko a Chorvatko). Během dovolených tak vždy počítaly počítače v serverovnách v Česku (velké díky patří MetaCentru, které poskytuje tuto infrastrukturu pro akademickou půdu zdarma) a já jsem vzdáleně zpracovával výsledky a přes tablet je nahrával na Kaggle.

Průběh posledních dvou týdnů soutěže ustálený, o první místo jsem se přetahoval já, tým KazAnova&Rafa (řekové) a Stanislav Semenov (rus).

Cílová rovinka

Když peleton nás, závodníků, vjížděl na stadion, byl jsem právě v Chorvatsku. V MetaCentru jsem měl naplánovány poslední experimenty, které, jak se průběžně dopočítávaly, jsem nahrával na Kaggle. A i když jsem poslední den soutěže nahrál výsledky a byl jsem stále první, věděl jsem, že náhoda je silnější než my všichni vědci dohromady a že stále není vyhráno (protože výsledky co jsem viděl byly jiné, než podle který se pak řadilo ve finále).

Rozhodl jsem se počkat do dvou do rána (soutěž končila o půlnoci UTC). Těsně před druhou se na druhou příčku vyhoupnul Alexander D’yakonov a na pátém místě se objevil tým anttip. Toto je to zmiňované pořadí na 25.000 článcích. O půlnoci greenwichského času stroj přepočítal výsledky na zbývajících 10.000 článků, první se objevil Alexander, druzí anttip a na mě se usmálo krásné třetí místo.

Co z toho?

Zajímavé bylo zásadní přeuspořádání výsledků po přepnutí na 10.000 neviděných článků. Členové týmu anttip na druhém místě to přičítali tomu, že my, kteří jsme vedli první hodnocení jsme modely vyladili na oněch 25 tisíc článků. Podle mého byla ale příčina někde jinde, protože můj model měl následujcí výsledky: 0.79558 vs. 0.79463, takže na všech datech fungoval +- stejně, anttip měl tato čísla: 0.79123 a 0.79482, čili daleko větší rozdíl na dvou různých datových sadách…

Po skončení soutěže jsem se z fóra dozvěděl, že na začátku roku 2014 běžela na Kaggle.com obdobná soutěž Large Scale Hierarchical Text Classification, kde na prvním místě byl tým anttip a druhý Alexander D’yakonov. V tomto světle je pak moje třetí místo (z celkových 121 týmů) úplně skvělý výsledek, protože jsem nestavil na žádných existujících modelech ani metodách pro zpracování textu, začínal jsem od nuly.

Kromě toho, že jsem si zasoutěžil mám i výborný model, který je svojí strukturou velice jednoduchý a který najde uplatnění hlavně ve výzkumných projektech, které na KKY ZČU řešíme. Už teď mi běží experimenty nad obdobnými daty v češtině a výsledky jsou velice nadějné…

A nakonec — na začátku října je v řecké Soluni konference WISE 2014, které mám v plánu se zúčastnit a na kterou se již připravuje sdílený článek všech prvních čtyřech týmů popisující a porovnávající tato úspěšná řešení.

Poznámky na konec

  • Celé řešení jsem naprogramoval v Pythonu, s použitím knihovny pro strojové učení sklearn a scipy/numpy.
  • Kód měl celkově 1665 řádků.
  • Při počítání experimentů jsem propočítal cca 2 CPU roky, to je asi tolik, kolik by propočítal běžný stolní počítač za dva roky.
  • Za celou dobu jsem udělal 34 různých verzí modelů a na Kaggle jsem nahrál 52 různých výsledků.

Napsat komentář