Навчання та донавчання багатовекторних моделей вбудовування за допомогою Sentence Transformers
MultiVectorEncoder для пошуку з пізньою взаємодією в стилі ColBERT, а також повний підхід до її навчання. У цій статті я покажу, як донавчити багатовекторну модель, яка перевершує універсальні моделі пошуку на ваших даних. Цей метод також дає змогу навчати нові потужні багатовекторні моделі з нуля. Усе нижче працює після виконання pip install -U "sentence-transformers[train]".
Донавчання багатовекторних моделей охоплює кілька компонентів: саму модель, набори даних, функції втрат, аргументи навчання, оцінювачі та клас тренера. Я розгляну кожен із цих компонентів і наведу практичні приклади їх використання для донавчання потужних багатовекторних моделей.
Насамкінець, у розділі «Оцінювання» я покажу, що моя донавчена модель multi-vector-encoder/mLateOn-medical, навчена за 14,5 години на одній RTX 3090 паралельно з підготовкою цієї статті, легко перевершує кожну універсальну модель пошуку, яку я зміг знайти для свого медичного оцінювання пошуку: щільні, розріджені, лексичні та багатовекторні моделі.
Якщо вас цікавить донавчання щільних або розріджених моделей ембедингів чи переранжувальників, радимо ознайомитися з моїми попередніми статтями: Навчання та донавчання моделей ембедингів, Навчання та донавчання розріджених моделей ембедингів і Навчання та донавчання моделей переранжувальників.
Ця стаття присвячена навчанню багатовекторних моделей. Якщо ви хочете дізнатися, як їх використовувати — від завантаження та кодування до індексації у векторних базах даних, — перегляньте супровідну статтю Багатовекторні моделі ембедингів (пізня взаємодія) за допомогою Sentence Transformers.
Зміст
- Що таке багатовекторні моделі?
- Навіщо виконувати донавчання?
- Компоненти навчання
- Модель
- Донавчання наявної багатовекторної моделі
- Створення моделі на основі базового трансформера
- Яку початкову точку обрати?
- Набір даних
- Дані на Hugging Face Hub
- Локальні дані
- Формат набору даних
- Функція втрат
- Аргументи навчання
- Оцінювач
- Тренер
- Зворотні виклики
- Навчання на кількох наборах даних
- Оцінювання
- Оптимізація індексу
- Подяки
- Додаткові ресурси
- Приклади навчання
- Документація
Що таке багатовекторні моделі?
Щільна модель ембедингів стискає весь текст в один вектор, а подібність визначається одним скалярним добутком між двома такими узагальненнями. Багатовекторна модель (також відома як модель із пізньою взаємодією або модель у стилі ColBERT) уникає такого стискання. Вона зберігає один невеликий вектор для кожного токена та оцінює запит щодо документа за допомогою оператора MaxSim, у якому кожен токен запиту знаходить найбільш відповідний токен документа, а отримані оцінки підсумовуються. Зіставлення на рівні токенів зберігає саме ті детальні сигнали, які одна векторна репрезентація змушена усереднювати, що зазвичай забезпечує потужніший пошук ціною більшого індексу.
У супровідній статті Багатовекторні моделі ембедингів детально розглянуто архітектуру, кодування, оцінювання та індексацію, тож я зроблю цей розділ коротким і перейду до навчання.
Навіщо виконувати донавчання?
Донавчання багатовекторних моделей суттєво покращує їхню ефективність пошуку у вашій конкретній предметній області: словниковий запас, стиль запитів і поняття релевантності відрізняються для вебпошуку, юридичного пошуку, пошуку коду та огляду наукової літератури. Оскільки запити й документи зіставляються токен за токеном, багатовекторні моделі вловлюють тонкі доменні сигнали, які одновекторні моделі зазвичай усереднюють, і дуже добре реагують навіть на помірний обсяг доменних даних для донавчання.
Крім того, більшість опублікованих моделей пошуку налаштовано для коротких фрагментів. Класичні контрольні точки ColBERT обрізають документи до 180 або 300 токенів, а багато популярних щільних моделей — до 256 або 512, оскільки їхні навчальні дані у стилі MS MARCO рідко перевищують ці значення. Якщо ваші документи довгі, ці моделі непомітно відкидають більшу частину кожного документа ще до його оцінювання. Під час мого медичного оцінювання, де фрагменти в середньому містили 941 токен, я виміряв, що таке обрізання коштує до 0,24 NDCG@10 — значно більше, ніж будь-яка різниця між архітектурами моделей. Навчаючи власну модель, ви налаштовуєте довжину документа відповідно до потреб ваших даних.
LightOn зіткнулася з такою самою ситуацією під час пошуку коду: універсальної моделі LateOn було недостатньо, тому вони навчили LateOn-Code. Ваша предметна область — медична, юридична, фінансова чи документи вашої компанії — не отримує офіційної моделі. У цій статті показано, як створити її самостійно за лічені години на одному споживчому GPU.
Компоненти навчання
Навчання моделей MultiVectorEncoder передбачає такі компоненти:
- Модель: модель для донавчання або архітектура для створення з нуля.
- Набір даних: дані, що використовуються для навчання та оцінювання.
- Функція втрат: функція, яка вимірює ефективність моделі та керує процесом оптимізації.
- Аргументи навчання (необов’язково): параметри, що впливають на продуктивність навчання, відстеження та налагодження.
- Оцінювач (необов’язково): клас для оцінювання моделі до, під час або після навчання.
- Тренер: об’єднує всі компоненти навчання.
Розгляньмо кожен компонент докладніше.
Модель
Навчання багатовекторних моделей дає реальний вибір початкової точки, і це важливіше, ніж може здаватися.
Донавчання наявної багатовекторної моделі
Якщо ви хочете додатково донавчити наявну багатовекторну модель, вам узагалі не потрібно перейматися архітектурою:
from sentence_transformers import MultiVectorEncoder
model = MultiVectorEncoder(
"lightonai/mLateOn-unsupervised",
model_kwargs={"torch_dtype": "float32"},
processor_kwargs={"model_max_length": 8192},
)
Контрольна точка містить власний набір налаштувань: маркерні токени для запитів і документів, проєкційну голову та список токенів, які пропускаються під час оцінювання. Для донавчання зазвичай варто зберегти все це й змінити лише те, чого потребують ваші дані. Насамперед перевірте налаштування довжини, оскільки багато опублікованих контрольних точок обмежують документи 180–512 токенами (див. «Навіщо виконувати донавчання?»), тоді як мої медичні фрагменти містять до 1400 токенів. Сімейство mLateOn уже використовує весь контекст у 8192 токени базової моделі, але якщо ваша початкова контрольна точка має обмеження, їх можна зняти:
model[0].query_length = None
model[0].document_length = None
Якщо обмеження для окремих завдань не задані, обрізання повертається до значення model_max_length токенізатора, тому вище під час завантаження я налаштовую саме цей ліміт.
Я також додав список розділових знаків, який виключає токени пунктуації з оцінювання та зберігання на стороні документа. У чотиристоронньому абляційному дослідженні (без списку, пунктуація, стоп-слова, обидва варіанти) це помірно покращило якість, а індекс документів безкоштовно зменшився на 9,6% на цих даних:
import string
model[2].skiplist_words = list(string.punctuation)
model[2].resolve_with_tokenizer(model.tokenizer)
Створення моделі на основі базового трансформера
Ви також можете вказати для MultiVectorEncoder будь-який базовий трансформер, і для вас буде додано нову, випадково ініціалізовану проєкцію на рівні токенів:
from sentence_transformers import MultiVectorEncoder
model = MultiVectorEncoder("answerdotai/ModernBERT-base", model_kwargs={"torch_dtype": "float32"})
Це класичний конвеєр ColBERT: Transformer, що створює контекстуалізовані ембединги токенів; Dense, який проєктує кожен із них у 128 вимірів; MultiVectorMask, що визначає, які токени враховувати під час оцінювання; і Normalize на рівні токенів. Проєкція починається випадковою, тому перед використанням цієї моделі її потрібно навчити. Цікаво, що це працює і з потужними основами для щільних ембедингів. Нова проєкція на Alibaba-NLP/gte-modernbert-base у моїх експериментах відставала від початкових точок на основі готових контрольних точок менш ніж на 0,03, використовуючи лише проєкцію та 25 тисяч навчальних пар.
Класичні прийоми токенізації ColBERT ([MASK] для розширення запиту, префіксні токени [Q] / [D], обмеження довжини документа та список пунктуації) за замовчуванням вимкнені й налаштовуються. Повний набір описано в розділі Створення власних моделей. Для довідки: я протестував розширення запиту [MASK] у чотирьох конфігураціях для доменного донавчання, і жодна не дала вимірюваної різниці, тож не обов’язково застосовувати класичний рецепт.
Яку початкову точку обрати?
Я безпосередньо виміряв це під час підготовки цієї статті: взяв шість початкових точок і навчав кожну за ідентичним рецептом на 25 тисячах пар «медичне запитання — фрагмент» із MIRIAD, а потім оцінював на 1000 відкладених запитаннях щодо корпусу з 50 тисяч фрагментів:
| Початкова точка | NDCG@10 без навчання | Після 25 тисяч пар | Зміна |
|---|---|---|---|
| lightonai/mLateOn-unsupervised | 0.9087 | 0.9398 | +0.0311 |
| lightonai/mLateOn | 0.9277 | 0.9319 | +0.0042 |
| lightonai/LateOn-unsupervised | 0.9026 | 0.9206 | +0.0180 |
| lightonai/LateOn | 0.9185 | 0.9105 | -0.0080 |
| lightonai/GTE-ModernColBERT-v1 | 0.9198 | 0.9007 | -0.0191 |
| Нова голова на gte-modernbert-base | - | 0.9177 | - |
Результат мене здивував і відтворився у двох сімействах моделей. Контрольні точки *-unsupervised значно краще адаптуються до нового домену, ніж їхні завершені аналоги, і зрештою випереджають їх, хоча починають із нижчого рівня. Ці контрольні точки перебувають після великомасштабного контрастивного попереднього навчання, але до контрольованого донавчання для загального пошуку, тому вони мають усю структуру пізньої взаємодії, але не мають універсального налаштування, яке доменне навчання згодом мусить скасувати. Натомість завершені контрольні точки майже не змінювалися або навіть погіршувалися за кожної перевіреної мною швидкості навчання.
Отже, якщо вподобане вами сімейство моделей публікує контрольну точку до контрольованого навчання, починайте з неї. Якщо ні, нова проєкція на потужній основі, попередньо навченій для пошуку, є близьким другим варіантом. Продовження навчання повністю готової контрольної точки — найслабший варіант для доменної адаптації, хоча він здається найприроднішим.
Набір даних
MultiVectorEncoderTrainer використовує екземпляри datasets.Dataset або datasets.DatasetDict для навчання та оцінювання. Ви можете завантажувати дані з Hugging Face Datasets Hub або використовувати локальні дані у зручному для вас форматі (наприклад, CSV, JSON, Parquet, Arrow чи SQL).
Примітка: багато загальнодоступних наборів даних, які одразу працюють із Sentence Transformers, позначено тегом sentence-transformers на Hugging Face Hub, тож їх легко знайти за адресою https://huggingface.co/datasets?other=sentence-transformers. Перегляньте їх, щоб знайти готові набори даних, корисні для ваших завдань, предметних областей або мов.
Дані на Hugging Face Hub
Для завантаження даних із наборів на Hub можна використовувати функцію load_dataset:
from datasets import load_dataset
train_dataset = load_dataset("tomaarsen/miriad-4.4M-split", split="train")
print(train_dataset)
"""
Dataset({
features: ['question', 'passage_text'],
num_rows: 4467542
})
"""
Саме на цьому наборі даних я навчатиму модель у цій статті: 4,4 мільйона медичних запитань із MIRIAD, кожне з яких поєднане з вихідним фрагментом, що містить відповідь (у середньому 941 токен). Такі прості пари «запит — релевантний фрагмент» — найпростіші навчальні дані для пошуку, які можна зібрати у власній предметній області, і, як ви побачите, їх достатньо.
Локальні дані
Для завантаження локальних даних у поширених файлових форматах також можна використовувати load_dataset:
from datasets import load_dataset
dataset = load_dataset("csv", data_files="my_file.csv")
dataset = load_dataset("json", data_files="my_file.json")
Якщо ж локальні дані потребують попередньої обробки, можна використати datasets.Dataset.from_dict, щоб ініціалізувати набір даних зі словника списків:
from datasets import Dataset
queries = []
documents = []
dataset = Dataset.from_dict({
"query": queries,
"document": documents,
})
Формат набору даних
Важливо, щоб формат вашого набору даних відповідав функції втрат (або щоб ви обрали функцію втрат, яка відповідає формату набору даних). Перевірка сумісності формату набору даних із функцією втрат складається з двох кроків:
- Якщо згідно з таблицею Огляд функцій втрат функція втрат потребує мітки, набір даних повинен містити стовпець із назвою «label» або «score». Цей стовпець автоматично використовується як мітка.
- Усі стовпці, названі не «label» або «score», вважаються вхідними даними згідно з таблицею Огляд функцій втрат. Кількість решти стовпців має відповідати кількості допустимих входів для обраної функції втрат. Назви цих стовпців не мають значення — важливий лише порядок.
Крім цього, для багатовекторних моделей діють дві спеціальні домовленості:
- Позиційне призначення запиту й документа: перший стовпець вбудовується як запит, а всі наступні — як документи, незалежно від назв стовпців. Це значення за замовчуванням можна перевизначити для кожного стовпця за допомогою стандартного аргументу навчання
router_mapping. - Формат дистиляції знань: один стовпець на документ-кандидат, тобто
(query, document_1, ..., document_N, scores), деscores— список із N оцінок учителя для кожного рядка. Для наборів даних KD, у яких ідентифікатори запитів і документів зберігаються окремо від наборів текстів (наприклад, lightonai/ms-marco-en-bge), можна використовуватиresolve_ids, щоб динамічно перетворювати ідентифікатори на тексти.
Функція втрат
Функції втрат кількісно оцінюють, наскільки добре модель працює на певній порції даних, даючи оптимізатору змогу оновлювати ваги моделі для отримання сприятливіших (тобто нижчих) значень втрат. Правильна функція втрат для вашого завдання залежить від наявних даних і мети. Повний список варіантів наведено в розділі Огляд функцій втрат.
Для поширеного випадку пар «запитання — відповідь» або «запитання — фрагмент» основним методом є навчання з негативними прикладами в межах порції за допомогою MultiVectorMultipleNegativesRankingLoss, де кожен інший документ у порції є негативним прикладом для кожного запиту. Більші порції означають більше негативних прикладів і потужніше навчання, тому на практиці варто використовувати її варіант GradCache — CachedMultiVectorMultipleNegativesRankingLoss, який відокремлює ефективний розмір порції від того, що вміщується у ваш GPU:
from sentence_transformers import MultiVectorEncoder
from sentence_transformers.multi_vector_encoder.losses import CachedMultiVectorMultipleNegativesRankingLoss
model = MultiVectorEncoder("lightonai/mLateOn-unsupervised", model_kwargs={"torch_dtype": "float32"})
loss = CachedMultiVectorMultipleNegativesRankingLoss(
model=model,
mini_batch_size=16,
)
Параметр mini_batch_size обмежує використання пам’яті, кодуючи документи частинами такого розміру, тоді як ефективний контрастивний розмір порції (128 у моєму запуску; в абляційних дослідженнях більші порції вже нічого не давали) залишається довільним. GradCache гарантує ідентичні результати незалежно від розміру частини, тож для менших GPU його можна зменшити ціною лише збільшення часу виконання. Якщо довжина документів сильно відрізняється, розгляньте споріднений параметр mini_batch_num_tokens, який формує кожну частину за загальним бюджетом токенів, а не кількістю документів, тому незвично довгі документи не спричинять раптового зростання використання пам’яті (моє значення mini_batch_size=16 за приблизно 940 токенів на документ відповідає mini_batch_num_tokens=15_000).
Одна специфічна для багатовекторних моделей пастка полягає в тому, що контрастивні функції втрат за замовчуванням використовують scale=1.0, на відміну від відповідного варіанта для щільних ембедингів, де за замовчуванням задано scale=20.0. Значення 20.0 потрібне тому, що косинусна подібність є одним числом у діапазоні [-1, 1], надто вузькому для різкого softmax. Натомість оцінка MaxSim підсумовує по одній найкращій подібності для кожного токена запиту, тож уже охоплює приблизно діапазон [0, query_length]: запит із 32 токенів може отримати оцінку до 32. Тому не копіюйте scale=20.0 зі скрипта навчання щільної моделі: це наситить softmax і знищить ваші градієнти.
Для дистиляції від потужнішого вчителя, яким навчають найсильніші універсальні моделі з пізньою взаємодією, див. MultiVectorDistillKLDivLoss і вкладку «Дистиляція знань» у документації Огляд навчання.
Аргументи навчання
Ви можете налаштувати процес навчання за допомогою класу MultiVectorEncoderTrainingArguments. Цей клас дає змогу змінювати параметри, які можуть впливати на швидкість навчання та допомагають зрозуміти, що відбувається під час нього.
Докладніше про найкорисніші аргументи навчання читайте в розділі Multi-Vector Encoder > Огляд навчання > Аргументи навчання. Його варто прочитати, щоб отримати максимум від навчання.
Ось приклад із фактичними значеннями з мого запуску:
from sentence_transformers import MultiVectorEncoderTrainingArguments
from sentence_transformers.base.sampler import BatchSamplers
args = MultiVectorEncoderTrainingArguments(
output_dir="models/mLateOn-medical",
num_train_epochs=1,
per_device_train_batch_size=128,
per_device_eval_batch_size=16,
learning_rate=1e-4,
warmup_steps=0.05,
prompts={"question": "[Q] ", "passage_text": "[D] "},
fp16=False,
bf16=True,
batch_sampler=BatchSamplers.NO_DUPLICATES,
eval_strategy="steps",
eval_steps=0.1,
save_strategy="steps",
save_steps=0.05,
logging_steps=0.01,
run_name="mLateOn-medical",
)
Кілька з них варто прокоментувати:
prompts: під час навчання підказки, збережені в моделі, не застосовуються автоматично, тому їх потрібно явно зіставити зі стовпцями навчання. Тут це маркер контрольної точки[Q]для стовпця запитань і[D]для стовпця фрагментів, що забезпечує узгодженість навчання з інференсом.max_length(навмисно не задано): цей аргумент обмежує токенізацію лише під час навчання, якщо ви хочете здешевити навчання порівняно з повною довжиною обслуговування моделі. Я виміряв ціну такого скорочення на цих даних. Навчання на 512 токенах знизило NDCG@10 приблизно на 0,015, але прискорило його приблизно вдвічі; дефіцит не зменшувався з додаванням даних, оскільки модель просто не бачить відкинуту частину. Не задавайте цей параметр, щоб навчання відповідало інференсу, якщо тільки прискорення не важливіше за якість.learning_rate=1e-4: після перевірки значень від 5e-6 до 2e-4 найкращі результати я отримав із цією вищою за звичайну швидкістю навчання.
Оцінювач
Щоб відстежувати ефективність моделі під час навчання, можна передати до тренера eval_dataset для обчислення втрат оцінювання, але конкретні метрики пошуку набагато інформативніші. Sentence Transformers містить такі вбудовані оцінювачі для багатовекторних моделей:
| Оцінювач | Необхідні дані |
|---|---|
MultiVectorInformationRetrievalEvaluator |
Запити, корпус і зіставлення релевантних документів |
MultiVectorNanoBEIREvaluator |
Дані не потрібні |
MultiVectorTripletEvaluator |
Трійки (якір, позитивний, негативний) |
MultiVectorRerankingEvaluator |
Список словників {'query': '...', 'positive': [...], 'negative': [...]} |
MultiVectorDistillationEvaluator |
Запити з документами-кандидатами та оцінками вчителя |
Для доменного донавчання найважливішим є MultiVectorInformationRetrievalEvaluator, побудований на ваших власних відкладених даних. Під час його створення варто врахувати, що корпус має бути достатньо складним, щоб моделі можна було розрізнити. У моєму випадку запитання MIRIAD генеруються з їхніх власних вихідних фрагментів, що робить пошук незвично простим. Якщо використовувати лише 10 тисяч еталонних фрагментів, майже кожна модель отримує NDCG@10 понад 0,97. Якщо ваше оцінювання так само насичується, додайте відволікаючі фрагменти (я використовую дедупліковані фрагменти з навчальної частини), доки оцінки не почнуть розподілятися:
Тренер
MultiVectorEncoderTrainer — це місце, де об’єднуються всі попередні компоненти. Ось повний скрипт, за допомогою якого було навчено multi-vector-encoder/mLateOn-medical, модель із вступу:
Ось увесь рецепт: контрольна точка до контрольованого навчання, мільйон доменних пар, негативні приклади в межах порції, повна довжина документа та вища за звичайну швидкість навчання. Запуск на моїй єдиній RTX 3090 тривав 14,5 години й досяг пікового використання 17,5 ГБ VRAM, а кожен із цих варіантів був переможцем виміряного порівняння, а не припущенням.
Для читачів із меншим бюджетом: мої експерименти з масштабування показали, що 100 тисяч пар (75 хвилин навчання) відстають від повного запуску на мільйон пар лише на 0,012 NDCG@10. Більша частина приросту припадає на першу годину.
Зворотні виклики
Тренер MultiVectorEncoder підтримує різні підкласи transformers.TrainerCallback, зокрема:
WandbCallbackдля журналювання метрик навчання у W&B, якщо встановленоwandbTensorBoardCallbackдля журналювання метрик навчання в TensorBoard, якщо доступнийtensorboardCodeCarbonCallbackдля відстеження викидів вуглецю під час навчання, якщо встановленоcodecarbon
Увімкнути їх можна через аргумент навчання report_to, наприклад report_to=["wandb", "codecarbon"], попередньо встановивши необхідні залежності. За замовчуванням використовується "none", а report_to="all" активує кожну інтеграцію, залежність якої встановлено.
Докладніше про ці зворотні виклики та створення власних див. у документації зі зворотних викликів Transformers.
Навчання на кількох наборах даних
Зазвичай найефективніші універсальні моделі навчаються одночасно на кількох наборах даних. Однак цей підхід може бути складним через різні формати кожного набору даних. На щастя, MultiVectorEncoderTrainer дає змогу навчатися на кількох наборах даних без уніфікації їхніх форматів. Крім того, він дозволяє застосовувати до кожного набору даних різні функції втрат. Ось кроки для одночасного навчання на кількох наборах даних:
- Використовуйте словник екземплярів
datasets.Dataset(абоdatasets.DatasetDict) якtrain_dataset(і, за бажання, такожeval_dataset). - (Необов’язково) Використовуйте словник функцій втрат, що зіставляє назви наборів даних із функціями втрат. Це потрібно лише за бажання використовувати різні функції втрат для різних наборів даних.
Кожна порція навчання або оцінювання міститиме зразки лише з одного набору даних. Порядок вибірки порцій із кількох наборів даних визначається переліком MultiDatasetBatchSamplers, який можна передати до MultiVectorEncoderTrainingArguments через multi_dataset_batch_sampler. Допустимі варіанти:
MultiDatasetBatchSamplers.ROUND_ROBIN: циклічна вибірка з кожного набору даних, доки один із них не завершиться. За цієї стратегії, імовірно, будуть використані не всі зразки кожного набору, але вибірка з кожного набору відбуватиметься однаково часто.MultiDatasetBatchSamplers.PROPORTIONAL(за замовчуванням): вибірка з кожного набору даних пропорційно до його розміру. За цієї стратегії використовуються всі зразки кожного набору, а з більших наборів вибірка відбувається частіше.
Оцінювання
Щоб визначити позицію донавченої моделі, я оцінив її на понад 50 конфігураціях моделей пошуку з чотирьох архітектурних сімейств на наборі оцінювання MIRIAD, побудованому точно так, як описано вище в розділі «Оцінювач»: 1000 відкладених медичних запитань шукали серед 200 тисяч унікальних фрагментів (10 тисяч еталонних фрагментів, прихованих серед 190 тисяч дедуплікованих відволікаючих фрагментів із навчальної частини). Цей корпус у чотири рази більший за корпус із 50 тисяч фрагментів із розділу «Яку початкову точку обрати?», тому оцінки між цими двома таблицями непорівнювані.
Головний результат із повною таблицею нижче:
| Модель | Сімейство | NDCG@10 |
|---|---|---|
| multi-vector-encoder/mLateOn-medical (моя) | Багатовекторна, донавчена | 0.9139 |
| lightonai/mLateOn | Багатовекторна, без навчання | 0.8520 |
| lightonai/GTE-ModernColBERT-v1 (обмеження знято) | Багатовекторна, без навчання | 0.8502 |
| Qwen/Qwen3-Embedding-4B | Щільна, без навчання | 0.7817 |
| voyageai/voyage-4-nano | Щільна, без навчання | 0.7563 |
| BM25 | Лексична | 0.7501 |
| naver/splade-v3 | Розріджена, без навчання | 0.6853 |
Донавчена модель очолила таблицю, випередивши найсильнішу модель без навчання будь-якої архітектури на +0,062 NDCG@10. Інакше кажучи, найсильніша модель без навчання повертає правильний фрагмент першим результатом для 75,8% запитів, тоді як донавчена модель — для 84,9%, скорочуючи помилку першого рангу більш ніж на третину.
Архітектурна закономірність так само очевидна: верхівку таблиці повністю займають моделі з пізньою взаємодією. На довгих документах один вектор на токен перевершує один вектор на документ навіть за однакових навчальних даних і однакових базових моделей. DenseOn і LateOn мають однакові навчальні дані та архітектуру, за винятком голови, і споріднена модель із пізньою взаємодією перемагає з перевагою +0,12; мультимовна пара (mDenseOn і mLateOn) повторює це з перевагою +0,13. Масштаб також не рятує одновекторні моделі. Qwen3-Embedding-4B, найсильніша щільна модель із приблизно у 33 рази більшою кількістю активних (неембедингів) параметрів, усе одно відстає на 0,13, а версія 8B отримує нижчу оцінку, ніж 4B.
BM25 також працює напрочуд добре: він перевершує всі розріджені моделі, усі багатовекторні моделі з обмеженням довжини та всі щільні моделі, крім трьох: багатомільярдних Qwen3-Embedding-4B і 8B, а також
Перекладено автоматично з англійської. Оригінал статті — за посиланням нижче.Ще новини

