Я недавно познакомился с библиотекой 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?
Какую архитектуру лучше всего использовать для "ванильной" модели трансформатора, которую я ищу?
Спасибо!