Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
user:zeman:joshua [2009/06/03 19:06] zeman Extrakce gramatiky. |
user:zeman:joshua [2009/06/04 11:25] zeman Oprava nedorozumění ohledně ref.txt. |
||
---|---|---|---|
Line 7: | Line 7: | ||
* http:// | * http:// | ||
* http:// | * http:// | ||
- | * http:// | + | |
+ | | ||
===== Instalace ===== | ===== Instalace ===== | ||
Line 120: | Line 121: | ||
<code bash> | <code bash> | ||
+ | |||
+ | |||
+ | ===== Decoding ===== | ||
+ | |||
+ | Jakmile máme gramatiku (tj. překladový model), můžeme dekódovat neboli překládat. Bývá sice zvykem ještě nejdříve vyladit váhy jednotlivých komponent pomocí MERTu, ale MERT sám už dekódování používá a teoreticky se můžeme spokojit s dekódováním pomocí odhadnutých, | ||
+ | |||
+ | Parametry dekódování se zadávají prostřednictvím konfiguračního souboru. Vytvoříme si ho třeba tak, že zkopírujeme a upravíme konfigurační soubor, který byl přibalen k Joshuovi v jednom z příkladů (example2). Konfigurační soubor obsahuje následující parametry: | ||
+ | |||
+ | Cesta k souboru s jazykovým modelem. Zatím předpokládám, | ||
+ | |||
+ | < | ||
+ | |||
+ | Cesta k souboru s překladovým modelem, tedy s gramatikou vyextrahovanou pro daný testovací soubor. Formát má být stejný, jako produkuje Hiero. Předpokládám, | ||
+ | |||
+ | < | ||
+ | tm_format=hiero</ | ||
+ | |||
+ | Jakýsi spojovací soubor, glue_file. Vůbec nevím, co to je. Joshua ale jeden obsahuje a vypadá dost obecně, takže možná nezávisí na konkrétních trénovacích datech. | ||
+ | |||
+ | < | ||
+ | glue_format=hiero</ | ||
+ | |||
+ | Konfigurace jazykového modelu. Kopíruju ji z example2, akorát měním order na 3, protože jsem trénoval trigramy, nikoli čtyřgramy. | ||
+ | |||
+ | < | ||
+ | use_srilm=false | ||
+ | lm_ceiling_cost=100 | ||
+ | use_left_euqivalent_state=false | ||
+ | use_right_euqivalent_state=false | ||
+ | order=3</ | ||
+ | |||
+ | Konfigurace překladového modelu. Kopíruju ji z example2, aniž bych tušil, co znamená. | ||
+ | |||
+ | < | ||
+ | span_limit=10 | ||
+ | phrase_owner=pt | ||
+ | mono_owner=mono | ||
+ | begin_mono_owner=begin_mono | ||
+ | default_non_terminal=X | ||
+ | |||
+ | #pruning config | ||
+ | fuzz1=0.1 | ||
+ | fuzz2=0.1 | ||
+ | max_n_items=30 | ||
+ | relative_threshold=10.0 | ||
+ | max_n_rules=50 | ||
+ | rule_relative_threshold=10.0</ | ||
+ | |||
+ | Konfigurace N-best listu (dekodér vrací N překladových hypotéz, které se mu jeví jako nejlepší, seřazených podle skóre, které jim přiřadil). Pro MERT potřebujeme N nejlepších hypotéz, abychom mohli každou z nich porovnat s referenčními překlady, spočítat BLEU skóre a případně upravit váhy, pokud má nejlepší BLEU skóre hypotéza, která se celkovým skóre nedostala na začátek seznamu, ale při jiném vyvážení komponent by se tam mohla dostat. Pro závěrečný překlad testovacích dat obvykle N nejlepších hypotéz nepotřebujeme, | ||
+ | |||
+ | < | ||
+ | use_unique_nbest=true | ||
+ | use_tree_nbest=false | ||
+ | add_combined_cost=true | ||
+ | top_n=300</ | ||
+ | |||
+ | Další sekce se týkají vzdáleného serveru pro jazykové modelování a paralelního dekodéru. Tyto sekce vynechávám, | ||
+ | |||
+ | Následují váhy jednotlivých komponent (" | ||
+ | |||
+ | < | ||
+ | #lm order weight | ||
+ | lm 1.000000 | ||
+ | |||
+ | # | ||
+ | phrasemodel pt 0 1.066893 | ||
+ | phrasemodel pt 1 0.752247 | ||
+ | phrasemodel pt 2 0.589793 | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # | ||
+ | |||
+ | # | ||
+ | wordpenalty -2.844814</ | ||
+ | |||
+ | No a nakonec příkaz, kterým pustíme Joshuu s naším konfiguračním souborem (na clusteru): | ||
+ | |||
+ | < | ||
+ | "java -Xmx1200m -Xms1200m -cp $JOSHUA/bin joshua.decoder.JoshuaDecoder \ | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | I když si v konfiguračním souboru řekneme, že chceme N-best výstup pro N=1, dostaneme ho ve formátu, který je připraven na více hypotéz (každý překlad např. obsahuje skóre a váhy). Abychom z toho dostali obyčejný 1-best překlad, můžeme použít Zhifeiův skript, který je k Joshuovi přibalen ve složce example2: | ||
+ | |||
+ | < | ||
+ | |||
+ | ===== Vyhodnocení úspěšnosti ===== | ||
+ | |||
+ | 1-best výstup Joshuy a referenční překlad bychom mohli převést do příslušného XML formátu a pustit na ně oficiální externí perlový skript, který počítá BLEU skóre. Pro výsledná čísla do článku bychom to tak také měli udělat. | ||
+ | |||
+ | Jinak ale Joshua obsahuje svůj vlastní kód pro vyhodnocování. Přehled parametrů jeho volání se dozvíme, když ho zavoláme bez argumentů: | ||
+ | |||
+ | < | ||
+ | |||
+ | S využitím většiny defaultů stačí dodat jméno vyhodnocovaného souboru a jméno souboru s referenčním překladem: | ||
+ | |||
+ | < | ||
+ | -cand $HINDI/ | ||
+ | -ref $HINDI/ | ||
+ | |||
+ | Bez MERTu mi zatím vyšlo BLEU = 0.0807. | ||
+ | |||
+ | ===== MERT ===== | ||
+ | |||
+ | Celý proces by nebyl úplný bez MERTu, což je zkratka za Minimum Error Rate Training. V principu jde o to, že se dekodér opakovaně pouští na vývojová data a na základě změřené úspěšnosti se postupně optimalizují váhy překladového modelu, jazykového modelu a případně dalších složek. V Joshuovi je pro tento účel integrován javovský nástroj Z-MERT. | ||
+ | |||
+ | Většina parametrů se Z-MERTu předává prostřednictvím konfiguračního souboru. Přehled volání Z-MERTu se dozvíme takto: | ||
+ | |||
+ | < | ||
+ | |||
+ | Příklad použití Z-MERTu najdeme ve složce '' | ||
+ | |||
+ | Dále potřebujeme soubor (vlastně skript: měl by být spustitelný), | ||
+ | |||
+ | < | ||
+ | cp ../ | ||
+ | cp ../ | ||
+ | cp $JOSHUA/ | ||
+ | vi decoder-config</ | ||
+ | |||
+ | Změněné parametry: | ||
+ | |||
+ | < | ||
+ | tm_file=/ | ||
+ | glue_file=/ | ||
+ | order=3</ | ||
+ | |||
+ | < | ||
+ | chmod 755 decoder_command | ||
+ | vi decoder_command</ | ||
+ | |||
+ | Ve volání dekodéru musíme změnit cesty ke konfiguračnímu, | ||
+ | |||
+ | < | ||
+ | $HINDI/ | ||
+ | $HINDI/ | ||
+ | $HINDI/ | ||
+ | |||
+ | V konfiguraci Z-MERTu zohledníme právě upravené volání a konfiguraci dekodéru. | ||
+ | |||
+ | < | ||
+ | cp $JOSHUA/ | ||
+ | vi zmert-config.txt</ | ||
+ | |||
+ | Změněné parametry: | ||
+ | |||
+ | < | ||
+ | -s src.txt # source sentences file name | ||
+ | -r ref.txt # target sentences file name | ||
+ | -rps 1 # references per sentence | ||
+ | -maxIt 5 # maximum MERT iterations | ||
+ | -cmd ./ | ||
+ | -decOut nbest.txt # file produced by decoder | ||
+ | -dcfg decoder-config.txt # decoder config file</ | ||
+ | |||
+ | No a teď už můžeme spustit Z-MERT (případně to celé dát do uvozovek a před to '' | ||
+ | |||
+ | < | ||
+ | $HINDI/ | ||
+ | > $HINDI/ |