Meer dan alleen een selfie: hoe het leeftijdsverificatiesysteem van Roblox helpt om leeftijdscontroles actueel te houden
Een modulair, multimodaal ML-systeem voor gedragsanalyse dat veiligheid vooropstelt

Het systeem voor gezichtsleeftijdsschatting van Roblox heeft 338 miljoen leeftijdsverificatierecords verwerkt om Roblox-gebruikers te helpen leeftijdsgeschikte chatfuncties te ontgrendelen en toegang te krijgen tot leeftijdsgeschikte games op het platform. De eerste leeftijdsverificatie is noodzakelijk, maar leeftijdsverificatie houdt niet op bij de selfie. Accounts kunnen worden gedeeld of doorgegeven aan een jonger broertje of zusje. Kwaadwillenden kunnen proberen onze beveiliging te omzeilen. Om leeftijdsverificatie verder te brengen dan een momentopname, hebben we een ML-laag met hoge doorvoercapaciteit ontwikkeld die beoordeelt of het voortdurende gedrag van een account in de loop van de tijd nog steeds overeenkomt met de geschatte leeftijd. Ons modulaire ontwerp op feature-niveau maakt efficiënte modelupdates en snelle aanpassing aan veranderende gedragspatronen mogelijk.
Het betrouwbaar laten functioneren van onze end-to-end-workflow voor leeftijdsverificatie is evenzeer een uitdaging op het gebied van gedistribueerde systemen als een uitdaging op het gebied van ML. Leeftijdsschatting is op zich al een moeilijk ML-probleem, omdat leeftijdsgrenzen geen scherpe gedragsgrenzen zijn. Ouders kunnen dezelfde ervaringen beleven als hun kinderen, en taal varieert niet alleen naar leeftijd, maar ook per cultuur, context en gemeenschap. Geen enkel gedragssignaal kan op betrouwbare wijze genuanceerde gedragspatronen vastleggen die in de loop van de tijd en onder vijandige druk veranderen. Zelfs onze sterkste ‘ground truth’-labels zijn afkomstig van een geselecteerde populatie en kunnen vooringenomenheid bevatten.
Het werken op de schaal van Roblox voegt extra complexiteit toe. In elke dagelijkse inferentiecyclus verzamelen we gedragssignalen van over het hele platform, draaien we submodellen op de computerstack die het meest geschikt is voor elke werklast, en combineren we hun outputs tot één gekalibreerde schatting. Onze modellen variëren van traditionele ML-classificatoren tot meertalige transformers met meer dan 300 miljoen parameters. Het systeem verwerkt dagelijks bijna twee miljard records op accountniveau, terwijl de training gebruikmaakt van bijna 30 miljoen leeftijdslabels met een hoge betrouwbaarheid.
Door het hele systeem in eigen beheer te bouwen, beschikken we over de transparantie en controle die we nodig hebben om alle functies en signalen te toetsen op privacy, wat een centrale ontwerpvereiste is. We kunnen ook Roblox-specifieke signalen gebruiken die vastleggen hoe een account in de loop van de tijd wordt gebruikt – longitudinale context waarover een op zichzelf staande externe schatter op eigen kracht niet zou beschikken. Het geeft ons ook controle over de volledige ML-levenscyclus. We kunnen modaliteiten combineren zodra ze beschikbaar komen, en de output afstemmen op de veiligheidsworkflows van Roblox, terwijl we individuele componenten monitoren, filteren en bijwerken naarmate het gedrag verandert.
De juiste signalen kiezen om de leeftijd te voorspellen
Verschillende leeftijdsgroepen navigeren op Roblox op verschillende manieren wat betreft spel-, communicatie- en platforminteractiepatronen. Om de diversiteit in gedrag vast te leggen, splitsen we onze input op in verschillende signaalgroepen:
- Sociale context: geaggregeerde patronen in de sociale kring van een gebruiker, inclusief met wie ze contact hebben en hoe vaak ze interactie hebben.
- Ervaringsbetrokkenheid: geaggregeerde patronen die verder gaan dan wat gebruikers spelen, waarbij wordt vastgelegd wanneer ze spelen, hoe lang ze blijven en hoe hun betrokkenheid in de loop van de tijd verandert.
- Account- en platformactiviteit: geaggregeerde signalen over platformgebruik en levenscyclus, zoals de duur van het account, de frequentie van activiteiten en gedrag op sessieniveau.
- Communicatiepatronen: uit modellen afgeleide samenvattingen van leeftijdsgebonden taalgebruik, inclusief hoe communicatiepatronen variëren per context en in de tijd.
- Aangeleerde gebruikersrepresentaties: representaties op hoger niveau die bredere gebruikspatronen vastleggen. We werken nauw samen met ons ML-team voor Ontdekking en Personalisatie; dezelfde rijke representaties die voorspellen waarmee een gebruiker zich vervolgens bezig zou kunnen houden, kunnen achteraf worden getraind om voorspellingen te doen voor brede leeftijdsgroepen.
Elke signaalfamilie krijgt een model dat is afgestemd op de vorm van de bijbehorende gegevens. Schaarse, hoogdimensionale geaggregeerde signalen worden verwerkt door gradient-boosted beslissingsbomen (bijv. XGBoost-classificatoren); tekst wordt verwerkt door een nauwkeurig afgestemde meertalige transformer-encoder (mmBERT); en gebruikersrepresentaties voeden een aantal compacte neurale netwerken (Multilayer Perceptron).
Elk submodel voorspelt hetzelfde doel: een waarschijnlijkheidsverdeling over een reeks leeftijdsgroepen. Een gradient-boosted meta-learner combineert vervolgens die waarschijnlijkheidsvectoren tot de uiteindelijke gekalibreerde schatting.

