Машинное обучение это весело! Часть 5

Часть цикла статей Adam Geitgey – “Машинное обучение это весело!”: ч.1ч.2ч.3ч.4ч.5ч.6ч.7ч.8.


Перевод языков с помощью глубокого обучения

Мы все знаем и любим сервис Google Translate, который может, словно по волшебству, мгновенно переводить с и на 100 разных языков. Он есть даже в наших телефонах и смарт-часах:

Технология, используемая в Google Translate, называется машинным переводом. Она изменила мир, позволив людям общаться, когда других способов просто нет.

Мы все знаем, что школьники вот уже 15 лет используют Google Translate для … ммм … помощи с домашкой по испанскому языку. Но разве это новость?

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

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

Поехали!

Заставляем компьютеры переводить

Итак, как заставить компьютер переводить с одного языка на другой?

Самый простой способ – это заменить каждое слово в предложении на переведенное слово на нужном языке. Вот простой пример перевода с испанского на английский по словам:

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

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

Сработало! Если мы будем продолжать добавлять новые правила, пока не переберем всю грамматику, наша программа сможет перевести любое предложение, так ведь?

Так работали самые ранние системы машинного перевода. Лингвисты придумали сложные правила, и их пришлось программировать одно за другим. Некоторые из самых умных лингвистов в мире на протяжении многих лет трудились во времена «холодной войны», стремясь создать системы перевода, облегчающие понимание сообщений на русском.

К сожалению, это работало только с простыми структурированными документами, такими как метеорологические отчеты. С реальными документами ничего не вышло.

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

Улучшение машинного перевода с помощью статистики

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

Построение системы перевода на основе статистики требует большого количества обучающих данных, где один и тот же текст переводится как минимум на два языка. Этот дважды переведенный текст называется параллельным корпусом (parallel corpora). Точно так же, как Розеттский камень в 1800-х годах помогал ученым переводить египетские иероглифы с греческого, компьютеры могут использовать параллельные корпуса, чтобы угадать, как преобразовывать текст с одного языка в другой.

К счастью, таких текстов довольно много, и они повсюду. Например, Европейский парламент переводит свои материалы на 21 язык. Поэтому исследователи часто используют эти данные для создания систем перевода.

Мышление в терминах вероятностей

Фундаментальное отличие статистических систем перевода заключается в том, что они не пытаются создать единственно точный перевод. Вместо этого они генерируют тысячи возможных переводов, а затем ранжируют эти переводы и выбирают наиболее вероятный. Они оценивают, насколько «правильна» та или иная фраза, сравнивая ее с обучающими данными. Вот как это работает:

Шаг 1: Исходное предложение разбивается на куски

На первом шаге мы разбиваем наше предложение на простые фрагменты, которые могут быть легко переведены:

Шаг 2. Поиск всех возможных переводов для каждого фрагмента

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

Важно отметить, что мы не просто ищем эти фрагменты в простом словаре. Мы смотрим реальные переводы реальных людей. Это помогает нам найти все возможные переводы той или иной фразы в разных контекстах:

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

Например, чаще говорят, что «Quiero» означает «я хочу», а не «я стараюсь». Поэтому перевод «Quiero» как «я хочу» в наших обучающих данных имеет большую частоту и вес.

Шаг 3: Генерация всех возможных предложений и поиск подходящего

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

Из фрагментов, которые мы перечислили в Шаге 2, мы можем сгенерировать около 2500 разных вариантов нашего предложения, комбинируя их по-разному. Вот несколько примеров:

I love | to leave | at | the seaside | more tidy.
I mean | to be on | to | the open space | most lovely.
I like | to be |on | per the seaside | more lovely.
I mean | to go | to | the open space | most tidy.

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

I try | to run | at | the prettiest | open space.
I want | to run | per | the more tidy | open space.
I mean | to forget | at | the tidiest | beach.
I try | to go | per | the more tidy | seaside.

Теперь нужно просмотреть все эти сгенерированные предложения и выбрать то, которое звучит более менее «по-человечески».

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

Взгляните на этот вариант перевода:

I try | to leave | per | the most lovely | open space.

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

Но посмотрите на этот возможный перевод:

I want | to go | to | the prettiest | beach.

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

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

Наш окончательный перевод будет «I want to go to the prettiest beach». Неплохо!

Статистический машинный перевод был серьезным прорывом

Статистические системы машинного перевода работают намного лучше, чем системы на основе правил, если дать им достаточное количество обучающих данных. Франц Йозеф Ох усовершенствовал эти идеи и использовал их для создания Google Translate в начале 2000-х годов. Машинный перевод стал доступен для всего мира.

В первые дни все удивлялись, что «наивный» подход к переводу на основе вероятности работал лучше, чем разработанные лингвистами системы, основанные на правилах. В этой связи можно вспомнить высказывание одного из исследователей 80-х годов:

