Ответ
Технически — да, но архитектурно и концептуально это противоречит принципам GPT. BERT специально создан для двунаправленного контекста в задаче Masked Language Modeling (MLM), в то время как GPT — это авторегрессионная модель, обученная предсказывать следующее слово (слева направо).
Проблемы при обучении GPT на MLM:
- Односторонний контекст: Во время предсказания маскированного токена GPT не может использовать информацию из токенов, стоящих справа от маски (future context), что является ключевым преимуществом BERT.
- Нарушение обучающего распределения: GPT обучается на последовательном предсказании, а MLM требует случайного маскирования. Это может ухудшить качество генерации.
Как можно адаптировать GPT для MLM-подобных задач (практический пример):
import torch
from transformers import GPT2LMHeadModel, GPT2Tokenizer
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
tokenizer.pad_token = tokenizer.eos_token # Устанавливаем pad токен
# Текст с маской
text = "Машинное обучение — это [MASK] технология."
# Заменяем маску на специальный токен (если его нет, используем существующий)
mask_token = "<mask>" if "<mask>" in tokenizer.vocab else tokenizer.unk_token
text = text.replace("[MASK]", mask_token)
inputs = tokenizer(text, return_tensors="pt")
input_ids = inputs['input_ids']
# Находим позицию маски в последовательности
mask_token_id = tokenizer.convert_tokens_to_ids(mask_token)
mask_positions = (input_ids == mask_token_id).nonzero(as_tuple=True)[1]
# Прямой проход модели
with torch.no_grad():
outputs = model(input_ids)
logits = outputs.logits # [batch_size, seq_len, vocab_size]
# Предсказание только для позиций с маской
for pos in mask_positions:
predicted_token_id = logits[0, pos].argmax()
predicted_token = tokenizer.decode(predicted_token_id)
print(f"Предсказание для маски на позиции {pos}: '{predicted_token}'")
Вывод и рекомендации:
- Не рекомендуется обучать GPT с нуля на MLM. Для задач, требующих двунаправленного понимания контекста (например, извлечение признаков, NSP), изначально лучше выбрать BERT или RoBERTa.
- Если необходимо адаптировать предобученную GPT для заполнения пропусков, можно использовать технику PPLM (Plug and Play Language Models) или дообучить модель на небольшом датасете с масками, но это будет менее эффективно, чем BERT.
- Универсальным решением для задач и маскирования, и генерации является архитектура T5 (Text-To-Text Transfer Transformer), которая преобразует все задачи в формат "текст -> текст".