Підготовка до співбесіди з мультимодального машинного навчання

Питання для співбесіди на позицію інженера з мультимодального машинного навчання

15 вибраних питань для співбесіди з мультимодального машинного навчання, згрупованих за рівнем досвіду. Використовуйте їх для повторення основ, практичних компромісів та міркувань щодо виробничих рішень для Senior-рівня.

Розпочати ШІ-співбесіду з мультимодального машинного навчанняКредитна картка не потрібна. Доступна 1 безкоштовна сесія.
Практика технічних співбесід англійськоюРежим для тих, для кого англійська не є рідною, щоб тренувати технічні співбесіди.

Питання для Junior

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

Основна ідея контрастного навчання для представлення зображень і тексту полягає в проектуванні вхідних даних зображень і тексту в спільний латентний векторний простір таким чином, щоб семантично відповідні (позитивні) пари притягувалися ближче одна до одної, тоді як невідповідні (негативні) пари відштовхувалися далі. Шляхом навчання окремих візуальних та текстових кодерів з використанням цілей схожості (наприклад, косинусної схожості), модель вирівнює семантику безперервних візуальних пікселів з дискретними текстовими токенами. Спільний простір вбудовування корисний, оскільки він дозволяє вирішувати мультимодальні завдання безпосередньо через пошук за схожістю векторів. У цьому уніфікованому просторі крос-модальний пошук (знаходження зображень за текстовими запитами або навпаки) та класифікація з нульовим пострілом (оцінка вбудовування зображення відносно вбудовувань запитів, таких як "фотографія собаки") стають простими, високоефективними пошуками найближчих сусідів або скалярним добутком без необхідності використання специфічних для завдання класифікаторів.

import torch
import torch.nn.functional as F

# image_features: [B, D], text_features: [B, D]
image_norm = F.normalize(image_features, dim=-1)
text_norm = F.normalize(text_features, dim=-1)

# Pairwise cosine similarity matrix: [B, B]
sim_matrix = image_norm @ text_norm.T
# Positive pairs lie on the diagonal; off-diagonals are negatives
Відповісти на це запитання з ШІ-тренером

2Поясніть архітектуру двоканального кодера (dual-encoder) у стилі CLIP та припущення, які вона робить щодо взаємодії зображення-текст.

Архітектура двоканального кодера в стилі CLIP складається з двох окремих, незалежних нейронних мереж: візуального кодера (наприклад, Vision Transformer або ResNet), який обробляє зображення в вектори візуальних ознак, і текстового кодера (наприклад, Transformer), який обробляє текст в вектори текстових ознак. Обидва представлення проектуються в спільну розмірність вбудовування, де узгодженість вимірюється за допомогою простої метрики подібності (наприклад, нормалізованої косинусної подібності або скалярного добутку). Фундаментальне архітектурне припущення – це пізнє злиття (або факторизована крос-модальна взаємодія): візуальні та текстові модальності не взаємодіють на проміжних шарах через крос-увагу або взаємодії на рівні токенів. Натомість, передбачається, що повна семантика кожної модальності стискається в єдину щільну векторну суму, а крос-модальна взаємодія повністю розкладається на скалярний добуток. Цей компроміс пріоритизує надзвичайну ефективність пошуку (дозволяючи офлайн-попередню обробку вбудовувань зображень для векторного пошуку в масштабах мільярдів) над детальним крос-модальним міркуванням (таким як прив'язка токенів до регіонів або складні композиційні просторові зв'язки).

import torch
import torch.nn as nn
import torch.nn.functional as F

class CLIPDualEncoder(nn.Module):
    def __init__(self, visual_encoder, text_encoder, img_dim, txt_dim, embed_dim):
        super().__init__()
        self.visual_encoder = visual_encoder
        self.text_encoder = text_encoder
        self.img_proj = nn.Linear(img_dim, embed_dim, bias=False)
        self.txt_proj = nn.Linear(txt_dim, embed_dim, bias=False)
        self.logit_scale = nn.Parameter(torch.ones([]) * 2.659)

    def forward(self, images, text_tokens):
        # Independent uncoupled encoding
        v_feat = self.img_proj(self.visual_encoder(images))
        t_feat = self.txt_proj(self.text_encoder(text_tokens))
        # L2 normalize
        v_norm = F.normalize(v_feat, p=2, dim=-1)
        t_norm = F.normalize(t_feat, p=2, dim=-1)
        # Late interaction via dot product
        return torch.matmul(v_norm, t_norm.T) * self.logit_scale.exp()
Відповісти на це запитання з ШІ-тренером

3Опишіть інтуїцію, що стоїть за проєктуванням ознак зображень та тексту в спільний нормалізований простір та оптимізацією косинусної подібності.

