NLP и трансформеры
Современный NLP держится на трансформерах, а те — на нескольких точных идеях. Эмбеддинги превращают слова в векторы, self-attention смешивает контекст без рекуррентности, позиционное кодирование возвращает порядок, которого attention сам не видит, а encoder/decoder и BERT — конкретные способы собрать это в рабочую модель.
Тема глубокая, и ловушки здесь механические. Self-attention перестановочно-инвариантен — без позиционного кодирования он слеп к порядку. Каузальная маска в декодере ставит −∞ до softmax, а не обнуляет веса после. BERT — это encoder, он не генерирует текст, а кодирует его. Векторы word2vec статичны, а BERT — контекстный. Полная карта — в слоях ниже.
Карта темы
- Эмбеддинги слов — от разреженных BoW/TF-IDF к плотным word2vec/GloVe/FastText и контекстным ELMo/BERT.
- Self-attention — механизм Query/Key/Value, масштабированный softmax и каузальная маска декодера.
- Позиционное кодирование — почему attention слеп к порядку и как это чинят синус, обучаемые эмбеддинги и RoPE.
- Трансформер — блоки encoder и decoder, их подслои и cross-attention между ними.
- BERT — encoder-модель для эмбеддингов, редких слов, целого текста и extractive question answering.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
| Считать self-attention чувствительным к порядку без кодирования | Без позиционного кодирования модель слепа к порядку слов |
| Забыть масштабирование на √dₖ внутри softmax | Скалярные произведения растут, softmax насыщается, градиент гаснет |
| Маскировать прошлые, а не будущие позиции в декодере | Автогрессия ломается — модель подглядывает в ответ |
| Применять каузальную маску после softmax | Веса перестают суммироваться в единицу; надо ставить −∞ до softmax |
| Считать векторы word2vec контекстными | Они статические — одно слово один вектор, вне зависимости от контекста |
| Считать BERT генератором текста | BERT — encoder, он кодирует, а не порождает последовательность |
Значение для собеседований
NLP-часть отбирает тех, кто понимает трансформер как механизм. Кандидат, который объясняет, почему нужен √dₖ и почему каузальная маска — это −∞ до softmax, звучит на порядок сильнее, чем «ну, attention смотрит на все слова».
Что обычно проверяют:
- Чем статические эмбеддинги (word2vec) отличаются от контекстных (BERT).
- Как устроен self-attention — Query/Key/Value, масштабированный softmax, выход как взвешенная сумма Value.
- Почему нужно позиционное кодирование и какие есть варианты.
- Чем блок decoder отличается от encoder и что делает BERT с редким словом или целым текстом.
Типичный неверный ответ: «self-attention учитывает порядок слов сам». На самом деле он перестановочно-инвариантен: без позиционного кодирования перестановка слов не меняла бы, кто на кого смотрит.