Шрифт:
Интервал:
Закладка:
Не менее, чем вопрос о топологии рекуррентных сетей, интересен вопрос: каким образом такие сети могут быть обучены? Трюки, позволяющие применять метод обратного распространения ошибки к рекуррентным сетям, изобретались разными исследователями неоднократно. Наверное, самый популярный из них получил название «метод обратного распространения ошибки сквозь время» [backpropagation through time]. Идея заключается в том, чтобы развернуть рекуррентную сеть вдоль временно́й шкалы, дублируя её для каждого момента времени и заменяя рекуррентные связи на прямые, соединяющие сеть, относящуюся к моменту времени t, с копией сети, относящейся к моменту времени t + 1. Однако применение этого метода на практике обнажает ахиллесову пяту метода обратного распространения ошибки — «проблему исчезающего (или затухающего) градиента» [vanishing gradient problem]. Поскольку производные сигмоидальных функций на краях достаточно малы, абсолютный размер ошибки (а значит, и величин коррекции весов сети) быстро уменьшается по мере удаления слоя, для которого производится расчёт, от выходного слоя сети. В принципе, эта проблема характерна не только для сигмоидальных функций, поскольку в процессе обратного распространения ошибки градиент для каждого i-го слоя рассчитывается на базе градиента для i + 1-го слоя, отдельные компоненты градиента могут легко стать слишком малыми величинами. Таким образом, острота проблемы растёт по мере увеличения количества слоёв обучаемой сети. В случае развёрнутой на множество шагов во времени рекуррентной сети, как и в случае других сверхглубоких архитектур, мы неизбежно будем сталкиваться с ситуацией, когда точности выбранного для хранения весов типа данных перестанет хватать для хранения сверхмалых компонент градиента. И даже если мы сможем преодолеть эту проблему, скажем за счёт использования специальных типов, скорость обучения такой сети будет, скорее всего, неудовлетворительной, ведь синаптические веса в передних слоях сети будут корректироваться крайне медленно. Вообще, градиенты весов нейронных сетей штука чрезвычайно капризная — при некоторых условиях они могут не только исчезать, но и, напротив, «взрываться» [exploding gradient problem]. Взрывающиеся или затухающие градиенты могут привести к стагнации или, напротив, слишком быстрому изменению синаптических весов и тем самым сделать обучение нейронной сети нестабильным. Поэтому архитекторы нейронных сетей нередко вынуждены применять для решения подобных проблем особую «уличную магию», например «обрезку градиента» [gradient clipping][1491], уже упоминавшиеся нами «перепрыгивающие связи» и так далее.
Из-за проблемы исчезающего градиента на границе 1980–1990-х гг. исследователи могли позволить себе рекуррентные сети, способные различать лишь сравнительно короткие зависимости в обрабатываемых последовательностях[1492], [1493]. Было трудно поверить в то, что когда-нибудь появятся сети, способные улавливать закономерности в событиях, разделённых десятками или даже сотнями шагов. Однако через некоторое время появилась новая нейросетевая архитектура, способная существенно снизить остроту этой проблемы. О ней мы и поговорим в следующем разделе.
Рис. 106. Схематическое изображение блока рекуррентной нейронной сети (RNN). Обозначения: ht−1 — предыдущее скрытое состояние, ht — текущее скрытое состояние, xt — обрабатываемый элемент последовательности, ot — текущий выход, th — функция активации (гиперболический тангенс)
5.2.5.3 Сети с долгой краткосрочной памятью (LSTM) и другие модели
Решительный шаг вперёд в области рекуррентных нейронных сетей удалось сделать в 1997 г., когда Юрген Шмидхубер и Зепп Хохрайтер предложили[1494] принципиально новую архитектуру, получившую весьма оригинальное название — «долгая краткосрочная память» (Long short-term memory, LSTM).
Сталкиваясь с памятью людей, можно заметить, что люди помнят только важные события, а многое старое и ненужное забывается. Можно представить, что было бы, если бы человек запоминал абсолютно всё. Например, такая ситуация описана в рассказе «Фунес, чудо памяти» (Funes el memorioso)[1495], принадлежащем перу аргентинского писателя Хорхе Луиса Борхеса. Чтобы убить время, главный герой рассказа восстанавливает в своей памяти переживания целого дня, на что у него уходит также целый день. Фунес изобретает собственную систему счисления, где каждое число имеет своё название, например число 7030 получает имя «Максимо Перес», а 7040 — имя «поезд». Лирический герой автора пытается объяснить Фунесу, что такая система противоречит самой идее счёта, но Фунес не понимает его или не хочет понимать.
Действительно, способность к обобщению, к абстракции основывается на отвлечении от конкретных деталей, на их забвении. Избавившись от неважных деталей, мы можем находить аналогии, и именно они позволяют нам сложить 7030 и 7040, в то время как трудно представить себе операцию сложения «Максимо Переса» и «поезда». Поэтому возникает вполне резонный вопрос: нельзя ли реализовать в нейронных сетях такой механизм забывания, который позволял бы сети запоминать важные признаки последовательности, игнорируя не влияющие ни на что мелочи? Именно эта идея лежит в основе «долгой краткосрочной памяти» Шмидхубера и Хохрайтера.
Основой LSTM-сети являются так называемые LSTM-блоки (LSTM units). Такой блок представляет собой рекуррентный элемент сети, способный запоминать значения как на короткие, так и на длинные промежутки времени. Это достигается благодаря тому, что LSTM‑блок не использует функцию активации внутри своих рекуррентных компонентов, благодаря чему хранимое значение не размывается во времени и при использовании метода обратного распространения ошибки во времени градиент не исчезает.
Обычно LSTM-блоки содержат три вентиля [gate], предназначенных для управления потоками информации на входе, выходе и внутри блока. Эти вентили называются соответственно «входным» [input gate], «выходным» [output gate] и «вентилем забывания» [forget gate].
Основной функцией, выполняемой LSTM-блоком, является отслеживание зависимостей между элементами поступающей на вход последовательности. Входной вентиль определяет меру, в которой новые значения поступают в ячейку памяти [cell], вентиль забывания — меру, в которой значения сохраняются в ячейке от шага к шагу, а выходной вентиль отвечает за меру, в которой значения в ячейке используются для вычисления выходного значения. Обученный блок должен понимать, что именно и в какой мере стоит замечать, запоминать и использовать для ответа на каждом из шагов.
LSTM-блок может содержать несколько ячеек памяти, управляемых одними и теми же вентилями. К сожалению, в отношении терминологии в данном случае существует некоторая путаница[1496], но мы будем придерживаться именно этих наименований — LSTM-блок для обозначения совокупности ячеек памяти и управляющих вентилей и LSTM-ячейка для