- Je berekent masked mean pooling zonder padding mee te tellen.
- Je gebruikt cosinussimilariteit en benoemt wat een hoge overeenkomst niet bewijst.
Probeer ook echte tekstvectoren in het embedding-lab.
Twee vragen kunnen hetzelfde bedoelen zonder dezelfde woorden te gebruiken. Een zinsembedding (sentence embedding) zet tekst met een getrainde encoder om in een vector. Een passende encoder kan verwante passages dichter bij een vraag plaatsen.
De oefeningen gebruiken handgemaakte verborgen vectoren om de berekening te begrijpen. Voor echte geleerde vectoren is er het embedding-lab. Model, revisie, tokenizer, pooling en normalisatie moeten bij dezelfde embeddingruimte horen; dezelfde dimensie alleen maakt encoders niet compatibel.
1. Middel tokenvectoren zonder padding
In de les embedding-tabellen kreeg masked_mean een tabel, IDs en padding_idx. Hier heeft die naam een ander contract: je krijgt al verborgen toestanden H met vorm batch×tokens×dimensie en een booleaans masker. Er worden dus geen rijen uit een embeddingtabel opgezocht.
Neem twee echte tokenvectoren [1,2] en [3,4], plus padding [999,999]. De bedoelde som is [4,6], met twee geldige posities. Het gemiddelde wordt [2,3], zonder bijdrage van de padding.
hidden = np.array([[
[1,2],[3,4],[999,999]]])
mask = np.array([[True,True,False]])
print(hidden.shape) # (1, 3, 2)
print(mask[:,:,None].shape) # (1, 3, 1)
print((hidden*mask[:,:,None])
.sum(axis=1)) # [[4 6]]
De extra laatste as laat hetzelfde masker op alle dimensies van een token werken. Voor één voorbeeld is de gepoolde vector v:
t loopt over tokenposities; m is nul of één en Hₜ is de vector op die positie. Sommeer over tokens en behoud batch en dimensie.
print(masked_mean(hidden,mask))
# [[2. 3.]]
Maak masked_mean met minstens één geldige positie per voorbeeld. Hiddenwaarden zijn reëel, eindig en begrensd tot absolute waarde een miljoen. Het modelcontract bepaalt welke posities geldig zijn: verwijder speciale tokens niet willekeurig.
De modelkaart van all-MiniLM-L6-v2 toont masked mean pooling en daarna normalisatie. Andere encoders kunnen andere pooling of verschillende query-/documentinstructies gebruiken. Dit gemiddelde is daarom geen universele definitie van een tekstembedding.
012. Bewaar richting met een eenheidsvector
Een vector [3,4] heeft lengte vijf. Delen door vijf geeft [.6,.8], met dezelfde richting en lengte één. Alle dimensies tellen mee: [1,2,2] heeft lengte drie.
print(normalize_rows([[3,4]]))
# [[0.6 0.8]]
print(np.round(
normalize_rows([[1,2,2]]),4))
# [[0.3333 0.6667 0.6667]]
Maak normalize_rows met een nieuwe array per matrix en zonder invoermutatie. Een nulvector heeft geen richting; onze oefening weigert ook normen kleiner dan 10⁻¹². Voeg niet stilzwijgend een willekeurige richting toe.
Positief schalen verandert de richting niet. Normalisatie verwijdert wel lengte-informatie. Gebruik haar daarom alleen wanneer ze bij het getrainde scorecontract past.
023. Zoek op richting en evalueer relevantie apart
Cosinussimilariteit deelt het inproduct door beide lengtes. Na normalisatie is dat gewoon het inproduct van de twee eenheidsvectoren:
q is de vraagvector en d een passagevector. Bij query [1,0,0] scoren dezelfde richting één, een loodrechte richting nul en de tegengestelde richting min één. Exact gelijke scores krijgen alfabetische IDs als tie-break.
x = [[1,0,0],[2,0,0],
[-1,0,0],[0,1,0]]
ids = ['b','a','c','d']
hits = cosine_search(x,[1,0,0],ids,4)
for hit in hits:
score = round(hit['score'],1)
print(hit['id'],score)
# a 1.0
# b 1.0
# d 0.0
# c -1.0
Maak cosine_search met passende dimensies, unieke IDs en een geldige k. Bewaar negatieve scores; bijna gelijke floating-pointwaarden zijn geen exacte ties. De score is geen kans dat de passage waar of relevant is: tegengestelde uitspraken kunnen over hetzelfde onderwerp gaan.
03Wat neem je mee?
- Pooling en masker bepalen welke tokenvectoren meetellen.
- Normalisatie bewaart richting en gebruikt alle dimensies.
- Cosinus rangschikt vectoren; relevante en juiste bronnen vereisen evaluatie.
Hierna sla je de vectoren op en vergelijk je exact met benaderend zoeken.