- Je onderscheidt pretraining, voortgezette pretraining en taakgerichte fine-tuning.
- Je controleert de invloed van datamix en documentgrenzen op het trainingsdoel.
Je wilt een basismodel meer Nederlandse medische teksten laten zien, zonder dat algemene taal verdwijnt. Dat vraagt eerst een keuze over trainingsdata. Een groter model of een andere prompt bepaalt niet automatisch welke teksten tijdens leren vaak meetellen.
Pretraining begint met leren uit een brede verzameling, vaak via volgende-tokenvoorspelling. Voortgezette pretraining (continued pretraining) gaat vanuit bestaande gewichten door op bijvoorbeeld een ander domein. Fine-tuning past die gewichten aan voor een gekozen taak of gedrag; een gesprek tijdens inferentie verandert ze niet.
Onze mini-GPT startte willekeurig, maar zijn kleine synthetische corpus is geen brede pretraining. Hier bouw je drie kleine hulpmiddelen voor een bewust gekozen trainings- en evaluatiebeleid.
1. Kies eerst een domein
Stel dat twee domeinen 100 en 900 tokens bevatten. Proportioneel kiezen geeft kansen .1 en .9; beide domeinen even vaak kiezen geeft .5 en .5. Met vierkantswortels krijg je een tussenweg: gewichten 10 en 30, dus kansen .25 en .75.
n is het positieve tokenaantal van een domein, i het gekozen domein en j ieder domein in de som. α ligt hier tussen nul en één. Deze exponent is ons mengbeleid, geen universeel optimale waarde.
for alpha in [1.,.5,0.]:
p = domain_mix([100,900],alpha)
print(np.round(p,2))
# [.1 .9]
# [.25 .75]
# [.5 .5]
Maak domain_mix met logaantallen voor stabiele berekening. De kans kiest eerst een domein; daarna trek je daar een trainingsvenster. Gelijke domeinkansen maken de individuele tokens van kleine en grote domeinen dus niet automatisch even waarschijnlijk.
Gebruik vooraf gecontroleerde trainingsdata met toestemming. Houd evaluatiedata apart voordat je de mix afstemt. De helper kan niet controleren of de teksten representatief, rechtmatig verkregen of goed opgeschoond zijn.
012. Bevries de meetlat
Model A haalt verliezen [1,4] op twee domeinen, model B [2,3]. Op een 90/10-mix krijgt A 1×.9+4×.1=1.3, tegenover 2.1 voor B. Draai de mix om en B wint met 2.9 tegenover 3.7.
a = [1.,4.];b = [2.,3.]
for weights in [[9.,1.],[1.,9.]]:
la = weighted_domain_loss(a,weights)
lb = weighted_domain_loss(b,weights)
print(round(la,1),round(lb,1))
# 1.3 2.1
# 3.7 2.9
Maak weighted_domain_loss voor reeds per-token gemiddelde domeinverliezen. Normaliseer de niet-negatieve gewichten en rapporteer ook de afzonderlijke domeinmetingen. Vergelijk modellen met dezelfde tokenizer en hetzelfde evaluatieprotocol; verander de testmix niet achteraf om een winnaar te maken.
023. Maak documentgrenzen werkelijk werkzaam
Een eindtoken (EOS) tussen documenten is nog geen attentionmasker. Onze eigen pakregel voegt EOS toe, laat iedere query alleen eerdere posities van hetzelfde document zien en leert niet de overgang van EOS naar een nieuw document. Het voorspellen van EOS na de laatste inhoudstoken telt wel mee.
x,y,allowed,mask,pos = pack_documents(
[[10,11],[20]],2)
print(x) # [10 11 2 20]
print(y) # [11 2 20 2]
print(mask.astype(int)) # [1 1 0 1]
print(pos) # [0 1 2 0]
De derde inputpositie bevat EOS=2, maar zijn doel 20 hoort bij het volgende document en krijgt mask=False. De query op input 20 mag alleen zichzelf zien; zijn doel EOS telt mee. Lokale posities beginnen per document opnieuw.
Maak pack_documents met de opgegeven int64-ID’s, gereserveerde EOS en bovengrens van 128 gepakte tokens. Andere pipelines kunnen een ander grensbeleid kiezen. Onze mini-GPT heeft een expliciete adapter voor deze posities, attention en loss nodig; alleen deze helper aanroepen verandert zijn forward niet.
03Wat neem je mee?
- De trainingsmix bepaalt welke domeinen vaak aan bod komen.
- Een eerlijke modelvergelijking houdt evaluatiegewichten vast.
- Documentgrenzen vragen een expliciet attention- en verliesbeleid.
Hierna leer je een kleine gewichtsaanpassing met een bevroren basismatrix.