Grote taalmodellen (LLM's)

Voltooid

Opmerking

Zie het tabblad Tekst en afbeeldingen voor meer informatie.

In de kern van generatieve AI, grote taalmodellen (LLM's) - en hun compactere relaties, kleine taalmodellen (SLM's) - worden de taalkundige en semantische relaties tussen de woorden en woordgroepen in een vocabulaire ingekapseld. Het model kan deze relaties gebruiken om te redeneren voor invoer in natuurlijke taal en zinvolle en relevante antwoorden te genereren.

In wezen worden LLM's getraind om voltooiingen te genereren op basis van prompts. Beschouw ze als superkrachtige voorbeelden van de voorspellende tekstfunctie op veel mobiele telefoons. Een prompt start een reeks tekstvoorspellingen die resulteert in een semantisch juiste voltooiing. De truc is dat het model de relaties tussen woorden begrijpt en kan identificeren welke woorden in de reeks tot nu toe waarschijnlijk van invloed zijn op de volgende; en gebruik dit om de meest waarschijnlijke voortzetting van de reeks te voorspellen.

Denk bijvoorbeeld aan de volgende zin:

Ik hoorde een hond luid naar een kat blaffen

Stel dat u alleen de eerste paar woorden hoorde: "Ik hoorde een hond ...". U weet dat sommige van deze woorden nuttigere aanwijzingen zijn over wat het volgende woord kan zijn dan andere. Je weet dat 'gehoord' en 'hond' sterke indicatoren zijn van wat er komt en dat helpt je de waarschijnlijkheden te verfijnen. Je weet dat er een goede kans is dat de zin zal doorgaan als "Ik hoorde een hondblaffen".

U kunt het volgende woord raden omdat:

  • U hebt een grote woordenschat waaruit u kunt tekenen.
  • U hebt gemeenschappelijke taalkundige structuren geleerd, zodat u weet hoe woorden zich met elkaar verhouden in zinvolle zinnen.
  • U hebt een begrip van semantische concepten die zijn gekoppeld aan woorden - u weet dat iets dat u hoort een geluid van een soort moet zijn en u weet dat er specifieke geluiden zijn die door een hond worden gemaakt.

Hoe trainen we een model om dezelfde mogelijkheden te hebben?

Tokenisatie

De eerste stap is het model voorzien van een grote woordenschat van woorden en woordgroepen; en we bedoelen wel groot. De nieuwste generatie LLM's heeft woordenlijsten die bestaan uit honderdduizenden tokens, op basis van grote hoeveelheden trainingsgegevens van internet en andere bronnen.

Wacht even. Tokens?

Hoewel we vaak denken aan taal in termen van woorden, splitsen LLM's hun vocabulaire op in tokens. Tokens bevatten woorden, maar ook subwoorden (zoals de 'un' in 'ongelooflijk' en 'onwaarschijnlijk'), leestekens en andere veelgebruikte tekensreeksen. De eerste stap bij het trainen van een groot taalmodel is daarom het opsplitsen van de trainingstekst in de afzonderlijke tokens en het toewijzen van een unieke geheel getal-id aan elk model, zoals hieronder:

  • Ik (1)
  • gehoord (2)
  • a (3)
  • hond (4)
  • schors (5)
  • luid (6)
  • op (7)
  • een (3) al toegewezen
  • kat (8)

enzovoort.

Naarmate u meer trainingsgegevens toevoegt, worden er meer tokens toegevoegd aan de woordenlijst en toegewezen id's; dus je kunt eindigen met tokens voor woorden zoals puppy, skateboard, auto en anderen.

Opmerking

In dit eenvoudige voorbeeld hebben we de voorbeeldtekst getokend op basis van woorden. In werkelijkheid zouden er ook subwoorden, leestekens en andere tokens zijn.

Tokens transformeren met een transformator

Nu we een set tokens met unieke id's hebben, moeten we een manier vinden om ze aan elkaar te koppelen. Hiervoor wijzen we elk token een vector toe (een matrix met meerdere numerieke waarden, zoals [1, 23, 45]). Elke vector heeft meerdere numerieke elementen of dimensies en we kunnen deze gebruiken om taalkundige en semantische kenmerken van het token te coderen om een groot aantal informatie te geven over wat het token betekent en hoe het zich verhoudt tot andere tokens, in een efficiënte indeling.

We moeten de initiële vectorweergaven van de tokens transformeren in nieuwe vectoren met taalkundige en semantische kenmerken die erin zijn ingesloten, op basis van de contexten waarin ze worden weergegeven in de trainingsgegevens. Omdat de nieuwe vectoren semantische waarden bevatten die erin zijn ingesloten, noemen we ze insluitingen.

We gebruiken een transformatormodel om deze taak uit te voeren. Dit type model bestaat uit twee blokken:

  • Een encoderblok dat de embeddings creëert door een techniek genaamd aandacht toe te passen. De aandachtslaag onderzoekt elk token op zijn beurt en bepaalt hoe het wordt beïnvloed door de tokens eromheen. Om het coderingsproces efficiënter te maken, wordt aandacht met meerdere hoofden gebruikt om meerdere elementen van het token parallel te evalueren en gewichten toe te wijzen die kunnen worden gebruikt om de waarden van het nieuwe vectorelement te berekenen. De resultaten van de aandachtslaag worden ingevoerd in een volledig verbonden neuraal netwerk om de beste vectorweergave van de insluiting te vinden.
  • Een decoderlaag die gebruikmaakt van de insluitingen die door de encoder worden berekend om het eerstvolgende meest waarschijnlijke token in een reeks te bepalen dat door een prompt is gestart. De decoder gebruikt ook aandacht en een feed-forward neuraal netwerk om de voorspellingen te doen.

Diagram van de transformatiearchitectuur met de coderings- en decoderingslagen.

Opmerking

We hebben de transformatiearchitectuur en het proces in de beschrijving en het diagram aanzienlijk vereenvoudigd. Maak u niet te veel zorgen over de specifieke details van hoe aandacht werkt. Het belangrijkste punt is dat het helpt bij het vastleggen van taalkundige en semantische kenmerken van elk token op basis van de contexten waarin het wordt gebruikt. Als u meer wilt weten over de transformer-architectuur en hoe deze gebruikmaakt van aandacht, kunt u het oorspronkelijke Attention is all you need paper lezen.

Initiële vectoren en positionele codering

In eerste instantie worden de tokenvectorwaarden willekeurig toegewezen voordat ze via de transformator worden ingevoerd om insluitvectors te maken. De tokenvectoren worden in de transformator ingevoerd, samen met een positionele codering die aangeeft waar het token wordt weergegeven in de volgorde van trainingstekst (we moeten dit doen omdat de volgorde waarin tokens in de volgorde worden weergegeven relevant is voor hoe ze zich met elkaar verhouden). Onze tokens kunnen er bijvoorbeeld als volgt uitzien:

Teken Token-id Position Vector
I 1 1 [3, 7, 10]
Gehoord 2 2 [2, 15, 1]
a 3 3 [9, 11, 1]
hond 4 4 [2, 7, 11]
schors 5 5 [9, 12, 0]
luid 6 6 [3, 8, 13]
at 7 7 [5, 7, 10]
a 3 8 [9, 11, 1]
kat 8 9 [8, -6, 9 ]
... ... ... ...
puppie 127 45 [7, 7, -2 ]
auto 128 56 [5, -5, 1 ]
skateboard 129 67 [4, 7, 14]

Opmerking

We hebben dingen eenvoudig gehouden met behulp van vectoren met slechts drie elementen (waarmee we ze later in drie dimensies kunnen visualiseren). In werkelijkheid hebben de vectoren duizenden elementen.

Aandacht en insluitingen

Om de vectorweergaven te bepalen van tokens die ingesloten contextuele informatie bevatten, gebruikt de transformator attention-lagen. Een aandachtslaag beschouwt elk token op zijn beurt binnen de context van de reeks tokens waarin het wordt weergegeven. De tokens rond de huidige worden gewogen om hun invloed te weerspiegelen en de gewichten worden gebruikt om de elementwaarden voor de insluitvector van het huidige token te berekenen. Wanneer u bijvoorbeeld het token 'blaffen' beschouwt in de context van 'Ik hoorde een hond blaffen', krijgen de tokens voor 'gehoord' en 'hond' meer gewicht dan 'ik' of 'een', omdat ze sterkere indicatoren zijn voor 'blaffen'.

In eerste instantie weet het model niet welke tokens van invloed zijn op anderen; maar omdat het wordt blootgesteld aan grotere hoeveelheden tekst, kan het iteratief leren welke tokens vaak samen worden weergegeven en beginnen met het vinden van patronen die helpen waarden toe te wijzen aan de vectorelementen die de taalkundige en semantische kenmerken van de tokens weerspiegelen, op basis van hun nabijheid en frequentie van gebruik samen. Het proces wordt efficiënter gemaakt door multi-head aandacht te gebruiken om verschillende elementen van de vectoren parallel te overwegen.

Het resultaat van het coderingsproces is een set insluitingen; vectoren die contextuele informatie bevatten over hoe de tokens in het vocabulaire zich verhouden tot elkaar. Een echte transformator produceert insluitingen die duizenden elementen bevatten, maar om dingen eenvoudig te houden, houden we ons aan vectoren met slechts drie vectoren in ons voorbeeld. Het resultaat van het coderingsproces voor onze vocabulaire kan er ongeveer als volgt uitzien:

Teken Token-id Insluiten
I 1 [2, 0, -1]
Gehoord 2 [-2, 2, 4 ]
a 3 [-3, 5, 5 ]
hond 4 [10, 3, 2 ]
schors 5 [9, 2, 10 ]
luid 6 [-3, 8, 3 ]
at 7 [-5, -1, 1]
kat 8 [10, 3, 1]
puppie 127 [5, 3, 2 ]
auto 128 [-2, -2, 1 ]
skateboard 129 [-3, -2, 2 ]
schors 203 [2, -2, 3 ]

Als je oplettend bent, heb je misschien gezien dat onze resultaten twee insluitingen bevatten voor het token "bark". Het is belangrijk om te begrijpen dat de insluitingen een token in een bepaalde context vertegenwoordigen; en sommige tokens kunnen worden gebruikt om meerdere dingen te betekenen. De schors van een hond verschilt bijvoorbeeld van de schors van een boom! Tokens die vaak in meerdere contexten worden gebruikt, kunnen meerdere insluitingen produceren.

We kunnen de elementen van de insluitingen beschouwen als dimensies in een multidimensionale vectorruimte. In ons eenvoudige voorbeeld hebben onze insluitingen slechts drie elementen, zodat we ze kunnen visualiseren als vectoren in driedimensionale ruimte, zoals deze:

Diagram van insluitingsvectoren voor tokens in drie dimensies.

Omdat de dimensies worden berekend op basis van de relatie tussen de tokens en elkaar, leiden tokens die worden gebruikt in vergelijkbare contexten (en dus vergelijkbare betekenissen hebben) tot vectoren met vergelijkbare richtingen. De embeddings voor 'hond' en 'puppy' wijzen min of meer in dezelfde richting, die niet veel verschilt van die voor 'kat', maar heel anders is dan de embeddings voor 'skateboard' of 'auto'. We kunnen meten hoe dicht tokens bij elkaar liggen door de cosinus-gelijkenis van hun vectoren te berekenen.

Voorspellen van voltooiingen uit prompts

Nu we een set insluitingen hebben die de contextuele relatie tussen tokens inkapselen, kunnen we het decoderblok van een transformator gebruiken om het volgende woord in een volgorde te voorspellen op basis van een beginprompt.

Nogmaals, aandacht wordt gebruikt om elk token in context te overwegen; Maar deze keer kan de context die moet worden overwogen alleen de tokens bevatten die voorafgaan aan het token dat we proberen te voorspellen. Het decodermodel wordt getraind met behulp van gegevens waarvoor we al de volledige reeks hebben, door een techniek toe te passen die gemaskeerde aandacht wordt genoemd; waarin de tokens na het huidige token worden genegeerd. Omdat we het volgende token al kennen tijdens de training, kan de transformator dit vergelijken met het voorspelde token en de geleerde gewichten in latere trainingsiteraties aanpassen om de fout in het model te verminderen.

Bij het voorspellen van een nieuwe voltooiing, waarvoor de volgende tokens onbekend zijn, berekenen de aandachtslagen mogelijke vectoren voor het volgende token en wordt het feed-forward-netwerk gebruikt om de meest waarschijnlijke kandidaat te bepalen. De voorspelde waarde wordt vervolgens toegevoegd aan de reeks en het hele proces wordt herhaald om het volgende token te voorspellen; enzovoort, totdat de decoder voorspelt dat de reeks is beëindigd.

Op basis van de reeks 'Wanneer mijn hond een ...' was, evalueert het model de tokens in de reeks tot nu toe, gebruikt u aandacht om gewichten toe te wijzen en voorspelt u dat het eerstvolgende waarschijnlijke token "puppy" is in plaats van bijvoorbeeld "kat" of "skateboard".