Знакомство с архитектурой LSTM-сетей

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

Человек не начинает мыслить с начала каждую секунду. Читая эту статью, вы понимаете каждое слово на основе понимания предыдущих слов. Вы не отбрасываете всю предшествующую информацию, чтобы начать мыслить с нуля. Ваши мысли обладают постоянством.

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

Рекуррентные нейронные сети (РНС, recurrent neural network, RNN) решают эту проблему. Они содержат в себе обратные связи, позволяющие сохранять информацию.

РНС имеют обратные связи

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

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

Развернутая РНС

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

И они действительно применяются для подобных целей! За последние несколько лет РНС с большим успехом были использованы для решения различных задач, таких как распознавание речи, моделирование языка, перевод, создание описаний к изображениям и др. Список можно продолжать. В этой статье мы не будем обсуждать, какие удивительные результаты могут быть достигнуты с помощью РНС. Для этого вы можете прочитать прекрасную статью Андрея Карпаты (Andrej Karpathy) под названием «Невероятная эффективность рекуррентных нейронных сетей» (The Unreasonable Effectiveness of Recurrent Neural Networks). Скажу лишь, что результаты действительно впечатляют.

Большая часть успехов была достигнута с помощью особого типа РНС, называемого LSTM-сетью (long short-term memory, долговременно-кратковременная память), который при решении различных задач значительно превосходит стандартный вариант. Об LSTM-архитектуре мы как раз и поговорим в этой статье.

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

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

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

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

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

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

К счастью, LSTM-сети лишены такого недостатка!

LSTM-сети

LSTM-сеть – это особый тип РНС, способный обучаться долговременным зависимостям. LSTM-сети были представлены в работе Hochreiter and Schmidhuber, 1997, а затем оптимизированы и популяризированы во многих последующих работах. Такие сети прекрасно справляются с решением многих задач и находят широкое применение в данное время.

LSTM-сети разработаны специально для того, чтобы решить проблему долговременных зависимостей. Хранение информации в течение длительных периодов времени – это их поведение по умолчанию.

Повторяющийся модуль стандартной РНС содержит один слой.

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

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

Повторяющийся модуль LSTM-сети содержит четыре взаимодействующих слоя

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

Слой нейронной сети
Поточечная операция
Передача вектора
Объединение
Копирование

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

Идея, лежащая в основе LSTM-сетей

Ключевой особенностью LSTM-сети является состояние ячейки (cell state), представленное горизонтальной линией в верхней части следующего рисунка.

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

LSTM-сеть имеет возможность удалять и добавлять информацию в состояние ячейки. Этот процесс регулируется специальными структурами, называемыми гейтами (gate).

Гейт – это механизм, позволяющий пропускать информацию избирательно. Он состоит из sigmoid-слоя (функция активации – сигмоида) и операции поточечного умножения.

Выходом sigmoid-слоя является число от 0 до 1, которое определяет уровень пропускания. Ноль означает «не пропустить ничего», а единица – «пропустить все».

Ячейка имеет три гейта, управляющих ее состоянием.

Поэтапное объяснение процессов, происходящих в LSTM-сети

На первом этапе необходимо решить, какую информацию следует удалить из состояния ячейки. Это решение принимает sigmoid-слой, называемый «гейтом забывания» (forget gate). Он принимает на входе ht-1 и xt и дает на выходе число от 0 до 1 для каждого значения в состоянии ячейки Ct-1. Единица означает «полностью сохранить», а ноль – «полностью удалить».

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

На следующем этапе необходимо решить, какую новую информацию следует записать в состояние ячейки. Этот этап делится на две части. Вначале sigmoid-слой, называемый «входным гейтом» (input gate), решает, какие значения необходимо обновить. Затем tanh-слой создает вектор новых значений-кандидатов Ct, которые могут быть добавлены в состояние ячейки.

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

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

Мы умножаем предыдущее состояние ячейки на ft, «забывая» таким образом то, что ранее было решено «забыть». Затем прибавляем it * Сt – новые значения-кандидаты, отмасштабированные соответствующим образом.

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

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

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

Модификации LSTM-архитектуры

Мы с вами рассмотрели стандартную LSTM-архитектуру. Кроме нее также существуют различные модификации. На самом деле, почти во всех работах, затрагивающих тему LSTM-сетей, применяются версии с определенными отличиями. Рассмотрим некоторые из них.

Один из популярных вариантов LSTM-сети, представленный в работе Gers and Schmidhuber, 2000, содержит специальные связи, которые реализуют своего рода «смотровые отверстия». Благодаря этому гейты получают возможность «видеть» состояние ячейки.

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

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

Еще одной вариацией на тему LSTM-сетей является архитектура на основе GRU (gated recurrent unit, управляемый рекуррентный нейрон), представленная в работе Cho et al., 2014. В этом варианте гейт забывания и входной гейт объединены в один «гейт обновления» (update gate). Кроме того, объединены вместе состояние ячейки и скрытое состояние, а также присутствуют другие изменения. Полученная в результате модель является более простой, чем стандартные LSTM-модели, и, как следствие, в последнее время набирает все большую популярность.

Мы рассказали лишь о некоторых наиболее интересных модификациях LSTM-архитектуры. Существует множество других вариантов, например, depth-gated RNN (РНС с управлением по глубине) [Yao et al., 2015]. Также были предложены и принципиально другие подходы к решению проблемы долговременных зависимостей, например, clockwork RNN [Koutnik et al., 2014].

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

По материалам: colah’s blog

Добавить комментарий

Ваш адрес email не будет опубликован.

закрыть

Поделиться

Отправить на почту
закрыть

Вход

закрыть

Регистрация

+ =