Table of Contents

Malt parser: pokusy s PDT 2.0

http://maltparser.org/

Od května 2012 používám Malt Parser 1.7.1 z /home/zeman/nastroje/parsery/maltparser-1.7.1.

Podle Joakima trénování na celém PDT trvá 3 až 5 dní, a to ještě jen při použití splitting tricku (bez něj několik týdnů). Trénování SVM má kvadratickou složitost vzhledem k počtu trénovacích příkladů; těch z PDT vypadnou asi 3 milióny. (S Joakimem jsem se o tom bavil na jaře 2010 a šlo o Malt Parser 1.3. Tehdy jsem také zkoušel trénovat bez splitting tricku. Jeden experiment běžel i 60 dní, řada experimentů ale vůbec nedoběhla, protože jejich stroj cestou chcípnul.)

Celá trénovací data mají 68562 vět (někde mám chybně uvedeno 68563 kvůli nejasnostem s počítáním od nuly a od jedničky, ale teď jsem to kontroloval a dvojím způsobem přepočítával prázdné řádky v souboru dtrain.conll a je to opravdu 68562). Testování je vždy, když není řečeno jinak, na celém dtestu, tedy 9270 vět. Tam, kde je explicitně uvedeno testování na etestu, jde o 10148 vět; v tom případě pak trénuju na sjednocení trénovacích a d-test dat, celkem 77832 vět.

Jak se to pouští?

Co dál?

Nové výsledky s Malt Parserem 1.7

Experimenty probíhaly v červnu 2013. Měl jsem dva cíle: 1. Natrénovat nové modely, protože ty staré nejsou kompatibilní s novou verzí parseru, a 2. získat výsledky na e-testu, protože dosud jsem pracoval jen s d-testem. I když jsem novou verzi parseru pouštěl se stejnými parametry jako před třemi lety tu starou, dostal jsem jiné výsledky (nepatrně horší).

D-test (9270 vět):
LAS = 80,04 %
UAS = 85,96 %
LAB = 86,43 %
Běželo na stroji lucifer5 (Intel Xeon 2394 GHz) s vyhrazenými 30 GB paměti:
learning time (na trénovacích datech) = 139 hodin, tj. necelých 6 dní
parsing time = 7 hodin (25559301 ms), tj. 1 věta průměrně za 2,76 s

E-test (10148 vět):
LAS = 79,80 %
UAS = 85,76 %
LAB = 86,24 %
Běželo na stroji hydra1 (AMD Opteron 2518 GHz) s vyhrazenými 30 GB paměti:
learning time (na trénovacích a d-test datech) = 221 hodin, tj. něco přes 9 dní
parsing time = 9 hodin (34135285 ms), tj. 1 věta průměrně za 3,36 s

BEST: Malt parser 1.3, javová implementace libsvm, splitting trick

Vyžaduje více času a paměti než céčková implementace, ale nepadá. Podle dokumentace může dojít i k drobným odchylkám v úspěšnosti způsobeným odlišným zpracováním racionálních čísel. Tato sada pokusů používala splitting trick, jinak by trénování v rozumném čase nedoběhlo. Dole mám ještě jednu, u které si nejsem jist, čím přesně se její nastavení liší. Zdůrazňuje právě splitting trick. Protože rozdíl nemůže tkvět v tom, zda vůbec byl splitting trick nasazen, bude pravděpodobně v tom, podle jaké hodnoty se dělilo. Předpokládám, že tady to byl slovní druh, zatímco tam (jak se tam i říká) poddruh.

N Úloha Délka trénování Délka parsingu Rychlost parsingu Úspěšnost Datum
1000 1032117 2:38 min 1252 s = 20:52 min 1 věta / 0,14 s 74,63 % 6.4.2010
2000 1032118 8:44 min 2344 s = 39:03 min 1 věta / 0,25 s 77,73 % 6.4.2010
5000 1040063 48:07 min 3956 s = 1:06 h 1 věta / 0,43 s 80,18 % 12.4.2010
10000 1032120 3:57 h 7235 s = 2:01 h 1 věta / 0,78 s 82,11 % 6.4.2010
20000 1032121 16:45 h 12979 s = 3:36 h 1 věta / 1,40 s 83,65 % 6.-7.4.2010
25000 1032122 27:43 h 16500 s = 4:35 h 1 věta / 1,78 s 84,24 % 6.-8.4.2010
30000 1032123 47:21 h 24255 s = 6:44 h 1 věta / 2,62 s 84,54 % 6.-8.4.2010
35000 1035249 2 dny 11:08 h 21468 s = 5:58 h 1 věta / 2,32 s 84,89 % 9.-12.4.2010
40000 1035250 3 dny 10 min 24582 s = 6:50 h 1 věta / 2,65 s 85,08 % 9.-12.4.2010
45000 1035251 4 dny 10:53 h 33744 s = 9:22 h 1 věta / 3,64 s 85,35 % 9.-14.4.2010
50000 1035252 5 dní 19:32 h 37140 s = 10:19 h 1 věta / 4,01 s 85,47 % 9.-15.4.2010
55000 1035258 7 dní 8:37 h 40518 s = 11:15 h 1 věta / 4,37 s 85,65 % 9.-17.4.2010
60000 1035254 7 dní 4:55 h 34374 s = 9:33 h 1 věta / 3,71 s 85,80 % 9.-17.4.2010
65000 1035255 5 dní 21:01 h 31378 s = 8:43 h 1 věta / 3,38 s 85,96 % 9.-15.4.2010
68563 1177906, 1305554 10 dní 4:40 h 46999 s = 13:03 h 1 věta / 5,07 s 86,08 % 27.4.-14.5.2010

