Как устроена модель BERT?

«Как устроена модель BERT?» — вопрос из категории NLP и трансформеры, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

BERT (Bidirectional Encoder Representations from Transformers) — это архитектура трансформера, предобученная на больших текстовых корпусах для создания контекстуализированных эмбеддингов слов.

Ключевые архитектурные особенности:

  1. Двунаправленный контекст: В отличие от односторонних моделей вроде GPT, BERT анализирует контекст слева и справа от каждого токена одновременно благодаря механизму Masked Self-Attention.
  2. Стек энкодеров: Состоит из идентичных слоев-энкодеров (обычно 12 в bert-base, 24 в bert-large). Каждый слой включает:
    • Multi-Head Self-Attention для вычисления взвешенных зависимостей между всеми токенами в последовательности.
    • Полносвязную feed-forward сеть (обычно с активацией GELU).
    • Layer Normalization и остаточные связи (Residual Connections) вокруг каждой подструктуры.
  3. Специальные токены: Использует [CLS] (для классификации) и [SEP] (для разделения предложений).

Этапы предобучения:

  • MLM (Masked Language Modeling): Случайно маскируется 15% входных токенов, модель обучается их предсказывать. Это позволяет изучать глубокие контекстуальные представления.
  • NSP (Next Sentence Prediction): Модель обучается определять, является ли второе предложение логическим продолжением первого. Это помогает понимать отношения между предложениями.

Пример получения эмбеддингов с помощью Hugging Face Transformers:

from transformers import BertTokenizer, BertModel
import torch

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

inputs = tokenizer("Hello, BERT!", return_tensors="pt")
with torch.no_grad():
    outputs = model(**inputs)

# outputs.last_hidden_state содержит контекстуальные эмбеддинги для каждого токена
# outputs.pooler_output — это обработанный эмбеддинг токена [CLS]
embeddings = outputs.last_hidden_state

На практике предобученную BERT дообучают (fine-tune) на конкретных downstream-задачах: классификации текста, NER, question answering.