Русский
Русский
English
Статистика
Реклама

Машинный перевод

Обратный перевод для Нейронного машинного перевода

25.08.2020 18:19:47 | Автор: admin
Привет. Некоторое время назад я рассказывал про способ сделать хороший машинный перевод на нейронных сетях, когда в наличии мало данных. Всего таких способа два. И наступило время рассказать про второй. Встречайте: обратный перевод.

Что это такое? Допустим, мы хотим обучить переводчик с чувашского на русский. Берем некоторое небольшое количество параллельных данных: предложений, которые есть на двух языках. В нашем случае это 250 тысяч предложений. Обучаем модель в обратную сторону, с русского на чувашский. Теперь у нас есть относительно неплохой переводчик. Далее возьмем много данных на одном языке, в нашем случае это 1 миллион предложений на русском языке. Переведем их на чувашский язык. В результате у нас появится дополнительный синтетический параллельный корпус из 1 миллиона пар предложений. Дальше смешиваем с оригинальным корпусом и обучаем. Получается неплохой профит, при этом метод достаточно прост и не требует изменений в архитектуре сети.

Чтобы показать этот профит, нужно с чем-то сравниться. В качестве бейзлайна возьмем модель, обученную только на параллельных данных. Здесь и далее используем архитектуру Трансформер, реализованную на Sockeye

pip install sockeye

Обучаем на GPU

pip install mxnet-cu100mkl

Поскольку чувашский и русский языки сложны морфологически, то собрать словарь из уникальных слов проблематично, поэтому используем Byte Pair Encoding (BPE)

git clone https://github.com/rsennrich/subword-nmt.gitpython subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input /content/train/chv.train_250K.tok /content/train/ru.train_250K.tok -s 10000 -o bpe.codes --write-vocabulary bpe.vocab.chv bpe.vocab.rupython subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.chv --vocabulary-threshold 50 < chv.train_250K.tok > chv.train_250K.bpepython subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.ru --vocabulary-threshold 50 < ru.train_250K.tok > ru.train_250K.bpepython subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.chv --vocabulary-threshold 50 < chv.dev.tok > chv.dev.bpepython subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.ru --vocabulary-threshold 50 < ru.dev.tok > ru.dev.bpe


Параметры обучения такие:

python -m sockeye.prepare_data -s chv.train_250K.bpe -t ru.train_250K.bpe -o chvru_datapython -m sockeye.train -d chvru_data -vs chv.dev.bpe -vt ru.dev.bpe --encoder transformer --decoder transformer --transformer-model-size 512 --transformer-feed-forward-num-hidden 256 --transformer-dropout-prepost 0.1 --num-embed 512 --max-seq-len 100 --decode-and-evaluate 500 -o chvru_model --num-layers 6 --disable-device-locking --keep-last-params 1 --batch-size 1024 --optimized-metric bleu --max-num-checkpoint-not-improved 15


Получается 30,77 BLEU.

Классический обратный перевод

Для нейронных сетей эталонная статья Rico Sennrich et al., 2016 про обратный перевод появилась в 2016 году. Обратите внимание, что архитектура сети остается прежней, меняется только входной корпус

python subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input /content/train/chv.train_250K_bt_1M.tok /content/train/ru.train_250K_bt_1M.tok -s 10000 -o bpe.codes --write-vocabulary bpe.vocab.chv bpe.vocab.rupython subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.chv --vocabulary-threshold 50 < chv.train_250K_bt_1M.tok > chv.train_250K_bt_1M.bpe...python -m sockeye.prepare_data -s chv.train_250K_bt_1M.bpe -t ru.train_250K_bt_1M.bpe -o chvru_datapython -m sockeye.train ...


Даже такой базовый метод сразу дает хороший рост относительно базовой модели: 34,38 BLEU

В дальнейшем было предложено несколько модификаций и альтернатив. Давайте на них тоже посмотрим.

Тегированный обратный перевод