Проєктування ознак зображень та тексту в спільний нормалізований простір (зазвичай на одиничній гіперсфері за допомогою L2-нормалізації) та оптимізація косинусної подібності відокремлює семантичний напрямок вбудовування від його величини вектора. Без нормалізації, необмежений скалярний добуток дозволяє моделі мінімізувати втрати при навчанні, тривіально збільшуючи норми ознак для легких або частих зразків, замість того, щоб вирівнювати їхні семантичні напрямки. Нормалізація векторів на одиничній гіперсфері обмежує значення подібності строго в межах [-1, 1], забезпечуючи, що відстань відповідає суто кутовому розділенню. Це стабілізує градієнти оптимізації, запобігає вибуху або колапсу представлення та гарантує, що кожен зразок у пакеті рівномірно впливає на втрати, незалежно від розбіжностей у масштабі, характерних для модальностей. У поєднанні з параметром температури, що навчається, це контролює гостроту розподілу ймовірностей над гіперсферою, щоб збалансувати вирівнювання істинних пар з рівномірним розсіюванням негативних пар.

import torch
import torch.nn.functional as F

# Unnormalized embeddings with extreme norm differences
v = torch.tensor([[10.0, 0.0], [0.1, 0.0]])
t = torch.tensor([[5.0, 0.0], [0.1, 0.0]])

# Raw dot products: heavily distorted by magnitude (50.0 vs 0.01)
raw_dot = v @ t.T

# L2 Normalized:
v_norm = F.normalize(v, p=2, dim=-1)
t_norm = F.normalize(t, p=2, dim=-1)
cosine_sim = v_norm @ t_norm.T
print('Cosine similarity matrix:\n', cosine_sim)
Відповісти на це запитання з ШІ-тренером

4Поясніть візуальне заземлення та розуміння референсних виразів як локалізацію, обумовлену мовою, та чим вони відрізняються від подібності на рівні зображення.

Візуальне заземлення (Visual grounding) (часто реалізоване як розуміння референсних виразів (Referring Expression Comprehension, або REC)) — це завдання локалізації конкретної візуальної області, обмежувальної рамки (bounding box) або маски сегментації в зображенні на основі референсного виразу природною мовою (наприклад, «чоловік у синій куртці біля лампи»). Воно розглядає локалізацію як обумовлену мовою, вимагаючи від моделі розв'язувати лінгвістичні просторові відносини, атрибути та ідентичності об'єктів аж до піксельних або просторових координат. Це принципово відрізняється від подібності на рівні зображення (image-level similarity), яка обчислює єдиний цілісний показник семантичної спорідненості між усім зображенням та текстовим рядком (наприклад, визначення того, чи відповідає зображення підпису «чоловік у парку»). Подібність на рівні зображення не виробляє просторових координат, може знаходити відповідності в зображеннях, де об'єкт, на який посилаються, не локалізований однозначно, і часто не справляється з детальним розрізненням посилань між кількома схожими об'єктами в одній сцені.

# Image-level similarity:
# Input: Image I, Text T ("black dog sitting on the left")
# Output: scalar score s in [0, 1] or dot product
similarity_score = image_text_model(image, text)

# Referring Expression Comprehension (Visual Grounding):
# Input: Image I, Text T ("black dog sitting on the left")
# Output: Bounding box coordinates [x_min, y_min, x_max, y_max]
bbox = grounding_model.predict_box(image, text)
Відповісти на це запитання з ШІ-тренером

5Поясніть крос-увагу як механізм злиття між візуальними токенами та текстовими токенами в мультимодальних трансформерах.

У мультимодальних трансформерах крос-увага (cross-attention) діє як асиметричний механізм злиття, де одна модальність спрямовує запити (Q) для звернення до ключів (K) та значень (V), витягнутих з іншої модальності. Наприклад, коли візуальні токени виступають як запити, а текстові токени — як ключі та значення, кожен візуальний токен обчислює зважену суму уваги над текстовими представленнями, динамічно обумовлюючи візуальні ознаки текстовим контекстом (і навпаки, коли текст запитує візуальні токени). Математично, маючи візуальну послідовність X_v та текстову послідовність X_t, крос-увага обчислює: CrossAttention(Q_v, K_t, V_t) = softmax((Q_v * K_t^T) / sqrt(d)) * V_t, де Q_v = X_v * W_Q, K_t = X_t * W_K, а V_t = X_t * W_V. Цей механізм дозволяє моделі виконувати деталізоване семантичне вирівнювання між токенами різних модальностей, незалежно від відмінностей у довжинах послідовностей або початкових просторах ознак. Двонаправлене злиття може бути досягнуто за допомогою двох симетричних шарів крос-уваги (наприклад, від візуального до мовного та від мовного до візуального) або шляхом чергування блоків крос-уваги.

