Příprava na pohovor z Multimodálního ML

Dotazy na pohovor pro Multimodálního ML inženýra

15 vybraných otázek na pohovor z multimodálního strojového učení, rozdělených podle úrovně seniority. Využijte je k opakování základů, praktických kompromisů a úvah pro produkční prostředí na seniorské úrovni.

Začněte AI pohovor z Multimodálního MLNení vyžadována platební karta. K dispozici je 1 bezplatná relace.
Příprava na technické pohovory v angličtiněRežim pro lidi, pro které angličtina není rodným jazykem, určený k procvičování technických pohovorů.

Otázky pro Juniory

1Vysvětlete základní myšlenku kontrastního učení pro sladění reprezentací obrazu a textu a proč je užitečný sdílený vkládací prostor (embedding space).

Základní myšlenkou kontrastního učení pro reprezentaci obrazu a textu je projektovat obrazové a textové vstupy do sdíleného latentního vektorového prostoru tak, aby sémanticky odpovídající (pozitivní) páry byly přitahovány blíže k sobě, zatímco neodpovídající (negativní) páry jsou odsouvány dále. Trénováním samostatných vizuálních a textových kodérů pomocí cílů podobnosti (jako je kosinová podobnost) model sladí sémantiku spojitých vizuálních pixelů s diskrétními textovými tokeny. Sdílený vkládací prostor (embedding space) je užitečný, protože umožňuje řešit multimodální úlohy přímo pomocí vyhledávání vektorové podobnosti. V tomto sjednoceném prostoru se křížově-modální vyhledávání (nalezení obrázků na základě textových dotazů nebo naopak) a zero-shot klasifikace (hodnocení vkládání obrázku oproti vkládání výzev, jako je „fotografie psa“) stávají jednoduchými a vysoce efektivními vyhledáváními nejbližšího souseda nebo tečkového součinu bez nutnosti hlav klasifikátoru specifických pro úlohu.

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
Zkusit odpovědět na tuto otázku s trenérem AI

2Vysvětlete architekturu duálního kodéru ve stylu CLIP (Contrastive Language–Image Pre-training) a předpoklady, které činí ohledně interakce obrazu a textu.

Architektura duálního kodéru ve stylu CLIP se skládá ze dvou samostatných, oddělených neuronových sítí: vizuálního kodéru (např. Vision Transformer nebo ResNet), který zpracovává obrázky do vizuálních vektorů příznaků, a textového kodéru (např. Transformer), který zpracovává text do textových vektorů příznaků. Obě reprezentace jsou promítnuty do společné dimenze vnoření (embedding dimension), kde se zarovnání měří pomocí jednoduché metriky podobnosti (jako je normalizovaná kosinová podobnost nebo skalární součin). Základním architektonickým předpokladem je pozdní fúze (nebo faktorizovaná křížově-modální interakce): obrazové a textové modality neinteragují na mezilehlých vrstvách prostřednictvím křížové pozornosti (cross-attention) nebo interakcí na úrovni tokenů. Místo toho se předpokládá, že plná sémantika každé modality je stlačitelná do jednoho hustého vektorového souhrnu, a křížově-modální interakce je považována za plně rozložitelnou na skalární součin. Tento kompromis upřednostňuje extrémní efektivitu vyhledávání (umožňující offline předvýpočet vnoření obrázků pro vektorové vyhledávání v miliardovém měřítku) před jemnozrnným křížově-modálním uvažováním (jako je ukotvení tokenů k regionům nebo komplexní kompoziční prostorové vztahy).

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()
Zkusit odpovědět na tuto otázku s trenérem AI

3Popište intuici za projekcí obrazových a textových funkcí do společného normalizovaného prostoru a optimalizací kosinové podobnosti (cosine similarity).

Projekce obrazových a textových funkcí do společného normalizovaného prostoru (typicky na jednotkové hypersféře pomocí L2 normalizace) a optimalizace kosinové podobnosti odděluje sémantický směr vložení od jeho vektorové velikosti. Bez normalizace by neomezený skalární součin umožnil modelu minimalizovat trénovací ztrátu tím, že by triviálně nafukoval normy funkcí pro snadné nebo časté vzorky, spíše než aby sladil jejich sémantické směry. Normalizace vektorů na jednotkovou hypersféru omezuje hodnoty podobnosti striktně do rozmezí [-1, 1], čímž zajišťuje, že vzdálenost odpovídá čistě úhlovému oddělení. To stabilizuje optimalizační gradienty, zabraňuje explozi nebo kolapsu reprezentace a zajišťuje, že každý vzorek v dávce přispívá k ztrátě spravedlivě, bez ohledu na disparity měřítka specifické pro modalitu. V kombinaci s učitelným teplotním parametrem (learnable temperature parameter) to řídí ostrost rozdělení pravděpodobnosti na hypersféře, aby se vyvážilo sladění skutečných párů s rovnoměrným rozptýlením negativních párů.

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)
Zkusit odpovědět na tuto otázku s trenérem AI

