Comments 21
В качестве исходного датасета был использован найденный в сети файл, содержащий английские и немецкие фразы, разделенные табуляцией
Не нашел ссылки на этот файл в статье. Можете дать ее хотя бы в комментариях?
www.manythings.org/bilingual/deu
Сравните двуязычный фрагмент в статье со словами на этой странице:
www.manythings.org/bilingual/deu/1.html
P.S. Поправка! Вероятный первоисточник:
tatoeba.org
13Мбайт к статье не приаттачить, файл слишком большой.
Как их вообще делают? Не вручную наверное
Я парсил словари/разговорники в электронном виде. Есть еще книги на двух языках. Большой вопрос только существует ли что-то подобное для вашего языка.
Лучше парсить словарь и разговорник в электронном виде, при сканировании (особенно с редкого языка) будет достаточно много ошибок, поэтому такой переводчик без обработки будет возвращать неправильный текст.
Если словарь нужно именно сканировать (скажем, нет электронного), я бы делал примерно так:
- Отсканировал автоматически словарь, распарсил пусть и с ошибками,
- Обработал все тексты на этом редком языке, составил список слов с частотой их употребления,
- Подобрал бы для каждого слова из 1 подходящий популярный слово из 2 наиболее близкое, при необходимости провел бы анализ частично вручную, в этом случае получится словарь уже без ошибок,
Обратите внимание на поведение val_loss. Это значение ошибки на данных которые нейросеть не получала на вход. И он у вас в процессе обучения растет.
Это говорит о том что ваша нейронка просто зазубривает комбинации вместо того чтоб находить какие-то закономерности «выучивать» глаголы и т.д.
Ценность такой обученной модели крайне сомнительная, вы вводите в заблуждение и себя и читателей.
При правильном подборе датасета, разделения обучающей и тестовой выборки вы столкнетесь с тем что задача перевода с помощью нескольких слоев LSTM — в принципе не решаема. Для ее решения придумана архитектура трансформера с multi-head attention.
Мне кажется тогда нейронки просто будут учится давать максимально одинаковые результаты (даже если они будут бредовыми). Типо если одна нейронка переведет фразу "я тебя люблю" как "иди на х", то вторая будет стараться перевести "иди на х" как "я тебя люблю", чтобы максимизировать метрику. Плюс проблема в том, что обучая обе нейронки на одинаковых датасетах и алгоритмах будет получать одинаковые результаты.
P.S. Кстати, тут еще есть проблема, что если мы пытаемся анализировать схожесть нескольких "тупых" нейронок (который "cat and dog rain" переводят как "дождь из кошек и собак") и одной умной (которая переводит как "сильный ливень"), то "тупые" будут забивать умную числом (или если анализировать вручную, метрика будет давать "белый шум" на практически любую неочевидную фразу).
Краткое описание есть например здесь: ijdykeman.github.io/ml/2016/12/21/cvae.html
Спасибо за статью, однако эксперимент в ней совершенно не показателен.
1) Данных для обучения с нуля (как вы делаете) очень мало. Решение простое — возьмите предобученные эмбеддинги или бОльший корпус.
2) В NMT уже давным давно используют BPE, а не токены (советую YouTokenToMe от команды VK). Это тоже очень влияет на сходимость и конечный результат.
3) Много вопросов к архитектуре сети. Советую почитать про attention и трансформеры.
Ну и собсвтенно как итог — ваша модель жутко оверфитится и выдает невнятный результат.
Интересно было бы посмотреть на сколько бы изменилось качество если перевести все слова перед обучением в векторный формат с помощью word-to-vec и обучить эту же модель на векторах.
Python + Keras + LSTM: делаем переводчик текстов за полчаса