import torch
import torch.nn as nn

class MultimodalCrossAttention(nn.Module):
    def __init__(self, d_model, n_heads):
        super().__init__()
        self.mha = nn.MultiheadAttention(embed_dim=d_model, num_heads=n_heads, batch_first=True)
        self.norm = nn.LayerNorm(d_model)

    def forward(self, visual_query_tokens, text_kv_tokens):
        # visual_query_tokens: [B, N_v, D], text_kv_tokens: [B, N_t, D]
        attn_out, _ = self.mha(
            query=visual_query_tokens, 
            key=text_kv_tokens, 
            value=text_kv_tokens
        )
        # Residual connection and normalization
        output = self.norm(visual_query_tokens + attn_out)
        return output
Відповісти на це запитання з ШІ-тренером

6Поясніть, як аугментації зображень, такі як обрізка (cropping), зміна кольору (color jitter) та стиснення, можуть допомогти або зашкодити контрастному вирівнюванню зображень та тексту.

У мультимодальному контрастному навчанні (наприклад, CLIP) аугментації зображень слугують іншій меті, ніж в унімодальному самокерованому навчанні (наприклад, SimCLR). Оскільки зображення порівнюються з парними текстовими підписами, а не з іншим доповненим виглядом того ж зображення, аугментації можуть як приносити користь, так і погіршувати навчання представлень. **Як аугментації допомагають:** 1. **Запобігання швидкому навчанню:** Помірні аугментації (такі як випадкова обрізка, помірні горизонтальні віддзеркалення та помірна зміна кольору) запобігають залежності візуального кодера від тривіальних низькорівневих візуальних артефактів (наприклад, розподілу кольорів фону, кутових водяних знаків або просторових упереджень позиції). 2. **Інваріантність до точки огляду та масштабу:** Помірне масштабування та обрізка заохочують модель ідентифікувати семантичні об'єкти за різних фокусних відстаней та перспектив, забезпечуючи надійну узагальненість без попереднього навчання на конкретних класах (zero-shot generalization). **Як аугментації можуть зашкодити (семантична невідповідність):** 1. **Агресивна випадкова обрізка:** Якщо підпис описує конкретний об'єкт ("птах сидить на гілці"), а агресивна обрізка повністю видаляє птаха, частина зображення, що залишилася (лише листя/небо), все одно примусово вирівнюється з підписом про птаха. Це створює хибний шум нагляду та знижує точність пошуку. 2. **Сильне зміна кольору (color jittering) / інверсія відтінку:** Багато підписів явно описують колірні атрибути ("жовте таксі", "червоне яблуко"). Сильні зміни кольору перетворюють таксі на синє або яблуко на зелене, викликаючи пряму семантичну суперечність між візуальним входом та текстовим підписом. 3. **Сильне розмиття та стиснення:** Агресивне просторове зменшення дискретизації, стиснення JPEG (Joint Photographic Experts Group) або розмиття за Гауссом руйнують дрібнозернисті текстові підказки (текст OCR (оптичного розпізнавання символів) на знаках, логотипах, тонких текстурах), які явно описані в парних підписах. **Практичне правило:** Мультимодальне контрастне навчання вимагає значно консервативніших аугментацій (наприклад, `Random Resized Crop` з діапазоном масштабу [0.5, 1.0] та помірним віддзеркаленням), ніж унімодальне самокероване навчання.

from torchvision import transforms

# Multimodal contrastive transform: conservative to preserve caption semantics
clip_transforms = transforms.Compose([
    transforms.RandomResizedCrop(224, scale=(0.5, 1.0)),  # Conservative crop avoids dropping described entities
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.481, 0.457, 0.408], std=[0.268, 0.261, 0.275])
])

# Unimodal self-supervised transform: aggressive, risks breaking image-text alignment
simclr_heavy_transforms = transforms.Compose([
    transforms.RandomResizedCrop(224, scale=(0.08, 1.0)), # Extreme crop can remove captioned subjects
    transforms.RandomApply([transforms.ColorJitter(0.8, 0.8, 0.8, 0.2)], p=0.8), # Alters color adjectives
    transforms.RandomGrayscale(p=0.2),
    transforms.GaussianBlur(kernel_size=23, sigma=(0.1, 2.0)), # Destroys fine OCR/textures
    transforms.ToTensor()
])
Відповісти на це запитання з ШІ-тренером

7Поясніть пошук зображення-текст як задачу та різницю між зіставленням з фіксованим набором (closed-set matching) та пошуком у відкритому світі (open-world retrieval) на великих корпусах.

