← Назад к вопросам

В чем разница между BERT и RuBERT?

2.2 Middle🔥 191 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между 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. Язык обучения

ПараметрBERTRuBERT
ЯзыкEnglishRussian
CorpusEnglish Wikipedia + BookCorpusRussian 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 или другие русские модели.

В чем разница между BERT и RuBERT? | PrepBro