Innan jag började ta uppdrag drev jag Grandmother Machine Learning, ett bolag som optimerade Google Ads-annonsering via deras API.
Det är en ovanligt obarmhärtig miljö att bygga modeller i. En modell som ligger i en rapport kan vara fel i ett halvår innan någon märker det. En modell som sätter bud spenderar pengar varje timme, och när den har fel syns det i kontoutdraget samma dag. Fyra vanor växte fram ur det, och jag tar med dem in i varje uppdrag jag gör nu.
Modell-QA måste vara automatisk och löpande
Den vanliga ordningen är att en modell valideras noggrant en gång, vid leverans, och sedan aldrig igen. Det fungerar precis så länge världen står stilla.
Vi kom fram till att varje körning behövde passera samma kontroller som en release: rimlighetsgränser på prediktionerna, jämförelse mot föregående körnings utfall, kontroll av att indatafördelningarna inte glidit, och en spärr som stoppade hela körningen hellre än att låta något orimligt gå ut i skarp budgivning. Kontrollerna var trista att skriva och de räddade oss upprepade gånger.
En modell utan automatisk QA är inte i produktion. Den är i produktion på hoppet.
Omträning ska utlösas av mätning, inte av kalender
“Vi tränar om varje kvartal” är en gissning förklädd till rutin. Ibland är kvartalsvis alldeles för sällan: en kampanjstruktur ändras och modellen är inaktuell på en vecka. Ibland är det slöseri, för ingenting har rört sig.
Det som fungerade var att mäta träffsäkerheten löpande mot faktiskt utfall och låta omträningen utlösas när den föll under en tröskel. Då blir omträning ett svar på något som hänt i stället för ett datum i en kalender.
Det förutsätter förstås att utfallet går att mäta. För oss var det enkelt: klicket och konverteringen kom inom timmar. I andra sammanhang tar utfallet månader att observera, och då behöver övervakningen kompletteras med indirekta mått. Men principen står sig.
Övervaka målet, inte bara indata
Det finns gott om verktyg som larmar för datadrift. Betydligt färre besvarar den fråga som faktiskt spelar roll: gör modellen fortfarande nytta?
Vi lärde oss att alltid hålla en liten andel av trafiken utanför modellen, som en levande baslinje. Det kostade något i uteblivet resultat och var värt varje krona, för det var den enda mätning som besvarade frågan direkt i stället för att antyda ett svar. Utan en baslinje som lever parallellt går det att bli förvånansvärt säker på att en modell fungerar långt efter att den slutat göra det.
Fel målfunktion slår all modellkvalitet
Det här är den dyraste läxan, och den handlar inte om maskininlärning.
Det går att optimera mot klick, mot konverteringar, mot intäkt eller mot täckningsbidrag. De ger fyra olika system, och skillnaden mellan dem är större än skillnaden mellan en medioker och en utmärkt modell. En modell som med hög precision maximerar fel storhet är sämre än en grov modell som maximerar rätt.
I annonsbudgivning tillkommer en komplikation som gör det värre: modellens beslut avgör vilken data den får se härnäst. Bjuder systemet lågt på ett segment slutar det synas, och då slutar det generera data, och då blir modellen allt mer osäker på just det segment den redan valt bort. Återkopplingen är tyst och den ser ut som framgång: mätvärdena på det som visas ser utmärkta ut, för allt annat har försvunnit ur underlaget.
Botemedlet är att medvetet avsätta en del av budgeten för att fortsätta utforska, även där modellen tror sig veta bättre. Det känns fel varje gång och det är det som gör att systemet fortfarande fungerar om ett år.
Varför det här hänger med in i andra uppdrag
Samma mönster återkommer i kundvärdesmodeller, prognoser och churnmodeller. En CLV-modell som rangordnar kunder styr vilka som får uppmärksamhet. Det påverkar deras framtida beteende, vilket blir träningsdata för nästa version. En churnmodell som pekar ut kunder för retentionsinsatser förstör sin egen utvärdering om ingen håller en kontrollgrupp utanför.
Skillnaden är bara att i annonsbudgivning märks det på en vecka. I ett CRM-system tar det två år, och då är det svårt att veta vad som gick fel.