Пошук зображення-текст – це задача знаходження відповідних даних між модальностями за запитом в одній модальності (текст до зображення або зображення до тексту), що зазвичай досягається шляхом відображення як зображень, так і текстів у спільний простір представлень, де схожість корелює з релевантністю. Зіставлення з фіксованим набором (closed-set matching) передбачає фіксований, заздалегідь визначений пул кандидатів з відомими еталонними парами (такими як стандартні бенчмарки Flickr30k або MS-COCO), що дозволяє вичерпне обчислення попарної схожості або перехресну увагу «всі до всіх». Пошук у відкритому світі (open-world retrieval) працює з масивними, динамічними, некурованими корпусами (наприклад, від мільйонів до мільярдів веб- або каталожних елементів), де пули кандидатів необмежені, поширені дистрактори та хибні негативи, і потрібні масштабовані індекси наближеного пошуку найближчих сусідів (ANN - Approximate Nearest Neighbor) (наприклад, Faiss, HNSW), оскільки вичерпна перехресна увага до всіх пар є обчислювально нездійсненною.

import torch
import torch.nn.functional as F

# Closed-set matching: full pairwise similarity matrix over fixed evaluation set
image_embeds = F.normalize(torch.randn(1000, 512), dim=-1)
text_embeds = F.normalize(torch.randn(1000, 512), dim=-1)
sim_matrix = torch.matmul(text_embeds, image_embeds.T)  # (1000, 1000)

# Open-world retrieval: query vector queried against an indexed corpus using ANN
# index = faiss.IndexHNSWFlat(512, 32)
# distances, indices = index.search(query_embed, k=10)
Відповісти на це запитання з ШІ-тренером

Питання для Middle

8Порівняйте контрастивні втрати в стилі InfoNCE (Noise-Contrastive Estimation) з використанням softmax та попарні сигмоїдні втрати для навчання вбудовувань зображення-текст.

Контрастивні втрати в стилі InfoNCE (такі як у CLIP) розглядають вирівнювання як задачу багатокласової класифікації. Для кожного зразка обчислюється розподіл softmax для всіх кандидатних негативних пар у батчі, нормалізуючи схожості по всьому пулу батчу. На противагу цьому, попарні сигмоїдні контрастивні втрати (такі як у SigLIP) розглядають кожний запис у матриці схожості зображення-текст як незалежне завдання бінарної класифікації, застосовуючи сигмоїдну функцію та втрати бінарної крос-ентропії для кожної пари (позитивні пари мають ціль +1, негативні пари мають ціль -1). Ключові відмінності полягають у наступному: 1. **Зв'язування проти Розв'язування:** InfoNCE зв'язує всі негативи через знаменник глобального розділення softmax, викликаючи конкуренцію, де найскладніші негативи домінують над градієнтами. SigLIP розв'язує всі пари, оцінюючи кожну незалежно. 2. **Розподілена Масштабованість та Ефективність:** InfoNCE вимагає збору матриць схожості з різних GPU (Graphics Processing Unit) для глобальної нормалізації (вузьке місце комунікації all-gather). Незалежні попарні втрати SigLIP можуть обчислюватися локально без глобальної крос-GPU нормалізації softmax, покращуючи ефективність масштабування та залишаючись стабільними як при малих, так і при дуже великих розмірах батчів.

import torch
import torch.nn.functional as F

def siglip_loss(sim_matrix, temperature, bias):
    # sim_matrix: [B, B] dot product of normalized embeddings
    # targets: 1 on diagonal (positive), -1 on off-diagonals (negative)
    B = sim_matrix.size(0)
    targets = 2 * torch.eye(B, device=sim_matrix.device) - 1.0
    logits = sim_matrix * temperature + bias
    # Pairwise binary cross entropy with log-sigmoid
    return -torch.mean(F.logsigmoid(targets * logits))
Відповісти на це запитання з ШІ-тренером

9Поясніть, як «жорсткі негативи» (hard negatives) та «хибні негативи» (false negatives) впливають на контрастне навчання «зображення-текст».

«Жорсткі негативи» (hard negatives) та «хибні негативи» (false negatives) мають протилежні ефекти на контрастне навчання «зображення-текст»: 1. **Жорсткі негативи** — це невідповідні пари, які семантично або візуально дуже близькі до якоря (наприклад, зображення сибірського хаскі в парі з підписом «аляскинський маламут»). Жорсткі негативи забезпечують потужні, інформативні градієнтні сигнали. Вони змушують модель дивитися за межі грубих категоріальних ознак і вивчати тонкощі візуально-лінгвістичних деталей та чіткі межі рішень. 2. **Хибні негативи** виникають, коли випадково вибрані «негативні» пари в батчі насправді є дійсними семантичними відповідностями (наприклад, дві різні фотографії золотистих ретриверів, де одна пара виступає як негатив проти «милого золотистого ретривера в парку»). Хибні негативи штрафують правильні семантичні відповідності, змушуючи модель відштовхувати дійсні репрезентації відповідностей. Це спотворює градієнти, погіршує якість представлення та пригнічує легітимну синонімію та візуальну варіативність. Стратегії пом'якшення для хибних негативів включають: об'єктиви контрастного навчання з м'яким/згладжуючим маркуванням (soft/label-smoothing contrastive objectives), дебіасоване контрастне навчання (debiased contrastive learning), дедуплікацію наборів даних та узгодження з кількома позитивами (multi-positive matching).