Trénování větších modelů s céčkovou implementací libsvm padá

Malt Parser 1.3 jsem nedokázal použít s céčkovou implementací libsvm, která má být sice rychlejší, ale mně náhodně padala. Postupně jsem od ní zcela upustil a používám pomalejší, ale bezpečnější Javovou implementaci. Přesto tady zatím nechávám tuhle kapitolu, protože odkrývá některé detaily o Malt Parseru (které by snad mohly platit i v současné verzi).

Chybu hlásí sdm0.004.libsvm.mod, což je dílčí model pro hodnotu CPOSTAG číslo 4. Značky jsou číslovány podle pořadí, v jakém se v trénovacích datech objevily. Pokud tedy všechny podmnožiny trénovacích dat, které zkouším, začínají na začátku trénovacích dat, mají číslování značek stejné. Číslování je také možné ověřit tak, že rozbalíme model, vznikne stejnojmenná složka, v ní se pak podíváme do souboru symboltables.sym na část CPOSTAG:

java -jar ~/nastroje/parsery/malt-1.3/malt.jar -c model -m unpack
cd model
less symboltables.sym

Až na jednu výjimku trénování spadlo vždy při budování sdm0.004.libsvm.mod a vždy na větších trénovacích datech. Tento model patří podstatným jménům (přesněji: situacím, kdy na vrcholu zásobníku leží podstatné jméno). Tento model, resp. jeho vstupní data, jsou také zřejmě vždy největší. Není sice asi problém s dostupností operační paměti (svm-train spotřebovává řádově stovky megabajtů, přitom má k dispozici desítky gigabajtů), ale vnitřní struktury libsvm asi na tak velká data nejsou připraveny.

Joakim navrhuje, abychom zkusili dělení zjemnit, např. místo CPOSTAGu dělit modely podle slovního poddruhu (druhá pozice české značky). Pak by dílčí modely byly menší a libsvm by třeba nespadlo. Ve skutečnosti budu asi muset zjemňovat jiným způsobem, protože právě u podstatných jmen žádné zvláštní dělení na poddruhy neexistuje. Mohly by ale pomoct pády.

Splitting trick podle slovního poddruhu, jlibsvm

Snižuje časovou náročnost, zanedbatelně snižuje i úspěšnost.

N Úloha Délka trénování Délka parsingu Rychlost parsingu Úspěšnost Datum
1000 1177862 3:00 min 1304 s = 21:43 min 1 věta / 0,14 s 73,81 % 27.4.2010
2000 1177863 7:32 min 1715 s = 28:35 min 1 věta / 0,19 s 76,98 % 27.4.2010
5000 1177864 42:28 min 3282 s = 54:42 min 1 věta / 0,35 s 79,86 % 27.4.2010
10000 1177866 2:50 h 5863 s = 1:38 h 1 věta / 0,63 s 81,63 % 27.4.2010
20000 1177867 15:52 h 13877 s = 3:51 h 1 věta / 1,50 s 83,28 % 27.-28.4.2010
25000 1177868 21:02 h 13345 s = 3:42 h 1 věta / 1,44 s 83,97 % 27.-28.4.2010
30000 1177870 30:36 h 15689 s = 4:21 h 1 věta / 1,69 s 84,23 % 27.-28.4.2010
35000 1177871 39:04 h 27.4.2010 Parsing selhal.
40000 1177872 2 dny 8 h 19298 s = 5:22 h 1 věta / 2,08 s 84,92 % 27.-30.4.2010
45000 1177873 2 dny 20 h 21907 s = 6:05 h 1 věta / 2,36 s 85,18 % 27.-30.4.2010
50000 1177875 3 dny 14 h 22805 s = 6:20 h 1 věta / 2,46 s 85,37 % 27.4.-1.5.2010
55000 1177876 5 dní 32512 s = 9:02 h 1 věta / 3,51 s 85,57 % 27.4.-2.5.2010
60000 1177877 5 dní 20 h 27429 s = 7:37 h 1 věta / 2,96 s 85,70 % 27.4.-3.5.2010
65000 1177878 6 dní 4 h 28112 s = 7:48 h 1 věta / 3,03 s 85,91 % 27.4.-3.5.2010
full 1177879 8 dní 7 h 38957 s = 10:49 h 1 věta / 4,20 s 86,02 % 27.4.-6.5.2010

