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:

NoteOpgave 1: Sigmoid-funktionen
  • Tegn grafen for sigmoid-funktionen med forskrift: \[ \sigma(x)=\frac{1}{1+\mathrm{e}^{-x}}, \]

  • Hvad vil du på baggrund af grafen for sigmoid-funktionen mene, at værdimængden er (det vil sige: i hvilket interval ligger funktionsværdierne)?

  • Hvorfor kan sigmoid-funktionen bruges til at modellere graden af openness?

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.

NoteOpgave 2: Træning af AI model

Det fiktive datasæt om antal likes på eksempelvis Facebook og graden af openness kan hentes her.

Brug denne app. Du skal gøre følgende:

  • Under fanen "Data" uploader du datasættet og trykker på "Næste".
  • Under fanen "Variable" vælger du O_openness som "Target-variabel" og likes_art_culture, likes_science_tech, likes_travel_nature, likes_entertainment, likes_sports og likes_political_social som "Feature-variable". Tryk på "Næste".
  • Under fanen "Træning" kan man vælge en række forskellige indstillinger, som du ikke behøver at tænke så meget over. Men du kan for eksempel se, at der under "Tabsfunktion" står "Squared" – det svarer til tabsfunktionen i (3). Tryk nu på "Træn" model.

På grafen til højre i app’en kan du se, hvordan værdien af tabsfunktionen har ændret sig i takt med, at vi har opdateret vægtene for at bestemme et minimum. Læg mærke til at grafen flader ud, og vi forventer derfor, at vi har fundet et (eventuelt lokalt) minimum for tabsfunktionen.

  • Noter de fundne værdier af vægtene \(w_0, w_1, \cdots w_6\), som står i tabellen nederst til højre i app’en.

  • Tryk på fanen "Evaluering & Prædiktion" og tryk derefter på knappen "Kør evaluering". Noter værdien af \(R^2\) og RMSE (bemærk, at vi gerne vil have \(R^2\)-værdien tæt på \(1\) og RMSE tæt på \(0\)). Du kan læse mere om disse mål her.

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.

NoteOpgave 3: Openness-score for Peter

Sig hej til Peter! Peter elsker at se fodbold og underholdsningsprogrammer i fjernsynet. Til gengæld interesserer han sig ikke meget for kunst, kultur og politik. Vi har følgende oplysninger om Peters likes pr. uge:

Feature Antal likes pr. uge
\(x_1\) likes_art_culture \(11\)
\(x_2\) likes_science_tech \(17\)
\(x_3\) likes_travel_nature \(6\)
\(x_4\) likes_entertainment \(43\)
\(x_5\) likes_sports \(21\)
\(x_6\) likes_political_social \(7\)

For Peter skal du nu:

  • Beregne den vægtede sum.
  • Beregne den prædikterede openness-score.
  • Hvad kan du sige om Peters grad af openness sammenlignet med Mollys?

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.

NoteOpgave 4: Betydning af vægtene

Vi forestiller os en person, Sebastian, med følgende likes pr. uge:

Feature Antal likes pr. uge
\(x_1\) likes_art_culture \(15\)
\(x_2\) likes_science_tech \(24\)
\(x_3\) likes_travel_nature \(16\)
\(x_4\) likes_entertainment \(31\)
\(x_5\) likes_sports \(22\)
\(x_6\) likes_political_social \(23\)
  • Beregn openness-scoren for Sebastian.

Betydning af likes_art_culture

Bettina har præcis samme antal likes som Sebastian bortset fra, at Bettina har 10 ekstra likes til kunst og kultur.

  • Beregn Bettinas openness-score.

Betydning af likes_sports

Vigga har præcis samme antal likes som Sebastian bortset fra, at Vigga har 10 ekstra likes til sport.

  • Beregn Viggas openness-score.

  • Hvad kan du sige om betydningen af en feature, hvis vægten er henholdsvis positiv og negativ (vær opmærksom på, at du skal være varsom med at sige noget om de absolutte størrelser, som openness-scoren stiger eller falder med)?

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)) \]

NoteOpgave 5: Differentiation af \(E\)

Vi vil nu bestemme den partielle afledede af \(E\) med hensyng til \(w_1\). Vi gør det et trin ad gangen:

  • Bestem \[ \frac{\partial}{\partial w_1} (w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \cdots + w_6 \cdot x_6) \]

  • Bestem \[ \frac{\partial}{\partial w_1} \sigma (w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \cdots + w_6 \cdot x_6) \]

    Brug udtrykket for \(\sigma'(x)\), kædereglen og det du netop er kommet frem til.

Vi holder tingene simple og forestiller os, at vi kun har én person i træningsdatasæt, så tabsfunktionen bliver:

\[ E(w_0, w_1, \dots, w_6) = \frac{1}{2} (t-\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \cdots + w_6 \cdot x_6))^2 \]

  • Bestem \[ \frac{\partial E}{\partial w_1} \]

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.

Delvis facitliste

Facitliste.