Представляю вашему вниманию, первую бесплатную offline модель по переводу с русского языка на китайский и обратно.
Ранее, я писал, как можно достаточно легко обучить свою модель по машинному переводу на примере перевода с английского на русский.
В этот раз я решил, реализовать, модель перевода с китайского языка, так как давно хотел и о чем заявлял в комментариях к предыдущей своей статье.
С прошлой статьей, вы можете познакомится здесь: Как создать переводчик, который переводит лучше, чем Google Translate
Введение
Тема машинного перевода всегда была достаточно актуальной, и остается таковой и сейчас. Для обучения модели машинного перевода, требуется большое количество параллельных текстов. Если параллельных текстов с с английским языком достаточно много, то с другими языками вроде китайского, все намного сложнее, и найти большое количество текстов достаточно сложно.
Существенный прорыв в этом вопросе был произведен после выхода корпуса CCMatriх.
В котором было просканировано 1197 битекстов, на 90 различных языках мира.
На текущий момент появились модели вроде facebook/nllb-200-distilled-600M, способные переводить сразу с 200 различных языков, однако после проведенного мною анализа, показали, что такие модели переводят достаточно плохо, и в реальной работе для перевода текстов их использовать практически невозможно. Кроме того, лицензия модели cc-by-nc-4.0, не позволяет её использовать в коммерческих целях.
Данные для обучения
Для обучения своей модели машинного перевода я использовать большое количество параллельных корпусов текстов, с сайта https://opus.nlpl.eu/
В качестве данных для обучения я использовал список корпусов текстов: UNPC_v1_0_ru-zh, CCMatrix_v1_ru-zh, MultiUN_v1_ru-zh, LinguaTools-WikiTitles_v2014_ru-zh, News-Commentary_v16_ru-zh, WikiMatrix_v1_ru-zh, Tanzil_v1_ru-zh, MultiParaCrawl_v9b_ru-zh, bible-uedin_v1_ru-zh, TED2020_v1_ru-zh, infopankki_v1_ru-zh, tico-19_v2020-10-28_ru-zh,
QED_v2.0a_ru-zh, NeuLab-TedTalks_v1_ru-zh,
PHP_v1_ru-zh, wikimedia_v20210402_ru-zh, ELRC-wikipedia_health_v1_ru-zh, Ubuntu_v14.10_ru-zh, EUbookshop_v2_ru-zh
В общем итоге корпус получился размеров в 35 млн парных предложений и переводов.
Обучение
Обучение производилось полностью на основе инструкции из прошлой статьи Как создать переводчик, который переводит лучше, чем Google Translate.
В итоге получилось две модели машинного перевода, которые можно использовать в переводчике Argos Translate.
Первая модель translate-ru_zh-1_7.argosmodel - необходима для перевода с Русского на Китайский
Вторая модель translate-zh_ru-1_7.argosmodel - необходима для перевода с Китайского на Русский
Код для использования модели в Python:
import pathlib
import argostranslate.package
import argostranslate.translate
package_path = pathlib.Path("translate-zh_ru-1_7.argosmodel")
argostranslate.package.install_from_path(package_path)
from_code = 'zh'
to_code = 'ru'
translatedText = argostranslate.translate.translate("吃一些软的法国面包。", from_code, to_code)
print(translatedText)
#Съесть мягкий французский хлеб.
В этот раз, я решил так же обучить модель, с более популярной архитектурой, которую бы разработчики могли использовать в своих проектах. За основу я взял архитектуру mbart50, с предобученными весами.
Данная модель специально создавалась для решения задач машинного перевода, предобученные веса модели уже обучены на задаче и с использованием текстов на 50 различных языках мира.
Для машинного перевода, я не стал обучать модель mbart50 с нуля, а взял уже предобученные веса, и использовал метод дообучения (fine‑tune)
Изначально в модели присутствовали токены от 50 различных языков, мне же необходима была только пара Русский и Китайский, в результате чего, я перед обучение сжал модель, путем удаления лишних слов на слоях эмбеддингов и на последнем слое нейросети, в результате количество токенов в словаре уменьшилось с 250 тысяч, до 45 тысяч. Модель при этом похудела с 2.3 гигабайт до 1.6 гигабайт, немного больше чем на 30%, без изменения качества и скорости её работы. Обучать такую модель стало немного проще.
Код такого сжатия я опубликовал здесь.
Для дообучения модели я использовал инструкцию с сайта от huggingface.
Модель mbart я обучал переводить сразу с китайского на русский и обратно. В результате одну модель можно использовать для перевода с русского на китайский, так и с китайского на русский язык. Что в свою очередь позволяет использовать одну модель, для задачи перефразирования. Путем перевода текста сначала с русского на китайский, а затем обратно. В результате мы можем получим перефразированную версию одного и того же текста.
Пример кода функции перефразирования:
from transformers import MBartForConditionalGeneration, MBart50TokenizerFast
model = MBartForConditionalGeneration.from_pretrained("joefox/mbart-large-ru-zh-ru-many-to-many-mmt")
tokenizer = MBart50TokenizerFast.from_pretrained("joefox/mbart-large-ru-zh-ru-many-to-many-mmt")
def text_paraphrase(src_text):
# translate Russian to Chinese
tokenizer.src_lang = "ru_RU"
encoded_ru = tokenizer(src_text, return_tensors="pt")
generated_tokens = model.generate(
**encoded_ru,
forced_bos_token_id=tokenizer.lang_code_to_id["zh_CN"]
)
result = tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
# translate Chinese to Russian
tokenizer.src_lang = "zh_CN"
encoded_zh = tokenizer(result, return_tensors="pt")
generated_tokens = model.generate(
**encoded_zh,
forced_bos_token_id=tokenizer.lang_code_to_id["ru_RU"]
)
tgt_text = tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
return tgt_text
result = text_paraprase("Съешь ещё этих мягких французских булок.")
print(result)
#Ешьте французский хлеб.
Оценка результатов
Для оценки результатов, мне пришлось самостоятельно подготовить новый корпус китайско‑русских переводов. За основу я взял исходных корпус, который используется для оценки моделей opus, это корпус текстов newstest. Но так как в этом корпусе отсутствует пара переводов zh‑ru. Я собрал свой корпус, на основе имеющихся. Для этого я взял все новости переведенные с китайского на английский, и с английского на русский, и нашел среди них пересекающие идентичные новости. Результате у меня получился, очень хороший русско‑китайский корпус, на котором можно оценивать качество перевода с русского на китайский и обратно. Я решил поделится данным корпусом со всеми, и его теперь можно скачать здесь newstest-2017–2019-ru_zh
Я произвел оценку качества перевода различных моделей на опубликованном датасете newstest-2017–2019-ru_zh, и сравнил производительность.
В колонке CPU и GPU представлено время перевода одного предложения данной моделью без использования батчей, в миллисекундах.
Для полной наглядности, я взял для сравнения еще две известные мультиязычные модели машинного перевода m2m100_418M и nllb-200-ditilled-600M, а также прогнал перевод датасета через переводчик Google Translate, с помощью библиотеки Python — translators. Однако я заметил, что в браузере Google Translate переводит более качественно, чем через библиотеку translators.
По полученным метрикам, самой быстрой моделью на CPU оказалась модель обученная для argos_translate, причем по качеству она существенно обгоняет как переводчик от Google Translate, так и модели m2m100_418M и nllb-200-ditilled-600M.
Самой качественной моделью оказалась моя модель joefox/mbart‑large‑ru‑zh‑ru‑many‑to‑many‑mmt, показав метрику sacreBLEU 12.23 в задаче машинного перевода с китайского на русский язык.
Выводы
Пока модели не включили в официальный репозиторий Argos Translate вы можете скачать их с Yandex диска и использовать либо в приложении Argos Translate, либо в python.
translate-ru_zh-1_7.argosmodel
translate-zh_ru-1_7.argosmodel
Модель mbart выложена на huggingface joefox/mbart-large-ru-zh-ru-many-to-many-mmt с примерами её использования.
Я выкладываю модели в общий доступ, надеюсь, что они вам пригодятся.
Также мне хотелось бы продолжить работу по улучшению моделей перевода с русского на китайский и обратно. Поэтому если у вас есть идеи, как улучшить качество данных моделей. Может быть вы знаете, где можно найти большое количество Русско-Китайских параллельных корпусов текстов в интернете, присылайте любую информацию в личку или в комментарии. Буду очень рад любым идеям.
Кроме того, вы можете самостоятельно обучать свою модель, и использовать датасет newstest-2017-2019-ru_zh, для оценки качества и сравнения с моей моделью.
SmallDonkey
Вопрос про другую вашу модель, англо-русскую, почему очень чувствительна к капитализации слов?
Scene Text Recognition with Permuted Autoregressive Sequence Models - Распознавание текста с измененными моделями автоматической регрессии
Scene Text Recognition with permuted autoregressive sequence models - Сценовое распознавание текста с перестановкой моделей авторегрессии
Scene Text Recognition with Permuted autoregressive sequence models - Текстовое распознавание с измененными моделями авторегрессии
UtrobinMV Автор
Спасибо за вопрос. Правда наверное стоит его в той статье и задавать, уведомления там мне так же приходят.
На самом деле, чувствительна к капитализации как раз по той причине, что в процессе обучения у нас никак не изменяется капитализация слов. В результате для модели слово с большой буквы и с маленький имеет немного различный вес. т.е. если слово с большой буквы, то вероятно модель классифицирует его немного иначе. Ну и в процессе декондинга такое предложение уже имеет другую преплексию, что в целом при лучевом поиске влияет на результат выдачи, модели.
Чтобы этого избежать, необходимо специальным образом обучать модель, чтобы она была менее восприимчива к таким ситуациям.