- Je bouwt een promptensemble en maakt voorspellingen binnen aangeboden labels.
- Je onderscheidt kansscherpte van juistheid en meet retrieval in twee richtingen.
Je wilt een foto indelen als fiets, hond of boom zonder een nieuwe classificatiehead voor precies die drie labels te trainen. Met een gedeelde beeld-/tekstruimte kun je de beeldvector vergelijken met teksten die de klassen beschrijven. Dit heet zero-shotclassificatie: de taaklabels worden bij gebruik aangeboden.
Denk aan een meetlat met verschillende gelabelde richtingen. De beeldvector kiest de richting die het meest overeenkomt met zijn eigen richting. De kwaliteit hangt af van de eerder geleerde ruimte én van de beschrijvingen waarmee je de labels vertegenwoordigt.
Wij gebruiken opnieuw zelfgekozen vectoren. De rekensommen laten het mechanisme zien, maar bewijzen geen beeldherkenning of generalisatie. Bij een echt model zijn voorafgaande training, de gebruikte data en de mogelijke vertekeningen onderdeel van de beoordeling.
1. Geef een klasse meer dan één beschrijving
Een label zoals bank kan een meubel of financiële instelling bedoelen. Ook zonder dubbelzinnigheid kan de formulering een tekstencoder beïnvloeden. Een promptensemble maakt per klasse één vertegenwoordiger uit meerdere beschrijvingen, bijvoorbeeld foto van een fiets en een fiets in beeld.
Normaliseer eerst iedere tekstvector afzonderlijk. Middel daarna de vectoren van dezelfde klasse en normaliseer het gemiddelde opnieuw. Anders kan een toevallig lange tekstvector bijna alleen de richting van de klasse bepalen.
prompts = [
[[100,0],[0,1]],
[[0,4],[0,8]]]
classes = prompt_ensemble(prompts)
print(classes.round(3).tolist())
# [[0.707, 0.707], [0.0, 1.0]]
De eerste klasse heeft twee loodrechte richtingen. Na normalisatie zijn dat [1,0] en [0,1], met gemiddelde [0,5;0,5]; opnieuw normaliseren geeft ongeveer [0,707;0,707]. De waarde 100 krijgt zo geen extra stemgewicht ten opzichte van de waarde 1.
Maak prompt_ensemble voor de vorm klassen×prompts×kenmerken. Alle klassen hebben in dit lescontract evenveel prompts. Een nulvector of een precies wegvallend gemiddelde geeft ValueError: tegengestelde beschrijvingen leveren hier geen bruikbare klassenrichting.
012. Kies uit de aangeboden labels
Vergelijk iedere beeldvector met alle klassenrichtingen via dezelfde genormaliseerde inproducten en temperatuur als in de vorige les. Normaliseer vervolgens iedere score-rij met softmax. Elke rij hoort bij één beeld en moet over zijn aangeboden klassen optellen tot één.
images = [[1,0],[0,1]]
labels = [[1,0],[0,1],[-1,0]]
answer = zero_shot_predict(
images,labels,1.0)
print(answer['prediction'].tolist())
# [0, 1]
Maak zero_shot_predict met probabilities en prediction als uitvoervelden. De kansmatrix heeft één rij per beeld en één kolom per label; prediction bevat per beeld de index van de hoogste score. Bij een exacte gelijke hoogste score kiezen we de eerste index, zoals np.argmax.
print(answer['probabilities']
.round(3).tolist())
# [[0.665, 0.245, 0.09],
# [0.212, 0.576, 0.212]]
Voor het eerste beeld zijn de ongeschaalde scores 1, 0 en min 1. Exponentiëren geeft ongeveer 2,718;1;0,368, en delen door hun som geeft de eerste kansrij. Een softmax langs de beeldas zou een andere vraag beantwoorden en is voor deze classificatie verkeerd.
Het beeld heeft richting A: [1, 0]. Verwijder die richting uit de aangeboden labels en maak de verdeling scherper met een lagere temperatuur.
- Gekozen label
- richting A
- Hoogste softmaxwaarde
- 66,524%
Richting A is beschikbaar en wint binnen deze aangeboden labels.
Handgekozen rekenvoorbeelden. De getallen komen uit de eigen NumPy-functies; er is geen getrainde beeld- of tekstencoder.
3. Een scherpe kans is geen zekerheid over de wereld
Softmax verdeelt altijd alle kans over de aangeboden labels, ook als geen label goed past. Een foto van een boot krijgt nog steeds een winnaar tussen fiets, hond en boom. Je hebt aparte evaluatie en eventueel een afwijsregel nodig; een hoge score bewijst op zichzelf geen juiste of complete categorie.
Temperatuur laat dit scherp zien. Gebruik dezelfde beelden en labels met een kleinere temperatuur: de index van de winnaar blijft gelijk, terwijl de hoogste softmaxwaarde veel groter kan worden. Het model heeft daarbij geen nieuwe informatie over het beeld gekregen.
sharp = zero_shot_predict(
images,labels,0.1)
print(sharp['prediction'].tolist())
print(sharp['probabilities'].max()>0.99)
# [0, 1]
# True
Voor een batch met bekende beeld-tekstparen kun je ook retrieval meten: welk percentage beelden kiest de tekst op dezelfde index, en omgekeerd? Beide richtingen gebruiken dezelfde scoretabel, maar kunnen verschillende percentages halen. Hun noemers zijn de aantallen zoekopdrachten, niet het aantal scorecellen.
quality = paired_retrieval_accuracy(
[[3,2],[4,1]])
print(quality)
# {'image_to_text': 0.5,
# 'text_to_image': 0.0}
Hier kiezen beide beelden tekst nul, dus één van twee beeldzoekopdrachten is juist. Tekst nul kiest beeld één en tekst één kiest beeld nul: nul van twee tekstzoekopdrachten is juist. Maak paired_retrieval_accuracy voor deze vierkante tabel met de bekende koppelingen op de diagonaal.
03Wat neem je mee?
- Een promptensemble normaliseert vóór en na het middelen.
- Zero-shot kiest binnen de aangeboden labels, niet binnen alle mogelijke objecten.
- Meet retrieval in beide richtingen en beoordeel kansscherpte apart van juistheid.