Jeg blev også forvirret af nøgler, forespørgsler og værdier i opmærksomhedsmekanismerne et stykke tid. Efter at have søgt på Internettet og fordøjet relevant information, har jeg et klart billede af, hvordan nøgler, forespørgsler og værdier fungerer, og hvorfor de ville fungere!
Lad os se, hvordan de fungerer, efterfulgt af hvorfor de arbejder.
I en seq2seq-model koder vi indgangssekvensen til en kontekstvektor og føder derefter denne kontekstvektor til dekoderen for at give forventet god output.
Hvis indgangssekvensen er lang, bliver det kun mindre effektivt at stole på én kontekstvektor. Vi har brug for al information fra de skjulte tilstande i indgangssekvensen (koderen) for bedre afkodning (opmærksomhedsmekanismen).
En måde at bruge de skjulte inputtilstande er vist nedenfor:
Billedkilde: https://towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3
Med andre ord, i denne opmærksomhedsmekanisme beregnes kontekstvektoren som en vægtet sum af værdierne, hvor den vægt, der er tildelt hver værdi, beregnes ved hjælp af en kompatibilitetsfunktion af forespørgslen med den tilsvarende nøgle (dette er en ændret sætning fra [Opmærksomhed er alt hvad du behøver] https://arxiv.org/pdf/1706.03762.pdf).
Her er forespørgslen fra dekoderens skjulte tilstand, nøglen og værdien kommer fra koderen skjulte tilstande (nøgle og værdi er den samme i denne figur). Poengsummen er kompatibiliteten mellem forespørgslen og nøglen, som kan være et punktprodukt mellem forespørgslen og nøglen (eller anden form for kompatibilitet). Scorerne går derefter gennem softmax-funktionen for at give et sæt vægte, hvis sum er lig med 1. Hver vægt multiplicerer de tilsvarende værdier for at give kontekstvektoren, der bruger alle de skjulte inputtilstande.
Bemærk, at hvis vi manuelt indstiller vægten af det sidste input til 1 og alle dets forudgående forhold til 0s, reducerer vi opmærksomhedsmekanismen til den oprindelige seq2seq kontekstvektormekanisme. Det vil sige, der er ingen opmærksomhed mod de tidligere indgangskodertilstande.
Lad os nu overveje mekanismen for selvopmærksomhed som vist i nedenstående figur:
Billedkilde: https://towardsdatascience.com/illustrated-self-attention-2d627e33b20a
Forskellen fra ovenstående figur er, at forespørgsler, nøgler og værdier er transformationer af de tilsvarende inputtilstandsvektorer. De andre forbliver de samme.
Bemærk, at vi stadig kunne bruge de oprindelige kodertilstandsvektorer som forespørgsler, nøgler og værdier. Så hvorfor har vi brug for transformation? Transformationen er simpelthen en matrixmultiplikation som denne:
Forespørgsel = I x B (Q)
Nøgle = I x B (K)
Værdi = I x B (V)
hvor I er indgangsvektoren (encoder), og W (Q), W (K) og W (V) er de tilsvarende matricer til at transformere I-vektoren til forespørgsels-, nøgle-, værdivektorerne.
Hvad er fordelene ved denne matrixmultiplikation (vektortransformation)?
Husk effekten af SVD (Singular Value Decomposition) som i følgende figur:
Billedkilde: https://youtu.be/K38wVcdNuFc?t=10
Ved at multiplicere en inputvektor med en matrix V (fra SVD) opnår vi en bedre repræsentation til beregning af kompatibiliteten mellem to vektorer, hvis disse to vektorer er ens i emnerummet som vist i eksemplet i figuren.
Og disse matricer til transformation kan læres i et neuralt netværk!
Kort fortalt, ved at multiplicere inputvektoren med en matrix, fik vi:
1) bedre (latent) repræsentation af inputvektoren;
2) konvertering af inputvektoren til et rum med en ønsket dimension, f.eks. fra dimension 5 til 2, eller fra n til m osv. (hvilket er praktisk nyttigt);
hvor matrixen kan læres (uden manuel indstilling).
Jeg håber dette hjælper dig med at forstå forespørgsler, nøgler og værdier i (selv-) opmærksomhedsmekanismen i dybe neurale netværk.