4Vysvětlete vizuální uzemnění (visual grounding) a rozumění odkazujícím výrazům (Referring Expression Comprehension, REC) jako lokalizaci podmíněnou jazykem a jak se liší od podobnosti na úrovni obrázku.

Vizuální uzemnění (visual grounding) (často operacionalizované jako rozumění odkazujícím výrazům, neboli REC) je úkol lokalizace specifické vizuální oblasti, ohraničujícího rámečku (bounding box) nebo segmentační masky v obrázku na základě výrazu v přirozeném jazyce odkazujícího na objekt (např. 'muž v modré bundě vedle lampy'). Lokalizaci chápe jako podmíněnou jazykem, což vyžaduje, aby model rozřešil lingvistické prostorové vztahy, atributy a identity objektů až na pixelové nebo prostorové souřadnice. To se zásadně liší od podobnosti na úrovni obrázku (image-level similarity), která vypočítává jedno holistické skóre sémantické afinity mezi celým obrázkem a textovým řetězcem (např. určení, zda obrázek odpovídá popisku 'muž v parku'). Podobnost na úrovni obrázku neprodukuje prostorové souřadnice, může porovnávat obrázky, kde odkazovaný objekt není jednoznačně lokalizován, a často selhává při řešení jemnozrnného rozlišení odkazování mezi více podobnými objekty ve stejné scéně.

# 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)
Zkusit odpovědět na tuto otázku s trenérem AI

5Vysvětlete křížovou pozornost (cross-attention) jako mechanismus fúze mezi vizuálními tokeny a textovými tokeny v multimodálních transformerech.

V multimodálních transformerech funguje křížová pozornost (cross-attention) jako asymetrický mechanismus fúze, kde jedna modalita směřuje dotazy (Q) k obsluze klíčů (K) a hodnot (V) extrahovaných z jiné modality. Například, když vizuální tokeny působí jako dotazy a textové tokeny jako klíče a hodnoty, každý vizuální token vypočítá vážený součet s pozorností přes textové reprezentace, dynamicky podmiňující vizuální příznaky na textovém kontextu (a naopak, když text dotazuje vizuální tokeny). Matematicky, vzhledem k vizuální sekvenci X_v a textové sekvenci X_t, křížová pozornost počítá: CrossAttention(Q_v, K_t, V_t) = softmax((Q_v * K_t^T) / sqrt(d)) * V_t, kde Q_v = X_v * W_Q, K_t = X_t * W_K, a V_t = X_t * W_V. Tento mechanismus umožňuje modelu provádět jemné sémantické zarovnání token-to-token napříč modalitami bez ohledu na rozdíly v délkách sekvencí nebo počátečních prostorech příznaků. Obousměrné fúze lze dosáhnout pomocí dvou symetrických vrstev křížové pozornosti (např. vidění k jazyku a jazyk k vidění) nebo střídáním bloků křížové pozornosti.

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
Zkusit odpovědět na tuto otázku s trenérem AI

6Vysvětlete, jak obrazové augmentace, jako je ořezávání (cropping), barevné chvění (color jitter) a komprese, mohou pomoci nebo uškodit kontrastnímu zarovnání obrazu a textu.