“Каждый раз, когда я увольняю лингвиста, моя точность повышается.” (“Every time I fire a linguist, my accuracy goes up.” – шутка в слове fire, которое переводится как “увольнять” и “стрелять”, прим. переводчика)

Фредерик Йелинек

Ограничения статистического машинного перевода

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

Поскольку создание такого конвейера невероятно сложно, нужно искать компромиссы. Если вы попросите Google перевести с грузинского на телугу, он сначала переведет фразу на английский, а потом уже на телугу, так как у него недостаточно данных для перевода в языковой паре «грузинский-телугу» напрямую. Кроме того, перевод выполнялся бы по более простой схеме, чем если бы вы попросили перевести с французского на английский.

Было бы здорово, если бы мы могли заставить компьютер делать за нас еще и разработку, неправда ли?

Улучшение компьютерного перевода без участия дорогостоящих людей

Святой Грааль машинного перевода – это система «черного ящика», которая учится переводить самостоятельно, просто просматривая обучающие данные. А статистический машинный перевод все еще требует участия людей в создании и настройке многошаговых статистических моделей.

В 2014 году команда KyungHyun Cho сделала прорыв. Она нашли способ применить глубокое обучение для создания системы «черного ящика». Их модель обучения принимает параллельный корпус и использует его, чтобы научиться переводить два языка без вмешательства человека.

Это становится возможным благодаря двум идеям – рекуррентные нейронные сети (recurrent neural networks) и кодировки (encodings). Грамотно комбинируя эти две идеи, мы можем создать самообучающуюся систему перевода.

Рекуррентные нейронные сети

Мы уже говорили о рекуррентных нейронных сетях в части 2, но давайте кратко вспомним.

Обычная (нерекуррентная) нейронная сеть – это обобщенный алгоритм машинного обучения, который принимает список чисел и вычисляет результат (на основе предыдущего обучения). Нейронные сети могут использоваться в качестве «черного ящика» для решения множества проблем. Например, мы можем использовать нейронную сеть для расчета приблизительной стоимости дома на основе его параметров:

Но, как и большинство алгоритмов машинного обучения, нейросети не имеют памяти. Вы даете ей список чисел, и нейросеть подсчитывает результат. Если вы снова ввели те же числа, она снова даст тот же результат. Сеть не запоминает результаты прошлых вычислений. Иными словами, 2 + 2 всегда равняется 4.

Рекуррентная нейронная сеть (сокращенно RNNRecurrent Neural Network) представляет собой немного измененную версию нейронной сети, где предыдущее состояние нейронной сети является одним из входов к следующему вычислению. Это означает, что предыдущие расчеты влияют на результаты будущих расчетов!

Ну и зачем нам это надо? Разве не должно 2 + 2 всегда быть равным 4 независимо от того, что мы вычисляли ранее?

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

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

Если вы хотите узнать больше о RNN, вы можете прочитать часть 2, где мы использовали ее для создания фальшивой книги Эрнеста Хемингуэя, а затем использовали другую сеть для создания новых уровней игры Super Mario Brothers.

Кодировки

Другая идея, которую мы должны рассмотреть – это кодировки. Мы говорили о кодировках в части 4, посвященной распознаванию лиц. Чтобы объяснить кодировки, давайте немного отвлечемся в сторону различения людей с помощью компьютера.

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

Вы, вероятно, уже видели подобное в детективных шоу типа CSI:

Идея превратить лицо в набор измерений является примером кодирования. Мы берем необработанные данные (изображение лица) и превращаем его в список измерений, которые его представляют (кодировка).

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

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

Угадайте, что мы сделаем дальше? Правильно, мы можем сделать то же самое с предложениями! Мы можем придумать кодировку, которая представляет все возможные предложения в виде последовательности уникальных чисел:

Чтобы сгенерировать кодировку, мы будем давать RNN по одному слову за раз. После обработки последнего слова мы получим значение, соответствующее всему предложению:

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

Давайте переводить!

Итак, мы знаем, как использовать RNN для кодирования предложения в виде набора уникальных чисел. Как это нам поможет? Сейчас начнется все самое интересное!

Что, если мы возьмем две RNN и соединим их? Первая RNN может генерировать кодировку, представляющую предложение. Тогда вторая RNN могла бы принять эту кодировку и выполнить обратную операцию, декодировать исходное предложение:

Конечно, кодировать и снова декодировать исходное предложение не особо-то полезно. Но что, если (барабанная дробь!…) мы могли бы обучить вторую RNN декодировать предложение на испанском, а не на английском? Мы могли бы использовать наши параллельные корпуса, чтобы обучить ее этому:

Таким образом мы получим общий способ преобразования последовательности английских слов в эквивалентную последовательность испанских слов!

