Как обучить простую модель трансляции ванильных трансформеров с нуля с помощью Fairseq - PullRequest
0 голосов
/ 11 октября 2019

Я недавно познакомился с библиотекой fairseq и попробовал несколько предварительно обученных моделей. Я думал, что хороший способ научиться самому себе - это обучить простую модель ванильных трансформаторов с использованием данных, которые у меня есть, и затем я могу изменить и, возможно, добавить навороты, такие как предварительное обучение оттуда. В документации по Fairseq есть пример этого с архитектурой fconv, и я в основном хотел бы сделать то же самое с трансформаторами.

Ниже приведен код, который я пробовал:

При подготовке данных я очистилданные с помощью скрипта Моисея, токенизированных слов, а затем применили BPE, используя subword-nmt, где я установил число токенов BPE равным 15000.

Для предварительной обработки:

fairseq-preprocess --source-lang zh --target-lang en \
    --trainpref data/train --validpref data/valid --testpref data/test \
    --joined-dictionary \
    --destdir data-bin \
    --workers 20

Для обучения:

CUDA_VISIBLE_DEVICES=0,1,2,3

fairseq-train data-bin \
    --clip-norm 0.1 --dropout 0.2 --max-tokens 2048 \
    --optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 \
    --lr 5e-4 --lr-scheduler inverse_sqrt \
    --criterion label_smoothed_cross_entropy \
    --lazy-load \
    --update-freq 4 \
    --keep-interval-updates 100 --save-interval-updates 3000  --log-interval 50 \
    --arch transformer --save-dir checkpoints/transformer

Я обучил этому на наборе данных ~ 19M выборок, на 4 графических процессорах NVIDIA P100, в течение приблизительно 8 часов - в тот момент я закончил 1 эпоху и немного больше. Я проверил это по моим контрольным точкам - для первой контрольной точки в обновлении 3000 все предсказания были "the the" s, но это могло бы быть хорошо, потому что это была только первая контрольная точка. Однако затем я проверил это с последней контрольной точкой, и предсказание было одинаковым предложением для всех тестовых образцов !! - Прогноз был «комитет по использованию космического пространства в мирных целях» для всего, и балл BLEU был равен 0. Мой тестовый набор вовсе не касается космоса.

Итак, после этого крайне неутешительного результата я понял, что мне следует попросить несколько указателей по созданию базовой модели трансформаторов:

  • Прежде всего, мой результат на самом деле вожидание? В документе, на котором основан файл transformer.py «Совместное обучение выравниванию и переводу», говорится, что современные результаты достигаются на 64-вольтовых графических процессорах для обновлений 30 тыс. (!!!) - мои настройки были намного меньше, поэтому, возможно,результат был ожидаем? Тем не менее, я добился лучших результатов за меньшее время с меньшим количеством данных, поэтому я сомневаюсь в этом. Разве скорость обучения не была установлена ​​правильно, так что она застряла в каких-то странных локальных минимумах? Или что-то не так с моей настройкой выше?

  • Когда остановится вышеуказанная модель? max_epoch и max_update не являются обязательными параметрами и устанавливаются в math.inf, если они не указаны. Из train.py похоже, что обучение продолжается до тех пор, пока скорость обучения не опустится ниже args.min_lr, однако я не могу найти, где установлен min_lr, и это не параметр в документации, так что же такое min_lr? Это 0?

  • Какую архитектуру лучше всего использовать для "ванильной" модели трансформатора, которую я ищу?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...