сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · NLP

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, остальные разбираются в тренажёре.

  1. #sequence_models1 / 5
    В классическом seq2seq (энкодер-декодер на RNN) для перевода в чём «бутылочное горлышко»?
    A)Декодер в этой схеме не получает от энкодера информации, стартуя с пустого нулевого начального вектора
    B)Весь входной текст сжимается в один вектор фиксированной длины — на длинных предложениях информация теряется
    C)Энкодер и декодер обязаны быть строго одинаковой длины
    D)Модель не может обучаться на парах предложений
    показать ответ и разбор
    +B)Весь входной текст сжимается в один вектор фиксированной длины — на длинных предложениях информация теряется

    // разбор: Классический seq2seq кодирует всё входное предложение в один вектор фиксированной длины (последнее состояние энкодера), из которого декодер порождает перевод. Для длинных предложений один вектор — узкое горлышко: детали теряются, качество падает с длиной. Решение — механизм внимания (Bahdanau, 2014): декодер на каждом шаге смотрит на все состояния энкодера и взвешенно выбирает релевантные. Прямой предок трансформерного внимания.

  2. #sequence_models2 / 5
    Зачем в теггинге (NER/POS) применяют двунаправленную RNN (biLSTM)?
    A)Чтобы ровно вдвое увеличить итоговую скорость инференса на длинных последовательностях по сравнению с обычной однонаправленной рекуррентной сетью
    B)Чтобы обойтись без входных эмбеддингов слов
    C)Метка токена зависит и от левого, и от правого контекста; biRNN читает в обе стороны и объединяет состояния
    D)Чтобы модель превратилась в генеративную языковую модель
    показать ответ и разбор
    +C)Метка токена зависит и от левого, и от правого контекста; biRNN читает в обе стороны и объединяет состояния

    // разбор: Для разметки токена важен контекст с обеих сторон: чтобы понять, «Вашингтон» — персона или город, нужны и предыдущие, и последующие слова. Однонаправленная RNN видит только левый контекст. biLSTM прогоняет последовательность слева-направо и справа-налево и конкатенирует оба состояния на каждой позиции. Для теггинга это стандарт (часто biLSTM-CRF). Для авторегрессионной генерации biRNN не годится — будущего знать нельзя.

  3. #sequence_models3 / 5
    Что такое teacher forcing при обучении RNN-декодера генерации?
    A)Режим, при котором учитель-человек вручную размечает все обучающие примеры для сети
    B)Принудительное снижение скорости обучения по заранее заданному расписанию
    C)Полный запрет на использование GPU при обучении
    D)На обучении декодеру подают истинный предыдущий токен (не свой предсказанный) — учит быстрее, но даёт разрыв train/inference
    показать ответ и разбор
    +D)На обучении декодеру подают истинный предыдущий токен (не свой предсказанный) — учит быстрее, но даёт разрыв train/inference

    // разбор: При обучении генеративного декодера teacher forcing подаёт на каждый шаг настоящий предыдущий токен из эталона, а не то, что модель предсказала — обучение быстрее и стабильнее (ошибки не накапливаются). Но на инференсе истинных токенов нет, модель кормит себя своими предсказаниями, и одна ошибка тянет другие — это exposure bias, расхождение обучения и применения. Смягчают scheduled sampling.

  4. #sequence_models4 / 5
    Ванильные RNN страдают от взрывающихся градиентов. Классический приём борьбы?
    A)Обрезка нормы градиента (gradient clipping): при превышении порога норму масштабируют вниз
    B)Радикально и намеренно увеличить общий learning rate обучения примерно вдвое или больше на каждом шаге
    C)Убрать все функции активации из сети
    D)Обучать сеть вообще без обратного распространения ошибки
    показать ответ и разбор
    +A)Обрезка нормы градиента (gradient clipping): при превышении порога норму масштабируют вниз

    // разбор: Взрывающиеся градиенты (норма растёт экспоненциально при обратном распространении во времени) ломают обучение резкими скачками весов. Gradient clipping ставит потолок на норму: если ‖g‖ > порога, градиент масштабируют до порога, сохраняя направление. Дёшево и эффективно против взрыва (в отличие от затухания, которое лечат архитектурой LSTM/GRU). Стандартная практика для RNN и не только.

  5. #sequence_models5 / 5
    Чем последовательность слов сложнее для модели, чем строка табличных признаков?
    A)Длина переменная, и порядок слов несёт смысл
    B)Слова хранятся как строки, а табличные признаки — как числа
    C)В тексте больше пропусков и опечаток, чем в таблице
    D)Словарь языка меняется, и модель приходится переучивать ежедневно
    показать ответ и разбор
    +A)Длина переменная, и порядок слов несёт смысл

    // разбор: У таблицы фиксированное число колонок, и каждая имеет свой смысл. У текста длина плавает от твита до статьи, а смысл зависит от порядка: «собака укусила человека» и «человек укусил собаку» — одни и те же слова. Мешок слов порядок теряет; RNN обрабатывает его последовательно, трансформер — вниманием с позиционным кодированием.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.