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

Прежде чем мы начнем, вот как я выгляжу, пытаясь исправить LaTeX, когда он вставлен в Medium:

Еще в июне 2019 года я написал 10-страничный отчет о внутренней работе рекуррентных нейронных сетей и блоков долгосрочной памяти. Не так весело, как их реализовать, но тем не менее полезно!

Фон

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

Базовая архитектура нейронной сети - это нейронная сеть прямого распространения. Данные продвигаются по сети, начиная с входного слоя, через любые скрытые слои к выходному слою. Здесь мы сосредоточимся на варианте этой базовой структуры, называемом рекуррентными нейронными сетями (RNN), который вводит цикл обратной связи, позволяющий передавать выходной сигнал сети обратно в сеть в качестве нового входа.

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

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

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

До появления RNN решение задач прогнозирования, связанных с последовательными данными, достигалось с помощью таких методов, как скрытые марковские модели (HMM). HMM присваивают каждому элементу в последовательности класс и вычисляют вероятности того, что следующим элементом в последовательности будет этот класс, а затем выберут наиболее вероятный класс в качестве своего прогноза. Хотя HMM быстрые и эффективные для более коротких последовательностей, для достижения высокой точности в сложных последовательностях (где значение зависит от значений, стоящих на многих местах за ним) они становятся экспоненциально дорогими и уступают RNN в этих сложных задачах [1].

Основанием для создания RNN стали исследования в 1980-х годах с «сетями Хопфилда» - типом сетей с памятью [2]. RNN значительно улучшились в 1990-х годах с изобретением RNN с долгой кратковременной памятью (LSTM) [3], которые решили основную проблему со стандартными RNN - проблему исчезающего / увеличивающегося градиента, обсуждаемую в следующем разделе. Дальнейшее развитие архитектуры LSTM было представлено Чо и др. в 1994 г. - Gated Recurrent Unit (GRU) [4], также обсуждаемый ниже.

Сегодня RNN в различных формах присутствуют во многих домашних приложениях. Голосовой поиск Google использует RNN [5], персональный помощник Apple Siri использует GRU в синтезе речи [6], а возможности языкового перевода Google Translate были улучшены в 2016 году с использованием глубокой сети LSTM [7].

Стандартные рекуррентные нейронные сети

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

Рекуррентные нейронные сети обрабатывают последовательность значений u ₁,. . . , с индексом временного шага t от 1 до τ. Учитывая входной вектор ut и состояние нейронной сети xt, выходной вектор zt создается на каждом временном шаге t.

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

Где:

Отсюда следует, что выход zt зависит не только от входа, но и от текущего состояния сети, и, следовательно, на него также влияют все предыдущие входы. Параметрическая функция f (.) представляет вычисление выходного уровня, для задачи классификации это может быть softmax, а для задач регрессии это может быть ошибка квадрата нормы L2:

где Wo - веса выходного слоя.

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

Обучение RNN

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

Во время обратного распространения ошибка или «потеря» (разница между прогнозируемым выводом zt ′ и целевым выводом из обучающих данных zt) измеряется с использованием функции потерь. Вычисляется вклад в эту ошибку, возникающую на последнем временном шаге. Затем вклад предыдущего слоя и так далее, пока не будет достигнут входной слой. Распространение ошибки в обратном направлении по сети позволяет алгоритму измерять градиент ошибки по всем сетевым соединениям. Как только градиенты ошибок известны, градиентный спуск используется для настройки весов и смещений в сети, чтобы уменьшить ошибку. Обучение и обновление весов и смещений продолжают повторяться с целью изучения правильных весов и смещений для правильного прогнозирования целевого результата.

Обратное распространение во времени.

В отличие от традиционных ИНС, которые используют отдельные веса для каждого скрытого слоя, RNN разделяют веса на каждом временном шаге - если сеть разворачивается во времени, можно считать, что на каждом временном шаге у нее есть отдельный слой, у всех одна и та же матрица весов. Поскольку веса распределяются на каждом временном шаге, градиент ошибки на каждом шаге зависит от потерь на всех предыдущих шагах. Например, чтобы вычислить градиент на пятом шаге, градиенты предыдущих четырех шагов суммируются вместе с градиентом на пятом шаге. Это известно как обратное распространение во времени или BPTT.

Проблемы с RNN: проблемы исчезновения и увеличения градиента

При суммировании вкладов каждого временного шага в градиент во время BPTT, особенно для длинных последовательностей, значения градиента могут страдать от проблемы исчезающего градиента. Это происходит, если некоторые веса маленькие; при суммировании последующий градиент будет продолжать уменьшаться и стремиться к ~ 0 или «исчезать». Это проблема, потому что градиенты используются во время обучения для обновления параметров сети, поэтому, когда градиент уменьшается, обновления параметров становятся несущественными, и сеть не обучается. Это не проблема для стандартных ИНС, поскольку они не разделяют параметры по уровням и суммирование не требуется.

Точно так же, если веса большие, то окончательное значение будет стремиться к бесконечности, известное как взрывной градиент. Простое и эффективное решение проблемы взрывающегося градиента - установить порог для «обрезки» значения градиента, если оно слишком велико. Противодействовать проблеме исчезающего градиента труднее. Одним из решений является использование функции активации ReLU вместо функций активации tanh или сигмоида, поскольку производная ReLU равна либо 0, либо 1, и поэтому исчезающий градиент менее вероятен. В качестве альтернативы специально для решения этой проблемы была разработана разновидность стандартных RNN, называемая сетями с долгой краткосрочной памятью.

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