V multimodálním kontrastním učení (například CLIP) slouží obrazové augmentace jinému účelu než v unimodálním učení bez dohledu (například SimCLR). Protože obrazy jsou porovnávány s párovými textovými popisky, spíše než s jiným augmentovaným pohledem na stejný obraz, mohou augmentace prospět i narušit učení reprezentací. Jak augmentace pomáhají: 1. Prevence učení zkratek: Jemné augmentace (jako náhodné ořezávání, mírné horizontální převrácení a mírné barevné chvění) zabraňují vizuálnímu kodéru spoléhat se na triviální nízkoúrovňové vizuální artefakty (např. distribuce barev pozadí, rohové vodoznaky nebo zkreslení prostorové polohy). 2. Invariance vůči úhlu pohledu a měřítku: Mírné škálování a ořezávání povzbuzují model k identifikaci sémantických objektů napříč různými ohniskovými vzdálenostmi a perspektivami, čímž zajišťují robustní zobecnění typu zero-shot. Jak augmentace mohou škodit (sémantické nesoulady): 1. Agresivní náhodné ořezávání: Pokud popisek popisuje konkrétní objekt ('pták sedící na větvi') a agresivní ořez zcela odstraní ptáka, zbývající ořez (jen listí/obloha) je stále nucen se zarovnat s popiskem ptáka. To zavádí falešný dohledový šum a snižuje přesnost vyhledávání. 2. Silné barevné chvění (Color Jittering) / inverze odstínu (Hue Inversion): Mnoho popisků explicitně popisuje barevné atributy ('žluté taxi', 'červené jablko'). Silné barevné posuny změní taxi na modré nebo jablko na zelené, což způsobuje přímý sémantický rozpor mezi vizuálním vstupem a textovým popiskem. 3. Silné rozostření a komprese: Agresivní prostorové zmenšování, JPEG komprese nebo Gaussovo rozostření ničí jemné textové nápovědy (OCR text na značkách, loga, jemné textury), které jsou explicitně popsány v párových popiscích. Praktické pravidlo: Multimodální kontrastní trénink vyžaduje výrazně konzervativnější augmentace (např. Random Resized Crop s rozsahem měřítka [0.5, 1.0] a mírným převrácením) než unimodální učení bez dohledu.

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()
])
Zkusit odpovědět na tuto otázku s trenérem AI

7Vysvětlete vyhledávání obrazů a textů (image-text retrieval) jako úlohu a rozdíl mezi párováním s uzavřenou množinou kandidátů (closed-set matching) a vyhledáváním v otevřeném světě (open-world retrieval) napříč velkými korpusy.

Vyhledávání obrazů a textů (image-text retrieval) je úloha, jejímž cílem je najít odpovídající data napříč modalitami na základě dotazu v jedné modalitě (text-na-obraz nebo obraz-na-text). Toho je typicky dosaženo mapováním obrazů i textů do sdíleného reprezentačního prostoru, kde podobnost koreluje s relevancí. Párování s uzavřenou množinou kandidátů (closed-set matching) předpokládá fixní, předdefinovaný fond kandidátů se známými referenčními párováními (ground-truth pairings), jako jsou standardní benchmarky Flickr30k nebo MS-COCO, což umožňuje vyčerpávající výpočet párové podobnosti nebo křížovou pozornost typu all-to-all. Vyhledávání v otevřeném světě (open-world retrieval) operuje s masivními, dynamickými, nekurátorovanými korpusy (např. miliony až miliardy webových nebo katalogových položek), kde množiny kandidátů nejsou omezené, převládají rušivé a falešně negativní výsledky, a jsou vyžadovány škálovatelné indexy pro přibližné vyhledávání nejbližších sousedů (ANN – Approximate Nearest Neighbor) (např. Faiss, HNSW), protože vyčerpávající křížová pozornost přes všechny páry je výpočetně nezvládnutelná.

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)
Zkusit odpovědět na tuto otázku s trenérem AI

Otázky pro Middly

8Porovnejte kontrastní ztrátové funkce se softmaxem (InfoNCE-style softmax contrastive losses) s párovými sigmoidními ztrátovými funkcemi (pairwise sigmoid losses) pro učení vložení (embeddingů) obrazu a textu.