import torch
import torch.nn.functional as F

# Image 0 and Image 1 both depict 'a red sports car'
# Text 0: 'a red sports car', Text 1: 'a fast red car'
# In standard InfoNCE, Text 1 is treated as a negative for Image 0.
sim = torch.tensor([[0.95, 0.90],   # Image 0 similarities
                    [0.88, 0.94]])  # Image 1 similarities

loss_img0 = -F.log_softmax(sim / 0.07, dim=-1)[0, 0]
print(f'InfoNCE loss for Image 0: {loss_img0.item():.4f}')
# High similarity to false negative Text 1 (0.90) heavily penalizes the model
Відповісти на це запитання з ШІ-тренером

10Порівняйте глобальне вирівнювання зображення-тексту з вирівнюванням на рівні регіон-слово або токенів.

Глобальне вирівнювання зображення-тексту відображає ціле зображення та всю текстову послідовність в єдині цілісні вектори вбудовування (наприклад, за допомогою об'єднаних ознак у CLIP) і вирівнює їх, використовуючи контрастивну ціль, як-от InfoNCE. Це забезпечує відмінні властивості масштабування, швидкі індексовані подання для пошуку та сильну семантичну кластеризацію. Однак воно страждає від грубої просторової деталізації, має труднощі з дрібними візуальними деталями, композиційністю, підрахунком та просторовими зв'язками, а також часто демонструє проблеми з прив'язкою атрибутів. Натомість, вирівнювання на рівні регіон-слово або токенів працює з дрібнозернистою деталізацією підзображень (наприклад, токени-патчі, ознаки обмежувальних рамок об'єктів) та підречень (наприклад, токени слів або підслів). Методи, такі як FILIP, GLIP або VinVL, вирівнюють токени за допомогою дрібнозернистих контрастивних втрат (таких як максимальна схожість між токенами або схожість Чемфера) або оптимального транспортування / вирівнювання за допомогою перехресної уваги. Це явно зберігає просторові та лінгвістичні композиційні деталі, дозволяючи виявлення об'єктів, візуальну прив'язку та точну прив'язку атрибутів, але ціною вищої обчислювальної та пам'ятної складності, більшої затримки висновку та більш зашумлених сигналів вирівнювання.

import torch
import torch.nn.functional as F

# visual_tokens: [B, N_v, D], text_tokens: [B, N_t, D]
def token_level_maxsim_similarity(visual_tokens, text_tokens):
    v_norm = F.normalize(visual_tokens, dim=-1)
    t_norm = F.normalize(text_tokens, dim=-1)
    # Compute similarity matrix between all visual and text tokens: [B, N_t, N_v]
    sim_matrix = torch.bmm(t_norm, v_norm.transpose(1, 2))
    # Text-to-image: For each word token, find maximum visual token similarity and average
    t2i_sim = sim_matrix.max(dim=-1).values.mean(dim=-1) # [B]
    return t2i_sim
Відповісти на це запитання з ШІ-тренером

11Порівняйте раннє злиття (early fusion), пізнє злиття (late fusion), проміжне злиття (intermediate fusion), злиття на основі крос-уваги (cross-attention fusion), шлюзоване злиття (gated fusion) та конкатенацію для мультимодальних моделей.

