Cambridge Analytica skandalen - matematik
I denne del er formålet at lave en model, som på baggrund af data fra sociale medier, kan bruges til at prædiktere personlighed.
Træningsdata
Vi skal starte med at forstå, hvordan man overhovedet kan lave en model, som kan prædiktere menneskers personlighed på baggrund af data fra sociale medier. Det beskrives i citatet her:
Kogan sold Cambridge Analytica access to 270,000 personality tests completed by Facebook users through an online app he had created for research purposes. Providing the data to Cambridge Analytica was, it seems, against Facebook’s internal code of conduct, but only now in March 2018 has Kogan been banned by Facebook from the platform. In addition, Kogan’s data also came with a bonus: he had reportedly collected Facebook data from the test-takers’ friends – and, at an average of 200 friends per person, that added up to some 50m people.
While not all of these people had provided personality test responses, it is possible to reverse-engineer a personality profile from Facebook activity. Decades of psychological research has formed around the lexical hypothesis, that personality traits can be inferred by studying the subject’s use of language. Facebook patented a process to do just this in 2012, as part of its commercial aims to provide more targeted advertising, by mapping the contents of posts and likes against the "Big Five" model of psychological traits, sometimes known as OCEAN (openness, conscientiousness, extroversion, agreeableness, neuroticism). Whether you choose to like pictures of sunsets, puppies or people apparently says a lot about your personality: a 2015 study by other academics from the Cambridge psychology lab found that the model of predicting personality traits using Facebook data could generate a personality profile with the same accuracy as a spouse with just 300 likes.
Kilde: Psychographics: the behavioural analysis that helped Cambridge Analytica know voters’ minds.
Ovenstående betyder, at Cambridge Analytica har haft adgang til \(270000\) menneskers Facebook data samtidig med, at disse mennesker frivilligt har taget en personlighedstest (som du har gjort det i opgave 3 i fælles delen af dette forløb). Altså kender man disse menneskers OCEAN scores. Det er alle disse data, som udgør det, man kalder for et træningsdatasæt.
Vi forestiller os nu et tænkt eksempel med et træningsdatasæt1 bestående af \(300\) personer. Idéen er, at hver person i træningsdatasættet har taget en OCEAN test. Derudover har vi for hver person registreret det gennemsnitlige antal likes pr. uge, som personen – på eksempelvis Facebook – har givet til opslag, som handler om:
1 Data er 100% fiktive og genereret ved hjælp af CoPilot.
likes_art_culture: kunst og kultur (\(x_1\))likes_science_tech: videnskab og teknologi (\(x_2\))likes_travel_nature: rejser og natur (\(x_3\))likes_entertainment: underholdning (\(x_4\))likes_sports: sport (\(x_5\))likes_political_social: politik og samfund (\(x_6\))
Ovenstående kaldes for features eller inputvariable.
Vi forestiller os – for at holde tingene simple – at vi kun er interesseret i at forudsige personens grad af Openness. Da alle personer i træningsdatasættet har taget en OCEAN personlighedstest, kender vi også:
O_openness: personens grad af openness på en skala fra \(0\) til \(1\) (\(t\)).
Her kaldes \(t\) for target, fordi det er den værdi, vil gerne vil prøve at "ramme" med vores model.
Idéen er nu, at vi ud fra de seks features \(x_1, x_2, \dots, x_6\) skal kunne forudsige targetværdien \(t\) så godt som muligt. Det gør vi ved først at udregne en vægtet sum af de seks features:
\[ w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \cdots + w_6 \cdot x_6 \tag{1}\]
Hvor \(w_0, w_1, \dots, w_6\) kaldes for vægte2, og det er i sidste ende dem, vi skal finde passende værdier for, så vi får en god model. Det kommer vi tilbage til.
2 Ofte kalder man også \(w_0\) for bias.
Nu vil ovenstående udtryk give et reelt tal, som kan antage en hvilken som helst værdi og som kan være negativ eller positiv. Til gengæld er hver persons grad af openness målt på en skala fra \(0\) til \(1\). Så udtrykket i (1) kan ikke direkte bruges til at modellere graden af openness. Det råder vi bod på ved at bruge en såkaldt aktiveringsfunktion. Vi bruger her en aktiveringsfunktion, som kaldes for sigmoid.
Sigmoid-aktiveringsfunktion
Sigmoid-funktionen har forskrift
\[ \sigma(x)=\frac{1}{1+\mathrm{e}^{-x}}, \tag{2}\]
Vi bruger nu sigmoid-funktionen på den vægtede sum i (1):
\[ o = \sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \cdots + w_6 \cdot x_6) \]
Her står \(o\) for outputværdi (og ikke for openness, selvom det også vil give mening her).
Men hvad skal den sigmoid-funktion nu gøre godt for? Det undersøger vi i den første opgave:
Som du lige har set, har sigmoid-funktionen nogle egenskaber, som gør den velegnet til at modellere graden af openness.
Opgaven er nu at bestemme værdier af vægtene \(w_0, w_1, \dots, w_6\), så vores beregnede outputværdi \(o\) kommer så tæt på vores målte targetværdi \(t\) som muligt (altså den faktiske grad af openness).
Det gør vi ved for hver person i træningsdatasættet at se på den kvadrerede forskel mellem \(t\) og \(o\):
\[ (t-o)^2 = (t-\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \cdots + w_6 \cdot x_6))^2 \]
Bemærk, at hvis vores model er god, så er denne forskel tæt på \(0\) (svarende til at \(o \approx t\)). Hvis vores model er dårlig – for eksempel hvis \(t\) er tæt på \(1\), mens \(o\) er tæt på \(0\) – så vil \((t-o)^2\) være tæt på \(1\).
Nu har vi \(300\) personer i vores træningsdata. For hver af dem kan vi beregne en kvadreret forskel mellem \(t\) og \(o\) og så lægger vi dem alle sammen (og ganger med \(1/2\), men det er ikke så afgørende). Det giver:
\[ E = \frac{1}{2} \sum (t-o)^2 \] Ovenstående kaldes for en tabsfunktion, fordi den måler hvor god vores model er. En lille værdi af tabsfunktionen \(E\) svarer til en god model (mange af de kvadrerede afvigelser er små, som ønsket), og omvendt vil en stor værdi af \(E\) svare til en dårlig model.
Tabsfunktionen \(E\) afhænger i virkeligheden af alle vægtene, fordi outputværdien \(o\) afhænger af alle vægtene:
\[ E(w_0, w_1, \dots, w_6) = \frac{1}{2} \sum (t-\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \cdots + w_6 \cdot x_6))^2 \tag{3}\]
Hele idéen er nu, at bestemme de værdier af vægtene \(w_0, w_1, \dots, w_6\) som minimerer tabsfunktionen. Hvis \(E\) kun afhænger af én vægt \(w\), så ved vi godt, hvordan man finder minimum. Vi skal nemlig løse:
\[ E'(w)=0 \] og så lige sikre os, at det er et minimumssted, vi har fundet. Nu afhænger \(E\) ikke af én, men af syv variable. Derfor bliver det lidt mere besværligt at bestemme minimum for \(E\). Den gode nyhed er, at vi ikke selv skal gøre det, men i stedet bruge en app til formålet. Afsnittet Ekstra udfordring: Hvordan bestemmer man minimum for tabsfunktionen? handler om den matematik, som bruges i app’en – så det kan du jo glæde dig til, hvis du når så langt!
Træning af AI model
Når man bestemmer de værdier af vægtene, som minimerer tabsfunktionen, så siger man, at man træner sin AI model. Det gør vi i opgave 2.
I virkeligheden gør Facebook og firmaer som Cambridge Analytica selvfølgelig noget, som er meget mere kompliceret, end det vi har gjort her. Desuden er der en kæmpe stor opgave i at finde ud af, hvordan man overhovedet oversætter Facebook aktivitet til tal:
- Hvordan afgør man for eksempel om et billede er i en af de seks kategorier, som vi ser på her?
- Hvordan oversætter man kommentarer på Facebook til tal, som man kan regne på og lave en model på baggrund af?
Det er klart, at det på ingen måde er en triviel opgave, og samtidig er det også for de firmaer, som arbejder med den slags, forretningshemmeligheder, så vi ved strengt taget ikke præcis, hvordan det foregår. Alligevel giver vores meget simple model en idé om, hvordan den kan bruges.
Prædiktion af openness-score

Vi forestiller os nu en Facebook bruger Molly, som går op i kunst, kultur, politik og samfund. Til gengæld går hun lidt mindre op i videnskab, rejser, underholdning og sport. Vi har for Molly registreret følgende antal likes pr. uge:
| Feature | Antal likes pr. uge | |
|---|---|---|
| \(x_1\) | likes_art_culture |
\(45\) |
| \(x_2\) | likes_science_tech |
\(18\) |
| \(x_3\) | likes_travel_nature |
\(10\) |
| \(x_4\) | likes_entertainment |
\(15\) |
| \(x_5\) | likes_sports |
\(17\) |
| \(x_6\) | likes_political_social |
\(46\) |
For Molly kan vi nu udregne den vægtede sum i (1):
\[ \begin{aligned} w_0 + w_1 \cdot x_1 &+ w_2 \cdot x_2 + \cdots + w_6 \cdot x_6 = \\ &-3.666 + 0.05245 \cdot 45 \\ &+ 0.03711 \cdot 18 \\ &+ 0.02928 \cdot 10 + 0.003369 \cdot 15 \\ &-0.01699 \cdot 17 + 0.04105 \cdot 46 \\ &\approx 1.305 \end{aligned} \]
Denne værdi indsætter vi nu i sigmoid-funktionen for at beregne vores prædikterede openness-score:
\[ o = \sigma(1.305) \approx 0.787 \]
Vi får altså en forholdsvis høj openness-score. Bemærk, at Molly ikke har taget en OCEAN-test. Alligevel kan vi på baggrund af vores model og informationen om Mollys Facebook aktivitet komme med et kvalificeret bud på Mollys grad af openness. Det vi har gjort her, er derfor et eksempel på det, der beskrives i citatet:
While not all of these people had provided personality test responses, it is possible to reverse-engineer a personality profile from Facebook activity.
Kilde: Psychographics: the behavioural analysis that helped Cambridge Analytica know voters’ minds.
Det er klart, at vores model og fremgangsmåde er ekstremt forsimplet i forhold til, hvad rigtige firmaer som Facebook og Cambridge Analytica har gjort. Alligevel giver det en meget overordnet idé om, hvordan man kan reverse-engineer a personality profile from Facebook activity.
Betydning af vægtene
Hvis du ser på de vægte, som du fandt i opgave 2, kan du se, at det er vægten for likes_art_culture, som har den højeste positive værdi, mens vægten for likes_sports har den laveste, negative værdi. Vi vil nu undersøge hvilken betydning, det har, for den prædikterede openness-score.
Bemærk, at modellen bygger på fiktive data, så det du kom frem til i opgave 4, vil sikkert ikke kunne genfindes i autentiske data!
Du kan her læse mere om, hvordan man kan give en mere konkret fortolkning af vægtene.
Ekstra udfordring: Hvordan bestemmer man minimum for tabsfunktionen?
Vi har tidligere set, at tabsfunktionen er defineret sådan her:
\[ E(w_0, w_1, \dots, w_6) = \frac{1}{2} \sum (t-\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \cdots + w_6 \cdot x_6))^2 \]
Og vi skulle altså finde minimum for denne funktion. Problemet er, at \(E\) ikke kun afhænger af én, men hele syv vægte. Når man skal bestemme minimum for en funktion, som afhænger af mere end én variabel, får man brug for noget, som kaldes for partielle afledede. Se derfor denne video, hvor vi forklarer, hvad det går ud på:
Når man skal bestemme partielle afledede for \(E\), får man også brug for at kunne differentiere sigmoid-funktionen. Man kan vise, at:
\[ \sigma'(x) = \sigma(x) \cdot (1-\sigma(x)) \]
I virkelighedens verden løser man sjældent ligningerne
\[ \frac{\partial E}{\partial w_0} = 0, \frac{\partial E}{\partial w_1} = 0, \cdots, \frac{\partial E}{\partial w_6} = 0 \]
I stedet bruger man en numerisk metode til at bestemme minimum for \(E\), som kaldes for gradientnedstigning. Idéen er, at man hele tiden opdaterer værdien af vægtene, sådan at tabsfunktionen bliver mindre og mindre. Det bliver man ved med, indtil man har fundet et (lokalt) minimum for tabsfunktionen. Det behøver du ikke at vide mere om, men hvis du alligevel er nysgerrig, kan du se denne video.
Hvis du vil arbejde videre med sigmoid-funktionen og dennes egenskaber, kan du finde opgaver her.
