NLP и трансформеры
Эмбеддинги слов и текстов, encoder/decoder в трансформере, self-attention и позиционное кодирование, BERT для эмбеддингов и question answering.
18 вопросов
JuniorТеорияОчень частоПочему для текстовых эмбеддингов предпочитают косинусную близость, а не евклидово расстояние?
Почему для текстовых эмбеддингов предпочитают косинусную близость, а не евклидово расстояние?
Косинус сравнивает только угол между векторами и игнорирует длину, поэтому ловит направление смысла. Евклидово расстояние растёт с нормой, а норма отражает длину текста, поэтому два текста об одном могут казаться далёкими лишь потому, что один длиннее.
Типичные ошибки
- ✗Считают косинус и евклидово расстояние взаимозаменяемыми при ранжировании
- ✗Забывают, что норма вектора кодирует длину или частоту, а не тему
- ✗Полагают, что для высокого косинуса нужны общие слова на поверхности
Уточняющие вопросы
- →Когда косинус и евклидово расстояние дают одинаковое ранжирование?
- →Почему высокий косинус всё же может означать несвязанные тексты?
JuniorТеорияОчень частоЧто такое positional encoding (позиционное кодирование) и зачем оно нужно?
Что такое positional encoding (позиционное кодирование) и зачем оно нужно?
Добавляет информацию о позиции к эмбеддингу токена, чтобы один токен на разных позициях отличался. Нужно, потому что self-attention перестановочно-инвариантен — сам по себе не видит порядок. Варианты: синусоидальное, обучаемые эмбеддинги и RoPE (rotary positional embeddings).
Типичные ошибки
- ✗Думают, что self-attention учитывает порядок и без positional encoding
- ✗Считают, что positional encoding заменяет, а не дополняет эмбеддинги токенов
- ✗Не знают вариантов, кроме исходной синусоидальной схемы
Уточняющие вопросы
- →Чем обучаемые позиционные эмбеддинги отличаются от синусоидальных?
- →Какое преимущество RoPE даёт перед абсолютным позиционным кодированием?
JuniorТеорияОчень частоКак работает self-attention в трансформере?
Как работает self-attention в трансформере?
Каждый токен обращает внимание на все остальные, смешивая контекст. Токен проецируется в векторы Query (запрос), Key (ключ) и Value (значение). Вес внимания между токенами — softmax(Q·Kᵀ / √dₖ), нормированная схожесть Query и Key. Выход токена — взвешенная сумма всех векторов Value.
Типичные ошибки
- ✗Считают внимание как RNN с одним последовательным скрытым состоянием
- ✗Забывают масштабирование на √dₖ внутри softmax
- ✗Путают роли Query, Key и Value
Уточняющие вопросы
- →Зачем делить скалярное произведение на √dₖ перед softmax?
- →Что многоголовое внимание добавляет к одному вниманию?
SeniorТеорияОчень частоЧем структурно отличаются блоки encoder и decoder в исходном трансформере?
Чем структурно отличаются блоки encoder и decoder в исходном трансформере?
Блок encoder имеет два подслоя: self-attention и feed-forward. Блок decoder добавляет ТРЕТИЙ — encoder-decoder cross-attention к выходам энкодера — и его self-attention каузально маскирован, в отличие от двунаправленного у энкодера. Декодер завершается Linear + Softmax.
Типичные ошибки
- ✗Забывают про дополнительный cross-attention подслой декодера
- ✗Думают, что self-attention декодера не маскирован, как у энкодера
- ✗Упускают, что лишь декодер завершается Linear + Softmax по словарю
Уточняющие вопросы
- →К чему обращается cross-attention декодера и зачем?
- →Почему self-attention декодера должен быть каузально маскирован?
JuniorТеорияЧастоКакую проблему словарей уровня слов решает субсловная токенизация?
Какую проблему словарей уровня слов решает субсловная токенизация?
Словарь уровня слов конечен, поэтому невиданные слова схлопываются в токен [UNK] и теряют смысл. Субсловные схемы хранят частотные фрагменты и режут любое незнакомое слово на известные куски, так что OOV исчезает. BPE учит слияния, жадно объединяя самую частую соседнюю пару.
Типичные ошибки
- ✗Думают, что субсловные модели всё равно выдают [UNK] на невиданное слово
- ✗Считают слияния BPE рукописными правилами, а не выученными по частоте
- ✗Путают субсловное разбиение со стеммингом или срезанием аффиксов
Уточняющие вопросы
- →Чем выбор разбиения в WordPiece отличается от BPE?
- →Что происходит с длиной последовательности при сильной фрагментации текста?
JuniorТеорияЧастоКакие способы построения эмбеддингов слов и текстов вы знаете?
Какие способы построения эмбеддингов слов и текстов вы знаете?
Разреженные/счётные: Bag-of-Words и TF-IDF. Плотные статические: word2vec и GloVe (один вектор на слово), FastText (word2vec плюс субсловные n-граммы, справляется с редкими/OOV-словами). Контекстные: ELMo и BERT, где вектор слова зависит от контекста, так что одно слово меняется.
Типичные ошибки
- ✗Называют BoW/TF-IDF плотными обучаемыми эмбеддингами вместо разреженных счётов
- ✗Думают, что векторы word2vec/GloVe контекстные, а не статические
- ✗Упускают, что FastText добавляет субсловные n-граммы поверх word2vec
Уточняющие вопросы
- →Как обучается word2vec и чем от него отличается FastText?
- →Почему контекстные эмбеддинги лучше статических для многозначных слов?
MiddleТеорияЧастоСтемминг или лемматизация — что применять и когда не стоит ни то, ни другое?
Стемминг или лемматизация — что применять и когда не стоит ни то, ни другое?
Стемминг срезает аффиксы по правилам и может выдавать несуществующие слова, зато дёшев; лемматизация использует словарь и часть речи, возвращая настоящую начальную форму, но дороже. Оба помогают разреженным счётным моделям, схлопывая формы; субсловным контекстным моделям они дают мало.
Типичные ошибки
- ✗Меняют местами, какой метод возвращает настоящую словарную форму
- ✗Применяют агрессивную нормализацию перед субсловным трансформером
- ✗Считают, что нормализация никак не меняет размер словаря
Уточняющие вопросы
- →Почему лемматизации нужна верно определённая часть речи?
- →Где избыточный стемминг заметно вредит ранжированию в поиске?
MiddleТеорияЧастоЧто именно понижает множитель IDF в TF-IDF по сравнению с bag-of-words?
Что именно понижает множитель IDF в TF-IDF по сравнению с bag-of-words?
Bag-of-words считает термины в документе. IDF домножает счёт на множитель, падающий с ростом числа документов с этим термином, и разлитые по корпусу термины гасятся. Слово, много раз повторённое в одном документе, всё равно получает высокий вес; штрафуется только разлитость по корпусу.
Типичные ошибки
- ✗Читают IDF как штраф за повторы внутри документа
- ✗Путают взвешивание терминов через IDF с L2-нормировкой документа
- ✗Переворачивают направление и думают, что частые термины усиливаются
Уточняющие вопросы
- →Зачем в формуле IDF сглаживание с единицей в знаменателе?
- →Когда TF-IDF проигрывает обычной счётной модели?
MiddleТеорияЧастоЧем skip-gram и CBOW отличаются по тому, что предсказывает word2vec, и когда что лучше?
Чем skip-gram и CBOW отличаются по тому, что предсказывает word2vec, и когда что лучше?
CBOW предсказывает центральное слово по усреднённому контексту — это быстро и выгодно частым словам. Skip-gram наоборот предсказывает каждое слово контекста по центральному, по паре на соседа, поэтому редкие слова получают больше обновлений, а малые корпуса выходят лучше.
Типичные ошибки
- ✗Меняют местами направление предсказания у двух задач
- ✗Считают, что выбор влияет только на скорость обучения
- ✗Думают, что одна обученная модель обслуживает обе задачи
Уточняющие вопросы
- →Почему negative sampling делает обе задачи вычислимыми?
- →Как размер окна меняет то, что кодируют векторы?
SeniorТеорияЧастоКак с помощью обученного BERT получить эмбеддинг целого текста?
Как с помощью обученного BERT получить эмбеддинг целого текста?
Без обучения: пулинг всех эмбеддингов токенов (mean/max) либо эмбеддинг [CLS] — хотя сырой [CLS] слаб для схожести. Для сильного эмбеддинга текста дообучают в стиле SentenceBERT: добавляют пулинг плюс feed-forward голову и обучают через metric learning (siamese/triplet loss).
Типичные ошибки
- ✗Доверяют сырому вектору [CLS] как хорошему эмбеддингу схожести
- ✗Думают, что для векторов текста надо обучать BERT с нуля
- ✗Забывают, что именно metric learning сближает похожие тексты
Уточняющие вопросы
- →Почему сырой эмбеддинг [CLS] плох для схожести без дообучения?
- →Как triplet loss формирует пространство эмбеддингов?
SeniorТеорияЧастоЧто особенного в self-attention автогрессивного декодера трансформера по сравнению с обычным вниманием?
Что особенного в self-attention автогрессивного декодера трансформера по сравнению с обычным вниманием?
Применяется треугольная каузальная маска: перед softmax оценки для будущих позиций (j > i) ставятся в −∞, так что позиция i смотрит лишь на себя и предыдущие токены. Это обеспечивает автогрессию — модель не подглядывает в предсказываемый токен. Энкодер (например, BERT) такой маски не применяет.
Типичные ошибки
- ✗Маскируют прошлые, а не будущие позиции
- ✗Применяют маску после softmax, а не как −∞ до него
- ✗Думают, что энкодер BERT тоже использует каузальную маску
Уточняющие вопросы
- →Почему маскированные оценки ставят в −∞, а не в ноль перед softmax?
- →Как отсутствие этой маски делает BERT двунаправленным?
JuniorТеорияИногдаПочему статическая таблица эмбеддингов плохо справляется со словом с несколькими значениями?
Почему статическая таблица эмбеддингов плохо справляется со словом с несколькими значениями?
Статическая модель word2vec хранит один вектор на словоформу, поэтому все значения слова усредняются в одну точку, которая не подходит ни одному. Контекстные модели считают вектор по окружающему предложению, так что каждое вхождение получает своё представление.
Типичные ошибки
- ✗Считают, что word2vec выбирает значение по контексту при поиске вектора
- ✗Думают, что один усреднённый вектор адекватно представляет каждое значение
- ✗Путают субсловное разбиение с разрешением многозначности
Уточняющие вопросы
- →Как заметить, что многозначность вредит модели в проде?
- →Где статические эмбеддинги на практике всё ещё выигрывают у контекстных?
MiddleТеорияИногдаИзменятся ли эмбеддинги токенов BERT, если переставить слова в предложении?
Изменятся ли эмбеддинги токенов BERT, если переставить слова в предложении?
Да. BERT добавляет позиционные эмбеддинги, поэтому токен на другой позиции стартует с другого входного вектора. Кроме того, self-attention смешивает токен с контекстом, а перестановка его меняет. Оба эффекта делают контекстные эмбеддинги после перестановки разными.
Типичные ошибки
- ✗Считают эмбеддинги BERT статическими, независимыми от позиции
- ✗Думают, что позиционная информация привязана лишь к [CLS], а не к каждому токену
- ✗Забывают, что self-attention заново смешивает контекст после перестановки
Уточняющие вопросы
- →Какие два компонента делают BERT чувствительным к порядку слов?
- →Как удаление позиционных эмбеддингов изменило бы этот ответ?
MiddleТеорияИногдаСможет ли предобученный BERT дать разумный эмбеддинг для редкого слова, которого он не видел при обучении?
Сможет ли предобученный BERT дать разумный эмбеддинг для редкого слова, которого он не видел при обучении?
Да, по двум причинам. Во-первых, WordPiece-токенизация разбивает редкое слово на частотные субсловные токены, так что OOV-сбоя нет. Во-вторых, BERT контекстный, поэтому соседние слова его информируют. Чтобы получить единый вектор слова, усредните или возьмите максимум по его субсловным токенам.
Типичные ошибки
- ✗Считают, что редкие слова всегда схлопываются в один токен [UNK]
- ✗Забывают, что субсловное разбиение WordPiece исключает OOV
- ✗Игнорируют, что контекст формирует контекстный эмбеддинг
Уточняющие вопросы
- →Как WordPiece решает, где разбить невиданное слово?
- →Когда пулинг субслов даёт обманчивый вектор слова?
MiddleТеорияИногдаКак метки сущностей уровня слова совмещаются с субсловными токенами в распознавании именованных сущностей?
Как метки сущностей уровня слова совмещаются с субсловными токенами в распознавании именованных сущностей?
Одно слово превращается в несколько кусков, поэтому метка слова по схеме BIO ставится на первый кусок; остальные помечаются как продолжения и маскируются из потерь. На инференсе предсказания возвращают к словам по метке первого куска каждого слова.
Типичные ошибки
- ✗Позволяют каждому субслову вносить дублированную метку в функцию потерь
- ✗Забывают отобразить субсловные предсказания обратно на целые слова
- ✗Считают, что субсловные модели не умеют классифицировать по токенам
Уточняющие вопросы
- →Что ломается, когда граница сущности попадает внутрь одного субслова?
- →Как оценивать такой тегер — по токенам или по спанам?
MiddleПроизводительностьИногдаДобавление словных биграмм и триграмм взорвало матрицу текстовых признаков — какова цена и что делать?
Добавление словных биграмм и триграмм взорвало матрицу текстовых признаков — какова цена и что делать?
Каждая n-грамма становится своим столбцом, поэтому словарь растёт куда быстрее корпуса, а большинство столбцов встречается в единицах документов. Отсекайте по минимальной документной частоте, ограничивайте словарь или хешируйте в фиксированную ширину; матрица разрежена, и цена идёт по ненулям.
Типичные ошибки
- ✗Считают, что счётная матрица хранится плотно со всеми нулевыми ячейками
- ✗Думают, что словарь n-грамм ограничен словарём униграмм
- ✗Полагают, что хеширование признаков обходится без коллизий
Уточняющие вопросы
- →Как выбирать ширину при хешировании признаков?
- →Когда символьные n-граммы бьют словные на том же тексте?
SeniorТеорияИногдаКак обучить BERT на извлекающий question answering, где ответ — это фрагмент в референсном тексте?
Как обучить BERT на извлекающий question answering, где ответ — это фрагмент в референсном тексте?
Ответ задаётся двумя числами — позициями начального и конечного токенов. Подают вопрос и текст вместе и добавляют две выходные головы по токенам: одна предсказывает P(начало), другая P(конец), каждая — feed-forward слой и softmax. Фрагмент идёт от argmax начала до argmax конца (в стиле SQuAD).
Типичные ошибки
- ✗Считают извлекающий QA свободной генерацией текста
- ✗Используют одну голову вместо отдельных голов начала и конца
- ✗Забывают, что фрагмент декодируется от argmax начала до argmax конца
Уточняющие вопросы
- →Как гарантировать, что предсказанный конец не раньше начала?
- →Какой функцией потерь обучают головы начала и конца?
MiddleДебаггингРедкоДоменные термины добавили в токенизатор, и дообучение падает — в чём ошибка?
Доменные термины добавили в токенизатор, и дообучение падает — в чём ошибка?
Добавление токенов расширяет словарь токенизатора, но не матрицу эмбеддингов модели, поэтому новые id выходят за её пределы и обучение падает. Вызовите resize_token_embeddings после add_tokens; новые строки случайны, так что заложите дообучение, иначе термины пусты.
Открыть задачу →Типичные ошибки
- ✗Вызывают add_tokens, не расширив матрицу эмбеддингов модели
- ✗Ждут осмысленности от новых строк без дополнительного обучения
- ✗Винят оптимизатор или learning rate в выходе индекса за диапазон
Уточняющие вопросы
- →Как инициализировать новые строки лучше, чем случайно?
- →Когда дешевле оставить термины раздробленными?