Стратегії мультимодального злиття інтегрують візуальні та мовні сигнали на різних рівнях глибини та структурних конфігурацій: 1. **Раннє злиття (Early Fusion)**: Сирі або низькорівневі ознаки (наприклад, вбудовування фрагментів зображення та вбудовування токенів слів) об'єднуються на етапі вхідних даних і подаються до єдиної спільної основної мережі (backbone). Це дозволяє глибоку крос-модальну взаємодію з нульового шару, але є обчислювально дорогим і ускладнює повторне використання попередньо навчених унімодальних моделей. 2. **Пізнє злиття (Late Fusion)**: Модальності обробляються незалежно глибокими унімодальними основними мережами в глобальні вектори представлення, які об'єднуються лише на самому кінці за допомогою простої агрегації (наприклад, скалярного добутку, косинусної подібності або неглибокого багатошарового перцептрону (MLP)). Це надзвичайно ефективно та ідеально підходить для індексованого пошуку, але не може захопити тонкозернисті крос-модальні взаємодії. 3. **Проміжне злиття (Intermediate Fusion)**: Унімодальні основні мережі обробляють вхідні дані протягом кількох шарів, а злиття відбувається на проміжних етапах через спільні шари або бічні з'єднання, що забезпечує баланс між унімодальною спеціалізацією та мультимодальною взаємодією. 4. **Злиття на основі крос-уваги (Cross-Attention Fusion)**: Використовує механізм багатошарової уваги (multi-head attention), де одна модальність надає запити (queries), а інша – ключі (keys) та значення (values). Це забезпечує високу репрезентативну здатність із кондиціонуванням від токена до токена, враховуючи гетерогенні довжини послідовностей. 5. **Шлюзоване злиття (Gated Fusion)**: Використовує навчені шлюзові механізми (наприклад, сигмоїдні або тангенс-гіперболічні шлюзи) для динамічного зважування внеску кожної модальності або шару злиття на основі контекстуальної впевненості, запобігаючи домінуванню однієї модальності або пошкодженню попередньо навчених ваг. 6. **Конкатенація (Concatenation)**: Об'єднує вектори ознак або послідовності токенів вздовж виміру ознак (конкатенація ознак) або виміру довжини послідовності (конкатенація токенів перед уніфікованим трансформером). Це просто і непараметрично, але конкатенація ознак вимагає вирівняних просторових/часових вимірів, тоді як конкатенація токенів масштабується квадратично відносно загальної довжини послідовності в само-увазі (self-attention).

import torch
import torch.nn as nn
import torch.nn.functional as F

# 1. Concatenation along feature dimension
z_concat = torch.cat([img_feat, txt_feat], dim=-1) # [B, D_img + D_txt]

# 2. Gated Fusion
gate = torch.sigmoid(gate_layer(z_concat)) # [B, D]
z_gated = gate * img_proj + (1 - gate) * txt_proj

# 3. Late Fusion (Score level)
similarity = torch.sum(F.normalize(img_feat, dim=-1) * F.normalize(txt_feat, dim=-1), dim=-1)
Відповісти на це запитання з ШІ-тренером

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

Двокодерні моделі для пошуку (dual-encoder retrieval models) та переранжувальники на основі крос-кодерів (cross-encoder rerankers) представляють дві різні парадигми для зіставлення зображень і тексту, пропонуючи фундаментальні компроміси між спроможністю взаємодії, точністю та затримкою: 1. Спроможність взаємодії: – Двокодери (наприклад, CLIP): Обробляють зображення та текст через окремі, роз'єднані архітектури (backbones). Мультимодальна взаємодія є строго пізньою та неглибокою, обмеженою одним скалярним добутком або косинусною подібністю між глобально згрупованими векторами. Їм бракує міжмодальних взаємодій на рівні токенів. – Крос-кодери (наприклад, UNITER, ViLT, ALBEF multimodal branch): Конкатенація візуальних і текстових токенів у спільний трансформер або використання шарів перехресної уваги (cross-attention). Кожен візуальний токен може взаємодіяти з кожним текстовим токеном через кілька шарів, забезпечуючи глибоке міжмодальне обґрунтування. 2. Точність: – Двокодери досягають нижчої точності для складних композиційних запитів, просторових відношень, заперечень та зіставлення дрібнозернистих атрибутів через вузьке місце одновекторних представлень. – Крос-кодери досягають значно вищої точності для складних, дрібнозернистих та композиційних завдань зіставлення зображень і тексту. 3. Затримка та масштабованість: – Двокодери дозволяють попередньо обчислювати та індексувати вбудовані представлення зображень (image embeddings) офлайн у векторній базі даних (наприклад, Milvus, FAISS). Під час висновку (inference) кодується лише текстовий запит, а пошук серед мільйонів кандидатів вимагає лише легких скалярних добутків наближених найближчих сусідів (ANN) (затримка менше мілісекунди). – Крос-кодери вимагають запуску повної об'єднаної нейронної мережі для кожної пари кандидатів (зображення, текст) під час запиту (O(N) прямих проходів для N кандидатів), що призводить до на порядки вищої затримки та робить їх обчислювально заборонними для пошуку на першому етапі у великих корпусах. У практичних виробничих системах стандартним є двостадійний конвеєр: двокодер отримує K найкращих кандидатів (наприклад, K=100) з низькою затримкою, після чого крос-кодер переранжує їх для високої точності.

# Stage 1: Dual-Encoder First-Stage Retrieval (Fast, Vector Index)
query_emb = text_encoder(query_text) # [1, D]
# Cosine similarity over pre-indexed image embeddings [N, D]
scores = query_emb @ precomputed_image_embeddings.T # [1, N]
top_k_indices = torch.topk(scores, k=100).indices[0]