Первый рассматриваемый способ усовершенствования описан в статье Isaac Caswell et al., 2019 Известно, что если объем переведенного обратно корпуса будет значительно превышать параллельный, то постепенно результаты будут деградировать. Чтобы помочь модели справиться, предлагается разметить все синтетические предложения на языке источнике тегом BT вначале: BT На улице сегодня очень жарко, но говорят, что будет дождь.. Тогда, говоря по-простому, модель возьмет все самое хорошее от дополнительных данных, а плохого не возьмет.
python subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input /content/train/chv.train_250K_tagbt_1M.tok /content/train/ru.train_250K_tagbt_1M.tok -s 10000 -o bpe.codes --write-vocabulary bpe.vocab.chv bpe.vocab.rupython subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.chv --vocabulary-threshold 50 < chv.train_250K_tagbt_1M.tok > chv.train_250K_tagbt_1M.bpe...python -m sockeye.prepare_data -s chv.train_250K_tagbt_1M.bpe -t ru.train_250K_tagbt_1M.bpe -o chvru_datapython -m sockeye.train ...

В результате получилось 34,32 BLEU. Примерно столько же, сколько и на классическом обратном переводе. Делаем вывод, что наш синтетический корпус еще не так велик, и можно обратно переводить еще. К сожалению, это по времени затратный процесс, поэтому оставим для дальнейших исследований.

COPY

Очень простой метод, описанный в статье Anna Currey et al., 2017 Гипотеза здесь такая: что если профит обратного перевода не только в обученной обратной модели, но и в самом дополнительном моно-корпусе. Давайте для этого используем данные целевого языка и просто скопируем в данные исходного языка. Получится как бы русско-русская пара. Далее смешаем с параллельным корпусом.

python subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input /content/train/chv.train_250K_cp_1M.tok /content/train/ru.train_250K_cp_1M.tok -s 10000 -o bpe.codes --write-vocabulary bpe.vocab.chv bpe.vocab.rupython subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.chv --vocabulary-threshold 50 < chv.train_250K_cp_1M.tok > chv.train_250K_cp_1M.bpe...python -m sockeye.prepare_data -s chv.train_250K_cp_1M.bpe -t ru.train_250K_cp_1M.bpe -o chvru_datapython -m sockeye.train ...

Такой метод дает 31,19 BLEU на нашем корпусе.

Дальше метод можно чуть усовершенствовать: при подготовке словаря использовать только параллельные данные, чтобы в словаре исходного языка акцент был на чувашский.

python subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input /content/train/chv.train_250K.tok /content/train/ru.train_250K.tok -s 10000 -o bpe.codes --write-vocabulary bpe.vocab.chv bpe.vocab.rupython subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.chv --vocabulary-threshold 50 < chv.train_250K_cp_1M.tok > chv.train_250K_cp_1M.bpe...python -m sockeye.prepare_data -s chv.train_250K_cp_1M.bpe -t ru.train_250K_cp_1M.bpe -o chvru_datapython -m sockeye.train ...

И это действительно работает. Подход дает 32,44 BLEU. Хуже чем обратный перевод, но если нет времени на подготовку синтетических данных, то метод хороший.

Дальше авторы статьи предлагают совместить обратный перевод и COPY так, что модель будет обучена на 2 250 000 парах предложений: 250 тысяч параллельный корпус, 1 миллион обратный перевод, и еще 1 миллион COPY. Таким образом предложения на русском языке из моно-корпуса появятся дважды. К сожалению, здесь улучшения на нашем корпусе не получилось: 33,43 BLEU. Авторы показывали, что ухудшение появляется только на больших корпусах. Однако, и у нас на бедном корпусе тоже видно ухудшение. Можно предположить только, что вручную качественно собранные 250 тысяч предложений это уже достаточно большой корпус

Word-on-Word

Следующую статью Sreyashi Nag et al., 2019 упомянем лишь в ознакомительных целях. Когда совсем мало параллельных данных, авторы используют всю силу имеющихся словарей. Предлагается предложение из моно-корпуса на целевом языке перевести пословно. Так, для английского I like to sing получилось бы Я любить [пропуск] петь. На практике для нашего корпуса это малоприменимо по двум причинам. Во-первых, русский и чувашский языки имеют богатую морфологию, поэтому в данном случае задача усложняется. Помимо непосредственного перевода слова, его нужно сначала привести в неопределенную форму одного языка, а затем в нужную форму другого. Если этого не сделать, то в словаре будет много отсутствующих слов. Во-вторых, метод скорее применим для параллельных корпусов менее 100 тысяч предложений. В нашем случае обратный перевод, скорее всего, будет давать более качественный перевод.

NOISE

