Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между BERT и RuBERT
Это отличный вопрос о языковых моделях. Обе это BERT модели, но специализированные для разных языков. Объясню ключевые различия.
BERT: Исходная модель
BERT (Bidirectional Encoder Representations from Transformers)
- Выпущена Google в 2018
- Обучена на английском тексте
- Базовая версия (bert-base-uncased):
- 12 слоёв трансформера
- 768 hidden units
- 12 attention heads
- 110M параметров
Как работает:
from transformers import BertTokenizer, BertModel
model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)
text = "Machine learning is amazing"
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)
# [CLS] token embedding (для classification)
sentence_embedding = outputs.last_hidden_state[:, 0, :]
RuBERT: Русская версия
RuBERT (Russian BERT)
- Создана DeepPavlov (SberAI)
- Обучена на русских текстах (корпус Wikipedia + новости)
- Архитектура аналогична BERT, но:
- Словарь (vocabulary) русский
- Токенизация учитывает русский язык
- Веса предварительного обучения на русском корпусе
Использование:
from transformers import AutoTokenizer, AutoModel
# RuBERT (русская версия)
model_name = "sberbank-ai/ruBert-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
text = "Машинное обучение это потрясающе"
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)
sentence_embedding = outputs.last_hidden_state[:, 0, :]
print(sentence_embedding.shape) # [1, 768]
Основные различия
1. Язык обучения
| Параметр | BERT | RuBERT |
|---|---|---|
| Язык | English | Russian |
| Corpus | English Wikipedia + BookCorpus | Russian Wikipedia + News |
| Size | ~3.3B слов | ~4.8B слов |
2. Vocabulary (Словарь)
# BERT vocabulary (30,522 tokens)
# Включает англисские слова, подслова
bert_vocab_size = 30522
# RuBERT vocabulary (119,547 tokens)
# Включает русские слова, подслова, морфемы
rubert_vocab_size = 119547
# Пример
text_en = "running"
text_ru = "бегущий"
bert_tokens = tokenizer(text_en)["input_ids"]
rubert_tokens = ru_tokenizer(text_ru)["input_ids"]
print(bert_tokens) # [2581, 2571, 1012]
print(rubert_tokens) # [1047, 1048]
3. Морфология
Русский язык имеет сложную морфологию (падежи, роды, виды).
# Русские слова с одним корнем, но разными окончаниями
Russian_forms = [
"кот", # именительный падеж
"кота", # родительный падеж
"коту", # дательный падеж
"кота", # винительный падеж
"котом", # творительный падеж
"коте", # предложный падеж
]
# BERT (обучен на английском) не поймёт отношение между этими формами
# RuBERT специально обучен на русском и лучше понимает морфологию
bert_embeddings = bert_model(bert_tokenizer(russian_forms[0]))[0]
rubert_embeddings = rubert_model(rubert_tokenizer(russian_forms[0]))[0]
# RuBERT embeddings будут более информативны
Сравнение производительности
На русских задачах RuBERT работает лучше:
from sklearn.metrics import accuracy_score, f1_score
import torch
def evaluate_model(model, tokenizer, texts, labels, task='classification'):
model.eval()
predictions = []
for text in texts:
inputs = tokenizer(text, return_tensors="pt",
max_length=512, truncation=True)
with torch.no_grad():
outputs = model(**inputs)
# Для классификации используем [CLS] token
logits = outputs.last_hidden_state[:, 0, :]
pred = torch.argmax(logits, dim=-1)
predictions.append(pred.item())
accuracy = accuracy_score(labels, predictions)
f1 = f1_score(labels, predictions, average='weighted')
return {'accuracy': accuracy, 'f1': f1}
# Данные на русском
russian_texts = [
"Это отличный фильм!",
"Мне очень понравилось",
"Ужасно, не рекомендую",
# ...
]
labels = [1, 1, 0, ...]
# RuBERT даст лучшие результаты
results_rubert = evaluate_model(rubert_model, rubert_tokenizer,
russian_texts, labels)
print(results_rubert) # Например: {'accuracy': 0.92, 'f1': 0.91}
Когда использовать какую модель
Используй BERT если:
- Работаешь с английским текстом
- Большой объём English данных
- BERT имеет больше fine-tuned моделей
Используй RuBERT если:
- Работаешь с русским текстом
- Русский язык — основной язык проекта
- Нужна лучшая семантическая близость для русских слов
- Классификация/кластеризация русского текста
Примеры использования RuBERT
1. Классификация текста
from transformers import pipeline
# Zero-shot классификация
classifier = pipeline(
"zero-shot-classification",
model="sberbank-ai/ruBert-base"
)
result = classifier(
"Мне нужна помощь с компьютером",
["техподдержка", "продажи", "маркетинг"]
)
print(result)
# {'sequence': 'Мне нужна помощь с компьютером',
# 'labels': ['техподдержка', 'маркетинг', 'продажи'],
# 'scores': [0.89, 0.07, 0.04]}
2. Извлечение информации (Named Entity Recognition)
ner_pipeline = pipeline(
"token-classification",
model="sberbank-ai/ruBert-base"
)
result = ner_pipeline("Иван Петров работает в Сбербанке")
print(result)
# [{'entity': 'B-PER', 'score': 0.998, 'index': 1, 'word': 'Иван'},
# {'entity': 'I-PER', 'score': 0.995, 'index': 2, 'word': 'Петров'},
# {'entity': 'B-ORG', 'score': 0.992, 'index': 5, 'word': 'Сбербанке'}]
3. Семантическое подобие
from sklearn.metrics.pairwise import cosine_similarity
def get_sentence_embedding(model, tokenizer, text):
inputs = tokenizer(text, return_tensors="pt",
max_length=512, truncation=True)
with torch.no_grad():
outputs = model(**inputs)
# Усреднение всех токенов
return outputs.last_hidden_state.mean(dim=1)[0].numpy()
sentences = [
"Кот сидит на диване",
"Кот лежит на диване",
"Собака быстро бежит",
]
embeddings = [get_sentence_embedding(rubert_model, rubert_tokenizer, s)
for s in sentences]
# Подобие между первыми двумя (похожи — кот и диван)
sim_01 = cosine_similarity([embeddings[0]], [embeddings[1]])[0][0]
# Подобие между первой и третьей (не похожи)
sim_02 = cosine_similarity([embeddings[0]], [embeddings[2]])[0][0]
print(f"Sim(0,1): {sim_01:.3f}") # ~0.85
print(f"Sim(0,2): {sim_02:.3f}") # ~0.35
Другие русские BERT модели
# DeepPavlov предлагает несколько вариантов
models = {
"sberbank-ai/ruBert-base": "базовая версия",
"sberbank-ai/ruBert-large": "большая версия (большей памяти)",
"sberbank-ai/ruDistilBert": "дистиллированная (быстрее, меньше памяти)",
"sberbank-ai/ruRoberta-large": "RoBERTa архитектура (улучшения к BERT)",
"sberbank-ai/rugpt2large": "русский GPT-2 (генеративная)",
}
for model_id, description in models.items():
print(f"{model_id}: {description}")
Заключение
BERT vs RuBERT:
- BERT — универсальная, но обучена на английском
- RuBERT — специализирована для русского языка
Для русского текста RuBERT даёт значительно лучшие результаты благодаря:
- Русской лексике
- Понимаю морфологии
- Культурному контексту
Для production систем с русским текстом — используй RuBERT или другие русские модели.