# Stage 2: Cross-Encoder Reranker (Accurate, Token Interaction)
candidate_images = [load_image(idx) for idx in top_k_indices]
rerank_scores = cross_encoder(candidate_images, [query_text] * 100) # Full cross-attention
final_ranking = top_k_indices[torch.argsort(rerank_scores, descending=True)]
Відповісти на це запитання з ШІ-тренером

Питання для Senior

13Розробіть мультимодальну RAG (Retrieval Augmented Generation) систему для PDF-файлів або посібників, що містять текст, таблиці, діаграми, скріншоти, схеми та вбудовані зображення.

Наскрізна мультимодальна RAG (Retrieval Augmented Generation) система для складних візуальних документів (PDF-файлів, посібників, звітів) охоплює чотири основні архітектурні етапи: 1. **Прийом даних та парсинг з урахуванням макета.** Сторінки PDF обробляються за допомогою моделей документів, що враховують макет (наприклад, LayoutLM, DocTR) або конвеєрів візуального парсингу, щоб сегментувати вміст на структуровані блоки: текстові уривки, структуровані таблиці (перетворені на HTML/Markdown з об'єднаними комірками), відрендерені зображення діаграм з рядами даних та окремі схеми або скріншоти з просторовими обмежувальними рамками. 2. **Мультимодальне індексування та подвійне представлення.** - **Візуальні активи** (діаграми, скріншоти, схеми): Зберігаються як обрізані зображення зі щільними мультимодальними вбудовуваннями (наприклад, SigLIP, CLIP або візуальні патч-токени ColPali) разом із синтетичними текстовими резюме та текстом OCR, згенерованим VLM (візуальною мовною моделлю), що зберігається у щільному текстовому індексі. - **Таблиці**: Зберігаються як структурований Markdown/HTML у текстових векторних та BM25 індексах. - **Текст**: Розбитий на фрагменти за семантичними розділами та індексується за допомогою щільних вбудовувань та розріджених ключових слів. 3. **Гібридний пошук та мультимодальне переранжування.** - **Пошук першого етапу**: Виконує паралельний пошук за розрідженими BM25 (ключові слова, текст OCR, розмітка таблиць), щільними текстовими векторами та індексами візуальних вбудовувань (пошук ANN — Approximate Nearest Neighbor). - **Злиття та переранжування**: Об'єднує кандидатів (наприклад, за допомогою Reciprocal Rank Fusion) та оцінює найкращі елементи за допомогою мультимодального крос-кодера або візуальної моделі пізньої взаємодії (оцінюючи текст запиту за обрізаними зображеннями високої роздільної здатності та розпарсеним текстом). 4. **Формування мультимодального контексту та обґрунтована генерація.** Найкращий $k$ мультимодальний контекст — відрендерені фрагменти зображень, схеми таблиць та текстові уривки з метаданими документа/сторінки — передається VLM, налаштованій за інструкціями (наприклад, GPT-4o, Claude 3.5 Sonnet або open-source Qwen2-VL). Підказка генерації забезпечує походження джерела, вимагаючи явних посилань (номери сторінок, номери малюнків або обмежувальні рамки).

from dataclasses import dataclass
from typing import Optional, List

@dataclass
class MultimodalChunk:
    chunk_id: str
    document_id: str
    page_number: int
    modality_type: str  # 'text', 'table', 'chart', 'diagram'
    text_payload: str   # Raw text or structured Markdown/HTML
    vlm_caption: Optional[str] = None  # Synthetic summary of visual content
    bbox: Optional[List[float]] = None  # [x0, y0, x1, y1]
    image_crop_path: Optional[str] = None
    dense_embedding: Optional[List[float]] = None

# Indexing strategy: Text search covers text_payload + vlm_caption;
# Multimodal search matches dense_embedding or visual tokens.
Відповісти на це запитання з ШІ-тренером

14Поясніть, як оцінка мультимодальної RAG (Retrieval-Augmented Generation) повинна окремо вимірювати якість пошуку, використання доказів, походження та вірність остаточної відповіді.

Оцінка мультимодальної RAG (Retrieval-Augmented Generation) вимагає декомпозиції системи на чотири роз'єднані виміри оцінки, щоб точно визначити, чи походять помилки з пошуку, споживання контексту, точності посилань чи генерації: 1. **Якість пошуку:** оцінює, чи ідентифікує модуль пошуку необхідні візуальні та текстові фрагменти. Ключові метрики включають мультимодальний Recall@K, NDCG@K та MRR. Для візуальних елементів це також включає Візуальний IoU (Intersection over Union) / Точність пошуку обмежувальних рамок (чи містить обрізане зображення відповідну діаграму/графік) та Баланс точності пошуку за модальностями (забезпечення того, щоб нетекстові модальності, такі як таблиці та графіки, не пропускалися систематично). 2. **Використання доказів (достатність і необхідність):** вимірює, чи модель генерації справді покладається на отримані мультимодальні докази, а не генерує відповіді виключно з параметричної пам'яті. Це вимірюється за допомогою Релевантності контексту (точність отриманих візуальних/текстових токенів, що підтримують питання), Необхідності доказів / Абляційного тестування (маскування або видалення отриманої діаграми/таблиці для перевірки, чи не призведе це до помилки у відповіді) та аналізу атрибуції перехресної уваги. 3. **Походження та точність посилань:** вимірює, чи є атрибуції джерел точними та перевіряються. Оцінюється за допомогою Точності (Precision), Повноти (Recall) та F1-міри для посилань (назви документів, номери сторінок, ідентифікатори малюнків або координати обмежувальних рамок). Автоматичні перевірки підтверджують, що вказана обмежувальна рамка або сторінка справді містить еталонні докази, необхідні для відповіді на питання. 4. **Вірність та коректність остаточної відповіді:** * **Вірність / Обґрунтованість:** оцінює, чи кожне згенероване твердження випливає з отриманого мультимодального контексту без галюцинацій (зазвичай оцінюється за допомогою VLM (візуальної мовної моделі) як судді, що перевіряє виведення твердження щодо тексту та візуальних фрагментів). * **Фактична коректність:** оцінює, чи згенерована відповідь відповідає еталонним даним. * **Стійкість до відмов:** перевіряє, чи модель правильно відмовляється відповідати, коли отриманий контекст є нерелевантним або суперечливим.

# Evaluation record schema for a single Multimodal RAG query:
eval_record = {
    'retrieval_quality': {
        'hit_at_k': True,          # Top-3 chunks contain target diagram
        'visual_bbox_iou': 0.85    # Retrieved crop overlap with true figure region
    },
    'evidence_utilization': {
        'necessity_ablation_passed': True  # Removing chart causes answer to fail
    },
    'provenance': {
        'page_match': True,        # Cited Page 12 (Ground Truth Page 12)
        'figure_id_match': True    # Cited 'Figure 4'
    },
    'faithfulness': {
        'claim_entailment_score': 1.0,  # All claims entailed by context
        'hallucination_detected': False
    }
}
all_passed = all(all(metrics.values()) for metrics in eval_record.values())
print(f'System passes all decoupled checks: {all_passed}')
Відповісти на це запитання з ШІ-тренером

15Обґрунтуйте оновлення виробничих мультимодальних моделей пошуку, коли вбудовані вектори галереї та індекси повинні оновлюватися у великих масштабах.

Оновлення мультимодальної системи пошуку у великих масштабах представляє проблему зсуву представлення (representation drift): новостворені вбудовані вектори знаходяться в іншому геометричному латентному просторі і не можуть порівнюватися безпосередньо з існуючими вбудованими векторами галереї без значного погіршення повноти пошуку (recall). Отже, оновлення без простоїв вимагають або розгортання за схемою blue/green з подвійним індексом, або навчання сумісності (таке як зворотно сумісне навчання або адаптери трансформації), або поетапних конвеєрів переіндексації. У стандартному робочому процесі переіндексації blue/green офлайн пакетні завдання обчислюють нові вбудовані вектори для всієї галереї та створюють новий векторний індекс (наприклад, HNSW або IVF). Поки відбувається переіндексація, живий пошуковий трафік продовжує запитувати активний застарілий індекс. Нові вхідні елементи обробляються за допомогою подвійного запису або потокових журналів захоплення змінених даних (CDC), щоб обидва індекси залишалися актуальними. Після того, як новий індекс перевіряється за допомогою тіньового трафіку та розігрівається в пам'яті, трафік атомарно перемикається на новий кодер та індекс, після чого старий індекс виводиться з експлуатації. Альтернативно, зворотно сумісне навчання обмежує новий кодер запитів для узгодження з простором застарілої галереї, дозволяючи негайні оновлення моделі запитів, асинхронно заповнюючи галерею з часом.

class MultimodalRetrievalRouter:
    def __init__(self, v1_service, v2_service, dual_write=True):
        self.v1 = v1_service  # Model v1 + Index v1
        self.v2 = v2_service  # Model v2 + Index v2
        self.active_version = "v1"
        self.dual_write = dual_write

    def search(self, query_multimodal):
        # Route query strictly to the encoder matching the active index
        if self.active_version == "v1":
            return self.v1.search(query_multimodal)
        return self.v2.search(query_multimodal)

    def ingest_new_item(self, item):
        # Dual-write during migration window so the new index is up-to-date at cutover
        self.v1.index_item(item)
        if self.dual_write and self.v2.is_ready_for_ingest:
            self.v2.index_item(item)
Відповісти на це запитання з ШІ-тренером