Это очень сильная идея:

  • Во-первых, этот подход ограничен лишь количеством обучающих данных и количеством вычислительной мощности, которую вы можете выделить на перевод. Исследователи машинного обучения изобрели этот метод всего два года назад, но такие системы уже работают лучше, чем статистические системы машинного перевода, на разработку которых ушло 20 лет.
  • Во-вторых, система не зависит от знания каких-либо правил языка. Алгоритм сам определяет эти правила. Это означает, что вам не нужны эксперты, которые должны настраивать каждый шаг вашего конвейера переводов. Компьютер сделает это за вас.
  • И наконец, этот подход работает практически для всех последовательных задач! И оказывается, что задач таких немало. Читайте дальше, и узнаете еще больше крутых вещей!

Обратите внимание, что мы опустили некоторые проблемы, которые необходимо решить, чтобы запустить эту систему на реальных данных. Например, нам нужно решить проблему с различными длинами предложений ввода и вывода (см. bucketing and padding). Также есть проблемы с переводом редких слов.

Создание собственной системы перевода

Если вы хотите создать свою собственную систему перевода языков, то уже есть рабочая система с использованием TensorFlow, которая переводит между английским и французским. Однако, она не подходит для слабонервных или для тех, у кого ограниченные бюджеты. Эта технология все еще новая и очень ресурсоемкая. Даже если у вас быстрый компьютер с видеокартой высокого класса, для обучения вашей языковой системы перевода может потребоваться около месяца непрерывной обработки данных.

Кроме того, последовательные методы перевода языков развиваются настолько быстро, что очень трудно идти с ними в ногу. Многие последние фишки (например, добавление механизма внимания или отслеживания контекста) значительно улучшают результаты, но эти изменения настолько новы, что про них даже еще не написано в Википедии. Если вы хотите сделать что-то серьезное с помощью последовательного обучения, вам нужно будет подхватывать новые разработки по мере их возникновения.

Удивительная мощь последовательных моделей

Итак, что еще мы можем сделать с такими моделями?

Примерно год назад исследователи из Google показали, что мы можем использовать последовательные модели для создания роботов с ИИ. Идея настолько проста, что удивительно, как она вообще работает.

Сначала они сохраняли переписки между сотрудниками Google и службой технической поддержки Google. Затем натренировали модель, где вопрос сотрудника был входным предложением, а ответ команды технической поддержки был «переводом» этого предложения.

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

Конечным результатом был полуинтеллектуальный бот, который мог (иногда) отвечать на реальные вопросы технической поддержки. Вот часть примерного диалога между пользователем и ботом из их статьи:

Человек: у меня тут разрыв соединения или что-то в этом роде

Машина: могу ли я узнать версию подключения к сети, которую вы используете?

Человек: я не уверен, что понимаю, о чем вы

Машина: подключение к сети всплывает для любого пользовательского сертификата?

Человек: да

Машина: вы сейчас дома или на работе? В офисе?

Человек: я нахожусь дома

Машина: попробуйте это. Перейдите по <ссылке> и введите свое имя и пароль

Человек: сделано

Машина: попробуйте войти в систему с помощью <имя> и проверьте, работает ли она теперь

Человек: да, теперь работает!

Машина: Отлично. Чем еще я могу помочь?

Также ребята из Google пытались создать чат-бота на основе миллионов субтитров к фильмам. Идея заключалась в том, чтобы использовать разговоры между персонажами как способ обучить бота вести человеческий диалог. Входное предложение представляет собой строку диалога, сказанную персонажем, а «перевод» – это то, что собеседник говорит в ответ:

Это дало действительно интересные результаты. Бот не только разговаривал, как человек, но и проявлял черты интеллекта:

Человек: меня зовут Дэвид. Как меня зовут?

Машина: Дэвид.

Человек: меня зовут Джон. Как меня зовут?

Машина: Джон.

Человек: ты лидер или последователь?

Машина: я лидер.

Человек: ты последователь или лидер?

Машина: я лидер.

И это только начало возможностей. Мы не ограничиваемся простым преобразованием одного предложения в другое. Также возможно создать модель, которая могла бы составлять словесное описание изображения!

Другая команда в Google сделала это, заменив первую RNN на сверточную нейронную сеть (мы говорили о такой сети в третьей части). Это позволяет вводить изображение вместо предложения. Остальная часть системы работает примерно так же:

Таким нехитрым путем мы можем превращать картинки в слова (если у нас есть огромное количество обучающих данных)!

Андрей Карпатый (Andrej Karpathyразвил эти идеи, чтобы создать систему, способную подробно описывать изображения, обрабатывая несколько областей изображения отдельно:

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

Исследователи работают также и над обратной задачей – создание изображения по словесному описанию!

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

Если вы хотите узнать больше о последовательных моделях и переводах, вот несколько рекомендуемых ресурсов: