Как HMTL помогает улучшить итоговую точность в задачах NLP

5 декабря 2018
многозадачное обучение hmtl

Как HMTL помогает улучшить итоговую точность в задачах NLP

Да, вы правильно прочитали, это правда HMTL — модель Hierarchical Multi-Task Learning, что дословно переводится как Иерархическое многозадачное обучение. Наблюдается нарастающая волна как в NLP, так и в целом в глубоком…

Да, вы правильно прочитали, это правда HMTL — модель Hierarchical Multi-Task Learning, что дословно переводится как Иерархическое многозадачное обучение. Наблюдается нарастающая волна как в NLP, так и в целом в глубоком обучении, которая называется многозадачное обучение!

Перевод статьи Beating state-of-the-art in NLP with HMTL, автор — Victor Sanh.

Я работал с многозадачным обучением на протяжении года, и результатом работы является HMTL. Эта модель, которая превосходит современные state-of-the-art модели в некоторых задачах NLP, будет представлена на избирательной конференции AAAI. Была выпущена статья и представлен тренировочный код, которые стоит посмотреть.

Одна модель для нескольких задач

Дадим определение многозадачному обучению.

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

Создана качественная онлайн демо-версия, в которой можно интерактивно взаимодействовать с HMTL. Попробуйте сами!

Примеры полученных в демо HTML результатов.
Примеры полученных в демо HMTL результатов.

Традиционно, специальные модели обучались независимо для каждой из этих NLP задач (Named-Entity Recognition, Entity Mention Detection, Relation Extraction, Coreference Resolution).

В случае HMTL, все эти результаты получаются при помощи одной модели с одним прямым прохождением!

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

Многозадачное обучение (Multi-Task Learning, MTL) поощряет модели использовать признаки и методы, которые могут быть полезны в других задачах. Фундаментальная движущая сила MTL состоит в том, что близкие задачи должны получать преимущества друг от друга через индуцирование более богатых представлений.

Читайте также: Transfer learning с библиотекой Keras

Зачем применять многозадачное обучение

В классической парадигме машинного обучения мы обучаем одну модель через оптимизацию одной функции потери для выполнения одной конкретной задачи. Хотя фокусировка обучения на одном интересующем задании ещё является общим подходом для многих задач машинного обучения, это несет в себе недостатки. Такой способ никак не учитывает информацию, которую могут давать связанные (или почти связанные) задачи, чтобы добиться более точного результата.

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

В естественной обработке языка MTL сначала был использован в подходах на нейронной основе исследователями R. Collobert и J. Weston. Модель, которую они предложили, представляла из себя MTL-инстанс, в котором несколько разных задач (со слоями для узкоспециализированных задач) основаны на одних и тех же общих вложениях, тренируемых для выполнения различных задач.

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

Хотя и можно заранее простым способом зафиксировать, как информация будет передаваться между задачами, мы можем также позволить модели самой решать, какие параметры и слои она должна делить (share), а также какие слои лучше всего использовать для данной задачи.

В последнее время идеи общих представлений вновь появились в значительной степени из-за погони за универсальными вложениями предложений, которые могут быть использоваться во всех областях независимо от конкретной задачи. Некоторые полагаются на MTL. Subramanian et al., например, заметил: для того чтобы иметь возможность обобщать широкий круг разнообразных задач, необходимо кодировать несколько лингвистических аспектов предложения. Была предложена Gensen — архитектура MTL с общим представлением кодировщика с несколькими последующими слоями для конкретных задач. В этой работе использовались 6 различных слабо связанных задач — от поиска логических выводов из естественного языка до машинного перевода через разбор грамматики с фразовыми структурами.

Коротко говоря, многозадачное обучение сейчас привлекает к себе много внимания и становится обязательным для широкого спектра задач не только в естественной обработке языка, но и в компьютерном зрении. Совсем недавно бенчмарки, такие как GLUE benchmark (оценка общего понимания языка), были представлены для оценки обобщающей способности архитектур MTL и, в более общем смысле, моделей понимания языка (Language Understanding).

Многозадачное обучение на Python

Теперь давайте напишем код, чтобы увидеть как работает MTL на практике.

Очень важная часть программы многозадачного обучения — тренировка. Здесь необходимо ответить на вопросы:

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

По этим вопросам нет единого мнения, в литературе встречается много вариаций обучения.

Для начала давайте начнем с простой и общей части кода, которой будут безразличны обучающие процессы:

  • Выбираем задачу (независимо от выбора алгоритма);
  • Выбираем пакет (batch) в датасете для выбранной задачи (случайная выборка пакета — почти всегда хороший выбор);
  • Выполним прямой проход через нейросеть;
  • Распространим ошибку в обратном направлении.

Этих четырех шагов должно быть достаточно в большинстве случаев.

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

На сайте Hugging Face представлена хорошая библиотека AllenNLP, разрабатываемая Институтом ИИ Аллена. Эта библиотека — мощный и в то же время гибкий инструмент для проведения исследований в NLP. AllenNLP совмещает в себе гибкость PyTorch с умными модулями для загрузки и обработки данных, которые тщательно разрабатывались для задач NLP.

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

Код

Ниже я представлю простую часть кода для создания обучающей модели MTL на основе AllenNLP.

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

Теперь, когда у нас есть класс Task, мы можем определить нашу модель Model.

Создание модели в AllenNLP — весьма простое занятие. Для этого нужно просто сделать ваш класс наследуемым от класса allennlp.models.model.Model. В этом случае будет автоматически получено множество методов, таких как get_regularization_penalty(), который будет штрафовать модель (То есть L1 или L2 регуляризация) во время обучения.

Давайте поговорим о двух основных методах, которые мы будем использовать в работе сети, это forward() и get_metrics(). Эти методы во время обучения рассчитывают, соответственно, прямое прохождение (вплоть до вычисления потерь) и метрики обучения/оценки для данной задачи.

Важный элемент в многозадачном обучении — добавить конкретный аргумент task_name, который во время обучения будет использоваться для выбора текущей интересующей задачи. Давайте посмотрим, как это написать:

Ключевой пункт в MTL — выбор порядка выполнения (обучения) задач. Самый простой способ сделать это — производить выбор задачи случайно из равномерного распределения после каждого обновления параметров (прямой + обратный проход через нейросеть). Такой алгоритм использовался в нескольких ранних работах, таких как упомянутый ранее Gensen.

Однако мы можем поступить несколько умнее. Давайте выбирать задачу случайным образом, учитывая распределение вероятности, в котором каждая вероятность выбора задачи пропорциональна отношению количества пакетов (training batch) для задачи к общему числу пакетов. Как мы увидим позже, такая схема случайного выбора оказывается весьма полезной и является элегантным способом предотвратить забывание (catastrophic forgetting — явление в искусственных нейронных сетях, которое описывает потерю выученной ранее информации при получении новой информации).

В следующем куске кода реализована процедура выбора задачи. Здесь task_list определяется как список задач Task, на которых мы хотим обучать нашу модель.

Давайте запустим нашу MTL модель.

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

Итерации метода train() будут проходить по задачам в соответствии с их распределением вероятности. Метод также будет оптимизировать параметры MTL модели шаг за шагом.

Хорошей идеей будет добавить условие остановки во время обучения на основе валидационных метрик (_val_metric и _val_metric_decreases в классе Task). Например, можно останавливаться, когда валидационная метрика не улучшается в течение patience количества эпох. Такое условие проверяется после каждой тренировочной эпохи. Хотя мы этого не делали, вы должны легко разобраться, как модифицировать представленный код, чтобы он принимал во внимание это улучшение. В любом случае, здесь можно посмотреть на полный тренировочный код.

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

  • Последовательная регуляризация. Одна из основных проблем во время обучения MTL модели — забывание. Модель полностью или частично забывает часть информации, связанную с обучением прошлой задачи, после обучения новой задачи. Это явление повторяется вновь и вновь, когда несколько задач выполняются последовательно. Hashimoto et al. представляет последовательную регуляризацию: она предотвращает слишком сильное по сравнению с прошлыми эпохами обновление параметров при помощи добавления L2 штрафа к функции потерь. В таком конфигурации тренер MTL не меняет задачу после обновления параметров, а проходит полный тренировочный датасет интересующей задачи.
  • Многозадачное обучение как вопросно-ответная система. Недавно McCann et al. [7] представил новую парадигму в исполнении многозадачного обучения. Каждая задача переформулируется в вопросно-ответную задачу, а единственная модель (MQAN) обучается совместно отвечать на 10 разных задач, рассмотренных в этой работе. MQAN достигает state-of-the-art результатов в нескольких задачах, например, в таких WikiSQL — задача семантического парсинга. Вообще говоря, в этой работе обсуждаются ограничения монозадачного обучения и связи многозадачного обучения с Transfer Learning.

Улучшение state-of-the-art в семантических задачах: Модель иерархического многозадачного обучения (HMTL)

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

В недавней работе, представленной на AAAI в январе, было предложено сконструировать такую модель в виде иерархии. Если говорить более подробно, мы строим иерархию между набором точно подобранных семантических задач, чтобы отразить лингвистические иерархии между разными задачами (здесь также полезно посмотреть Hashimoto et al.).

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

Мы рассматриваем набор, состоящих их следующих семантических задач:

  • Named Entity Recognition;
  • Entity Mention Detection;
  • Relation Extraction;
  • Coreference Resolution.

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

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

  • Комбинация упомянутых 4 задач приводят к state-of-the-art результатам на 3 из них (Named Entity Recognition, Relation Extraction and Entity Mention Detection);
  • Фреймворк MTL значительно ускоряет скорость обучения по сравнению с фреймворками монозадачного обучения.

Мы также проанализировали  обучаемые и совместно используемые вложения в HMTL. Для анализа использовался SentEval — набор из 10 пробных задач, представленных Conneau et al. [8]. Эти пробные задания нацелены на оценку способности распознавать широкий набор лингвистических свойств (синтаксические, поверхностные и семантические).

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

Нейросеть научили описывать происходящее на видео

9 ноября 2018

Нейросеть научили описывать происходящее на видео

Разрабочики Facebook создали нейронную сеть, которая описывает происходящее на видео в реальном времени. Они также собрали датасет из 20 тысяч видеороликов с 123 тысячами описаний. В перспективе технология может помочь…

Разрабочики Facebook создали нейронную сеть, которая описывает происходящее на видео в реальном времени. Они также собрали датасет из 20 тысяч видеороликов с 123 тысячами описаний. В перспективе технология может помочь слабовидящим и незрячим людям в повседневной жизни, создавая описания к окружающему миру.

Создание описаний происходящего

Команда обучала рекуррентную нейронную сеть (RNN) с архитектурой энкодер-декодер, которая обычно используется для задач обработки естественного языка. Для обучения использовались 17098 видео датасета VideoStory. Нейросеть кодировала видео и описывала каждый сегмент. Модель научилась генерировать описания, однако они не были совсем правильными. В видео, где ребенок играл с собакой, описывались только действия собаки. Однако нейросеть умеет учитывать корреляцию между прошлыми и будущими событиями и добавлять контекст.

Описания, сгенерированные нейронной сетью

Датасет VideoStory

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

Примеры описаний видео в датасете

В Facebook нацелены совершенствовать разработку — сделать текстовые описания видео более последовательными и обучить модель «рассказывать истории». Работу представили в ноябре на конференции EMNLP 2018, посвященной эмпирическим методам в обработке естественного языка.

LSTM — нейронная сеть с долгой краткосрочной памятью

13 сентября 2018
сети LSTM

LSTM — нейронная сеть с долгой краткосрочной памятью

Люди не запускают мыслительный процесс с нуля в каждый момент времени. Читая статью, вы понимаете смысл каждого слова на основе значений предыдущих слов. Мысли имеют свойство накапливаться и влиять друг…

Люди не запускают мыслительный процесс с нуля в каждый момент времени. Читая статью, вы понимаете смысл каждого слова на основе значений предыдущих слов. Мысли имеют свойство накапливаться и влиять друг на друга. Этот принцип используется в сетях LSTM.

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

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

Рекуррентные нейронные сети (РНС) решают эту проблему. В них присутствуют циклы, сохраняющие информацию.

Рекуррентная нейронная сеть цикл
Циклы в РНС

На приведенной выше диаграмме часть нейронной сети A принимает входной сигнал x и выводит значение h. Цикл позволяет передавать информацию с одного шага сети на другой.

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

Развертка цикла в РНС
Развертка цикла в РНС

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

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

Существенным подспорьем в решении перечисленных задач стали LSTM — специфического типа рекуррентные нейронные сети, которые решают отдельные задачи гораздо эффективнее стандартных методов. С использованием сетей LSTM связаны все захватывающие результаты, основанные на РНС.

Проблема долгосрочных связей

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

Иногда для решения задачи требуется просмотреть только последнюю информацию. Например, построить лингвистическую модель, которая пытается предсказать следующее слово, основываясь на предыдущих. Если мы пытаемся предсказать последнее слово в словосочетании «облака в небе», нам не нужен дополнительный контекст — очевидно, что следующее слово будет «небе». В тех случаях, когда разрыв между предыдущей информацией и местом, в котором она нужна, невелик, РНС справится с задачей.

Разрыв между информацией - LSTM нейронная сеть

Но иногда требуется больше контекста. Рассмотрим попытку предсказать последнее слово в тексте «Я вырос во Франции … Я свободно говорю на французском». Из предыдущих слов понятно, что следующим словом, вероятно, будет название языка, но если мы хотим назвать правильный язык, нужно учесть упоминание о Франции. Разрыв между необходимой для учета информацией и точкой, в которой она нужна, становится бОльшим.

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

сети LSTM как работают

В теории РНС способны справиться с такими «долгосрочными зависимостями». Исследователь может тщательно подобрать параметры сети для устранения этой проблемы. К сожалению, на практике РНС не способны решить эту задачу. Проблема подробно исследована в работах [Hochreiter (1991)] и [Bengio, et al. (1994)], в которых выявлены фундаментальные ограничения РНС.

К счастью, у LSTM нет этой проблемы!

Сети LSTM

LSTM (long short-term memory, дословно (долгая краткосрочная память) — тип рекуррентной нейронной сети, способный обучаться долгосрочным зависимостям. LSTM были представлены в работе [Hochreiter & Schmidhuber (1997)], впоследствии усовершенствованы и популяризированы другими исследователями, хорошо справляются со многими задачами и до сих пор широко применяются.

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

Все рекуррентные нейронные сети имеют форму цепочки повторяющихся модулей нейронной сети. В стандартных РНС этот повторяющийся модуль имеет простую структуру, например, один слой tanh.

пример lSTM
Повторяющийся модуль стандартной РНС состоит из одного слоя
LSTM пример
Повторяющийся модуль LSTM состоит из четырех взаимодействующих слоев

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

LSTM нейронная сеть

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

Принцип работы LSTM сети

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

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

состояние ячейки LSTM

В LSTM уменьшает или увеличивает количество информации в состоянии ячейки, в зависимости от потребностей. Для этого используются тщательно настраиваемые структуры, называемые гейтами.

Гейт — это «ворота», пропускающие или не пропускающие информацию. Гейты состоят из сигмовидного слоя нейронной сети и операции поточечного умножения.

гейт lstm

На выходе сигмовидного слоя выдаются числа от нуля до единицы, определяя, сколько процентов каждой единицы информации пропустить дальше. Значение «0» означает «не пропустить ничего», значение «1» — «пропустить все».

Пошаговая схема работы LSTM сети

LSTM имеет три таких гейта для контроля состояния ячейки.

Слой утраты

На первом этапе LSTM нужно решить, какую информацию мы собираемся выбросить из состояния ячейки. Это решение принимается сигмовидным слоем, называемым «слоем гейта утраты». Он получает на вход h и x и выдает число от 0 до 1 для каждого номера в состоянии ячейки C.означает «полностью сохранить», а 0 — «полностью удалить».

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

Слой сохранения

На следующем шаге нужно решить, какую новую информацию сохранить в состоянии ячейки. Разобьем процесс на две части. Сначала сигмоидный слой, называемый «слоем гейта входа», решает, какие значения требуется обновить. Затем слой tanh создает вектор новых значений-кандидатов C, которые добавляются в состояние. На следующем шаге мы объединим эти два значения для обновления состояния.

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

LSTM tahn

Новое состояние

Теперь обновим предыдущее состояние ячейки для получения нового состояния C. Способ обновления выбран, теперь реализуем само обновление.

Умножим старое состояние на f, теряя информацию, которую решили забыть. Затем добавляем i*C. Это новые значения кандидатов, масштабируемые в зависимости от того, как мы решили обновить каждое значение состояния.

В случае с лингвистической моделью мы отбросим информацию о роде старого субъекта и добавим новую информацию.

LSTM

Наконец, нужно решить, что хотим получить на выходе. Результат будет являться отфильтрованным состоянием ячейки. Сначала запускаем сигмоидный слой, который решает, какие части состояния ячейки выводить. Затем пропускаем состояние ячейки через tanh (чтобы разместить все значения в интервале [-1, 1]) и умножаем его на выходной сигнал сигмовидного гейта.

Для лингвистической модели, так как сеть работала лишь с подлежащим, она может вывести информацию, относящуюся к глаголу. Например, сеть выведет информацию о том, в каком числе представлено подлежащее (единственное или множественное) для правильного спряжения глагола.

Новое состояние LSTM

Примеры LSTM

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

В популярном варианте LSTM, представленном в [Gers & Schmidhuber (2000)], мы позволяем слоям гейтов просматривать состояние ячейки.

LSTM 2000 год

На диаграмме вверху «глазок» есть у всех гейтов, но во многих статьях он есть лишь у некоторых гейтов.

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

LSTM сети

Несколько отличающейся пример LSTM — Gated Recurrent Unit или GRU, введенная в [Cho, et. al. (2014)]. Она объединяет гейты утраты и входа в единый «шлюз обновления». В нем также объединяются состояние ячейки и скрытое состояние и вносятся некоторые другие изменения. Получающаяся модель проще по сравнению со стандартными типами LSTM и становится все более популярной.

LSTM пример

Это лишь некоторые из наиболее известных вариантов LSTM. Есть много других, таких как РНС с гейтом глубины (см. [Yao, et al. (2015)]). Известен также совершенно иной подход к решению долгосрочных зависимостей, приведенный в [Clockwork RNN by Koutnik, et al. (2014)].

Какой из перечисленных вариантов лучший? Имеют ли большое значение различия? В [Greff, et al. (2015)] приведено широкое сравнение популярных версий LSTM, а также продемонстрировано, что все они примерно одинаковы. В [Jozefowicz, et al. (2015)] опробованы более десяти тысяч архитектур РНС. Некоторые из них работают лучше LSTM при решении определенных задач.

Заключение

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

LSTM были большим шагом в развитии РНС. Естественно задаться вопросом: а что, можно пойти дальше? Общее для исследователей мнение: «Да! Cледующий шаг заключается в использовании механизма внимания!» Идея состоит в том, чтобы РНС на каждом шаге выбирала информацию для просмотра из некого большего количества данных. Например, если вы используете РНС для создания описания изображения, сеть может выбрать часть изображения для просмотра каждого выводимого слова. Именно это и было проделано в [Xu, et al. (2015)] и станет отправной точкой для изучения механизма внимания.


Интересные статьи:

Рекуррентные нейронные сети: типы, обучение, примеры и применение

11 августа 2018
рекуррентные нейронные сети

Рекуррентные нейронные сети: типы, обучение, примеры и применение

Рекуррентные нейронные сети (Recurrent Neural Networks, RNNs) — популярные модели, используемые в обработке естественного языка (NLP). Во-первых, они оценивают произвольные предложения на основе того, насколько часто они встречались в текстах. Это…

Рекуррентные нейронные сети (Recurrent Neural Networks, RNNs) — популярные модели, используемые в обработке естественного языка (NLP). Во-первых, они оценивают произвольные предложения на основе того, насколько часто они встречались в текстах. Это дает нам меру грамматической и семантической корректности. Такие модели используются в машинном переводе. Во-вторых, языковые модели генерируют новый текст. Обучение модели на поэмах Шекспира позволит генерировать новый текст, похожий на Шекспира.

Что такое рекуррентные нейронные сети?

Идея RNN заключается в последовательном использовании информации. В традиционных нейронных сетях подразумевается, что все входы и выходы независимы. Но для многих задач это не подходит. Если вы хотите предсказать следующее слово в предложении, лучше учитывать предшествующие ему слова. RNN называются рекуррентными, потому что они выполняют одну и ту же задачу для каждого элемента последовательности, причем выход зависит от предыдущих вычислений. Еще одна интерпретация RNN: это сети, у которых есть «память», которая учитывает предшествующую информацию. Теоретически RNN могут использовать информацию в произвольно длинных последовательностях, но на практике они ограничены лишь несколькими шагами (подробнее об этом позже).

Рекуррентная нейронная сеть и ее развертка (unfolding)
Рекуррентная нейронная сеть и ее развертка (unfolding)

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

  • x_t — вход на временном шаге t. Например x_1 может быть вектором с одним горячим состоянием  (one-hot vector), соответствующим второму слову предложения.
  • s_t — это скрытое состояние на шаге t. Это «память» сети. s_t зависит, как функция, от предыдущих состояний и текущего входа x_t: s_t=f(Ux_t+Ws_{t-1}). Функция f обычно нелинейная, например tanh или ReLU. s_{-1}, которое требуется для вычисление первого скрытого состояния, обычно инициализируется нулем (нулевым вектором).
  • o_t — выход на шаге t. Например, если мы хотим предсказать слово в предложении, выход может быть вектором вероятностей в нашем словаре. o_t = softmax(Vs_t)

Несколько заметок:

  • Можно интерпретировать s_t как память сети. s_t содержит информацию о том, что произошло на предыдущих шагах времени. Выход o_t вычисляется исключительно на основе «памяти» s_t. На практике все немного сложнее: s_t не может содержать информацию слишком большого количества предшествующих шагов;
  • В отличие от традиционной глубокой нейронной сети, которая использует разные параметры на каждом слое, RNN имеет одинаковые (U, V, W) на всех этапах. Это отражает тот факт, что мы выполняем одну и ту же задачу на каждом шаге, используя только разные входы. Это значительно уменьшает общее количество параметров, которые нам нужно подобрать;
  • Диаграмма выше имеет выходы на каждом шаге, но, в зависимости от задачи, они могут не понадобиться. Например при определении эмоциональной окраски предложения, целесообразно заботиться только о конечном результате, а не о окраске после каждого слова. Аналогично, нам может не потребоваться ввод данных на каждом шаге. Основной особенностью RNN является скрытое состояние, которое содержит некоторую информацию о последовательности.

Где используют рекуррентные нейросети?

Рекуррентные нейронные сети продемонстрировали большой успех во многих задачах NLP. На этом этапе нужно упомянуть, что наиболее часто используемым типом RNN являются LSTM, которые намного лучше захватывают (хранят) долгосрочные зависимости, чем RNN. Но не волнуйтесь, LSTM — это, по сути, то же самое, что и RNN, которые мы разберем в этом уроке, у них просто есть другой способ вычисления скрытого состояния. Более подробно мы рассмотрим LSTM в другом посте. Вот некоторые примеры приложений RNN в NLP (без ссылок на исчерпывающий список).

Языковое моделирование и генерация текстов

Учитывая последовательность слов, мы хотим предсказать вероятность каждого слова (в словаре). Языковые модели позволяют нам измерить вероятность выбора, что является важным вкладом в машинный перевод (поскольку предложения с большой вероятностью правильны). Побочным эффектом такой способности является возможность генерировать новые тексты путем выбора из выходных вероятностей. Мы можем генерировать и другие вещи, в зависимости от того, что из себя представляют наши данные. В языковом моделировании наш вход обычно представляет последовательность слов (например, закодированных как вектор с одним горячим состоянием (one-hot)), а выход — последовательность предсказанных слов. При обучении нейронной сети, мы подаем на вход следующему слою предыдущий выход o_t=x_{t+1}, поскольку хотим, чтобы результат на шаге t был следующим словом.

Исследования по языковому моделированию и генерации текста:

Машинный перевод

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

Рекуррентные нейронные сети для машинного перевода
RNN для машинного перевода

Распознавание речи

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

Генерация описания изображений

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

Рекуррентные нейронные сети
Глубокие визуально-семантические совмещения для генерации описания изображений. Источник: http://cs.stanford.edu/people/karpathy/deepimagesent/

Обучение RNN

Обучение RNN аналогично обучению обычной нейронной сети. Мы также используем алгоритм обратного распространения ошибки (backpropagation), но с небольшим изменением. Поскольку одни и те же параметры используются на всех временных этапах в сети, градиент на каждом выходе зависит не только от расчетов текущего шага, но и от предыдущих временных шагов. Например, чтобы вычислить градиент при t = 4, нам нужно было бы «распространить ошибку» на 3 шага и суммировать градиенты. Этот алгоритм называется «алгоритмом обратного распространения ошибки сквозь время» (Backpropagation Through Time, BPTT). Если вы не видите в этом смысла, не беспокойтесь, у нас еще будет статья со всеми кровавыми подробностями. На данный момент просто помните о том, что рекуррентные нейронные сети, прошедшие обучение с BPTT, испытывают трудности с изучением долгосрочных зависимостей (например, зависимость между шагами, которые находятся далеко друг от друга) из-за затухания/взрывания градиента. Чтобы обойти эти проблемы, существует определенный механизм, были разработаны специальные архитектуры PNN (например LSTM).

Модификации RNN

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

Двунаправленные рекуррентные нейронные сети (Bidirectional RNNs) основаны на той идее, что выход в момент времени t может зависеть не только от предыдущих элементов в последовательности, но и от будущих. Например, если вы хотите предсказать недостающее слово в последовательности, учитывая как в левый, так и в правый контекст. Двунаправленные рекуррентные нейронные сети довольно просты. Это всего лишь два RNN, уложенных друг на друга. Затем выход вычисляется на основе скрытого состояния обоих RNN.

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

Сети LSTM довольно популярны в наши дни, мы кратко говорили о них выше. LSTM не имеют принципиально отличающейся архитектуры от RNN, но они используют другую функцию для вычисления скрытого состояния. Память в LSTM называется ячейками, и вы можете рассматривать их как черные ящики, которые принимают в качестве входных данных предыдущее состояние h_ {t-1} и текущий входной параметр x_t. Внутри, эти ячейки, решают, какую память сохранить и какую стереть. Затем они объединяют предыдущее состояние, текущую память и входной параметр. Оказывается, эти типы единиц очень эффективны в захвате (хранении) долгосрочных зависимостей.

Умный набор: модель быстрых ответов в Gmail

18 мая 2018
Модель быстрых ответов в Gmail

Умный набор: модель быстрых ответов в Gmail

На прошлой неделе на Google I\O исследователи представили Умный Набор (Smart Compose) — новую функцию в Gmail, которая использует машинное обучение, чтобы интерактивно предлагать завершение предложения, позволяя вам отвечать на электронные письма быстрее. Опираясь…

На прошлой неделе на Google I\O исследователи представили Умный Набор (Smart Compose) — новую функцию в Gmail, которая использует машинное обучение, чтобы интерактивно предлагать завершение предложения, позволяя вам отвечать на электронные письма быстрее. Опираясь на технологии, разработанные для Умного ответа (Smart Reply), Умный набор предлагает новые подсказки в составлении ответов на входящее письмо или создании нового с нуля.

В течение разработки Smart Compose встретились несколько ключевых сложностей:

  1. Задержка: поскольку Smart Compose обеспечивает предсказания на каждое нажатие клавиши, в идеале оно должно давать ответ в течение 100 мс, чтобы пользователь не замечал задержек. Важно найти баланс сложности модели и скорости вывода подсказок.
  2. Выборка: Gmail пользуется более миллиарда человек. Чтобы предлагать полезное для пользователя автоматическое завершение предложений, модель должна иметь достаточно вместимости для создания подсказок, учитывающих даже небольшие изменения контекста.
  3. Честность и конфиденциальность: во время разработки Smart Compose исследователям было необходимо учитывать источники повышенной предвзятости и придерживаться тех же строгих пользовательских стандартов, что и в Smart Reply, будучи уверенными, что их модель никогда не выдаст конфиденциальной информации о пользователе. Исследователи не имели доступа к письмам, что означало, что они должны были разрабатывать и обучать систему машинного обучения на базе данных, которую они сами не могли просматривать.

Поиск правильной модели

Стандартные модели генерации текста, такие как N-грамма (ngram), neural bag-of-words (BoW) и RNN language (RNN-LM) модели, учатся предсказывать следующее слово, основываясь на прошлой последовательности слов. Однако слова, написанные пользователем в текущем письме, служат только “сигналом”, которые модель может использовать для предсказания следующего слова. Модель также берет в расчет тему и текст предыдущего письма (если пользователь отвечает на входящее сообщение).

Один из подходов для добавления дополнительного контекста — рассматривать задачу как “последовательность-в-последовательность” (sequence-to-sequence, seq2seq) задачу машинного перевода, в которой последовательность является конкатенацией (соединением) темы и текста предыдущего письма (если таковое имеется), а целевой последовательностью является письмо, которое пользователь создает в данный момент. В то время как данный подход работает хорошо в смысле качества предсказаний, он не соответствует ограничению по задержке.

Чтобы улучшить это, разработчики скомбинировали модель BoW и модель RNN-LM, которая быстрее seq2seq, немного жертвуя качеством предсказания. В данном гибридном подходе, кодируется тема и предыдущее письмо путем усреднения значений векторов слов (word embeddings) в каждом поле. Далее эти два усредненных вектора соединяются и получившийся вектор передаётся в качестве целевой последовательности для RNN-LM на каждом этапе декодирования (как показывает схема ниже).

Архитектура модели RNN-LM
Архитектура модели RNN-LM для Умного набора. Тема и предыдущее письмо кодированы с помощью усреднения значений векторов слов в каждом поле. Усреднения далее передаются RNN-LM на каждом шаге декодирования.

Обучение и работа ускоренной модели

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

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

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

Честность и конфиденциальность

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

Предстоящая работа

Исследователи постоянно работают над улучшением качества предсказания моделей генерации текста, изучая передовые архитектуры (например Transformer, RNMT+ и т.д.), и экспериментируют с продвинутыми способами обучения. Когда их ограничения по задержке будут устранены, они развернут эти более продвинутые модели в своих продуктах. Они также работают над включением персонализированной языковой модели, сконструированной для более точного понимания пользовательского стиля написания.

Виктор Новосад