python

Конфуций и Маргарита

  • понедельник, 17 августа 2020 г. в 00:31:29
https://habr.com/ru/post/515346/
  • Python
  • Машинное обучение
  • Спортивное программирование




Вступление


Соревнований по машинному обучению как и платформ, на которых они проводятся, существует немало и на любой вкус. Но не так часто темой контеста является человеческий язык и его обработка, еще реже такое соревнование связано с русским языком. Недавно я принимал участие в соревновании по машинному переводу с китайского на русский, прошедшего на платформе 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 в начале января.
1月初脸书完成了对Little Eye Labs的收购,

Четыре инженера в Бангалоре запустили Little Eye Labs около полутора лет назад.
一年半以前四位工程师在班加罗尔创办了Little Eye Labs。

Компания строит программные инструменты для мобильных приложений, сделка будет стоить от 10 до 15 миллионов долларов.
该公司开发移动应用软件工具,这次交易价值1000到1500万美元,

Итак, наши новые ингредиенты: 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