Kontrastní ztrátové funkce se softmaxem typu InfoNCE (Information Noise-Contrastive Estimation) (jako u CLIP – Contrastive Language–Image Pre-training) považují zarovnání za kategorický problém víceklasové klasifikace. Pro každý vzorek vypočítají softmax distribuci přes všechny kandidátní negativní páry v dávce, normalizují podobnosti napříč celým zásobníkem (pool) dávky. Naproti tomu párové sigmoidní kontrastní ztrátové funkce (jako u SigLIP – Sigmoid Loss for Language-Image Pre-training) považují každou položku v matici podobnosti obrazu a textu za nezávislou úlohu binární klasifikace, aplikující sigmoidní funkci a binární křížovou entropii na pár (pozitivní páry cílí na +1, negativní páry na -1). Klíčové rozdíly jsou: 1. Vazba versus Oddělení: InfoNCE váže všechny negativy prostřednictvím globálního jmenovatele softmax partition, což způsobuje konkurenci, kde nejtěžší negativy dominují gradientům. SigLIP odděluje všechny páry a vyhodnocuje každý nezávisle. 2. Distribuovaná škálovatelnost a efektivita: InfoNCE vyžaduje shromažďování matic podobnosti napříč GPU (Graphics Processing Unit) pro globální normalizaci (komunikační úzké hrdlo all-gather). Nezávislá párová ztrátová funkce SigLIP může být vypočítána lokálně bez globální softmax normalizace napříč GPU, což zlepšuje škálovací efektivitu a zůstává stabilní napříč malými i velmi velkými velikostmi dávek.

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))
Zkusit odpovědět na tuto otázku s trenérem AI

9Vysvětlete, jak těžké (hard) negativní vzorky a falešně negativní vzorky ovlivňují kontrastní učení obraz-text.

Těžké (hard) negativní vzorky a falešně negativní vzorky mají protichůdné účinky na kontrastní učení obraz-text: 1. **Těžké negativní vzorky (Hard negatives)** jsou neodpovídající páry, které jsou sémanticky nebo vizuálně velmi blízké kotvě (anchor) (např. obrázek sibiřského huskyho spárovaný s popiskem 'aljašský malamut'). Těžké negativní vzorky poskytují silné, informativní gradientní signály. Nutí model, aby se díval za hrubé (coarse) kategorie vlastností a učil se jemné vizuálně-lingvistické detaily a ostré rozhodovací hranice. 2. **Falešně negativní vzorky (False negatives)** nastávají, když náhodně vzorkované „negativní“ páry v dávce jsou ve skutečnosti platné sémantické shody (např. dvě odlišné fotografie zlatých retrívrů, kde je jedna spárována jako negativní proti 'roztomilý zlatý retrívr v parku'). Falešně negativní vzorky penalizují správná sémantická zarovnání tím, že nutí model oddělovat platné odpovídající reprezentace. To poškozuje gradienty, zhoršuje kvalitu reprezentace a potlačuje legitimní synonymii a vizuální variabilitu. Strategie zmírnění falešně negativních vzorků zahrnují kontrastní cíle s měkkým vyhlazováním štítků (soft/label-smoothing contrastive objectives), debiované kontrastní učení, deduplikaci datové sady a vícenásobné pozitivní shody (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
Zkusit odpovědět na tuto otázku s trenérem AI

10Porovnejte globální zarovnání obrazu a textu s cíli zarovnání na úrovni oblasti-slova nebo tokenů.

Globální zarovnání obrazu a textu mapuje celý obraz a celou textovou sekvenci do jednotlivých holistických vektorů vnoření (embeddingů) (např. prostřednictvím agregovaných rysů (pooled features) v CLIP) a zarovnává je pomocí kontrastního cíle, jako je InfoNCE. To poskytuje vynikající škálovatelné vlastnosti, rychlé indexovatelné reprezentace pro vyhledávání a silné sémantické shlukování. Nicméně, trpí hrubou prostorovou granularitou, potýká se s jemnými vizuálními detaily, kompozicionalitou, počítáním a prostorovými vztahy a často vykazuje problémy s vázáním atributů. Naopak, zarovnání na úrovni oblasti-slova nebo tokenů pracuje na jemnozrnných granularitách podobrazu (např. patch tokeny, rysy ohraničujících boxů objektů) a podvětných granularitách (např. slova nebo podslovné tokeny). Metody jako FILIP, GLIP nebo VinVL zarovnávají tokeny pomocí jemnozrnných kontrastních ztrát (jako je token-wise max-sim nebo Chamfer similarity) nebo zarovnání pomocí optimálního transportu / křížové atence. To explicitně zachovává prostorové a lingvistické kompoziční detaily, což umožňuje detekci objektů, vizuální uzemnění a přesné vázání atributů, ale za cenu vyšší výpočetní a paměťové složitosti, vyšší latence inference a hlučnějších zarovnávacích signálů.

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
Zkusit odpovědět na tuto otázku s trenérem AI

11Porovnejte časnou fúzi (Early Fusion), pozdní fúzi (Late Fusion), mezilehlou fúzi (Intermediate Fusion), fúzi křížovou pozorností (Cross-Attention Fusion), hradlovou fúzi (Gated Fusion) a zřetězení (Concatenation) pro multimodální modely.

Multimodální fúzní strategie integrují zrakové a jazykové signály v různých hloubkách a strukturních konfiguracích: 1. **Časná fúze (Early Fusion):** Nezpracované nebo nízkoúrovňové příznaky (např. vnoření obrazových patchů a vnoření slovních tokenů) se slučují ve vstupní fázi a jsou předány do jedné sdílené páteřní sítě. To umožňuje hluboké křížovo-modální interakce již od nulové vrstvy, ale je to výpočetně nákladné a ztěžuje opětovné použití unimodálního předtrénování. 2. **Pozdní fúze (Late Fusion):** Modality jsou zpracovávány nezávisle hlubokými unimodálními páteřními sítěmi do globálních vektorových reprezentací, které se kombinují až na samém konci pomocí jednoduché agregace (např. skalárního součinu, kosinové podobnosti nebo mělké MLP (Multi-Layer Perceptron)). To je extrémně efektivní a ideální pro indexovatelné vyhledávání, ale nedokáže zachytit jemné křížovo-modální interakce. 3. **Mezilehlá fúze (Intermediate Fusion):** Unimodální páteřní sítě zpracovávají vstupy po několik vrstev a fúze probíhá v mezilehlých fázích prostřednictvím sdílených vrstev nebo laterálních spojení, čímž se dosahuje rovnováhy mezi unimodální specializací a multimodální interakcí. 4. **Fúze křížovou pozorností (Cross-Attention Fusion):** Využívá vícehlavou pozornost (multi-head attention), kde jedna modalita dodává dotazy (queries) a druhá dodává klíče (keys)/hodnoty (values). Nabízí vysokou reprezentační kapacitu s podmiňováním token-na-token a umožňuje heterogenní délky sekvencí. 5. **Hradlová fúze (Gated Fusion):** Využívá naučené hradlovací mechanismy (např. sigmoidní nebo tanh hradla) k dynamickému vážení příspěvku každé modality nebo fúzní vrstvy na základě kontextuální spolehlivosti, čímž zabraňuje jedné modalitě dominovat nebo poškozovat předtrénované váhy. 6. **Zřetězení (Concatenation):** Slučuje vektory příznaků nebo sekvence tokenů podél dimenze příznaků (zřetězení příznaků) nebo dimenze délky sekvence (zřetězení tokenů před jednotným transformátorem). Je to jednoduché a neparametrické, ale zřetězení příznaků vyžaduje zarovnané prostorové/časové dimenze, zatímco zřetězení tokenů se v samočinné pozornosti (self-attention) škáluje kvadraticky s celkovou délkou sekvence.

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)
Zkusit odpovědět na tuto otázku s trenérem AI

12Porovnejte retrieval modely s duálním enkodérem (dual-encoder) s re-rankery s křížovým enkodérem (cross-encoder rerankers) pro párování obrázků a textu z hlediska kapacity interakce, přesnosti a latence.

Modely s duálním enkodérem (dual-encoder, bi-encoder) a re-rankery s křížovým enkodérem (cross-encoder rerankers) představují dvě odlišné paradigmy pro párování obrázků a textu, které nabízejí zásadní kompromisy mezi kapacitou interakce, přesností a latencí: 1. **Kapacita interakce:** * **Duální enkodéry (např. CLIP):** Zpracovávají obraz a text prostřednictvím oddělených, oddělených páteřních sítí (backbones). Multimodální interakce je striktně pozdní a mělká, omezena na jeden skalární součin (dot product) nebo kosinusovou podobnost mezi globálně sdruženými vektory. Chybí jim mezimodální interakce na úrovni tokenů. * **Křížové enkodéry (např. UNITER, ViLT, multimodální větev ALBEF):** Zřetězují vizuální a textové tokeny do sdíleného transformátoru nebo používají vrstvy křížové pozornosti (cross-attention layers). Každý vizuální token může interagovat s každým textovým tokenem napříč více vrstvami, což umožňuje hluboké mezimodální uvažování. 2. **Přesnost:** * **Duální enkodéry** dosahují nižší přesnosti u komplexních kompozičních dotazů, prostorových vztahů, negace a jemnozrnného párování atributů kvůli úzkému hrdlu jednovektorových reprezentací. * **Křížové enkodéry** dosahují výrazně vyšší přesnosti u komplexních, jemnozrnných a kompozičních úloh párování obrázků a textu. 3. **Latence a škálovatelnost:** * **Duální enkodéry** umožňují předběžné výpočty a indexování obrazových embeddingů offline ve vektorové databázi (např. Milvus, FAISS). V době inferencí je zakódován pouze textový dotaz a vyhledávání mezi miliony kandidátů vyžaduje pouze odlehčené přibližné skalární součiny nejbližšího souseda (approximate nearest neighbor (ANN) dot products) s latencí v řádu submilisekund. * **Křížové enkodéry** vyžadují spuštění plné společné neuronové sítě pro každý pár kandidátů (obrázek, text) v době dotazu (O(N) forward passů pro N kandidátů), což vede k latenci o řády vyšší a činí je výpočetně náročnými pro prvotní retrieval přes velká korpora. V praktických produkčních systémech je standardem dvoufázová pipeline: duální enkodér vyhledá top-K kandidátů (např. K=100) s nízkou latencí, následovaný křížovým enkodérem, který je pro vysokou přesnost znovu seřadí (reranks).