Далее рассмотрим еще два способа, описанные в статье Сергея Едунова, который, как он сам говорит, много сидит в фейсбуке, Sergey Edunov et al., 2018 В работе есть и другие варианты, но утверждается, что не все они работают одинаково хорошо. Суть NOISE в том, что в синтетические предложения исходного языка добавляется шум 3 видов: 0,1 слов удаляется, 0,1 слов заменяется условным тегом , часть слов перемешивается, но так, что слово не может сдвинуться дальше, чем на 3 позиции. Реализацию можно посмотреть тут поиском по фразе noise for auto-encoding loss. Например, это может выглядеть так: если на вход подать предложение На улице сегодня очень жарко, но говорят, что будет дождь., то на выходе можно получить На сегодня жарко, но говорят, дождь что будет.

python subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input /content/train/chv.train_250K_noise_1M.tok /content/train/ru.train_250K_1M.tok -s 10000 -o bpe.codes --write-vocabulary bpe.vocab.chv bpe.vocab.rupython subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.chv --vocabulary-threshold 50 < chv.train_250K_noise_1M.tok > chv.train_250K_noise_1M.bpe...python -m sockeye.prepare_data -s chv.train_250K_noise_1M.bpe -t ru.train_250K_1M.bpe -o chvru_datapython -m sockeye.train ...

В итоге получается 33,25 BLEU. На нашем корпусе проигрывает классическому обратному переводу. Видимо, подразумеваемся, что синтетический корпус должен быть кратно больше.

SAMPLING

Суть второго метода из статьи в том, чтобы иначе сделать обратный перевод, так как он неидеален. Предлагается брать не лучший по мнению модели перевод, а некоторый случайный из предложенных моделью. Получившиеся предложения будут хуже, но более разнообразными, и дадут более богатый сигнал для обучения. Технически это решается добавлением одного параметра в команду перевода. Было

python -m sockeye.translate --input ru.train_1M.bpe -m ruchv_model --output chv.train_1M.bpe

Стало

python -m sockeye.translate --input ru.train_1M.bpe -m ruchv_model --output chv.train_1M.bpe --sample

Результат: 32,67 BLEU. И это тоже хуже, чем классический обратный перевод. Гипотеза, почему так, примерно такая же, как и с методом выше.

Совмещение с Переносом Знания

В заключении обсудим еще один важный вопрос: можно ли совместить обратный перевод и перенос знания, про который я писал в прошлой статье.

В качестве основы для метода переноса знаний на этот раз используем 3 миллиона предложений казахско-русского корпуса: те, для которых коэффициент соответствия (третья колонка) больше 1. Дочерний корпус те же 250 тысяч предложений. Для этого объема данных получили 35,24 BLEU. Да-да, это чуть лучше, чем результаты обратного перевода.

По всем законам жанра, дальше должна быть история про то, что комбинация двух методов дала еще более высокий результат. Но нет. Эксперименты с использованием разных вариантов словарей (с добавлением данных обратного перевода и без) и разных дочерних корпусов для дообучения (опять же с добавлением данных обратного перевода и без) показали себя либо чуть хуже, либо значительно хуже. Вплоть до того, что если и в подготовке общего словаря, и в качестве дочернего использовать корпус в 250 тысяч параллельных предложений вместе с 1 миллионом обратно-переведенных, то получим весьма заметное ухудшение 24,73 BLEU. Причем сильнее всего на результат влияет общий словарь. Поле для дальнейших исследований.

Выводы

Итого в результате экспериментов пришли к тому, что классический обратный перевод дает наилучший результат. Равно как и метод переноса знаний. Использовать можно любой из них, в зависимости от имеющихся данных. COPY подходит, когда нет времени и ресурсов переводить обратно, помогает быстро улучшить базовую модель. Остальные методы дают результаты чуть хуже, их надо применять аккуратно, сравнивать на вашем корпусе.
Подробнее..

Из песочницы Конфуций и Маргарита

16.08.2020 18:20:26 | Автор: admin


Вступление


Соревнований по машинному обучению как и платформ, на которых они проводятся, существует немало и на любой вкус. Но не так часто темой контеста является человеческий язык и его обработка, еще реже такое соревнование связано с русским языком. Недавно я принимал участие в соревновании по машинному переводу с китайского на русский, прошедшего на платформе ML Boot Camp от Mail.ru. Не обладая большим опытом в соревновательном программировании, и проведя, благодаря карантину, все майские праздники дома, удалось занять первое место. Про это, а также про языки и подмену одной задачи другой я постараюсь рассказать в статье.

Глава 1. Никогда не разговаривайте на китайском


Авторами данного соревнования предлагалось создать систему машинного перевода общего назначения, так как перевод даже от крупных компаний в паре китайский-русский значительно отстает от более популярных пар. Но так как валидация проходила на новостях и художественной литературе, то стало понятно, что обучаться надо именно на новостных корпусах и книгах. Метрика для оценки переводов была стандартная BLEU. Эта метрика сравнивает человеческий перевод с машинным и, грубо говоря, за счет количества найденных совпадений оценивает близость текстов по 100-балльной шкале. Русский язык богат своей морфологией, поэтому данная метрика всегда заметно ниже при переводе на него чем на языки с меньшим количеством способов словообразования (например, романские языки французский, итальянский и т.д.).

Каждый, кто занимается машинным обучением, знает, что это в первую очередь данные и их очистка. Займемся же поиском корпусов и параллельно будем разбираться в дебрях машинного перевода. Итак, в белом плаще

Глава 2. Пон Тий Пи Лат


В белом плаще с кровавым подбоем, шаркающей кавалерийской походкой мы лезем в поисковик за параллельным русско-китайским корпусом. Как мы позже поймем, того, что мы нашли недостаточно, но пока взглянем на наши первые находки (найденные и почищенные мной датасеты я собрал вместе и выложил в открытый доступ [1]):


OPUS довольно большой и в языковом плане разнообразный корпус, посмотрим на примеры из него:
То, что мы с ней пережили, еще необычнее того, что пережили вы...


Я расскажу вам об этом.


Маленький городок, где я родился...
...

Как видно из названия, это в основном субтитры к фильмам и сериалам. К такому же типу принадлежат и субтитры TED'a, которые после парсинга и очистки тоже превращаются во вполне себе параллельный корпус:

Вот чем обернулся наш исторический эксперимент в наказании:


молодые люди боятся, что в любой момент их могут остановить, обыскать, задержать.


И не только на улице, но и в их собственных домах,
WikiMatrix это выровненные LASER'ом тексты из интернет страничек (так называемый common crawling) на различных языках, но для нашей задачи их мало, да и выглядят они странновато:
Збраньки (укр.


Но вам лучше поститься, если бы вы только знали!


Он отверг такое утверждение.
После первого этапа поиска данных, возникает вопрос с нашей моделью. Какие есть инструменты и как вообще подойти к задаче?

Есть очень понравившийся мне NLP курс от МФТИ на Степике [2], особенно полезный при прохождении онлайн, там на семинарах разбираются в том числе и системы машинного перевода, причем пишешь их ты сам. Помню восторг от того, что написанная с нуля сеть после обучения в Colab, выдала адекватный русский перевод в ответ на немецкий текст. Модели мы строили на архитектуре трансформеров с механизмом внимания, который в свое время стал прорывной идеей [3].

Естественно, первой мыслью было просто дать модели другие данные на вход и выиграть уже. Но, как знает любой китайский школьник, в китайской письменности пробелы отсутствуют, а наша модель на вход принимает наборы токенов, которыми в ней являлись слова. Разбить китайский текст на слова с какой-то точностью позволяют библиотеки типа jieba. Встроив токенизацию по словам в модель и прогнав ее на найденных корпусах, я получил BLEU около 0,5 (а шкала-то 100-балльная).

Глава 3. Машинный перевод и его разоблачение


К соревнованию был предложен официальный baseline (простое, но работающее решение-пример), который основывался на OpenMNT. Это открытый инструмент для обучения переводу с множеством гиперпараметров для подкрутки. На этом шаге давайте обучать и делать вывод модели через него. Обучать будем на платформе kaggle, так как она дает 40 часов обучения на GPU бесплатно [4].

Надо отметить, что к этому моменту участников конкурса было настолько немного, что войдя в него, можно было бы попасть сразу в пятерку, и на то были причины. Форматом решения был docker-контейнер, к которому в процессе инференса монтировались папки и модель должна была читать из одной, а ответ класть в другую. Так как официальный бейзлайн не заводился (я лично сходу его не собрал) и был без весов, то я решил собрать свой и выложил в открытый доступ [5]. После этого начали обращаться участники с просьбой правильно собрать решение и вообще помочь с докером. Мораль, контейнеры это стандарт в сегодняшней разработке, используйте их, оркестрируйте и упрощайте себе жизнь (с последним утверждением согласны не все).

Давайте теперь добавим к найденным на предыдущем шаге корпусам еще парочку:


Первый это огромный корпус юридических документов с заседаний ООН. Доступен он, кстати, на всех официальных языках этой организации и выровнен по предложениям. Второй еще более интересен, так как непосредственно является новостным корпусом с одной особенностью, он китайско-английский. Нас этот факт не смущает, потому что современный машинный перевод с английского на русский очень качественный, и в ход идут Amazon Translate, Google Translate, Bing и Яндекс. Для полноты картины покажем примеры из того, что получилось.

Документы ООН
Этот микроспутник представляет собой недорогостоящую платформу которая имеет умеренно продолжительный срок службы и в будущем может быть модифицирована.


В частности в нем представлена подробная информация о разработанных самими участниками планах осуществления ряда проектов регионального уровня представляющих определенный интерес.

UM-Corpus

Facebook закрыл сделку на покупку Little Eye Labs в начале января.
1Little Eye Labs

Четыре инженера в Бангалоре запустили Little Eye Labs около полутора лет назад.
Little Eye Labs

Компания строит программные инструменты для мобильных приложений, сделка будет стоить от 10 до 15 миллионов долларов.
10001500

Итак, наши новые ингредиенты: OpenNMT + качественные корпуса + BPE (про BPE токенизацию можно почитать здесь). Обучаем, собираем в контейнер, и после отладки/очистки и стандартных трюков получаем BLEU 6,0 (шкала по-прежнему 100-балльная).

Глава 4. Параллельные рукописи не горят


До этого момента мы шаг за шагом мы улучшали нашу модель и самый большой прирост дало использование новостного корпуса, одного из проверочных доменов. Кроме новостей неплохо было бы обзавестись и корпусом литературы. Потратив изрядное количество времени стало понятно что машинный перевод книг с китайского ни одна популярная система предоставить не может Настасья Филипповна становится чем то вроде Ностоси Филипауны, а Рогожин Рого Реном. Имена персонажей обычно составляют довольно большой процент от всего произведения и часто это имена редкие, поэтому, если модель их никогда не видела, то и перевести корректно скорее всего не сможет. Надо обучаться на книгах.

Тут мы подменяем задачу перевода на задачу выравнивания текстов. Сразу скажу, что эта часть мне понравилась больше всего, потому что сам я увлекаюсь изучением языков и параллельные тексты книг и рассказов, по-моему мнению, это один из наиболее продуктивных способов обучения. Идей для выравнивания было несколько, самой продуктивной оказалось переводить предложения в векторное пространство и считать косинусное расстояние между кандидатами на соответствие. Перевод чего-нибудь в вектора называется embedding, в данном случае это sentence embedding. Для этих целей есть несколько хороших библиотек [6]. При визуализации результата видно, что китайский текст немного сползает за счет того, что сложные предложения на русском часто переводят как два или три на китайском.



Найдя все что можно на просторах интернета, и самостоятельно выравнивая книжки добавляем их к нашему корпусу.

Он был в дорогом сером костюме, в заграничных, в цвет костюма, туфлях.


Серый берет он лихо заломил на ухо, под мышкой нес трость с черным набалдашником в виде головы пуделя.


По виду лет сорока с лишним.

После обучения на новом корпусе, BLEU вырос до 20 на публичном датасете и до 19,7 на приватном. Тут сыграло и то, что в обучение очевидно попали произведения из валидации. В реальности так никогда делать нельзя, это называется утечкой, а метрика перестает быть показательной.

Заключение


Машинный перевод прошел немалый путь от эвристик и статистических методов до нейросетей и трансформеров. Я рад, что удалось найти время и познакомиться с этой темой, она определенно заслуживает пристального внимания со стороны сообщества. Хочу поблагодарить авторов соревнования и других участников за интересное общение и новые идеи!

[1] Параллельные русско-китайские корпуса
[2] Курс по Natural Language Processing от МФТИ
[3] Прорывная статья Attention is all you need
[4] Ноутбук с примером обучения на kaggle
[5] Публичный docker бейзлайн
[6] Библиотека для multilingual sentence embeddings
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru