ModernBERT: Наступне покоління моделей кодувальників — Посібник з використання та тонкої настройки для завдань обробки природної мови

Випуск BERT справив революцію в обробці природної мови (NLP), встановивши новий стандарт для моделей з лише енкодером (encoder-only transformer models). Однак, з розвитком додатків NLP, застарілі моделі, такі як BERT, почали виявляти обмеження у роботі з довшими послідовностями, досягненні обчислювальної ефективності та підтримці сучасних сценаріїв, таких як генерація з доповненням за допомогою пошуку (retrieval-augmented generation, RAG) і завдання, пов'язані з кодом.

Ось тут з’являється ModernBERT — модель нового покоління, розроблена для вирішення цих проблем. З рідною довжиною послідовності 8192 токени, передовими архітектурними вдосконаленнями, такими як обертальні позиційні вбудовування (Rotary Positional Embeddings, RoPE) та активації GeGLU, а також навчанням на величезному наборі даних з 2 трильйонів токенів (включаючи код), ModernBERT встановлює нову планку для продуктивності та ефективності. Він перевершує своїх попередників у задачах пошуку, класифікації та роботі з кодом, при цьому є значно швидшим і більш ефективним у використанні пам'яті, що робить його ідеальним для реального впровадження.

У цьому блозі ми розглянемо, як ModernBERT переосмислює можливості моделей лише з енкодером, його ключові інновації та неперевершену продуктивність за різними стандартами NLP.

pic

https://huggingface.co/blog/modernbert

Чому ModernBERT?

Незважаючи на успіх моделей, таких як BERT, вони не завжди встигають задовольнити зростаючі вимоги сучасних завдань NLP. Ось чому було розроблено ModernBERT:

Проблеми з застарілими моделями:

  • Обмеження довжини послідовності: Старі моделі з енкодером, як-от BERT, обмежені обробкою послідовностей до 512 токенів, що обмежує їх ефективність у задачах з довгими контекстами, таких як пошук документів і підсумовування.
  • Неоптимальні архітектури: Такі дизайни, як абсолютні позиційні вбудовування і додаткові коефіцієнти в усіх шарах, призводять до субоптимальної продуктивності та повільного виведення.
  • Застарілі дані для навчання: Застарілі моделі навчалися на менших наборах даних, які часто не враховували критично важливі області, такі як програмування та нові знання.

Нові вимоги до NLP:

  • Завдання з довгим контекстом: Завдання, такі як генерація з доповненням за допомогою пошуку (RAG), вимагають моделей, які можуть ефективно обробляти і витягувати інформацію з довгих послідовностей.
  • Гібридні дані: Сучасні додатки часто комбінують текстові та кодові дані, що вимагає моделей, здатних обробляти обидва типи без проблем.
  • Продуктивність у реальному часі: Для впровадження в реальні сценарії необхідні моделі з швидшим виведенням та ефективним використанням пам'яті для масштабування на різноманітному апаратному забезпеченні.

ModernBERT вирішує ці проблеми безпосередньо, привносячи інновації в архітектуру, масштабування даних і ефективність для задоволення вимог сучасних завдань NLP.

Ключові особливості ModernBERT

ModernBERT виділяється завдяки продуманим оновленням архітектури, навчанням на величезних наборах даних та революційним покращенням ефективності.
Ось його основні характеристики:

Архітектурні інновації

Обертальні позиційні вбудовування (Rotary Positional Embeddings, RoPE):

  • Заміщує абсолютні позиційні вбудовування для покращення продуктивності як для коротких, так і для довгих контекстів.
  • Забезпечує безперешкодне розширення контексту до 8192 токенів.

Активації GeGLU:

  • Використовує Gated Linear Units (GLU), що підвищує виразність моделі та покращує виконання завдань нижчого рівня.

Глибокий і вузький дизайн:

  • Балансує глибину та ширину для оптимальної продуктивності та ефективності, що робить його ідеальним для реальних сценаріїв.

Покращення ефективності

Flash Attention:

  • Використовує ефективні з погляду пам'яті механізми уваги для підвищення швидкості обробки токенів, особливо для довгих послідовностей.

Механізм Unpadding:

  • Видаляє токени заповнення під час навчання та інференції, знижуючи обчислювальні витрати до 20%.

Оптимізація для GPU:

  • Оптимізовано для популярних GPU, таких як NVIDIA T4, A100 та RTX 4090, максимізуючи використання апаратних засобів.

Обробка розширеного контексту

Довжина послідовності 8192 токенів:

  • Обробляє значно довші послідовності в порівнянні з застарілими моделями, такими як BERT (512 токенів).
  • Ідеально підходить для завдань, що потребують розуміння довгого контексту, таких як багатодокументний пошук і підсумовування.

Навчання на сучасних даних

Великий набір даних:

  • Навчався на 2 трильйонах токенів, що охоплюють різноманітні області, такі як веб-документи, наукова література та кодові дані.

Оновлений токенізатор:

  • Має сучасний токенізатор Byte-Pair Encoding (BPE), оптимізований для обробки як природних мов, так і програмних завдань.

Ці інновації разом роблять ModernBERT потужним інструментом для завдань пошуку та класифікації, встановлюючи нову планку для моделей з лише енкодером.

Як використовувати ModernBERT з Huggingface

Встановіть бібліотеку transformers з github

!pip install git+https://github.com/huggingface/transformers.git

Завантажте модель

from transformers import AutoTokenizer, AutoModelForMaskedLM  

model_id = "answerdotai/ModernBERT-base"  
tokenizer = AutoTokenizer.from_pretrained(model_id)  
model = AutoModelForMaskedLM.from_pretrained(model_id)

Використовуйте модель для маскованого мовного моделювання:

#text = "The Chairman of China is [MASK]."  
text = "The capital of China is [MASK]."  
#text = "US is [MASK]."  
inputs = tokenizer(text, return_tensors="pt")  
outputs = model(**inputs)  

# Щоб отримати прогнози для маски:  
masked_index = inputs["input_ids"][0].tolist().index(tokenizer.mask_token_id)  
predicted_token_id = outputs.logits[0, masked_index].argmax(axis=-1)  
predicted_token = tokenizer.decode(predicted_token_id)  
print("Прогнозований токен:", predicted_token)  

Вихід: Beijing

Використовуйте модель для класифікації тексту

sentences = [  
 "I absolutely love this product!",  
 "This is the worst experience I've ever had.",  
 "The movie was okay, not great but not terrible either.",  
 "I'm extremely happy with the service."  
]  


labels = ["bad", "good", "great"]  


label_ids = tokenizer.convert_tokens_to_ids(labels)  

for sentence in sentences:  

 input_text = f"{sentence} Overall, it was a [MASK] experience."  
 inputs = tokenizer(input_text, return_tensors="pt")  
 mask_token_index = torch.where(inputs["input_ids"][0] == tokenizer.mask_token_id)[0]  
 with torch.no_grad():  
 outputs = model(**inputs)  

 logits = outputs.logits  
 mask_token_logits = logits[0, mask_token_index, :]  


 label_scores = mask_token_logits[:, label_ids]  
 predicted_index = torch.argmax(label_scores, dim=1)  
 predicted_token = labels[predicted_index]  

 print(f"Оригінальне речення :{sentence}")  
 print(f"Сентимент:{predicted_token}\n")  

Вихід:  
Оригінальне речення :I absolutely love this product!  
Сентимент:great  

Оригінальне речення :This is the worst experience I've ever had.  
Сентимент:bad  

Оригінальне речення :The movie was okay, not great but not terrible either.  
Сентимент:good  

Оригінальне речення :I'm extremely happy with the service.

сентимент:great

Використовуйте модель для завдання питання-відповідь

context = "Альберт Ейнштейн був теоретичним фізиком, який розробив теорію відносності."

сентимент:great

Використовуйте модель для завдання питання-відповідь

context = "Альберт Ейнштейн був теоретичним фізиком, який розробив теорію відносності."  
question = "Де народився Альберт Ейнштейн?"  

input_text = f"{question} Він народився в [MASK]."  

inputs = tokenizer(input_text, return_tensors="pt")  
mask_token_index = torch.where(inputs["input_ids"][0] == tokenizer.mask_token_id)[0]  

with torch.no_grad():  
 outputs = model(**inputs)  

logits = outputs.logits  
mask_token_logits = logits[0, mask_token_index, :]  

top_k = 1 #  
top_k_ids = torch.topk(mask_token_logits, top_k, dim=1).indices[0].tolist()  
predicted_tokens = tokenizer.convert_ids_to_tokens(top_k_ids)  

print(f"питання :{question}")  
print("Відповідь на основі контексту:")  
for token in predicted_tokens:  
 print(token)

Тонка налаштування ModernBERT для класифікації тексту

Встановіть необхідні бібліотеки:

! pip install git+https://github.com/huggingface/transformers.git datasets accelerate scikit-learn -Uqq

Завантажте набір даних для класифікації новин:

Деталі набору даних можна знайти тут: argilla/synthetic-text-classification-news

from datasets import load_dataset  
from datasets.arrow_dataset import Dataset  
from datasets.dataset_dict import DatasetDict, IterableDatasetDict  
from datasets.iterable_dataset import IterableDataset  

# Dataset id з huggingface.co/dataset  
dataset_id = "argilla/synthetic-text-classification-news"  

# Завантажте сирий набір даних  
train_dataset = load_dataset(dataset_id, split='train')  

split_dataset = train_dataset.train_test_split(test_size=0.1)  
split_dataset['train'][0]  

Output:

pic

Токенізація даних:

from transformers import AutoTokenizer  

# Model id для завантаження токенізатора  
model_id = "answerdotai/ModernBERT-base"  

# Завантажити токенізатор  
tokenizer = AutoTokenizer.from_pretrained(model_id)  

# Допоміжна функція для токенізації  
def tokenize(batch):  
 return tokenizer(batch['text'], padding=True, return_tensors="pt")  

# Токенізація набору даних  
if "label" in split_dataset["train"].features.keys():  
 split_dataset = split_dataset.rename_column("label", "labels") # для відповідності Trainer  
tokenized_dataset = split_dataset.map(tokenize, batched=True, remove_columns=["text"])  

tokenized_dataset["train"].features.keys()

Завантажте модель:

from transformers import AutoModelForSequenceClassification  

# Model id для завантаження токенізатора  
model_id = "answerdotai/ModernBERT-base"  

# Підготовка міток моделі - корисно для виведення  
labels = tokenized_dataset["train"].features["labels"].names  
num_labels = len(labels)  
label2id, id2label = dict(), dict()  
for i, label in enumerate(labels):  
 label2id[label] = str(i)  
 id2label[str(i)] = label  

# Завантажте модель з huggingface.co/models  
model = AutoModelForSequenceClassification.from_pretrained(  
 model_id, num_labels=num_labels, label2id=label2id, id2label=id2label,  
)

Визначте метрики оцінки як f1_score:

import numpy as np  
from sklearn.metrics import f1_score  

# Допоміжна функція для метрики  
def compute_metrics(eval_pred):  
 predictions, labels = eval_pred  
 predictions = np.argmax(predictions, axis=1)  
 score = f1_score(  
 labels, predictions, labels=labels, pos_label=1, average="weighted"  
 )  
 return {"f1": float(score) if score == 1 else score}

Визначте тренера:

train_bsz, val_bsz = 32, 32  
lr = 8e-5  
betas = (0.9, 0.98)  
n_epochs = 2  
eps = 1e-6  
wd = 8e-6  
training_args = TrainingArguments(  
 output_dir=f"fine_tuned_modern_bert",  
 learning_rate=lr,  
 per_device_train_batch_size=train_bsz,  
 per_device_eval_batch_size=val_bsz,  
 num_train_epochs=n_epochs,  
 lr_scheduler_type="linear",  
 optim="adamw_torch",  
 adam_beta1=betas[0],  
 adam_beta2=betas[1],  
 adam_epsilon=eps,  
 logging_strategy="epoch",  
 eval_strategy="epoch",  
 save_strategy="epoch",  
 load_best_model_at_end=True,  
)

bf16=True,  
 bf16_full_eval=True,  
 push_to_hub=False,  
)  
# Створіть екземпляр Trainer  
trainer = Trainer(  
 model=model,  
 args=training_args,  
 train_dataset=tokenized_dataset["train"],  
 eval_dataset=tokenized_dataset["test"],  
 compute_metrics=compute_metrics,  
)

Навчання моделі:

trainer.train()

pic

Використовуйте модель для інференсу:

sample = "Глобальне потепління збільшується на тривожному рівні."

Air pollution is all time high."  
inf_inputs = tokenizer(sample, return_tensors="pt")  
inf_inputs = inf_inputs.to("cuda")  

with torch.no_grad():  
 logits = model(**inf_inputs).logits  

print(logits)  
print(f"Prediction: {model.config.id2label[str(logits.argmax().item())]}")  

Output:  
tensor([[-1.1172, -0.2432, 0.9375, 0.0378, 0.0325, 1.2734, -1.9141, -1.7734]],  
 device='cuda:0')  
Prediction: environment

Основні досягнення в ефективності

ModernBERT переосмислює досягнення в моделях на основі енкодерів, встановлюючи нові стандарти в ефективності для різних завдань і бенчмарків. Ось найважливіші досягнення:

Успіхи на бенчмарках

  • Розуміння природної мови (NLU):
    • Перевершив всі існуючі базові моделі на бенчмарку GLUE, ставши першим, хто перевершив DeBERTaV3-base в завданнях класифікації.
    • Досягнув майже однакових результатів з DeBERTaV3-large, незважаючи на те, що має на 10% менше параметрів та обробляє токени вдвічі швидше.

Пошук коротких контекстів:

  • Перевершив моделі, такі як RoBERTa та GTE-en-MLM, на бенчмарках, таких як BEIR, відзначившись у завданнях Dense Passage Retrieval (DPR) з одним вектором та ColBERT з кількома векторами.

Пошук довгих контекстів:

  • Досягнув найкращих результатів на бенчмарку MLDR для завдань пошуку з одним і кількома векторами, використовуючи довжину контексту до 8192 токенів.

Універсальність

Пошук коду та змішані текстово-кодові завдання:

  • Показав виняткові результати на бенчмарках, пов'язаних з програмуванням, таких як CodeSearchNet і StackQA, перевершивши конкурентів завдяки включенню даних програмування в процес навчання.

Пошук з доповненням генерації (RAG):

  • Покращив пайплайни RAG, здійснюючи пошук контексту більш ефективно та точно, постачаючи LLM з високоякісною та релевантною інформацією.

Ефективність

Швидкість:

  • Обробляє довгі контексти в 2–3 рази швидше за конкурентів, зокрема GTE-en-MLM.

Використання пам'яті:

  • Досягнув найкращої ефективності використання пам'яті, підтримуючи більші розміри пакетів, ніж будь-яка інша модель на основі енкодера.

Застосовність у реальному часі:

  • Оптимізований для інференсу на широко використовуваних GPU, забезпечуючи високу продуктивність у виробничих умовах.

Обмеження

Хоча ModernBERT є значним кроком уперед у моделях на основі енкодерів, він не позбавлений своїх обмежень. Ось деякі сфери, де потрібні вдосконалення та подальші дослідження:

1. Мовна сфера

  • Орієнтований на англійську мову: ModernBERT зосереджений виключно на англійській мові, що обмежує його застосування до багатомовних або малоресурсних мов. Розширення підтримки інших мов підвищило б його корисність для глобальної аудиторії.

2. Упередження в тренувальних даних

  • Залежність від даних з Інтернету: Велика частина тренувальних даних ModernBERT походить з веб-джерел, що може містити в собі упередження, притаманні таким даним. Це може призвести до упереджених або спотворених результатів у downstream застосунках.

3. Обмеження генерації

  • Тільки MLM-ціль: ModernBERT навчений за допомогою цілі Masked Language Modeling (MLM), що, хоча і є відмінним для завдань класифікації та пошуку, не використовує такі цілі, як Replaced Token Detection (RTD). Це обмежує його застосування в сценаріях, що вимагають генеративних можливостей.
  • Обмежене генерування послідовностей: Хоча модель може пропонувати токени, замінюючи [MASK], вона не розроблена для генерації довгих послідовних текстів.

4. Розширення розмірів

  • Параметри моделі: ModernBERT зосереджений на оптимізації архітектури та даних, але не досліджує потенційні переваги масштабування кількості параметрів моделі, що могло б ще більше покращити її продуктивність для певних завдань.

5. Адаптація до довгих контекстів

  • Потрібна доопрацювання: Хоча ModernBERT досягає відмінних результатів на завданнях з довгими контекстами, деякі бенчмарки вказують на те, що він працює трохи гірше за GTE-en-MLM в поза-доменних оцінках без доопрацювання.
    This suggests its long-context capabilities may need more adaptation for domain-specific tasks.

Перспективи

Подолання цих обмежень включає розширення багатомовних можливостей ModernBERT, удосконалення цілей тренування та дослідження гібридних підходів, які поєднують генеративні та дискримінативні цілі. Подолавши ці виклики, майбутні версії ModernBERT можуть розширити свій вплив та застосовуваність.

Посилання:

  1. Warner, Benjamin, et al. “Smarter, Better, Faster, Longer: A Modern Bidirectional Encoder for Fast, Memory Efficient, and Long Context Finetuning and Inference.” arXiv preprint arXiv:2412.13663 (2024).

  2. https://huggingface.co/blog/modernbert

Перекладено з: ModernBERT: The Next Generation of Encoder Models — A Guide to Using and Fine-Tuning for NLP Tasks

Leave a Reply

Your email address will not be published. Required fields are marked *