We hebben bewust gekozen voor deze fusiebenadering op beslissingsniveau in plaats van één monolithisch model op kenmerkniveau, met het oog op modulariteit, snelheid en verklaarbaarheid. Door het systeem modulair op te zetten, kunnen we een submodel toevoegen, opnieuw trainen of buiten gebruik stellen zonder het hele systeem opnieuw te hoeven opbouwen. Het stelt ons ook in staat sneller te reageren wanneer gedragspatronen verschuiven als gevolg van natuurlijke evolutie of vijandige druk. De fusielaag leest de meest recente gepromote output van elk submodel, zodat deze de best beschikbare signalen kan gebruiken en op een soepele manier kan terugschakelen wanneer een signaal ontbreekt of vertraagd is. Omdat elke modaliteit als een afzonderlijke input binnenkomt, kunnen we nagaan welke signaalgroepen beslissingswijzigingen aansturen, en kalibratie- en kwaliteitscontroles toepassen voordat de outputs verderop in het proces worden gebruikt.
We dwingen kalibratie af op de fusielaag omdat in een veiligheidssysteem voorspelbaarheid belangrijker is dan pure nauwkeurigheid. We kalibreren de modellen zodat ze ons betrouwbaarheidsscores geven waarop we kunnen vertrouwen. Op die manier kunnen we, als een actie verderop in het proces grote gevolgen heeft voor een gebruiker, sterker bewijs en een hogere betrouwbaarheidseis stellen voordat we tot actie overgaan.
Selectiebias in labels
Onze labels met de hoogste betrouwbaarheid zijn afkomstig van gebruikers die een strenge leeftijdscontrole hebben doorlopen. Deze labels zijn nuttig, maar vormen geen willekeurige steekproef van Roblox-gebruikers. Voor een systeem dat de toegang van gebruikers kan beïnvloeden, is representativiteit een essentieel onderdeel van de trainingsdoelstelling.
De gelabelde populatie is niet de doelpopulatie. Gebruikers die strengere leeftijdscontroles doorlopen, verschillen systematisch van de bredere populatie. Een naïef model dat op die groep is getraind, loopt het risico net zozeer te leren wie ervoor kiest het proces te doorlopen als dat het de leeftijd leert. Om die selectiebias te verminderen, wegen we de trainings- en evaluatiegegevens opnieuw, zodat de gelabelde steekproef een betere afspiegeling vormt van de populatie die we willen beoordelen.
We werken functieoverschrijdend samen met het gebruikersonderzoek en gebruiken geaggregeerde enquêteresultaten om de doelpopulaties te bepalen die voor de weging worden gebruikt. Van daaruit passen we technieken toe zoals inverse propensity-weging en iteratieve proportionele aanpassing – of ‘raking’ – om de gewogen steekproef in meerdere dimensies tegelijk op één lijn te brengen, in plaats van voor één factor afzonderlijk te corrigeren.
Niet elke bron met een hoge betrouwbaarheid levert een bruikbaar trainingsvoorbeeld op. Een label is slechts zo betrouwbaar als de verificatiegebeurtenissen die eraan ten grondslag liggen. Sommige gebeurtenissen kunnen signalen bevatten waardoor ze ongeschikt zijn voor modeltraining, zoals ongebruikelijke verificatiepatronen of zorgen over de integriteit van het account.
We streven ernaar om labels vóór de training op te schonen met op integriteit gerichte label-filtering of benaderingen voor het identificeren van label-fouten, zoals Confident Learning, om voorbeelden te verwijderen die buiten de verdeling vallen voor gedragsmodellering. Vroege experimenten tonen aan dat dit soort opschoning helpt voorkomen dat het model overfit raakt en zorgt voor consistente prestatieverbeteringen.

