Как BERT улавливает семантическую схожесть между разными по написанию, но одинаковыми по смыслу предложениями?
Answer from AI
sobes.tech AI
Что хотят услышать интервьюеры:
BERT понимает семантическую схожесть не по совпадению слов, а по контекстным эмбеддингам токенов. Он учитывает окружение каждого слова в предложении, поэтому близкие по смыслу фразы могут получать похожие векторные представления даже при разной формулировке. Для сравнения предложений обычно используют pooled-эмбеддинг, [CLS]-вектор или отдельные sentence-embedding модели на базе BERT.
Определение:
BERT — это трансформерная языковая модель, которая строит представление каждого токена с учетом всего предложения целиком. Благодаря двунаправленному контексту одно и то же слово в разных фразах получает разные векторы, а разные фразы с одинаковым смыслом могут оказаться близко в embedding-пространстве. Семантическая схожесть в этом случае определяется не буквальным совпадением текста, а близостью этих контекстных представлений.
Пример использования:
Например, фразы «Как пройти в центр?» и «Подскажите дорогу до центра» написаны по-разному, но смысл у них один. BERT преобразует каждую фразу в вектор, и затем по косинусной близости этих векторов можно понять, что предложения семантически похожи.
from transformers import AutoTokenizer, AutoModel
import torch
import torch.nn.functional as F
model_name = "bert-base-multilingual-cased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
sentences = [
"Как пройти в центр?",
"Подскажите дорогу до центра"
]
inputs = tokenizer(sentences, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
# Берем [CLS]-вектор как простое представление предложения
sentence_embeddings = outputs.last_hidden_state[:, 0, :]
cos_sim = F.cosine_similarity(sentence_embeddings[0], sentence_embeddings[1], dim=0)
print(cos_sim.item())
Пояснение кода:
В этом примере код нужен, потому что речь идет о практическом способе сравнения предложений.
- Загружается токенизатор и модель BERT.
- Два предложения преобразуются в токены и подаются в модель.
- На выходе модель возвращает скрытые состояния для всех токенов.
- Берется вектор первого токена
[CLS]как компактное представление предложения. - Косинусная близость между двумя векторами показывает степень семантической схожести: чем выше значение, тем ближе смысл.
Ключевые моменты:
- BERT сравнивает не строки, а контекстные векторные представления.
- Один и тот же токен в разных предложениях может иметь разные эмбеддинги из-за контекста.
- Для оценки схожести предложений обычно используют
[CLS]-вектор или sentence embeddings. - Простая близость
[CLS]-векторов — рабочий базовый подход, но для качественного semantic search часто используют модели, специально обученные на сравнение предложений. - BERT лучше улавливает парафразы и смысловые совпадения, чем модели, основанные только на bag-of-words или TF-IDF.