2017-07-28 4 views
2

Ich habe OpenNLP-py Modelle von Englisch nach Deutsch und von Italienisch nach Deutsch auf Europarl trainiert und ich habe sehr niedrige BLEU Punkte: 8.13 für Englisch -> Deutsch und 4.79 für Italienisch -> Deutsch.OpenNMT-py niedrige BLEU Noten für Übersetzer auf Deutsch

Da ich kein Experte für NNs (noch) bin, habe ich die Standardkonfigurationen von der Bibliothek übernommen. Training 13 Epochen dauerte in beiden Fällen ca. 20 Stunden. In beiden Fällen verwendete ich 80% des Datensatzes für die Schulung, 10% für die Validierung und 10% für die Tests.

Im Folgenden sind die Befehle, die ich für die Erstellung des Italienisch -> Deutsch-Modells verwendet habe, ich habe eine ähnliche Befehlsfolge für das andere Modell verwendet. Kann mir jemand Ratschläge geben, wie ich die Effektivität meiner Modelle verbessern kann?

# $ wc -l Europarl.de-it.de 
# 1832052 Europarl.de-it.de 

head -1465640 Europarl.de-it.de > train_de-it.de 
head -1465640 Europarl.de-it.it > train_de-it.it 

tail -n 366412 Europarl.de-it.de | head -183206 > dev_de-it.de 
tail -n 366412 Europarl.de-it.it | head -183206 > dev_de-it.it 

tail -n 183206 Europarl.de-it.de > test_de-it.de 
tail -n 183206 Europarl.de-it.it > test_de-it.it 

perl tokenizer.perl -a -no-escape -l de < ../data/train_de-it.de > ../data/train_de-it.atok.de 
perl tokenizer.perl -a -no-escape -l de < ../data/dev_de-it.de > ../data/dev_de-it.atok.de 
perl tokenizer.perl -a -no-escape -l de < ../data/test_de-it.de > ../data/test_de-it.atok.de 

perl tokenizer.perl -a -no-escape -l it < ../data/train_de-it.it > ../data/train_de-it.atok.it 
perl tokenizer.perl -a -no-escape -l it < ../data/dev_de-it.it > ../data/dev_de-it.atok.it 
perl tokenizer.perl -a -no-escape -l it < ../data/test_de-it.it > ../data/test_de-it.atok.it 

python3 preprocess.py \ 
-train_src ../data/train_de-it.atok.it \ 
-train_tgt ../data/train_de-it.atok.de \ 
-valid_src ../data/dev_de-it.atok.it \ 
-valid_tgt ../data/dev_de-it.atok.de \ 
-save_data ../data/europarl_de_it.atok.low \ 
-lower 

python3 train.py \ 
-data ../data/europarl_de_it.atok.low.train.pt \ 
-save_model ../models_en_de/europarl_it_de_models \ 
-gpus 0 
+0

Sie können Romance Multi-Way-Modell] (http://forum.opennmt.net/t/training-romance-multi-way-model/86) und auch [Training Englisch-Deutsch WMT15 NMT-Engine] (http: //forum.oplenmt .net/t/training-deutsch-deutsch-wmt15-nmt-engine/29/33). Die Grundidee besteht darin, die BPE-Tokenisierung auf einem verketteten ENDE-Trainingskorpus auszuführen und dann die Trainingskorpora mit den gelernten BPE-Modellen zu tokenisieren. '-case_feature' ist auch eine gute Idee für alle Sprachen, in denen Buchstaben unterschiedliche Schreibweisen haben können. –

+0

das ist ziemlich interessantes Material zum Lesen! Danke für deinen Kommentar und für die Hinweise. Bitte, machen Sie eine Antwort daraus, so dass ich nach oben abstimmen und als Lösung markieren kann. – Alberto

+0

Wenn Sie mit einem Schritt für Schritt Code kommen, fühlen Sie sich bitte auch frei, als separate Antwort zu posten.Oder ich werde meine Antwort bearbeiten, nachdem meine Tests beendet sind. –

Antwort

2

Sie können eine Menge Hinweise auf Training Romance Multi-Way model und auch Training English-German WMT15 NMT engine bekommen. Die Grundidee besteht darin, die BPE-Tokenisierung in einem verketteten XXYY-Trainingskorpus auszuführen und dann die Trainingskorpora mit den gelernten BPE-Modellen zu tokenisieren.

Die Byte-Token-Codierung Tokenisierung sollte für Deutsch nützlich sein, da der Algorithmus hilft, Wörter in Unterwort-Einheiten zu segmentieren. Der Trick besteht darin, dass Sie ein BPE-Modell in einem einzigen Trainingskorpus trainieren müssen, der sowohl Quelle als auch Ziel enthält. Siehe Jean Senellart's comment:

Das BPE-Modell sollte nur auf dem Trainingskorpus trainiert werden - und im Idealfall trainieren Sie ein einziges Modell für Quelle und Ziel, so dass das Modell leicht lernt identische Wortfragmente übersetzen von der Quelle zum Ziel. Also würde ich Quell- und Zieltrainingskorpus verketten - dann trainiere es einmal tokenisieren, dann lerne ein BPE-Modell auf diesem Einzelkorpus, das du dann zur Tokenisierung von Test/gültig/Zugkorpus in Quelle und Ziel verwendest.

Eine andere Idee ist es, mit -case_feature zu tokenisieren. Es ist auch eine gute Idee für alle Sprachen, in denen Buchstaben unterschiedlich sein können. Siehe Jean's comment:

im Allgemeinen -case_feature ist eine gute Idee für fast alle Sprachen (mit Fall) - und zeigt eine gute Leistung für den Umgang und Rendering in Zielfall Variation in der Quelle (zum Beispiel all Groß-/Kleinschreibung oder Großgeschriebene Wörter, ...).

MT Qualität zu verbessern, könnten Sie auch

  1. mehr Corpora bekommen (zB WMT16 Corpora)
  2. Tune versuchen viele Hinweise bekommen [Training mit in-domain training