С июня 2020 г. я больше не буду использовать Medium для публикации новых историй. Пожалуйста, посетите мой личный блог, если вы хотите продолжить читать мои статьи: https://vallant.in.

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

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

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

Проблема перевода

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

Клара прекрасна = Clara é bonita

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

  • Клара — человек;
  • Клара — слово женского рода;
  • Клара в единственном числе;
  • прилагательное красивое.

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

Исчезающий и взрывающийся градиент

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

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

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

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

ЛСТМ

Согласно Википедии, LSTM — это единицы, составляющие RNN. Блок LSTM состоит из ячейки, входного затвора, выходного затвора и затвора забывания. Ячейка способна запоминать значения за произвольные промежутки времени. Затем поток информации в клетку регулируется воротами.

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



Прогнозирование интереса с помощью RNN

Теперь пришло время увидеть на практике, как все это работает. Давайте снова возьмем в качестве примера президентские выборы в Бразилии, которые происходят сейчас, в октябре 2018 года. Я зашел в Google Trends и загрузил общий интерес к слову «presidente» (президент) в Бразилии с 2004 года. Затем я разделил данные на обучающие и тестовые.

Если вы хотите следовать вместе со мной, вы можете скачать файлы данных здесь.

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

Во-первых, давайте загрузим необходимые библиотеки и импортируем набор данных. Набор данных состоит из двух столбцов: дата (год и месяц) и число от 0 до 100, представляющее интерес к поисковому запросу. Мы установим столбец даты в качестве индекса, чтобы мы могли сделать некоторую визуализацию.

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

Что мы видим здесь, так это то, что у нас есть — в целом — положительная тенденция. Интерес имеет тенденцию к росту. Мы также видим, что у нас есть некоторый компонент сезонности, который можно извлечь здесь, показывающий, что поведение каким-то образом повторяется через несколько лет (в нашем случае интерес к слову).

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



Затем мы должны масштабировать все значения, чтобы они находились в диапазоне от 0 до 1.

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

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

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

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

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

Вот сюжет:

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