NLP: рекуррентные модели
Рекуррентные модели - исторический слой, но вопросы по ним живы: через LSTM и seq2seq проверяют, понимаешь ли ты, какие проблемы решил трансформер. Это вопросы «откуда что выросло».
// Attention придумали до трансформеров, и знание этого факта отличает понимание от хронологии из твиттера.
RNN и гейты LSTM
RNN (recurrent neural network) несёт скрытое состояние вдоль последовательности - память о прочитанном. На длинных текстах градиент затухает: дальний контекст забывается.
LSTM (long short-term memory) и GRU (gated recurrent unit) лечат это гейтами - обучаемыми вентилями «что забыть, что записать, что отдать». GRU проще и быстрее, LSTM чуть выразительнее; на практике часто паритет.
// Для задач, где виден весь текст (классификация, NER), двунаправленный вариант: BiLSTM читает в обе стороны, и однонаправленный ему почти всегда проигрывает.
- гейты
- вентили LSTM/GRU против затухания градиента
Seq2seq и рождение attention
Encoder-decoder: энкодер сжимает вход в вектор, декодер разворачивает его в выход. Узкое место очевидно - весь смысл предложения в одном векторе фиксированной размерности.
Attention снял это: декодер на каждом шаге взвешенно смотрит на все состояния энкодера. Это прямой предок трансформера - который затем выкинул рекуррентность и оставил только attention.
// Teacher forcing: декодер учится на золотых префиксах, а на инференсе ест свои же предсказания - рассинхрон (exposure bias) копит ошибки, и трейн-лосс его не показывает.
- exposure bias
- трейн на золотых префиксах, инференс на своих - ошибки копятся
Что осталось от эпохи
CRF-слой (conditional random field) поверх BiLSTM для NER (named entity recognition) - классика до-BERT-эры: моделирует согласованность соседних меток (I не бывает без B). Идея жива и поверх трансформеров.
Причина смены эпохи - параллелизация: RNN последователен по времени, шаг ждёт шаг; attention считается на всю последовательность разом. Качество - следствие масштаба, который стал возможен.
// «RNN устарели» - с оговоркой: на коротких последовательностях и в embedded-задачах маленькая GRU до сих пор разумный выбор - дёшево и без квадратичной памяти.
- CRF-слой
- согласованность соседних меток в sequence labeling
Как отвечать: «Какую проблему seq2seq решил attention?»
Узкое место одного вектора: классический encoder-decoder сжимал всё предложение в один вектор фиксированной размерности, и на длинных входах декодеру не хватало информации - перевод начала предложения терялся к концу. Attention дал декодеру на каждом шаге взвешенно смотреть на все состояния энкодера: контекст достаётся адресно, а не из общего сжатия. Дальше история известна: трансформер оставил только attention, выкинув рекуррентность, и главным выигрышем оказалась даже не точность, а параллелизация обучения, открывшая масштаб.
Названа исходная проблема, механика решения и мостик к трансформерам с правильным акцентом на параллелизацию.
На чём валят
- −Однонаправленный LSTM там, где виден весь текст, Bi-вариант почти всегда лучше.
- −Забыть маскирование паддинга в лоссе sequence labeling - модель учится предсказывать PAD.
- −Оценивать seq2seq по лоссу с teacher forcing - накопление ошибок инференса он не показывает.
- −«RNN устарели» без оговорок - маленькая GRU на коротких последовательностях всё ещё разумна.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 9, остальные разбираются в тренажёре.
- В классическом seq2seq (энкодер-декодер на RNN) для перевода в чём «бутылочное горлышко»?A)Декодер в этой схеме не получает от энкодера информации, стартуя с пустого нулевого начального вектораB)Весь входной текст сжимается в один вектор фиксированной длины — на длинных предложениях информация теряетсяC)Энкодер и декодер обязаны быть строго одинаковой длиныD)Модель не может обучаться на парах предложений
показать ответ и разбор
+B)Весь входной текст сжимается в один вектор фиксированной длины — на длинных предложениях информация теряется// разбор: Классический seq2seq кодирует всё входное предложение в один вектор фиксированной длины (последнее состояние энкодера), из которого декодер порождает перевод. Для длинных предложений один вектор — узкое горлышко: детали теряются, качество падает с длиной. Решение — механизм внимания (Bahdanau, 2014): декодер на каждом шаге смотрит на все состояния энкодера и взвешенно выбирает релевантные. Прямой предок трансформерного внимания.
- Зачем в теггинге (NER/POS) применяют двунаправленную RNN (biLSTM)?A)Чтобы ровно вдвое увеличить итоговую скорость инференса на длинных последовательностях по сравнению с обычной однонаправленной рекуррентной сетьюB)Чтобы обойтись без входных эмбеддингов словC)Метка токена зависит и от левого, и от правого контекста; biRNN читает в обе стороны и объединяет состоянияD)Чтобы модель превратилась в генеративную языковую модель
показать ответ и разбор
+C)Метка токена зависит и от левого, и от правого контекста; biRNN читает в обе стороны и объединяет состояния// разбор: Для разметки токена важен контекст с обеих сторон: чтобы понять, «Вашингтон» — персона или город, нужны и предыдущие, и последующие слова. Однонаправленная RNN видит только левый контекст. biLSTM прогоняет последовательность слева-направо и справа-налево и конкатенирует оба состояния на каждой позиции. Для теггинга это стандарт (часто biLSTM-CRF). Для авторегрессионной генерации biRNN не годится — будущего знать нельзя.
- Что такое teacher forcing при обучении RNN-декодера генерации?A)Режим, при котором учитель-человек вручную размечает все обучающие примеры для сетиB)Принудительное снижение скорости обучения по заранее заданному расписаниюC)Полный запрет на использование GPU при обученииD)На обучении декодеру подают истинный предыдущий токен (не свой предсказанный) — учит быстрее, но даёт разрыв train/inference
показать ответ и разбор
+D)На обучении декодеру подают истинный предыдущий токен (не свой предсказанный) — учит быстрее, но даёт разрыв train/inference// разбор: При обучении генеративного декодера teacher forcing подаёт на каждый шаг настоящий предыдущий токен из эталона, а не то, что модель предсказала — обучение быстрее и стабильнее (ошибки не накапливаются). Но на инференсе истинных токенов нет, модель кормит себя своими предсказаниями, и одна ошибка тянет другие — это exposure bias, расхождение обучения и применения. Смягчают scheduled sampling.
- Ванильные RNN страдают от взрывающихся градиентов. Классический приём борьбы?A)Обрезка нормы градиента (gradient clipping): при превышении порога норму масштабируют внизB)Радикально и намеренно увеличить общий learning rate обучения примерно вдвое или больше на каждом шагеC)Убрать все функции активации из сетиD)Обучать сеть вообще без обратного распространения ошибки
показать ответ и разбор
+A)Обрезка нормы градиента (gradient clipping): при превышении порога норму масштабируют вниз// разбор: Взрывающиеся градиенты (норма растёт экспоненциально при обратном распространении во времени) ломают обучение резкими скачками весов. Gradient clipping ставит потолок на норму: если ‖g‖ > порога, градиент масштабируют до порога, сохраняя направление. Дёшево и эффективно против взрыва (в отличие от затухания, которое лечат архитектурой LSTM/GRU). Стандартная практика для RNN и не только.
- Чем последовательность слов сложнее для модели, чем строка табличных признаков?A)Длина переменная, и порядок слов несёт смыслB)Слова хранятся как строки, а табличные признаки — как числаC)В тексте больше пропусков и опечаток, чем в таблицеD)Словарь языка меняется, и модель приходится переучивать ежедневно
показать ответ и разбор
+A)Длина переменная, и порядок слов несёт смысл// разбор: У таблицы фиксированное число колонок, и каждая имеет свой смысл. У текста длина плавает от твита до статьи, а смысл зависит от порядка: «собака укусила человека» и «человек укусил собаку» — одни и те же слова. Мешок слов порядок теряет; RNN обрабатывает его последовательно, трансформер — вниманием с позиционным кодированием.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.