{"id":53143,"date":"2019-11-24T00:00:00","date_gmt":"2019-11-23T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru"},"modified":"2020-02-18T14:01:00","modified_gmt":"2020-02-18T11:01:00","slug":"ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru","status":"publish","type":"post","link":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru","title":{"rendered":"De toepassing van machine learning in Mail.ru","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/ee5728dccb94b849ad3bfd9cf84ad74d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ge\u00efnspireerd door mijn presentaties op Highload++ en DataFest Minsk 2019.<\/i><\/p>\n<p>Voor veel mensen is e-mail vandaag de dag een onmisbaar onderdeel van het leven op het web. Hiermee voeren we zakelijke correspondentie, bewaren we allerlei belangrijke informatie met betrekking tot financi\u00ebn, hotelreserveringen, het plaatsen van bestellingen en nog veel meer. In het midden van 2018 hebben we een productstrategie voor de ontwikkeling van e-mail geformuleerd. Hoe moet moderne e-mail zijn?<\/p>\n<p>E-mail moet <b>slim<\/b>, dat wil zeggen gebruikers helpen navigeren in de toenemende hoeveelheid informatie: filteren, structureren en deze op de meest handige manier aanbieden. Het moet <b>nuttige<\/b>, waardoor het mogelijk is verschillende taken direct in de inbox uit te voeren, bijvoorbeeld het betalen van boetes (een functie die ik, tot mijn verdriet, gebruik). En daarbij moet e-mail uiteraard informatiebeveiliging bieden, spam blokkeren en beschermen tegen hacks, dat wil zeggen het moet <b>veilige<\/b>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDeze richtingen bepalen een aantal belangrijke taken, waarvan veel effectief kunnen worden opgelost met behulp van machine learning. Hier zijn voorbeelden van al actieve functies die zijn ontwikkeld in het kader van de strategie \u2014 \u00e9\u00e9n per richting.<\/p>\n<ul>\n<li><b>Slimme Antwoord<\/b>. In de e-mail is er een functie voor slimme antwoorden. De neural net analyseert de tekst van de e-mail, begrijpt de betekenis en het doel, en stelt vervolgens drie meest geschikte antwoordopties voor: positief, negatief en neutraal. Dit helpt aanzienlijk tijd te besparen bij het beantwoorden van e-mails, en bovendien vaak op een onconventionele en grappige manier te reageren.\n<\/li>\n<li><b>Groepering van e-mails<\/b>, die betrekking hebben op bestellingen bij webwinkels. We doen vaak aankopen op het internet, en meestal kunnen winkels meerdere e-mails per bestelling sturen. Bijvoorbeeld, van AliExpress, de grootste dienst, komen er veel e-mails voor \u00e9\u00e9n bestelling, en we hebben berekend dat in het uiterste geval dit aantal kan oplopen tot 29. Dus met behulp van het model Named Entity Recognition halen we het bestellingsnummer en andere informatie uit de tekst en groeperen we alle e-mails in \u00e9\u00e9n thread. We tonen ook de belangrijkste informatie over de bestelling in een aparte balk, wat het werken met dit type e-mails vergemakkelijkt.\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/8b37b0bf0c0d152498027bc25d476128.jpg\" style=\"display:block;margin: 0 auto;\" \/>\n<\/li>\n<li><b>Anti-phishing<\/b>Phishing is a particularly dangerous type of fraud that attackers use to gain access to financial information (including users' credit card details) and login credentials. These emails mimic legitimate ones sent by services, including their visual appearance. Therefore, we use Computer Vision to recognize the logos and design styles of major companies' emails (for example, Mail.ru, Sber, Alfa) and take this into account along with text and other features in our spam and phishing classifiers.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Machine learning<\/h2>\n<p>\nA little about machine learning in email overall. Email is a high-load system: our servers handle an average of 1.5 billion emails daily for 30 million DAU users. Around 30 machine learning systems serve all necessary functions and features. <\/p>\n<p>Each email passes through a complete classification pipeline. First, we filter out spam and retain good emails. Users often do not notice the anti-spam work, as 95-99% of spam doesn\u2019t even reach the appropriate folder. Spam detection is a very important part of our system and the most complex, as there is constant adaptation between protection systems and attacks, which presents a continuous engineering challenge for our team.<\/p>\n<p>Next, we separate emails from people and robots. Human emails are the most important, so we provide features such as Smart Reply for them. Robot emails are divided into two parts: transactional \u2014 these are important emails from services, such as order confirmations or hotel reservations, finances, and informational \u2014 these are business promotions and discounts. <\/p>\n<p>We believe that transactional emails are as important as personal correspondence. They should be readily available, as it is often necessary to quickly find information about an order or a flight booking, and we waste time searching for these emails. Therefore, for convenience, we automatically divide them into six main categories: travel, orders, finances, tickets, registrations, and finally, fines.<\/p>\n<p>Informatieve e-mails zijn de grootste en waarschijnlijk de minst belangrijke groep, die geen onmiddellijke reactie vereisen, aangezien er niets wezenlijks in het leven van de gebruiker verandert als hij zo'n e-mail niet leest. In onze nieuwe interface bundelen we ze in twee threads: sociale netwerken en nieuwsbrieven, waardoor we de inbox visueel opruimen en alleen belangrijke e-mails zichtbaar laten.<\/p>\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/175773879daaa29d1542a98070cb7972.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Exploitatie<\/h3>\n<p>\nEen groot aantal systemen zorgt voor veel moeilijkheden in gebruik. Modellen degraderen na verloop van tijd, net als elke software: functies falen, machines weigeren, en er accumuleert defecte code. Bovendien veranderen de gegevens voortdurend: nieuwe worden toegevoegd, en het gedragspatroon van gebruikers transformeert, enzovoort. Daarom zal een model zonder de juiste ondersteuning na verloop van tijd steeds slechter presteren. <\/p>\n<p>We moeten ook niet vergeten dat hoe dieper machine learning doordringt in het leven van gebruikers, hoe groter de invloed die ze uitoefenen op het ecosysteem, en als gevolg daarvan, hoe meer financi\u00eble verliezen of winsten spelers op de markt kunnen behalen. Daarom passen steeds meer spelers zich aan om met ML-algoritmes te werken (klassieke voorbeelden zijn advertenties, zoekopdrachten en de eerder genoemde anti-spam).<\/p>\n<p>Ook hebben machine learning-taken de eigenschap dat elke, zelfs onbeduidende, wijziging in het systeem veel werk met het model kan veroorzaken: werken met gegevens, hertrainen, implementatie, wat weken of maanden kan duren. Hoe sneller de omgeving waarin uw modellen opereren verandert, hoe meer inspanningen nodig zijn voor hun ondersteuning. Een team kan veel systemen cre\u00ebren en daar tevreden over zijn, maar vervolgens bijna al zijn middelen aan hun ondersteuning besteden, zonder de mogelijkheid om iets nieuws te doen. We hebben ooit zo'n situatie meegemaakt in het anti-spamteam. En we trokken de voor de hand liggende conclusie dat onderhoud geautomatiseerd moet worden.<\/p>\n<h3>Automatisering<\/h3>\n<p>\nWat kan er geautomatiseerd worden? Eigenlijk bijna alles. Ik heb vier richtingen ge\u00efdentificeerd die de infrastructuur van machine learning bepalen:<\/p>\n<ul>\n<li>gegevensverzameling;\n<\/li>\n<li>verder leren;\n<\/li>\n<li>implementatie;\n<\/li>\n<li>testen &amp; monitoring.\n<\/li>\n<\/ul>\n<p>\nAls de omgeving onstabiel is en voortdurend verandert, dan is de gehele infrastructuur rond het model veel belangrijker dan het model zelf. Het kan een oude vertrouwde lineaire classifier zijn, maar als je de kenmerken op de juiste manier aanlevert en zorgt voor goede feedback van gebruikers, zal het veel beter werken dan State-Of-The-Art-modellen met al hun franje.<\/p>\n<h4>Feedbackcyclus<\/h4>\n<p>\nDeze cyclus omvat gegevensverzameling, bijscholing en deployment \u2014 in wezen de volledige cyclus van modelupdates. Waarom is dit belangrijk? Kijk naar de registratiegrafiek in de e-mail:<\/p>\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/f3c98bd49a101754cf299821a40e2b8e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEen machine learning-ontwikkelaar heeft een anti-botmodel ge\u00efmplementeerd dat voorkomt dat bots zich registreren in de e-mail. De grafiek daalt tot een niveau waarop alleen echte gebruikers overblijven. Alles is geweldig! Maar na vier uur passen botmakers hun scripts aan en alles komt weer op dezelfde plek terug. Tijdens deze implementatie heeft de ontwikkelaar een maand besteed aan het toevoegen van kenmerken en het bijscholen van het model, maar de spammer kon zich in vier uur aanpassen.<\/p>\n<p>Om te voorkomen dat het zo pijnlijk is en je later alles moet herzien, moet je in eerste instantie nadenken over hoe de feedbackcyclus eruit zal zien en wat we zullen doen als de omgeving verandert. Laten we beginnen met gegevensverzameling \u2014 dit is de brandstof voor onze algoritmen.<\/p>\n<h2>Gegevensverzameling<\/h2>\n<p>\nHet is duidelijk dat moderne neurale netwerken beter presteren met meer gegevens, en die worden in feite gegenereerd door de gebruikers van het product. Gebruikers kunnen ons helpen door gegevens te labelen, maar we moeten hier niet misbruik van maken, omdat de gebruikers op een gegeven moment moe kunnen worden van het bijscholen van jouw modellen en naar een ander product kunnen overstappen. <\/p>\n<p>Een van de meest voorkomende fouten (hier maak ik een verwijzing naar Andrew Ng) \u2014 is te veel gericht zijn op metrics van de testdataset in plaats van op feedback van de gebruiker, wat in feite de belangrijkste maatstaf is voor de kwaliteit van het werk, aangezien we een product voor de gebruiker cre\u00ebren. Als de gebruiker de werking van het model niet begrijpt of niet leuk vindt, dan is alles tevergeefs. <\/p>\n<p>Daarom moet de gebruiker altijd de mogelijkheid hebben om te stemmen; we moeten hem een instrument voor feedback geven. Als we denken dat er een e-mail in de inbox is die betrekking heeft op financi\u00ebn, moeten we deze markeren als 'financi\u00ebn' en een knop ontwerpen die de gebruiker kan indrukken en zeggen dat dit geen financi\u00ebn is.<\/p>\n<h3>Kwaliteit van de feedback<\/h3>\n<p>\nLaten we het hebben over de kwaliteit van gebruikersfeedback. Ten eerste kunnen jij en de gebruiker verschillende betekenissen toekennen aan hetzelfde begrip. Bijvoorbeeld, jij en de productmanagers beschouwen 'financi\u00ebn' als bankbrieven, terwijl de gebruiker denkt dat een brief van grootmoeder over een pensioen ook onder financi\u00ebn valt. Ten tweede zijn er gebruikers die zonder nadenken op knoppen drukken zonder enige logica. Ten derde kan de gebruiker zich diep vergissen in zijn conclusies. Een mooi voorbeeld uit onze praktijk is de implementatie van een classifier <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9D%D0%B8%D0%B3%D0%B5%D1%80%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D0%B8%D1%81%D1%8C%D0%BC%D0%B0\">van Nigeriaanse spam<\/a><\/noindex>, een vrij amusant type spam waarbij de gebruiker wordt aangeboden om miljoenen dollars te innen van een plotseling ontdekte verre verwant in Afrika. Na de implementatie van deze classifier hebben we de 'Niet spam'-klikken op deze brieven gecontroleerd en bleek dat 80% ervan volle Nigeriaanse spam was, wat aangeeft dat gebruikers extreem na\u00efef kunnen zijn.<\/p>\n<p>En laten we niet vergeten dat niet alleen mensen op knoppen kunnen klikken, maar ook allerlei bots die zich voordoen als browsers. Dus rauwe feedback is niet geschikt voor training. Wat kunnen we met deze informatie doen?<\/p>\n<p>We passen twee benaderingen toe: <\/p>\n<ul>\n<li><b>Feedback van gerelateerde ML<\/b>. Bijvoorbeeld, we hebben een online anti-bot systeem dat, zoals ik al noemde, snel beslissingen neemt op basis van een beperkt aantal kenmerken. En er is een tweede, langzame systeem dat post factum werkt. Dit systeem heeft meer gegevens over de gebruiker, zijn gedrag, enzovoort. Als gevolg hiervan wordt de meest weloverwogen beslissing genomen, waardoor het een hogere nauwkeurigheid en volledigheid heeft. We kunnen de verschillen in werking van deze systemen als trainingsgegevens voor het eerste systeem gebruiken. Op die manier zal het eenvoudigere systeem altijd proberen de prestaties van het complexere systeem te benaderen.\n<\/li>\n<li><b>Klikclassificatie<\/b>. Je kunt elke gebruikersklik eenvoudig classificeren, de geldigheid en bruikbaarheid ervan evalueren. Dit doen we in de anti-spam van e-mail door gebruik te maken van gebruikerskenmerken, hun geschiedenis, kenmerken van de afzender, de tekst zelf en de resultaten van de classificators. Uiteindelijk verkrijgen we een automatisch systeem dat de gebruikersfeedback valideert. En omdat het veel minder vaak hoeft te worden bijgeschoold, kan het de basis worden voor alle andere systemen. De belangrijkste prioriteit in dit model is precision, want het trainen van het model op onnauwkeurige gegevens kan ernstige gevolgen hebben. \n<\/li>\n<\/ul>\n<p>\nTerwijl we de data schoonmaken en onze ML-systemen bijscholen, mogen we de gebruikers niet vergeten, want voor ons zijn duizenden, miljoenen fouten op de grafiek statistiek, terwijl voor de gebruiker elke bug een tragedie is. Naast het feit dat de gebruiker op een of andere manier met jouw fout in het product moet omgaan, verwacht hij na feedback dat een soortgelijke situatie in de toekomst wordt uitgesloten. Daarom is het altijd belangrijk om gebruikers niet alleen de mogelijkheid te geven om te stemmen, maar ook om het gedrag van ML-systemen te corrigeren, bijvoorbeeld door persoonlijke heuristieken te cre\u00ebren voor elk klik van feedback. In het geval van e-mail kan dit de mogelijkheid zijn om soortgelijke berichten te filteren op basis van afzender en onderwerp voor deze gebruiker.<\/p>\n<p>Daarnaast moet je op basis van bepaalde rapporten of verzoeken bij de klantenservice de model bijschaven in een semi-automatische of handmatige modus, zodat andere gebruikers ook niet lijden onder soortgelijke problemen.<\/p>\n<h3>Heuristieken voor training<\/h3>\n<p>\nBij deze heuristieken en tijdelijke oplossingen zijn er twee problemen. Ten eerste is het moeilijk om het voortdurend groeiende aantal tijdelijke oplossingen te onderhouden, om nog maar te zwijgen over hun kwaliteit en werking op lange termijn. Het tweede probleem is dat een fout niet frequent kan zijn, en dat enkele klikken onvoldoende kunnen zijn voor het bijscholen van het model. Het lijkt erop dat deze twee niet-verbonden effecten aanzienlijk kunnen worden verminderd als de volgende aanpak wordt toegepast.<\/p>\n<ol>\n<li>We cre\u00ebren een tijdelijke oplossing. \n<\/li>\n<li>We sturen gegevens van deze oplossing naar het model, dat regelmatig bijgeleerd wordt, ook op basis van de verkregen gegevens. Het is hier uiteraard belangrijk dat de heuristiek een hoge nauwkeurigheid heeft, om de kwaliteit van de gegevens in de trainingsset niet te verminderen. \n<\/li>\n<li>Vervolgens zetten we monitoring in voor de uitval van de tijdelijke oplossing, en als deze na een bepaalde tijd niet meer nodig is en volledig wordt overgenomen door het model, kan deze gerust worden verwijderd. Dit probleem zal waarschijnlijk niet opnieuw optreden.\n<\/li>\n<\/ol>\n<p>\nDus het leger van tijdelijke oplossingen is zeer nuttig. Het belangrijkste is dat hun inzet tijdelijk is en niet permanent. <\/p>\n<h2>Fijnslijpen<\/h2>\n<p>\nFijnslijpen is het proces van het toevoegen van nieuwe gegevens, verkregen uit feedback van gebruikers of andere systemen, en het trainen van het bestaande model daarop. Er kunnen verschillende problemen zijn bij het fijnslijpen:<\/p>\n<ol>\n<li>Het model ondersteunt misschien gewoon geen fijnslijpen en kan alleen vanaf nul worden getraind. \n<\/li>\n<li>Er staat nergens in het boek der natuur geschreven dat fijnslijpen zeker de kwaliteit van het werk in productie zal verbeteren. Vaak gebeurt het tegenovergestelde, wat betekent dat verslechtering mogelijk is.\n<\/li>\n<li>Veranderingen kunnen onvoorspelbaar zijn. Dit is een heel subtiel punt dat we voor onszelf hebben vastgesteld. Zelfs als een nieuw model in een A\/B-test vergelijkbare resultaten laat zien als de huidige, betekent dat absoluut niet dat het identiek zal functioneren. Hun prestaties kunnen verschillen in een percentage dat nieuwe fouten kan introduceren of al eerder gecorrigeerde fouten kan terugbrengen. We hebben geleerd met de huidige fouten te leven, en wanneer zich een groot aantal nieuwe fouten voordoet, kan de gebruiker ook niet begrijpen wat er aan de hand is, aangezien hij voorspelbaar gedrag verwacht.\n<\/li>\n<\/ol>\n<p>\nDaarom is het belangrijkste bij het fijnslijpen dat we het model gegarandeerd verbeteren, of op zijn minst niet verslechteren. <\/p>\n<p>Het eerste wat in me opkomt als we het over fijnslijpen hebben, is de Active Learning-benadering. Wat betekent dit? Bijvoorbeeld, de classifier bepaalt of een brief tot de financi\u00ebn behoort, en rond de grens van zijn beslissing voegen we een steekproef toe van gemerkte voorbeelden. Dit werkt goed, bijvoorbeeld in de reclame, waar veel feedback is en het model in real-time kan worden getraind. Maar als er weinig feedback is, krijgen we een sterk vertekende steekproef ten opzichte van de productie-indeling van gegevens, waarop het gedrag van het model in gebruik niet kan worden ge\u00ebvalueerd.<\/p>\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/fd1b3e07bfaf896dde3248e43537f61a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEigenlijk is ons doel om oude patronen, al bekende modellen, te behouden en nieuwe aan te nemen. Hier is continu\u00efteit belangrijk. Het model dat we vaak met veel moeite hebben uitgerold, werkt al, dus kunnen we ons baseren op de prestaties ervan. <\/p>\n<p>In e-mail worden verschillende modellen toegepast: bomen, lineaire, neurale netwerken. Voor elk ontwikkelen we een eigen bijscholingsalgoritme. Tijdens het bijscholingsproces krijgen we niet alleen nieuwe gegevens, maar vaak ook nieuwe kenmerken, die we in alle onderstaande algoritmen zullen meenemen.<\/p>\n<h3>Lineaire modellen<\/h3>\n<p>\nLaten we zeggen dat we logistische regressie hebben. We stellen de verliesfunctie van het model samen uit de volgende componenten:<\/p>\n<ul>\n<li>LogLoss op nieuwe gegevens;\n<\/li>\n<li>weeg de nieuwe kenmerken regulariserend (we raken de oude niet aan);\n<\/li>\n<li>we leren ook van oude gegevens, om de oude patronen te behouden;\n<\/li>\n<li>en misschien het belangrijkste: we voegen Harmonic Regularization toe, die garandeert dat de gewichten ten opzichte van het oude model niet sterk veranderen in norm.\n<\/li>\n<\/ul>\n<p>\nAangezien elke component van Loss co\u00ebffici\u00ebnten heeft, kunnen we optimale waarden voor onze taak vinden via cross-validatie of op basis van productvereisten.<\/p>\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/00ae86d23afb780f5e260e61f833d4bd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Bomen<\/h3>\n<p>\nLaten we overstappen naar beslisbomen. We hebben het volgende bijscholingsalgoritme voor bomen ontwikkeld:<\/p>\n<ol>\n<li>In productie draait een bos van 100-300 bomen, dat is getraind op de oude dataset.\n<\/li>\n<li>Aan het eind verwijderen we M = 5 stuks en voegen 2M = 10 nieuwe toe, getraind op de volledige dataset, maar met een hoog gewicht voor de nieuwe gegevens, wat natuurlijk een incrementele wijziging van het model garandeert.\n<\/li>\n<\/ol>\n<p>\nHet is duidelijk dat het aantal bomen na verloop van tijd aanzienlijk toeneemt, en dat ze regelmatig moeten worden verminderd om binnen de tijdslimieten te blijven. Hiervoor gebruiken we tegenwoordig alomtegenwoordige Knowledge Distillation (KD). Kort gezegd over de werking ervan.<\/p>\n<ol>\n<li>We hebben het huidige \"complexe\" model. We draaien het op de trainingsdataset en krijgen de kansverdeling van de klassen als output.\n<\/li>\n<li>Vervolgens leren we het leerlingenmodel (in dit geval een model met minder bomen) om de resultaten van het model te repliceren, waarbij we de klassenverdeling als doelvariabele gebruiken.\n<\/li>\n<li>Het is belangrijk op te merken dat we de datasetstructuur niet gebruiken, en daarom kunnen we willekeurige gegevens gebruiken. Uiteraard gebruiken we een datamonster van het productieproces als trainingsset voor het leerlingmodel. Op deze manier stelt de trainingsset ons in staat de nauwkeurigheid van het model te waarborgen, terwijl het stroommonster een vergelijkbare prestatie op de productie-distributie garandeert, waarbij een bias in de trainingsset wordt gecompenseerd.\n<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/3fdfcb9b1e5a6fa824226a429afc475a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe combinatie van deze twee technieken (het toevoegen van bomen en het periodiek verminderen van hun aantal door middel van Knowledge Distillation) zorgt voor de introductie van nieuwe patronen en volledige continu\u00efteit.<\/p>\n<p>Met KD kunnen we ook operaties uitvoeren met modelkenmerken, zoals het verwijderen van kenmerken en omgaan met missers. In ons geval hebben we een aantal belangrijke statistische kenmerken (zoals van afzenders, tekst-hashes, URL's enzovoort) die zijn opgeslagen in een database met een afschrijvingsfunctie. Dit soort situatie komt natuurlijk niet voor in de trainingsset, zodat het model hiervoor niet voorbereid is. In dergelijke gevallen combineren we KD-technieken en augmentatie: tijdens de training verwijderen of nullen we noodzakelijke kenmerken voor een deel van de gegevens, terwijl we de labels (de uitgangen van het huidige model) uit de oorspronkelijke set nemen, zodat het leerlingmodel leert dit distributiepatroon te herhalen.<\/p>\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/5e1f5af9a359646a49f4fe88ffed1025.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe hebben opgemerkt dat hoe ernstiger de manipulatie van modellen is, hoe meer stroommonsterpercentage vereist is.<\/p>\n<p>Voor het verwijderen van kenmerken, de eenvoudigste operatie, is slechts een klein deel van de stroom vereist, omdat er slechts een paar kenmerken worden gewijzigd, en het huidige model op dezelfde set is getraind \u2014 het verschil is minimaal. Voor het vereenvoudigen van het model (het verminderen van het aantal bomen met enkele keren) is al een verhouding van 50\/50 vereist. En voor missers van belangrijke statistische kenmerken die de prestatie van het model ernstig be\u00efnvloeden, is nog meer stroom nodig om de werking van het nieuwe model, dat robuust is tegen missers, op alle typen e-mails in lijn te brengen. <\/p>\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/8f3729cfff43be9ecdc47d532daa8d6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>FastText<\/h3>\n<p>\nLaten we naar FastText gaan. Ik herinner jullie eraan dat de representatie (Embedding) van een woord bestaat uit de som van de embedding van het woord zelf en al zijn letterlijke N-grammen, meestal trigrammen. Aangezien er genoeg trigrammen kunnen zijn, wordt er gebruikgemaakt van Bucket Hashing, wat betekent dat de volledige ruimte wordt omgezet in een bepaalde vaste hash-map. Uiteindelijk is de gewichtenmatrix van de interne laag de dimensie van het aantal woorden plus de buckets. <\/p>\n<p>Bij het verder trainen ontstaan er nieuwe kenmerken: woorden en trigrammen. Tijdens de standaard training van Facebook gebeurt er niets substantieels. Enkel de oude gewichten worden opnieuw getraind met cross-entropie op nieuwe data. Daarbij worden de nieuwe kenmerken uiteraard niet gebruikt, en deze aanpak heeft al de hierboven beschreven nadelen met betrekking tot de onvoorspelbaarheid van het model in productie. Daarom hebben we FastText een klein beetje aangepast. We voegen alle nieuwe gewichten (woorden en trigrammen) toe, trainen de volledige matrix opnieuw met cross-entropie en voegen harmonische regularisatie toe, vergelijkbaar met het lineaire model, dat zorgt voor een onbeduidende wijziging van de oude gewichten.<\/p>\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/4491639587d1c91ac91d77b587ee0111.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>CNN<\/h3>\n<p>\nMet convolutionele netwerken is het iets ingewikkelder. Als in CNN de laatste lagen verder worden getraind, dan is het uiteraard mogelijk om harmonische regularisatie toe te passen en de continu\u00efteit te garanderen. Maar als een volledige netwerktraining vereist is, dan kan zo'n regularisatie niet zomaar op alle lagen worden toegepast. Er is echter een optie om complementaire embeddings te trainen via Triplet Loss (<noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1503.03832\">origineel artikel<\/a><\/noindex>).<\/p>\n<h4>Triplet Loss<\/h4>\n<p>\nAan de hand van de anti-phishing taak zullen we in grote lijnen de Triplet Loss uitleggen. We nemen ons logo, evenals positieve en negatieve voorbeelden van logo's van andere bedrijven. We minimaliseren de afstand tussen de eerste en maximaliseren de afstand tussen de tweede, en doen dit met een kleine marge om grotere compactheid van de klassen te waarborgen. <\/p>\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/dc8547fa042286798eb5c2f0887c4da6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAls we het netwerk verder trainen, dan verandert onze metrische ruimte volledig, en wordt deze absoluut onverenigbaar met de vorige. Dit is een serieus probleem bij taken die vectoren gebruiken. Om dit probleem te omzeilen, zullen we tijdens de training oude embeddings mengen.<\/p>\n<p>We have added new data to the training set and are training the second version of the model from scratch. In the second stage, we fine-tune our network: first, the last layer is trained, then the entire network is unfrozen. During the triplet formation process, only some embeddings are computed with the trained model, while the rest use the old one. This way, the fine-tuning process ensures compatibility between the metric spaces v1 and v2. A kind of harmonic regularization.<\/p>\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/854d4fcc97775b24e6863cc38743cd27.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Architectuur als geheel<\/h3>\n<p>\nIf we consider the entire system as an example of anti-spam, the models are not isolated but nested within each other. We take images, text, and other features, using CNN and Fast Text to obtain embeddings. Then, classifiers are applied on top of the embeddings, which provide scores for different classes (types of emails, spam, presence of a logo). The scores and features then enter a forest of trees to make the final decision. Separate classifiers in this scheme allow for better interpretation of the system's results and more targeted fine-tuning of components in case problems arise, rather than submitting all data in raw form to the decision trees.<\/p>\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/30effc5ef7398db5f085b6dd415647d3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAs a result, we guarantee continuity at every level. At the lower level in CNN and Fast Text, we use harmonic regularization; for the classifiers in the middle \u2013 also harmonic regularization and score calibration for probability distribution compatibility. Additionally, boosting trees are trained incrementally or through Knowledge Distillation.<\/p>\n<p>Overall, supporting such a nested machine learning system usually poses challenges since any component at the lower level leads to an update of the entire system above. However, as in our setup each component changes slightly and is compatible with the previous one, the entire system can be updated in pieces without needing to retrain the whole structure, which allows us to maintain it without significant overhead. <\/p>\n<h2>Deploy<\/h2>\n<p>\nWe have discussed data collection and fine-tuning of different types of models, so now we move on to their deployment in the production environment.<\/p>\n<h3>A\/B-testing<\/h3>\n<p>\nZoals eerder vermeld, krijgen we tijdens het verzamelen van gegevens meestal een vertekende steekproef, waardoor we de productieprestaties van het model niet kunnen beoordelen. Daarom is het bij implementatie essentieel om het model te vergelijken met de vorige versie om te begrijpen hoe het er werkelijk voor staat, dat wil zeggen dat we A\/B-tests moeten uitvoeren. In werkelijkheid is het proces van uitrol en het analyseren van grafieken vrij routineus en leent het zich uitstekend voor automatisering. We rollen onze modellen geleidelijk uit naar 5%, 30%, 50% en uiteindelijk 100% van de gebruikers, terwijl we alle beschikbare metrics verzamelen over de modelreacties en feedback van gebruikers. In gevallen van ernstige uitschieters draaien we het model automatisch terug, en voor de overige gevallen, na het verzamelen van voldoende gebruikerskliks, nemen we een beslissing over het verhogen van het percentage. Uiteindelijk brengen we het nieuwe model volledig automatisch naar 50% van de gebruikers, en de uitrol naar het volledige publiek wordt goedgekeurd door een persoon, hoewel deze stap ook geautomatiseerd kan worden.<\/p>\n<p>Echter, het proces van A\/B-tests biedt ruimte voor optimalisatie. Het punt is dat elke A\/B-test vrij lang duurt (in ons geval van 6 tot 24 uur, afhankelijk van de hoeveelheid feedback), wat het vrij kostbaar maakt, vooral met beperkte middelen. Bovendien is er een vrij hoog percentage dat nodig is voor de test om de totale tijd van de A\/B-test te versnellen (het verzamelen van statistisch significante steekproeven voor het beoordelen van metrics bij een laag percentage kan erg lang duren), waardoor het aantal A\/B-slots extreem beperkt is. Het is duidelijk dat we alleen de meest veelbelovende modellen in de test moeten brengen, waarvan we er tijdens de vervolmaking vrij veel ontvangen.<\/p>\n<p>Om dit probleem op te lossen, hebben we een aparte classifier getraind die de kans op succes van een A\/B-test voorspelt. Hiervoor nemen we statistieken over besluitvorming, Precision, Recall en andere metrics op in de trainingsset, op een afzonderlijke dataset en op een sample van de stroom. We vergelijken het model ook met het huidige model in productie, met heuristieken, en we houden rekening met de complexiteit van het model. Door al deze kenmerken te gebruiken, scoort de classifier, die op de geschiedenis van de tests is getraind, de kandidaat-modellen, in ons geval zijn dat decision trees, en neemt hij een beslissing over welke modellen in de A\/B-test kunnen worden gelanceerd. <\/p>\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/41b121987209a663075be399e83f5a50.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBij de implementatie heeft deze benadering het aantal succesvolle A\/B-testen meerdere keren verhoogd.<\/p>\n<h3>Testen &amp; monitoring<\/h3>\n<p>\nTesten en monitoring, vreemd genoeg, schaden onze gezondheid niet, maar verbeteren deze eerder en verminderen overbodige stress. Testen helpt om uitval te voorkomen, terwijl monitoring ervoor zorgt dat dit tijdig wordt opgemerkt om de impact op gebruikers te minimaliseren.<\/p>\n<p>Het is belangrijk te begrijpen dat uw systeem vroeg of laat altijd fouten zal maken \u2014 dit is inherent aan de ontwikkelingscyclus van elke software. In het begin van de ontwikkeling zijn er altijd veel bugs totdat alles is gestabiliseerd en de belangrijkste innovatiefase is voltooid. Maar na verloop van tijd neemt de entropie zijn tol en komen er opnieuw fouten naar boven \u2014 door degradatie van componenten en veranderingen in gegevens, waar ik eerder over sprak.<\/p>\n<p>Hier wil ik opmerken dat elk machinelearning-systeem moet worden beoordeeld op basis van zijn winst gedurende de hele levenscyclus. Hieronder op de grafiek is een voorbeeld te zien van een systeem dat zeldzame soorten spam detecteert (de lijn op de grafiek rond nul). Een keer raakte het in de war door een verkeerd gecachte eigenschap. Het had net zo zijn, er was geen monitoring op abnormale activatie, waardoor het systeem begon e-mails in de spambox op te slaan aan de rand van de besluitvorming in grote hoeveelheden. Ondanks het herstellen van de gevolgen, had het systeem zoveel fouten gemaakt dat het zichzelf niet zou terugverdienen, zelfs niet in vijf jaar. Dit is een volledige mislukking in termen van de levenscyclus van het model. <\/p>\n<p><img decoding=\"async\" alt=\"De toepassing van machine learning in Mail.ru\" src=\"\/wp-content\/uploads\/2019\/11\/65efd799537ceea3761cabc3a764ba90.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDaarom kan zoiets eenvoudigs als monitoring cruciaal zijn voor het leven van een model. Naast de standaard en voor de hand liggende metrics, beschouwen we de verdeling van de antwoorden en scores van het model, evenals de verdeling van de waarden van de belangrijkste kenmerken. Met behulp van KL-divergentie kunnen we de huidige verdeling vergelijken met de historische of de waarden op de A\/B-test met de overige stroom, wat ons in staat stelt om anomalie\u00ebn in het model op te merken en tijdig wijzigingen terug te draaien.<\/p>\n<p>In de meeste gevallen starten we onze eerste versies van systemen met eenvoudige heuristieken of modellen, die we in de toekomst gebruiken voor monitoring. Bijvoorbeeld, we monitoren het NER-model in vergelijking met regex voor specifieke webwinkels, en als de dekking van de classifier daalt in vergelijking met hen, onderzoeken we de redenen. Weer een nuttige toepassing van heuristieken!<\/p>\n<h2>Conclusies<\/h2>\n<p>\nLaten we nog eens de belangrijkste gedachten van het artikel doornemen.<\/p>\n<ul>\n<li><b>Fibdek<\/b>. We denken altijd aan de gebruiker: hoe zal hij omgaan met onze fouten, hoe kan hij deze rapporteren? We vergeten niet dat gebruikers geen bron van pure feedback zijn voor het trainen van modellen, en dat deze moet worden opgeruimd met behulp van ondersteunende ML-systemen. Als we geen mogelijkheid hebben om signalen van gebruikers te verzamelen, zoeken we alternatieve feedbackbronnen, zoals gerelateerde systemen. \n<\/li>\n<li><b>Fijnslijpen<\/b>. Hier is het belangrijkste de continu\u00efteit, daarom baseren we ons op het huidige productie-model. We trainen nieuwe modellen zo, dat ze niet veel verschillen van de vorige, door middel van harmonische regularisatie en soortgelijke trucs.<\/li>\n<li><b>Deploy<\/b>. Automatische implementatie op basis van metrics verkort de tijd voor het implementeren van modellen aanzienlijk. Monitoring van statistieken en de verdeling van besluitvorming, evenals het aantal valse meldingen van gebruikers, is essentieel voor uw gemoedsrust en productieve weekenden.\n<\/li>\n<\/ul>\n<p>\nIk hoop dat wat u gelezen heeft u helpt om uw ML-systemen sneller te verbeteren, hun marktintroductie te versnellen en ze betrouwbaarder te maken, waardoor de stress van het werk vermindert.<br \/>\n<br \/>Bron: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/476714\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u043c\u043e\u0438\u0445 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 Highload++ \u0438 DataFest Minsk 2019 \u0433. \u0414\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0447\u0442\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0436\u0438\u0437\u043d\u0438 \u0432 \u0441\u0435\u0442\u0438. \u0421 \u0435\u0435 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u044b \u0432\u0435\u0434\u0435\u043c \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0443, \u0445\u0440\u0430\u043d\u0438\u043c \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0443\u044e \u0432\u0430\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 \u0444\u0438\u043d\u0430\u043d\u0441\u0430\u043c\u0438, \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0442\u0435\u043b\u0435\u0439, \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u0438 \u043c\u043d\u043e\u0433\u0438\u043c \u0434\u0440\u0443\u0433\u0438\u043c. \u0412 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 2018 \u0433\u043e\u0434\u0430 \u043c\u044b \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u043e\u0447\u0442\u044b. \u041a\u0430\u043a\u043e\u0439 \u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-53143","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u043c\u043e\u0438\u0445 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0439 \u043d\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u042d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0432 \u041f\u043e\u0447\u0442\u0435 Mail.ru | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u043c\u043e\u0438\u0445 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0439 \u043d\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-23T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:01:00+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Implementatie van machine learning bij Mail.ru | ProHoster","description":"Gebaseerd op mijn presentaties op.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u042d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0432 \u041f\u043e\u0447\u0442\u0435 Mail.ru | ProHoster","og:description":"\u041f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u043c\u043e\u0438\u0445 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0439 \u043d\u0430.","og:url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/ekspluatatsiya-mashinnogo-obucheniya-v-pochte-mail-ru","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-23T21:00:00+00:00","article:modified_time":"2020-02-18T11:01:00+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"53143","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 06:14:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:30:25","updated":"2026-01-24 06:14:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/53143","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=53143"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/53143\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=53143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=53143"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=53143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}