Управляемый рекуррентный блок (GRU – Gated Recurrent Units, УРБ) – механизм Нейронных сетей (Neural Network), объединяющий кратковременную и долговременную виды памяти в одно состояние. Механизм создан в 2014 году, и это разновидность Рекуррентной нейронной сети (RNN), набирающая большую популярность. Давайте посмотрим, как она работает.
Вы все знаете, что базовая RNN страдает от проблемы с кратковременной памятью. Например, мы пытаемся сделать автозаполнение последнего слова для утверждения: «Дхавал ест самосу почти каждый день, нетрудно догадаться, что эта любимая кухня — индийская" (Dhaval eats samosa almost everyday, it shouldn't be hard to guess that his favorite cuisine is Indian). Итак, чтобы догадаться, что это индийская кухня, мы должны помнить про самосу (печёное тесто с начинкой), но у традиционного RNN более короткая память:
Так, например, когда нейросеть помнит только последние два слова, когда она автозаполняет предложение о кухне, то не может предсказать ее "индийское происхождение", ибо слов между "samosa" и "indian" целых 14. Если у нас есть подобная сеть, которая может запоминать важные ключевые слова, скажем: «Дхавал ест», остальные неважные слова она не помнит, и когда дело доходит до самосы, она запоминает это и он "несет" ее в долговременной памяти на протяжении всего пути, а затем, когда потребуется сделать предположение, что это за кухня, мы можетм использовать это воспоминание и сделать автозаполняющее предположение, что это индийская кухня.
LSTM обладает подобными возможностями: он может запоминать долговременно. GRU — это модифицированная, упрощенная версия LSTM, в которой долговременная и кратковременная память объединяется в так называемое Скрытое состояние (Hidden State). У него есть только скрытое состояние, которое может сочетать в себе как долговременную, так и кратковременную память:
Если вы заглянете в "ящик" GRU, в нем будет двое ворот: обновление и сброс:
Функция update-ворот — помнить. По сути, они знают, сколько памяти нужно сохранить, тогда как reset-ворота знают, сколько памяти нужно "забыть". Это звучит немного неясно, но на самом деле есть небольшая разница, и мы рассмотрим ее на примере. И есть еще один механизм, который мы вскоре изучим.
Итак, давайте вернемся к нашей исходной задаче Обработки естественного языка (NLP) о завершении предложения. Поэтому, когда у вас есть такое предложение, конечно, ответ "индийский". Возможно, вы помните автоподстановку в Gmail: когда мы что-то вводим, система пытается предсказать следующее слово. Итак, мы пытаемся решить ту же проблему, и нейросеть знает, что это индийская кухня, поскольку помнит слово "самоса".
Но когда у нас есть более длинное утверждение: 'Dhaval eats samosa almost everyday, it shouldn't be hard to guess that his favorite cuisine is Indian. His brother Bhavin hovewer is a lover of pasta and cheese that means Bhavin's favorite cuisine is Italian' (Дхавал ест самосу почти каждый день, нетрудно догадаться, что его любимая кухня – индийская. Его брат Бхавин, однако, – любитель пасты с сыром, что означает, что любимая кухня Бхавина – итальянская".
Тогда автозаполнение употребит слово "итальянская". Когда вы говорите "кухня", то вы хотите вспомнить о самосе, потому что у вас это сохранилось в контексте. И когда вы идете дальше и когда добираетесь до предложения с макаронами, то знаете, что контекст изменился. Когда дело доходит до пасты, мы хотим как бы забыть о самосе. Точно так же, когда дело доходит до сыра, вы хотите сохранить воспоминание о пасте, поэтому теперь вы уже видите какую-то разницу, то здесь хотите забыть о самосе.
Ячейка, которую можно увидеть ниже – это GRU:
Когда речь заходит о пасте, мы хотим забыть о самосе, и способ сделать это – использовать reset-ворота (также называемые гейтом, шлюзом]. Такой гейт принимает скрытое состояние и выполняет математическую операцию – Весовая функция (Weight Function), применяющую сигмоиду (Sigmoid) поверх нее. Значение r(t), которое мы получаем, является значением сброса.
Когда дело доходит до сыра, например, мы хотим сохранить воспоминание о макаронах. И это делается шлюзом обновления, так что он будет делать то же самое, что и шлюз сброса, но будет выполнять другую матоперацию. Например, если вы посмотрите на это математическое уравнение:
Математическое уравнение остается тем же: взвешенная сумма. Мы применяем сигмоиду, поэтому z(t), которое вы получаете здесь, является значением обновления.
До сих пор это выглядит немного просто, когда вы берете значение шлюза обновления и значение шлюза сброса. Дальнейшее объяснение станет немного сложнее. Мы будем использовать произведение Адамара – произведение двух матриц – поэлементное произведение их элементов.
Я знаю, что это довольно сложно, но, может быть, вы сможете использовать эту информацию и получите представление о том, что это такое. Суть GRU заключается в том, что он объединяет кратковременную память и долговременную память в одно состояние, и является более эффективным с вычислительной точки зрения, чем LSTM.
Автор оригинальной статьи: codebasics
Поддержите нас, поделившись статьей в социальных сетях и подписавшись на канал. И попробуйте курсы на Udemy.