De meest beperkte computer die de meeste mensen ooit zullen gebruiken, is de computer waarop u dit leest. Niet de telefoon. Het tabblad.
Een browsertabblad heeft geen installatieprogramma, geen grafische kaart waarop het kan rekenen, een paar honderd megabyte geheugen voordat het misgaat, en een gebruiker van wie het geduld met een voortgangsbalk in seconden wordt gemeten. Het is de slechtste plek in de moderne informatica voor een neuraal netwerk. Wij hebben het onze daar met opzet neergezet.
Waarom het model in het tabblad moet draaien
Anonimisering als dienst is een tegenspraak. Om haar te gebruiken uploadt u het vertrouwelijke document naar het bedrijf dat belooft het te beschermen. U hebt uw risico niet verkleind. U hebt het verplaatst, en er een verwerker bij gehaald.
Onze detectie draait daarom in uw browser: het lezen van de PDF, de tekenherkenning op gescande pagina's, en het model dat doorheeft dat Margarida Rodrigues een persoon is en 1249-300 Lisboa een adres, in zeven talen, zonder dat iemand zegt welke. Dat betekent dat het model in één tabblad moet passen. De eerste versie paste niet.
De alfabetbelasting
Onze detector begint als een meertalig BERT, bijgetraind om namen, organisaties en plaatsen te vinden. Prima model. Het sleept alleen wel een woordenlijst van 119.547 tokens voor 104 talen met zich mee.
Wij bieden er zeven aan: Engels, Frans, Duits, Spaans, Italiaans, Nederlands en Portugees. Allemaal in Latijns schrift.
Bij 768 dimensies is die woordenlijst zo'n 92 MB van een bestand van 178,5 MB — meer dan de helft van het model, en ruwweg 97% van alles wat een eerste bezoeker binnenhaalt. Erin zitten devanagari, cyrillisch, hangul, Thais, Armeens, Hebreeuws, Arabisch, kana en dertienduizend ideogrammen. Door iedere gebruiker gedownload. Door niemand gebruikt.
Noem het de alfabetbelasting. Elke bezoeker betaalt om 104 talen mee te zeulen om er één te lezen. En dan het deel waar we minder trots op zijn: het gereedschap dat dit oplost hadden we allang geschreven en bewezen dat het niets verslechterde — en toen lieten we het staan als een optioneel commando dat niemand uitvoerde. Een bouwstap die vrijblijvend is, is een bouwstap die nergens gebeurt.
Rijen wissen, geen foto's comprimeren
Het standaardantwoord is distillatie: een klein leerlingmodel trainen om een groot leraarmodel na te doen. Dat werkt, en het ruilt nauwkeurigheid in voor omvang — geen ruil die je stilletjes maakt in gereedschap waarvan het hele vak is om niets te missen. Dus deden we het niet.
Wat we wél deden lijkt meer op het wissen van ongebruikte rijen uit een spreadsheet. Geen enkel encodergewicht wordt aangeraakt: de twaalf lagen die het echte begrijpen doen, zijn letterlijk gekopieerd. De woordenlijst is per tensor gekwantiseerd, dus een bewaarde rij houdt precies dezelfde waarde, of haar buren er nu nog zijn of niet. En de tokenizer pakt altijd het langste beschikbare stuk: alleen stukken weghalen die in Latijns schrift toch onbereikbaar waren, laat Latijnse tekst exact hetzelfde opgedeeld.
Resultaat: van 119.547 tokens naar 68.875. Van 178,5 MB naar 139,6 MB, ongeveer 100 MB over de lijn. En de bewering is niet "vrijwel identiek". We hebben beide modellen over 77 echte documenten in alle zeven talen gehaald: nul verschillen in hoe de tekst werd opgedeeld, nul verschillen over 2.219 gevonden entiteiten, en een maximaal verschil in modeluitvoer van 0,0000000000. Geen kleiner model dat het ongeveer even goed doet. Hetzelfde model, zonder de ballast.
Er komen was goed voor één slechte week. Token-identificatiecodes staan op drie plekken in het tokenizerbestand; we werkten er twee bij. Alle tests slaagden, de tekst werd identiek opgedeeld, en het model gaf op zestig documenten stilletjes andere antwoorden. De regel die we eraan overhielden: vergelijk de ruwe modeluitvoer, nooit de lijst met entiteiten. Twee lijsten met entiteiten kunnen het toevallig eens zijn.
Twee keer wilden we verder gaan
De woordenlijst is nog altijd een derde van wat er over is, grotendeels Latijns schrift voor talen die we niet aanbieden. Er leek nog 30 à 40 megabyte te halen. Het is geen afweging. Het is een afgrond.
58.000 van de 68.875 Latijnse tokens houden — 84% ervan — leverde 8 MB op en kostte 13% van alle vondsten. Toen de proef die de discussie besliste: een lijst met uitsluitend de tokens die onze testdocumenten echt gebruiken — 22.800 gehouden, 46.000 weggegooid — gaf een tot op de bit identieke opdeling en 100% overeenstemming. Een kleine woordenlijst kost dus niets. Het is het ontbrekende token dat alles kost. Er is geen curve om op af te stemmen, en het opnieuw opdelen treft zeldzame woorden het hardst — en dat is nu precies wat eigennamen zijn.
Eén getal gaf de doorslag. De Latijnse tekens van de talen waarin we niet verkopen — het Turkse ğ ı, het Vietnamese ư ạ ế, het Roemeense ă ț, het Tsjechische ř ů, het Hongaarse ő, het Noordse ø — zijn samen 4.200 stukken. 3,2 MB. Dat is het alfabet van elke buitenlandse naam in een Europees contract: persoonsgegevens in zuivere vorm, in juist die documenten die ze het vaakst bevatten, voor drie megabyte. Als onze detectie hapert op uw naam omdat uw naam Turks is, hebben we het verkeerde product gebouwd.
Tweede poging: DistilBERT — zes lagen in plaats van twaalf, zo'n 70 MB over de lijn tegen onze 100. Daarna hebben we het gemeten tegen 137 met de hand gecontroleerde entiteiten. De detectie zakte van 77,2% naar 73,5% — weinig genoeg om het voor jezelf goed te praten. Maar het gemiddelde verbergt de vorm: Duits verloor 13 punten, Engels 9, Spaans 22. En de twee modellen waren het over slechts 76% van hun vondsten eens. Het vond niet minder entiteiten. Het vond een andere verzameling van ongeveer dezelfde omvang. Met "minder" valt te werken. Met "anders" niet.
Minuscule
Het model dat wij uitleveren heet Minuscule. De Karolingische minuskel was het schrift dat in de achtste eeuw in het rijk van Karel de Grote werd gestandaardiseerd — één helder Latijns schrift, bewust smal gehouden, en precies daarom kon een kopiist in Aken een in Tours overgeschreven handschrift lezen. Veel talen, één alfabet, niets erbij. En verder: heel klein.
68.875 tokens. 139,6 MB op schijf, ongeveer 100 MB die één keer over de lijn gaan en daarna blijvend in de cache staan. Geen enkel encodergewicht gewijzigd ten opzichte van het model waarvan het afstamt. Het draagt zijn eigen bouwkaart mee — bronmodel, instellingen, omvang van de woordenlijst, de controlesom van zijn eigen gewichten — want een model dat niet kan vertellen waar het vandaan komt, heeft niets te zoeken bij wat u probeert te beschermen. Het staat op Hugging Face — gewichten, tokenizer en bouwkaart — zodat u de cijfers hierboven zelf kunt narekenen in plaats van ons op ons woord te geloven.
Wat honderd megabyte oplevert
Op dit moment plakt ergens een juridisch medewerker het contract van een cliënt in een chatvenster. Een verpleegkundige uploadt een ontslagbrief. Een hulpverlener zet het dossier van een gezin op een gratis vertaalsite. Het zijn geen roekeloze mensen. Ze lopen achter. De goedgekeurde route vraagt een ticket, een veiligheidsbeoordeling en twee weken, en de deadline is donderdag.
De enige versie van "beschermd" die het ooit wint, is de versie die al openstaat. Geen installatie, geen beheerdersrechten, geen toestemming, geen overleg. Dus een browsertabblad. Dus een model dat in een browsertabblad past. En dáárom hebben volwassen mensen een week lang gediscussieerd over 3,2 megabyte Turkse diakritische tekens.
Ondankbaar werk, onzichtbaar van opzet. Maar het eindigt bij iemand achter een laptop, in een kantoor dat u nooit zult zien, die zijn werk op tijd aflevert — en de naam van de cliënt heeft de kamer nooit verlaten. Honderd megabyte, één keer. Daarna is het van u.
Veelgestelde vragen
Gaat een model minder nauwkeurig werken als je er woorden uit haalt?
Niet wanneer de verwijderde woordenlijst in de ondersteunde talen toch onbereikbaar was. Er wordt geen encodergewicht gewijzigd en elke bewaarde rij wordt bit voor bit gekopieerd, dus voor Latijns schrift is het resultaat numeriek identiek aan het origineel: wij maten nul verschillen over 2.219 entiteiten in 77 documenten. Snijden in woorden die het model wel kan bereiken is iets heel anders, en daar zakt de kwaliteit hard weg.
Waarom niet gewoon een kleiner model gebruiken?
Geprobeerd. Een DistilBERT met zes lagen uit dezelfde familie komt op zo'n 70 MB over de lijn tegen onze 100, maar scoorde 73,5% tegen 77,2% op onze gecontroleerde set, en het gemiddelde verborg 22 verloren punten Spaans en 13 Duits. Bovendien was het het met het uitgeleverde model over slechts 76% van zijn vondsten eens: een andere verzameling entiteiten, geen kleinere. Onze vergelijking met Microsoft Presidio legt uit hoe we dat meten.
Kan een model van deze omvang echt in een browsertabblad draaien?
Ja, met twee kanttekeningen. De download gebeurt één keer en staat daarna in de cache van uw apparaat, en het model moet bij elke start alsnog tot een sessie worden gecompileerd — vandaar de laadbalk bij het eerste gebruik. Al het overige is lokaal: er wordt geen pagina van uw document geüpload. Waarom we onze eigen detectiemotor bouwden beschrijft de rest van de keten.
Welke talen dekt het, en wat gebeurt er met de rest?
Engels, Frans, Duits, Spaans, Italiaans, Nederlands en Portugees, plus elke andere taal in Latijns schrift waarvan de tekens in de woordenlijst zijn blijven staan: Turkse, Vietnamese, Roemeense, Tsjechische, Hongaarse en Noordse tekens zijn met opzet bewaard, omdat buitenlandse namen voortdurend in Europese contracten opduiken. Een taal in een verwijderd schrift, zoals Japans, vraagt een eigen modelpakket in plaats van één gedeeld model dat bij elke nieuwe taal groeit.