# 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)]
Zkusit odpovědět na tuto otázku s trenérem AI

Otázky pro Seniory

13Navrhněte multimodální RAG systém (Retrieval-Augmented Generation) pro PDF soubory nebo manuály obsahující text, tabulky, grafy, snímky obrazovky, diagramy a vložené obrázky.

Kompletní multimodální RAG systém (Retrieval-Augmented Generation) pro komplexní vizuální dokumenty (PDF, manuály, reporty) zahrnuje čtyři základní architektonické fáze: 1. **Příjem a parsování s ohledem na rozvržení:** Stránky PDF jsou zpracovávány pomocí modelů dokumentů citlivých na rozvržení (např. LayoutLM, DocTR) nebo pipeline pro vizuální parsování, aby segmentovaly obsah do strukturovaných bloků: textové pasáže, strukturované tabulky (převedené na HTML/Markdown s rozpětím buněk), vykreslené obrázky grafů s datovými řadami a samostatné diagramy nebo snímky obrazovky s prostorovými ohraničujícími boxy. 2. **Multimodální indexace a duální reprezentace:** - **Vizuální aktiva (grafy, snímky obrazovky, diagramy):** Uloženy jako výřezy obrázků s hustými multimodálními vnořeními (např. SigLIP, CLIP nebo ColPali vizuální patch tokeny) spolu se syntetickými textovými souhrny a OCR textem generovaným VLM (Visual Language Model), uložené v hustém textovém indexu. - **Tabulky:** Uloženy jako strukturovaný Markdown/HTML v textových vektorových a BM25 indexech. - **Text:** Rozdělen do bloků podle sémantických sekcí a indexován pomocí hustých vnoření a řídkých klíčových slov. 3. **Hybridní vyhledávání a multimodální přeřazování:** - **Vyhledávání v první fázi:** Provádí paralelní vyhledávání napříč řídkými BM25 (klíčová slova, OCR text, značky tabulek), hustými textovými vektory a indexy vizuálních vnoření (hledání ANN – Approximate Nearest Neighbor). - **Fúze a přeřazování:** Sloučí kandidáty (např. pomocí Reciprocal Rank Fusion) a ohodnotí nejlepší položky pomocí multimodálního křížového kodéru nebo vizuálního modelu s pozdní interakcí (hodnocení textu dotazu proti výřezům obrázků ve vysokém rozlišení a parsovanému textu). 4. **Sestavení multimodálního kontextu a uzemněná generace:** Top-k multimodální kontext – vykreslené obrazové patche, schémata tabulek a textové pasáže s metadaty dokumentu/stránky – je předán VLM vyladěnému pro instrukce (instruction-tuned VLM) (např. GPT-4o, Claude 3.5 Sonnet nebo open-source Qwen2-VL). Generační prompt vynucuje původ zdroje vyžadováním explicitních citací (čísla stránek, čísla obrázků nebo ohraničující boxy).

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.
Zkusit odpovědět na tuto otázku s trenérem AI

14Vysvětlete, jak by mělo hodnocení multimodálního RAG (Retrieval Augmented Generation) samostatně měřit kvalitu vyhledávání, využití důkazů, původ a věrnost konečné odpovědi.

Vyhodnocení multimodálního RAG (Retrieval Augmented Generation) vyžaduje rozložení systému do čtyř oddělených dimenzí hodnocení, aby se přesně určilo, zda chyby pocházejí z vyhledávání, spotřeby kontextu, přesnosti citací nebo generování: 1. **Kvalita vyhledávání:** Hodnotí, zda vyhledávač identifikuje potřebné vizuální a textové části. Klíčové metriky zahrnují multimodální Recall@K, NDCG@K (Normalized Discounted Cumulative Gain) a MRR (Mean Reciprocal Rank). U vizuálních prvků to zahrnuje také vizuální IoU (Intersection over Union) / zpětné vyvolání ohraničujícího rámečku (Bounding-Box Recall) (zda načtený výřez obrazu obsahuje relevantní diagram/graf) a vyvážení zpětného vyvolání modality (zajištění, aby nemultimodální prvky, jako jsou tabulky a grafy, nebyly systematicky přehlíženy). 2. **Využití důkazů (dostatečnost a nutnost):** Měří, zda generační model skutečně spoléhá na načtené multimodální důkazy, spíše než aby generoval odpovědi čistě z parametrické paměti. To se měří pomocí relevance kontextu (přesnost načtených vizuálních/textových tokenů podporujících otázku), nutnosti důkazů / ablačního testování (maskování nebo vyřazení načteného grafu/tabulky za účelem ověření, zda odpověď selže) a analýzy atributů křížové pozornosti. 3. **Původ (provenance) a přesnost citací:** Měří, zda jsou přiřazení zdroje přesná a ověřitelná. Hodnoceno pomocí přesnosti (Precision), úplnosti (Recall) a F1 skóre citací (názvy dokumentů, čísla stránek, ID obrázků nebo souřadnice ohraničujících rámečků). Automatické kontroly ověřují, že citovaný ohraničující rámeček nebo stránka skutečně obsahuje ověřené důkazy (ground truth) potřebné k zodpovězení otázky. 4. **Věrnost a správnost konečné odpovědi:** * **Věrnost / ukotvení (grounding):** Posuzuje, zda je každé vygenerované tvrzení odvozeno z načteného multimodálního kontextu bez halucinací (typicky hodnoceno pomocí VLM (Visual Language Model) jako posuzovatele kontrolujícího implikaci tvrzení proti textovým a vizuálním výřezům). * **Faktická správnost:** Hodnotí, zda vygenerovaná odpověď odpovídá ověřené pravdě (ground truth). * **Robustnost odmítnutí:** Testuje, zda model správně odmítne odpovědět, když je načtený kontext irelevantní nebo konfliktní.

# 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}')
Zkusit odpovědět na tuto otázku s trenérem AI

15Zamyslete se nad aktualizací produkčních multimodálních vyhledávacích modelů, když je nutné ve velkém měřítku aktualizovat embeddingy galerie a indexy.

Aktualizace multimodálního vyhledávacího systému ve velkém měřítku představuje problém driftu reprezentace: nově generované embeddingy se nacházejí v jiném geometrickém latentním prostoru a nemohou být přímo porovnávány s existujícími embeddingy galerie bez vážné degradace úplnosti (recall). Následně aktualizace bez výpadků vyžadují buď nasazení blue/green s duálním indexem, učení kompatibility (jako je zpětně kompatibilní trénování nebo transformační adaptéry), nebo stupňovité reindexační pipeline. Ve standardním pracovním postupu reindexace blue/green offline dávkové úlohy počítají nové embeddingy napříč galerií a vytvářejí nový vektorový index (například HNSW (Hierarchical Navigable Small Worlds) nebo IVF (Inverted File Index)). Zatímco probíhá přestavba, živý vyhledávací provoz pokračuje v dotazování aktivního staršího indexu. Nové příchozí položky jsou zpracovávány duálním zápisem nebo streamovanými protokoly CDC (Change Data Capture), aby oba indexy zůstaly aktuální. Jakmile je nový index validován pomocí stínového provozu a zahřát v paměti, provoz se atomicky přepne na nový kodér a index, poté je starý index vyřazen z provozu. Alternativně, zpětně kompatibilní učení omezuje nový dotazovací kodér tak, aby se zarovnal se starším prostorem galerie, což umožňuje okamžité upgrady dotazovacího modelu, zatímco asynchronně doplňuje galerii v průběhu času.

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)
Zkusit odpovědět na tuto otázku s trenérem AI