Сети с долговременной краткосрочной памятью (LSTM), впервые предложенные в 1997 году Хохрайтером и Шмидхубером, усовершенствовали RNN, решая проблему исчезающего градиента [3], и теперь широко используются. Структура LSTM похожа на обычную RNN, но заменяет функцию, вычисляющую скрытое состояние, ячейкой . Ячейки принимают в качестве входных данных предыдущее состояние xt −1 и текущее значение данных ut и имеют возможность сохранять или удалять информацию о состоянии с помощью ворота.

Стандартный скрытый слой RNN прост, например, слой tanh.

Регулярный слой в LSTM добавляет три сигмовидных слоя, называемых «воротами». Один для контроля того, какая информация забывается, ворота забывания f, один для управления, какие значения обновлять, входной элемент i и последний слой, который создает новый вектор значения-кандидаты, которые могут быть добавлены к состоянию, выходной элемент o.

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

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

Чтобы обновить состояние ячейки в LSTM, сначала используется шлюз забывания, чтобы решить, какую информацию отбросить:

Где ft - это результат шлюза забывания, Wf - весовая матрица, zt -1 - предыдущий результат, ut - текущий ввод, а bf - вектор смещения. ft состоит из значения от 0 до 1 для каждого значения в предыдущем состоянии ячейки xt -1, чтобы управлять тем, что следует исключить из состояния ячейки. Затем выполняется операция из двух частей, чтобы решить, какую новую информацию добавить в состояние ячейки. Во-первых, входной вентиль решает, какие значения в состоянии ячейки обновлять:

Где it - выход входного вентиля, Wi - матрица весов, а bi - вектор смещения. Во-вторых, слой tanh создает новые значения, которые можно добавить к состоянию ячейки:

Где x ̃ - это выходные данные слоя tanh, W - это матрица весов, а b - это вектор смещения. Теперь можно обновить состояние ячейки, используя комбинацию выходов из входного логического элемента, шлюза забыть и слоя tanh:

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

Передача окончательного вывода из сети zt как:

Проблема исчезающего градиента больше не является проблемой при обратном распространении ошибок во времени в сетях LSTM. Во время обратного распространения, если производная выходного сигнала ∂ xt начинает сходиться к 0, значения шлюза забывания могут увеличиваться, предотвращая ∂ xt −1 градиентов от от исчезновения. Поскольку значения f, o, i и x ̃ узнаются сетью, сеть может решить когда позволить градиенту исчезнуть, а когда нет. Неважно, какой длины последовательность, в сети есть механизм, позволяющий не забывать информацию, и можно моделировать более долгосрочные зависимости.

Стробированные рекуррентные единицы

Популярный вариант сети LSTM под названием Gated Recurrent Unit (GRU) был представлен Чо и др. в 2014 г. [4]. Ячейки GRU являются упрощенными версиями ячейки LSTM, но имеют сопоставимую производительность.

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

Приложения рекуррентных нейронных сетей

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

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

Подход к решению этой задачи, основанный на нейронных сетях, был описан Венугопаланом и др. [8]. Они утверждают, что, используя CNN для маркировки отдельных видеокадров, выходные данные CNN могут использоваться в качестве входных данных для LSTM для генерации предложения, описывающего действия в видео, архитектура, которую они разработали, показана ниже:

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

Продолжается работа над автоматическим описанием видео. Сквозная сеть для распознавания активности и описания видео была предложена Донахью и др. в 2016 году [9] также использовалась комбинация CNN-LSTM, и решения на основе RNN остаются популярным подходом к этой проблеме [10].

Ссылки

  1. Костадинов С. Краткое руководство по рекуррентным нейронным сетям с Python. 2018: Packt Publishing.
  2. Хопфилд, Дж., Нейронные сети и физические системы с новыми коллективными вычислительными возможностями. Труды Национальной академии наук Соединенных Штатов Америки, 1982 г. 79: с. 2554–2558.
  3. Хохрайтер, С. и Дж. Шмидхубер, Долгосрочная кратковременная память. Neural Computing, 1997. 9 (8): p. 1735–1790.
  4. Чо, К. и др., Обучающие представления фраз с использованием кодировщика-декодера RNN для статистического машинного перевода. Proc. Конференция по эмпирическим методам обработки естественного языка, 2014: с. 1724–1734.
  5. Он, Я. и др., Сквозное потоковое распознавание речи для мобильных устройств. arXiv e-prints, 2018: с. arXiv: 1811.06621.
  6. Кейпс, Т. и др., Система преобразования текста в речь Siri On-Device, управляемая с помощью глубокого обучения, Interspeech 2017. 2017, Apple, Inc., стр. 4011–4015.
  7. Ву, Ю. и др., Система нейронного машинного перевода Google: устранение разрыва между человеческим и машинным переводом. arXiv e-prints, 2016: с. arXiv: 1609.08144.
  8. Венугопалан С. и др., Перевод видео на естественный язык с помощью глубоких рекуррентных нейронных сетей, в Технологии человеческого языка: Ежегодная конференция Североамериканского отделения ACL 2015 года. 2015, Ассоциация компьютерной лингвистики: Денвер, Colorado. п. 1494–1504.
  9. Донахью, Дж. И др., Долгосрочные рекуррентные сверточные сети для визуального распознавания и описания. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2016. 39 (4): стр. 677–691.
  10. Лаокульрат Н. и др. Создание описания видео с использованием модели «последовательность-последовательность» с временным вниманием. в COLING 2016, 26-й Международной конференции по компьютерной лингвистике. 2016. Осака, Япония.