Pull to refresh

Comments 21

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

Не нашел ссылки на этот файл в статье. Можете дать ее хотя бы в комментариях?

UFO just landed and posted this here
UFO just landed and posted this here
Как их вообще делают? Не вручную наверное

Я парсил словари/разговорники в электронном виде. Есть еще книги на двух языках. Большой вопрос только существует ли что-то подобное для вашего языка.

По идее, можно отсканировать и распознать разговорник или словарь, если они есть.

Лучше парсить словарь и разговорник в электронном виде, при сканировании (особенно с редкого языка) будет достаточно много ошибок, поэтому такой переводчик без обработки будет возвращать неправильный текст.


Если словарь нужно именно сканировать (скажем, нет электронного), я бы делал примерно так:


  1. Отсканировал автоматически словарь, распарсил пусть и с ошибками,
  2. Обработал все тексты на этом редком языке, составил список слов с частотой их употребления,
  3. Подобрал бы для каждого слова из 1 подходящий популярный слово из 2 наиболее близкое, при необходимости провел бы анализ частично вручную, в этом случае получится словарь уже без ошибок,
Это да, после сканирования нужна вычитка вручную. Электронный вариант разумеется проще, т.к. кто-то уже сделал это раньше :)

Просто словарей в электронном виде может и не быть.
Вам не обязательно нужен такой датасет. Для редких языков специально придуман подход, когда вам достаточно произвольных текстов на вашем языке без какого-либо перевода.
К сожалению, вы сделали неверные выводы и ваша нейросеть ничему не обучилась.
Обратите внимание на поведение val_loss. Это значение ошибки на данных которые нейросеть не получала на вход. И он у вас в процессе обучения растет.
Это говорит о том что ваша нейронка просто зазубривает комбинации вместо того чтоб находить какие-то закономерности «выучивать» глаголы и т.д.
Ценность такой обученной модели крайне сомнительная, вы вводите в заблуждение и себя и читателей.
При правильном подборе датасета, разделения обучающей и тестовой выборки вы столкнетесь с тем что задача перевода с помощью нескольких слоев LSTM — в принципе не решаема. Для ее решения придумана архитектура трансформера с multi-head attention.
Спасибо за поправку. Да, действительно, после примерно 50 эпох val_loss уже не снижается.
График


Ну, я и не рассчитывал сделать качественный переводчик в 50 строк кода.
Интересно, есть ли перспектива в том, чтобы учить сразу две нейронки (англ->нем и нем->англ), и учитывать метрику схожести для произвольной фразы, пропущенной через обе нейронки? То есть, предположение, что чем лучше переводчик, тем меньше исказится фраза.

Мне кажется тогда нейронки просто будут учится давать максимально одинаковые результаты (даже если они будут бредовыми). Типо если одна нейронка переведет фразу "я тебя люблю" как "иди на х", то вторая будет стараться перевести "иди на х" как "я тебя люблю", чтобы максимизировать метрику. Плюс проблема в том, что обучая обе нейронки на одинаковых датасетах и алгоритмах будет получать одинаковые результаты.


P.S. Кстати, тут еще есть проблема, что если мы пытаемся анализировать схожесть нескольких "тупых" нейронок (который "cat and dog rain" переводят как "дождь из кошек и собак") и одной умной (которая переводит как "сильный ливень"), то "тупые" будут забивать умную числом (или если анализировать вручную, метрика будет давать "белый шум" на практически любую неочевидную фразу).

Есть немного похожая архитектура, называемая VAE — Variational Autoencoder. Там действительно используются 2 сети, одна для кодирования, другая для декодирования. Вроде их как-то тоже применяют для перевода, лично не пробовал.

Краткое описание есть например здесь: ijdykeman.github.io/ml/2016/12/21/cvae.html
Мне кажется было бы логичней взять уже обученный эмбеддинг (BERT от Гугла вроде как щас топ) и плясать уже от него. И качество было-бы лучше и дофига языков поддерживается…

Спасибо за статью, однако эксперимент в ней совершенно не показателен.
1) Данных для обучения с нуля (как вы делаете) очень мало. Решение простое — возьмите предобученные эмбеддинги или бОльший корпус.
2) В NMT уже давным давно используют BPE, а не токены (советую YouTokenToMe от команды VK). Это тоже очень влияет на сходимость и конечный результат.
3) Много вопросов к архитектуре сети. Советую почитать про attention и трансформеры.
Ну и собсвтенно как итог — ваша модель жутко оверфитится и выдает невнятный результат.

Интересно было бы посмотреть на сколько бы изменилось качество если перевести все слова перед обучением в векторный формат с помощью word-to-vec и обучить эту же модель на векторах.

Скорее всего не изменится. Слой Embedding как раз учит такие вектора, но сразу от общих градиентов сети. Другое дело, если вектора получены от ELMO или BERT, а не через word-to-vec — такие вектора гораздо содержательнее, т.к. зависят от смысла всего предложения.
Sign up to leave a comment.

Articles