Вопросы с собесов. RNNs: рекуррентные нейронные сети
Разберем RNN от А до Я: как отвечать на собеседованиях и что знать про них для работы!
Что такое RNN?
Тип нейросети, предназначенный для работы с последовательностями.
Последовательно проходят по последовательности: обновляют и передают скрытое представление на следующий шаг.
Так как у нас одинаковые блоки и те же параметры, то мы как будто зацикливаемся над ячейкой - отсюда рекуррентность.
x - новый элемент последовательности
Что такое Bidirectional RNN?
- прямая (forward, токены в нее подаются от первого к последнему)
- обратная (backward, токены подаются в обратном порядке)
Можно аггрегировать не только конкаетнацией, но и усреднением, например.
Какие проблемы возникают при работе с RNN?
При обратном распространении ошибки мы будем умножать n раз на матрицу весов (где n - длина входа). Поэтому если у нас там большие собственные числа, то будет “взрыв” градиента, если маленькие, то “затухание”.
- Ванишинг градиент (затухание градиента)
- При обучении на длинных последовательностях градиент становится слишком малым, и ранние токены не оказывают влияния на выход.
- Exploding gradient (взрыв градиента)
- Затрудненное запоминание долгосрочной информации
Что такое LSTM?
У нас есть теперь не только скрытые состояния h_t (краткосрочная память), но еще и состояния блока c_t (долгосрочная память).
- Forget gate (вентиль забывания)
На основании входа x_t и предыдущего скрытого состояния h_t-1 решаем какую долю из состояния блока c_t-1 на прошлом шаге пропустить.
Формула такая же как и обычной рнн, но меняются активация - на сигмоиду.
То есть получаем маску после сигмоиды и поэлементно умножаем на c_t-1.
Сигмоида из-за своего выхода на промежуток [0; 1] больше подходит для интерпретации, что забыть, а что пропустить.
Здесь обучаемые параметры учатся на то, чтобы эффективно определять, что нужно забыть, а что не надо забывать.
По той же формуле считаем с тангенсом новое состояние блока c_t по x_t и h_t-1. Но также накладываем маску после сигмоиды, но уже с параметрами, которые учатся определять, что нужно пропускать, а что пропускать не надо. Хотя шаблон слоев одинаковый.
Потом после гейта забывания и гейта входа суммируем полученное и это будет итоговое состояние c_t.
По все той же формуле определяем какую долю выученной информации c_t отправить дальше на основании x_t и h_t-1.
Что такое GRU?
Оставляем только одно скрытое представление.
Теперь только 2 гейта: update и reset gate.
- update - играет роль input и forget вентилей из LSTM
- reset - решаем какие активации заново проинициализировать
По формулам все примерно то же самое. Но параметров меньше, обучается быстрее и часто на то же качество.
Какие особенности RNN по сложности реализации?
- линейна по сложности от длины последовательности
- но не распараллелить, потому что нужно проходить последовательно один за другим
- квадратичная по размеру внутреннего представления