Stackeager, java libsvm, švédské rysy

N Úloha Délka trénování Délka parsingu Rychlost parsingu Úspěšnost Datum Poznámka
1000 1473892 2:38 min 1283 s = 21 min 1 věta / 0,14 s 74,50 % 2.6.2010
2000 1473932 7:45 min 1891 s = 32 min 1 věta / 0,20 s 77,47 % 2.6.2010
5000 1473933 49:08 min 4178 s = 1:10 h 1 věta / 0,45 s 79,98 % 2.6.2010
10000 1473934 3:33 h 7534 s = 2:06 h 1 věta / 0,81 s 81,93 % 2.6.2010
20000 1473956 18:09 h 14095 s = 3:55 h 1 věta / 1,52 s 83,47 % 2.-3.6.2010
25000 1473957 26:12 h 17299 s = 4:48 h 1 věta / 1,87 s 84,01 % 2.-3.6.2010
30000 1473958 2 dny 25161 s = 6:59 h 1 věta / 2,71 s 84,43 % 2.-4.6.2010
35000 1473982 42:40 h 18856 s = 5:14 h 1 věta / 2,03 s 84,74 % 2.-4.6.2010
40000 1473983 3 dny 18 h 32172 s = 8:56 h 1 věta / 3,47 s 85,08 % 2.-6.6.2010
50000 1474005 4 dny 19 h 29638 s = 8:14 h 1 věta / 3,20 s 85,26 % 2.-7.6.2010
55000 1474009 7 dní 17 h 41959 s = 11:39 h 1 věta / 4,53 s 85,51 % 2.-10.6.2010
60000 1474010 9 dní 8 h 43088 s = 11:58 h 1 věta / 4,65 s 85,65 % 2.-12.6.2010
65000 1474011 7 dní 14 h 37991 s = 10:33 h 1 věta / 4,10 s 85,81 % 2.-10.6.2010
full 1474032 8 dní 6 h 40110 s = 11:09 h 1 věta / 4,33 s 85,94 % 2.-11.6.2010

Stackproj, java libsvm, švédské rysy

N Úloha Délka trénování Délka parsingu Rychlost parsingu Úspěšnost Datum Poznámka
1000 1474105 2:46 min 7.6.2010 Parsing nedoběhl (“The symbol code '-1' cannot be found in the symbol table.”)
2000 1474106 6:53 min 1810 s = 30 min 1 věta / 0,19 s 74,74 % 7.6.2010
5000 1474107 51:45 min 3723 s = 1:02 h 1 věta / 0,40 s 76,84 % 7.6.2010
10000 1474108 3:38 h 6934 s = 1:55 h 1 věta / 0,75 s 78,50 % 7.6.2010
20000 1474109 17:03 h 13256 s = 3:41 h 1 věta / 1,43 s 79,57 % 7.-8.6.2010
25000 1474110 29:14 h 15764 s = 4:23 h 1 věta / 1,70 s 80,23 % 7.-8.6.2010
30000 1474111 36:55 h 18845 s = 5:14 h 1 věta / 2,03 s 80,50 % 7.-9.6.2010
35000 1474112 2 dny 4 h 20638 s = 5:44 h 1 věta / 2,23 s 80,80 % 7.-9.6.2010
40000 1474113 3 dny 11 h 30127 s = 8:22 h 1 věta / 3,25 s 81,01 % 7.-11.6.2010
45000 1474114 4 dny 17 h 33036 s = 9:10 h 1 věta / 3,56 s 81,04 % 7.-12.6.2010
50000 1474115 5 dní 4 h 35954 s = 9:59 h 1 věta / 3,88 s 81,35 % 7.-13.6.2010
55000 1474116 4 dny 23 h 30700 s = 8:32 h 1 věta / 3,31 s 81,48 % 7.-12.6.2010
60000 1474117 6 dní 9 h 32758 s = 9:06 h 1 věta / 3,53 s 81,58 % 7.-14.6.2010
65000 1474118 9 dní 20 h 44870 s = 12:28 h 1 věta / 4,84 s 81,70 % 7.-17.6.2010
full 1474119 7 dní 11 h 36260 s = 10:04 h 1 věta / 3,91 s 81,88 % 7.-15.6.2010

Covproj / covnonproj / nivrestandard / nivreeager, java libsvm, švédské rysy

Všechny trénovací procesy hlásí “The function cannot be initialized.” Mohlo by to být tím, že Marcova definice rysů, kterou se pokouším použít, byla původně určena pro algoritmus stacklazy. Takže se třeba snaží dívat na zásobník, se kterým Covingtonův algoritmus vůbec nepracuje? Žádnou změnou na clusteru ta chyba totiž není, trénink stacklazy se rozeběhne bez problémů stejně jako dřív.