CUDA rapporterar dokumentindex
En CUDA-tränare vet vilket dokument den samplat
Varje träningssteg drar en sekvens från en .btok-binär, som packar många dokument efter varandra. CUDA registrerar ett dokumentindex tillsammans med förlusten: step 47213, source=gutenberg, doc=128407, loss=2.81. En proxy samlar dessa rapporter & underhåller en mängd unika dokumentindex sedda per källa.
Från antal till täckning
Täckning av en källa = unique_docs_seen / n_docs. Några exempel:
| Källa | n_docs | unikt sedd | täckning |
|---|---|---|---|
| gutenberg | 512,000 | 154,000 | 30.1% |
| hermes3-general | 67,395 | 47,176 | 70.0% |
| dictionary | 88,000 | 88,000 | 100.0% |
| synthetic-chat | 1,400 | 1,400 | 100.0% |
Små källor mättas snabbt. Stora källor sjunker under 50 % under veckor. Täckningsbonus belönar en bandit för att besöka dokument den ännu inte provtagit inom en källa.
Bonusformel
Täckningsbonus skalar linjärt från 1,3x vid 0 % täckning ner till 1,0x vid 50 % täckning, sedan platt vid 1,0x över 50 %:
if coverage < 0.5:
bonus = 1.0 + 0.3 * (1.0 - coverage / 0.5)
else:
bonus = 1.0
En källa med 0% täckning får 1,3x; en källa med 25% får 1,15x; en källa med 50% sjunker till 1,0x. Över 50% tillämpas ingen bonus.
Beräkna bonusen
Två distinkta färskhetssignaler
Samma mål, olika granularitet
ANDREA har två mekanismer som förhindrar överträning på en enda källa. De låter liknande; de mäter olika saker.
Epoch-straff. Spårar aggregerad överdragning. När lifetime_pulls / n_docs > 1.0 har en källa teoretiskt gått förbi varje dokument minst en gång. Straff = 1 / (1 + epochs). En 1,4K-dokuments synthetic-chat-källa med 5 600 lifetime pulls (epochs = 4) får straff 1/5 = 0,2x. Epoch-räknare kvarstår över omstarter; de avtar aldrig.
Täckningsbonus. Spårar per-dokuments färskhet inom en källa. CUDA rapporterar doc-index; proxyn underhåller en mängd per källa. Källor under 50 % täckning av unika docs får upp till 1,3x. Täckning belönar utforskning av en källas svans; epoch-straff straffar uttömning av den.
Varför båda är viktiga
| Signal | Tracks | Direction | Cap | Persists across restarts |
|---|---|---|---|---|
| Epoch-straff | aggregerad överdragning | minskar | 1/(1+e) | ja |
| Täckningsbonus | per-dok färskhet | ökar | 1.3x | ja |
En 500K-dokuments gutenberg-källa kan hålla sig under 50% täckning under hela 200K-träningskörningen samtidigt som den aldrig närmar sig epoch=1. Epoch-straff ignorerar den; täckningsbonusen drar aktivt en bandit mot gutenbergs outforskade 70% svans.
Omvänt mättar en 1.4K syntetisk-chatt-källa täckningen (100%) inom några tusen drag; täckningsbonusen stannar vid 1.0x medan epoch-straffet växer.
Skilj på de två
Vad täckningsbonusen ger ANDREA
Felmoden det förhindrar
Utan doc-level-spårning väljer en bandit baserat på per-stegsbelöning .btok-sekvenser girigt. Ett 500K-dokument Gutenberg-korpus innehåller ett fåtal tusen sekvenser med låg cross-entropy (konsekvent prosa, vanlig vokabulär). En bandit enbart baserad på belöning återvänder upprepat till dessa sekvenser eftersom de fortsätter producera starka belöningssignaler.
Resultat: ett 500K-dokument korpus samplas över kanske 2K-5K distinkta sekvenser under 200K träningssteg. Modellen memorerar dessa sekvenser utan att någonsin se resten. Kapacitet slösad; täckning fast under 1%.
Vad täckningsbonus ger
1.3x vid 0% täckning, skalat ner till 1.0x vid 50%. Den här knuffen propagerar genom UCB1-selektion: armar med låg täckning förblir konkurrenskraftiga även när deras per-drag-belöning sjunker. Banditen utforskar svansen avsiktligt snarare än av en slump.
Över en 200K-stegs körning på ett 500K-dok Gutenberg-korpus höjer täckningsbonusen typiskt observerad täckning från ~3% (ingen bonus) till ~25-30% (med bonus). Samma beräkning, åtta till tio gånger fler dokument berörda.
Var spårningen finns
| Komponent | Ansvar |
|---|---|
microgpt_cuda.cu | Rapporterar dokindex per träningsteg |
training_proxy.py | Underhåller seen_docs-uppsättning per källa |
training_proxy.py | Beräknar täckning, applicerar bonus till banditbelöning |
training_proxy.py | Sparar seen_docs till .state.json över omstarter |