Training, inferentie en het voorkomen van vertekening op Roblox-schaal
Inferentie moet vaak genoeg worden uitgevoerd om signalen actueel te houden, maar de trainingsfrequentie kan per signaalfamilie variëren. We kiezen hertrainingsschema's op basis van feature drift, modelstabiliteit en modelkosten. Een signaal dat snel verandert of verslechtert, kan vaker worden gehertraint; een zwaarder model met langzamer veranderende prestaties kan minder vaak of op aanvraag worden gehertraint.
De computerstack volgt de vorm van de werklast. We gebruiken Apache Spark voor grootschalige gestructureerde transformaties, het Ray-framework voor GPU-ondersteunde werklasten en productiewerkers voor realtime signaalverwerking.
Op de schaal van Roblox zou het ook niet praktisch zijn om elke dag de volledige geschiedenis van elk account opnieuw op te bouwen. Ons eigen framework voor gegevensverwerking onderhoudt begrensde, doorlopende geschiedenissen voor signalen met een hoog volume en voert kostbare transformaties in fasen uit. Hierdoor kunnen we dagelijks miljoenen records op accountniveau verwerken en aggregeren, terwijl we grote uitbreidingen, joins en feature-aggregaties onafhankelijk van elkaar kunnen opschalen. Dit hybride productieontwerp biedt ons directe integratie met ons datawarehouse, reproduceerbare uitvoering over modelcomponenten heen en toegang tot versnelde rekenkracht waar dat van belang is.
Om de stabiliteit op onze schaal te helpen handhaven, hanteren we twee strikte ontwerpbeslissingen in onze feature-pijplijnen:
- Afgeleide kenmerken opslaan: waar mogelijk slaan we afgeleide kenmerken op in plaats van ruwe activiteitsstromen. We bewaren het signaal dat we nodig hebben voor modellering, niet de volledige geschiedenis erachter.
- Uniforme datacontracten: Dezelfde datacontracten voeden zowel de training als de inferentie. Dat vermindert een van de meest voorkomende storingsbronnen in ML-systemen: afwijkingen tussen wat er is getraind en wat er wordt geleverd.
We passen gating toe op twee punten in de productielevenscyclus. Ten eerste is modelpromotie gescheiden van modeltraining. Een kandidaat-model moet ‘guardrail’-controles doorstaan voordat het in aanmerking komt voor inferentie in productie. Als een kandidaat niet door onze ‘guardrail’-controles komt, blokkeert de pijplijn de promotie en blijven we de laatst gepromote, goedgekeurde versie aanbieden.
Ten tweede wordt de inferentie-output aan een gate onderworpen voordat deze stroomafwaarts wordt gepubliceerd. Geautomatiseerde controles zoeken naar kwaliteitsverslechteringen en grote verschuivingen in de voorspellingsverdeling. Als een controle mislukt, wordt de publicatiestap geblokkeerd. In een ML-systeem dat is gekoppeld aan veiligheidsworkflows voor gebruikers, is ‘vandaag niets doen’ vaak een veiligere foutmodus dan het doorvoeren van een onverklaarbare verschuiving in de verdeling.
Het systeem meten
Voor een systeem als dit is één enkel nauwkeurigheidscijfer niet erg zinvol. We beoordelen de modelkwaliteit op basis van de kwaliteit van de rangschikking, kalibratie, stabiliteit in de tijd en het gedrag in de buurt van belangrijke leeftijdsgroepgrenzen. We beschouwen de representativiteit van de evaluatiegegevens ook als onderdeel van het meetprobleem, omdat een totale verbetering alleen zinvol is als deze een afspiegeling is van de populatie waarvoor het systeem bedoeld is.
Het samengevoegde model bereikt een gemiddelde precisie van meer dan 0,9 op deze gewogen, apart gehouden evaluatiegegevens. De schattingen met een hoge betrouwbaarheid zijn ook van dag tot dag consistent. Meer dan 99% blijft op opeenvolgende dagen in dezelfde brede leeftijdsgroep.
We vergelijken het model ook met onafhankelijke ‘ground truth’-gegevens die zijn geproduceerd door getrainde menselijke beoordelaars via onze Trust and Safety-workflows. Bij een hoge betrouwbaarheid komt de leeftijdsgroepschatting van het model in meer dan 80% van de gevallen overeen met het door mensen vastgestelde consensuslabel voor volwassenen.
Offline-evaluatie is slechts één aspect. In de productie verandert het gebruikersgedrag door seizoensinvloeden, productlanceringen en vijandige druk. Daarom combineren we modelevaluatiestatistieken met voortdurende monitoring van voorspellingsverdelingen, afwijkingen en stabiliteit voordat de output verderop in het proces wordt gebruikt. We monitoren ook de resultaten van vervolggecontroles op leeftijd, zodat feedback uit de productie de betrouwbaarheid van het model kan onderbouwen en kan aangeven waar drempels of beoordelingspaden moeten worden aangepast.
Wat nu?
Doordat we dit systeem in eigen beheer hebben, kunnen we Roblox-specifieke signalen veilig benutten, uiterst nauwkeurig te werk gaan en continu itereren.
In de toekomst richten we ons op het optimaliseren van onze submodellen, inferentie en metingen. We verleggen de grenzen van elke laag, waarbij we ons blijven richten op onze operationele principes van modulariteit, kalibratie, privacy en productiebeperkingen.


