Gated Recurrent Units (GRU) и Long Short Term Memory (LSTM) — это рекуррентные нейронные сети (RNN), которые обеспечивают улучшение по сравнению с обычными RNNS и оказались весьма полезными в задачах обучения обработке естественного языка.

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



Где ванильные RNN терпят неудачу

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

«Джулс: я думаю, что ее самой большой удачей было то, что она снялась в пилотном проекте.

Винсент:Что такое пилот?

Жюль:Ну, вы знаете передачи по телевизору?

Винсент:я не смотрю телевизор.

Жюль: Да, но вы в курсе, что есть такое изобретение, как телевидение, и по этому изобретению показывают шоу?

Винсент:Да.

Джулс:Ну, то, как они выбирают шоу на телевидении, они делают одно шоу, и это шоу называется пилотным. И они показывают одно шоу людям, которые выбирают шоу, и на основании этого одного шоу они решают, хотят ли они делать больше шоу. Некоторые из них принимаются и становятся телепрограммами, а некоторые нет и становятся никем. Она снялась в одном из тех, которые стали никем».

Допустим, мы хотим построить систему НЛП, чтобы давать рекомендации по грамматике и правописанию. Система примет сценарий «Криминального чтива» и выделит слова, которые не соответствуют грамматическим правилам, как это делает Microsoft Word.

Обратите внимание на последнее предложение в сценарии: Она снялась в одном из тех, что превратились в ничто. Как система определит, что Она является правильным местоимением? Читая сценарий, можно понять, что она — это правильное местоимение по первому предложению: Я думаю, что ее самым большим достижением было то, что она снялась в пилотной серии.

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

GRU и LSTM пытаются решить эту проблему, добавляя в сеть специализированные шлюзы, чтобы легче «запоминать» более ранние части последовательности и «забывать» ненужные части последовательности.

Закрытые рекуррентные сети

Напомним из RNN для обработки естественного языка, базовая единица обычной RNN может выглядеть примерно так:

Скрытое состояние h^t передается от одной рекуррентной единицы к другой, и на каждом шаге создается результат ŷ. В каждом блоке скрытое состояние всегда обновляется до нового значения на основе изученных весов и смещений в сети. GRU добавляет несколько дополнительных шагов в рекуррентную сеть, чтобы позволить скрытому состоянию опциональнообновлять скрытое состояние на каждом устройстве. Это означает, что скрытое состояние можно пройти напрямую практически без изменений.

Упрощенную версию Gated Recurrent Unit можно резюмировать следующим образом:

  1. Как и в нашей обычной RNN, объедините вектор скрытого состояния h и входной вектор x, чтобы создать: [x^t, h^t]
  2. Сделайте две копии конкатенированного вектора
  3. Подобно нашему ванильному RNN, умножьте веса (Wh), добавьте смещения (b_h) и используйте функцию активации tanh на одной копии объединенного вектора — это будет наше значение-кандидат (c^n), которое мы можем обновить скрытое состояние с.
  4. Введите новый набор весов (Wu) и смещений (b_u), называемый обновленными весами/смещениями, умножьте вторую копию конкатенированного вектора и проведите этот результат через сигмовидную функцию. Поскольку мы используем сигмовидную функцию, результатом будет число, очень близкое к 1 или 0. Этот результат называется значением обновления, u
  5. Затем мы используем это значение обновления u, чтобы определить, должны ли мы распространять предыдущее скрытое состояние как новое скрытое состояние или обновлять скрытое состояние нашим потенциальным значением. Это может быть представлено следующим уравнением, которое сохраняет предыдущее скрытое состояние, если u равно 0, или обновляет скрытое состояние значением-кандидатом, если u равно 1.

6. Наконец, чтобы получить текущее выходное значение (ŷ), введите результат в функцию softmax.

Следующая диаграмма дает визуальную ссылку для каждого шага в простом GRU.

Это упрощенное ГРУ также можно выразить в виде ряда уравнений (* обозначается как поэлементное умножение):

Полная версия GRU использует дополнительный «релевантный» шлюз, который позволяет сети узнать, насколько актуально скрытое состояние для каждого блока.

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

Долгосрочная память (LSTM)

Подобно GRU, LSTM позволяют сетям легче игнорировать ненужные части последовательности. Однако LSTM немного сложнее, они используют дополнительный вентиль для достижения эффекта, аналогичного GRU. Три вентиля вычисляются с отдельными весами и смещениями: вентиль обновления, u, вентиль забывания, f, и вентиль вывода, o. Вместо того, чтобы умножать предыдущее скрытое состояние на значение, противоположное шлюзу обновления (1 - u), вместо этого используется шлюз забывания. Кроме того, выходной вентиль используется для взвешивания результирующего вывода вентилей обновления и забывания. Это можно представить в следующих уравнениях:

Полезные ресурсы