11.1 Užklausos, raktai ir reikšmės

Iki šiol visi mūsų apžvelgti tinklai iš esmės rėmėsi tuo, kad įvestis yra aiškiai apibrėžto dydžio. Pavyzdžiui, ImageNet vaizdai yra 224×224224 \times 224 pikselių dydžio, o CNN specialiai pritaikyti šiam dydžiui. Net natūraliosios kalbos apdorojime RNN įvesties dydis yra aiškiai apibrėžtas ir fiksuotas. Kintamas dydis sprendžiamas nuosekliai apdorojant po vieną teksto vienetą arba specialiai suprojektuotais konvoliucijos branduoliais (Kalchbrenner ir kt., 2014). Šis požiūris gali sukelti didelių problemų, kai įvestis iš tiesų yra kintamo dydžio su kintamu informacijos kiekiu, pavyzdžiui, teksto transformavime 10.7 skyrelis (Sutskever ir kt., 2014). Visų pirma ilgoms sekoms tampa gana sunku sekti viską, kas jau buvo sugeneruota ar net peržiūrėta tinklo. Net aiškios sekimo euristikos, tokios kaip pasiūlytos (Yang ir kt., 2016), suteikia tik ribotą naudą.

Palyginkite tai su duomenų bazėmis. Paprasčiausia forma jos yra raktų (kk) ir reikšmių (vv) rinkiniai. Pavyzdžiui, mūsų duomenų bazę D\mathcal{D} gali sudaryti poros {("Zhang", "Aston"), ("Lipton", "Zachary"), ("Li", "Mu"), ("Smola", "Alex"), ("Hu", "Rachel"), ("Werness", "Brent")}, kur pavardė yra raktas, o vardas – reikšmė. Su D\mathcal{D} galime atlikti operacijas, pavyzdžiui, tikslią užklausą (qq) „Li“, kuri grąžintų reikšmę „Mu“. Jei („Li“, „Mu“) nebūtų D\mathcal{D} įrašas, galiojančio atsakymo nebūtų. Jei taip pat leistume apytikslius atitikmenis, vietoj to gautume („Lipton“, „Zachary“). Šis gana paprastas ir trivialus pavyzdys vis dėlto moko mus keleto naudingų dalykų:

  • Galime projektuoti užklausas qq, veikiančias (kk,vv) poras taip, kad jos galiotų nepriklausomai nuo duomenų bazės dydžio.
  • Ta pati užklausa gali gauti skirtingus atsakymus, priklausomai nuo duomenų bazės turinio.
  • „Kodas“, vykdomas didelei būsenų erdvei (duomenų bazei) apdoroti, gali būti gana paprastas (pvz., tikslus atitikimas, apytikslis atitikimas, top-kk).
  • Nereikia suspausti ar supaprastinti duomenų bazės, kad operacijos būtų veiksmingos.

Akivaizdu, kad čia nepristatytume paprastos duomenų bazės, jei ne giliojo mokymosi paaiškinimo tikslais. Iš tiesų tai veda prie vienos įdomiausių per pastarąjį dešimtmetį giliajame mokymesi pristatytų sąvokų: dėmesio sutelkimo mechanizmo (Bahdanau ir kt., 2014). Jo taikymo mašininiam vertimui specifiką aptarsime vėliau. Kol kas tiesiog apsvarstykite štai ką: pažymėkime D=def{(k1,v1),…(km,vm)}\mathcal{D} \stackrel{\textrm{def}}{=} \{(\mathbf{k}_1, \mathbf{v}_1), \ldots (\mathbf{k}_m, \mathbf{v}_m)\} duomenų bazę iš mm raktų ir reikšmių porų. Be to, pažymėkime q\mathbf{q} užklausą. Tada dėmesio sutelkimą D\mathcal{D} atžvilgiu galime apibrėžti kaip

Attention(q,D)=def∑i=1mα(q,ki)vi,(11.1.1)\textrm{Attention}(\mathbf{q}, \mathcal{D}) \stackrel{\textrm{def}}{=} \sum_{i=1}^m \alpha(\mathbf{q}, \mathbf{k}_i) \mathbf{v}_i, \tag{11.1.1}

kur α(q,ki)∈R\alpha(\mathbf{q}, \mathbf{k}_i) \in \mathbb{R} (i=1,…,mi = 1, \ldots, m) yra skaliariniai dėmesio svoriai. Pati operacija paprastai vadinama dėmesio sutelkimu (angl. attention pooling). Pavadinimas dėmesys kyla iš to, kad operacija kreipia ypatingą dėmesį į narius, kuriems svoris α\alpha yra reikšmingas (t. y. didelis). Taigi dėmesio sutelkimas D\mathcal{D} atžvilgiu sukuria duomenų bazėje esančių reikšmių tiesinį darinį. Tiesą sakant, tai apima aukščiau pateiktą pavyzdį kaip ypatingą atvejį, kai visi svoriai, išskyrus vieną, yra nuliai. Turime keletą ypatingų atvejų:

  • Svoriai α(q,ki)\alpha(\mathbf{q}, \mathbf{k}_i) yra neneigiami. Šiuo atveju dėmesio sutelkimo mechanizmo išvestis priklauso iškiliajam kūgiui, kurį generuoja reikšmės vi\mathbf{v}_i.
  • Svoriai α(q,ki)\alpha(\mathbf{q}, \mathbf{k}_i) sudaro iškilų derinį, t. y. ∑iα(q,ki)=1\sum_i \alpha(\mathbf{q}, \mathbf{k}_i) = 1 ir α(q,ki)≥0\alpha(\mathbf{q}, \mathbf{k}_i) \geq 0 visiems ii. Tai dažniausia nuostata giliajame mokymesi.
  • Lygiai vienas iš svorių α(q,ki)\alpha(\mathbf{q}, \mathbf{k}_i) yra 11, o visi kiti yra 00. Tai panašu į tradicinę duomenų bazės užklausą.
  • Visi svoriai yra lygūs, t. y. α(q,ki)=1m\alpha(\mathbf{q}, \mathbf{k}_i) = \frac{1}{m} visiems ii. Tai prilygsta vidurkinimui per visą duomenų bazę, giliajame mokymesi dar vadinamam sutelkimu vidurkinant.

Įprasta strategija užtikrinti, kad svoriai sumuotųsi į 11, yra juos normalizuoti per

α(q,ki)=α(q,ki)∑jα(q,kj).\alpha(\mathbf{q}, \mathbf{k}_i) = \frac{\alpha(\mathbf{q}, \mathbf{k}_i)}{{\sum_j} \alpha(\mathbf{q}, \mathbf{k}_j)}.

Visų pirma, kad svoriai taip pat būtų neneigiami, galima griebtis eksponentinimo. Tai reiškia, kad dabar galime pasirinkti bet kurią funkciją a(q,k)a(\mathbf{q}, \mathbf{k}) ir tada pritaikyti jai softmax operaciją, naudojamą daugianariams modeliams, per

α(q,ki)=exp⁡(a(q,ki))∑jexp⁡(a(q,kj)).(11.1.2)\alpha(\mathbf{q}, \mathbf{k}_i) = \frac{\exp(a(\mathbf{q}, \mathbf{k}_i))}{\sum_j \exp(a(\mathbf{q}, \mathbf{k}_j))}. \tag{11.1.2}

Ši operacija lengvai pasiekiama visuose giliojo mokymosi karkasuose. Ji diferencijuojama, o jos gradientas niekada neišnyksta – visos šios savybės pageidautinos modelyje. Vis dėlto atkreipkite dėmesį, kad aukščiau pristatytas dėmesio sutelkimo mechanizmas nėra vienintelis pasirinkimas. Pavyzdžiui, galime suprojektuoti nediferencijuojamą dėmesio sutelkimo modelį, kurį galima apmokyti skatinamojo mokymosi metodais (Mnih ir kt., 2014). Kaip ir galima tikėtis, tokio modelio apmokymas yra gana sudėtingas. Todėl didžioji šiuolaikinių dėmesio sutelkimo tyrimų dalis laikosi 11.1 skyrelis apibrėžto karkaso. Todėl savo pateikimą sutelkiame į šią diferencijuojamų mechanizmų šeimą.

Dėmesio sutelkimo mechanizmas apskaičiuoja tiesinį reikšmių \mathbf{v}_\mathit{i} darinį per dėmesio sutelkimą,
kur svoriai gaunami pagal užklausos \mathbf{q} ir raktų \mathbf{k}_\mathit{i} suderinamumą.

Gana nuostabu tai, kad tikrasis „kodas“, vykdomas raktų ir reikšmių aibei, būtent užklausa, gali būti gana glaustas, nors erdvė, kurioje veikiama, yra didelė. Tai pageidautina tinklo sluoksnio savybė, nes nereikia išmokti per daug parametrų. Ne mažiau patogu ir tai, kad dėmesio sutelkimas gali veikti savavališkai dideles duomenų bazes nekeičiant, kaip atliekama dėmesio sutelkimo operacija.

from d2l import mxnet as d2l
from mxnet import np, npx
npx.set_np()
from d2l import torch as d2l
import torch
from d2l import tensorflow as d2l
import tensorflow as tf
from d2l import jax as d2l
from jax import numpy as jnp

11.1.1 Vizualizavimas

Vienas dėmesio sutelkimo mechanizmo privalumų yra tas, kad jis gali būti gana intuityvus, ypač kai svoriai yra neneigiami ir sumuojasi į 11. Šiuo atveju galime interpretuoti didelius svorius kaip būdą modeliui išrinkti svarbius komponentus. Nors tai gera intuicija, svarbu atminti, kad tai tik tai – intuicija. Bet kuriuo atveju galime norėti vizualizuoti jo poveikį duotai raktų aibei taikant įvairias skirtingas užklausas. Ši funkcija mums pravers vėliau.

Todėl apibrėžiame funkciją show_heatmaps. Atkreipkite dėmesį, kad ji kaip įvesties nepriima (dėmesio svorių) matricos, o tenzorių su keturiomis ašimis, leidžiantį turėti skirtingų užklausų ir svorių masyvą. Todėl įvestis matrices turi formą (rodomų eilučių skaičius, rodomų stulpelių skaičius, užklausų skaičius, raktų skaičius). Tai pravers vėliau, kai norėsime vizualizuoti veikimą, kurį projektuojame transformeriams.

#@save
def show_heatmaps(matrices, xlabel, ylabel, titles=None, figsize=(2.5, 2.5),
                  cmap='Reds'):
    """Show heatmaps of matrices."""
    d2l.use_svg_display()
    num_rows, num_cols, _, _ = matrices.shape
    fig, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize,
                                 sharex=True, sharey=True, squeeze=False)
    for i, (row_axes, row_matrices) in enumerate(zip(axes, matrices)):
        for j, (ax, matrix) in enumerate(zip(row_axes, row_matrices)):
            if tab.selected('pytorch', 'mxnet', 'tensorflow'):
                pcm = ax.imshow(d2l.numpy(matrix), cmap=cmap)
            if tab.selected('jax'):
                pcm = ax.imshow(matrix, cmap=cmap)
            if i == num_rows - 1:
                ax.set_xlabel(xlabel)
            if j == 0:
                ax.set_ylabel(ylabel)
            if titles:
                ax.set_title(titles[j])
    fig.colorbar(pcm, ax=axes, shrink=0.6);

Kaip trumpas patikrinimas vizualizuokime vienetinę matricą, vaizduojančią atvejį, kai dėmesio svoris yra 11 tik tada, kai užklausa ir raktas yra tas pats.

attention_weights = d2l.reshape(d2l.eye(10), (1, 1, 10, 10))
show_heatmaps(attention_weights, xlabel='Keys', ylabel='Queries')

11.1.2 Santrauka

Dėmesio sutelkimo mechanizmas leidžia mums agreguoti duomenis iš daugelio (raktas, reikšmė) porų. Iki šiol mūsų diskusija buvo gana abstrakti, tiesiog aprašanti duomenų sutelkimo būdą. Dar nepaaiškinome, iš kur gali atsirasti tos paslaptingos užklausos, raktai ir reikšmės. Kai kuri intuicija čia gali padėti: pavyzdžiui, regresijos nuostatoje užklausa gali atitikti vietą, kurioje turėtų būti atliekama regresija. Raktai yra vietos, kuriose buvo stebimi ankstesni duomenys, o reikšmės yra pačios (regresijos) reikšmės. Tai vadinamasis Nadaraya–Watsono įvertis (Nadaraya, 1964; Watson, 1964), kurį nagrinėsime kitame skyrelyje.

Pagal dizainą dėmesio sutelkimo mechanizmas suteikia diferencijuojamą valdymo būdą, kuriuo neuroninis tinklas gali pasirinkti elementus iš aibės ir sudaryti susijusią vaizdų svertinę sumą.

11.1.3 Pratimai

  1. Tarkime, norėtumėte iš naujo įgyvendinti apytikslius (raktas, užklausa) atitikmenis, naudojamus klasikinėse duomenų bazėse; kokią dėmesio funkciją pasirinktumėte?
  2. Tarkime, kad dėmesio funkcija yra a(q,ki)=q⊤kia(\mathbf{q}, \mathbf{k}_i) = \mathbf{q}^\top \mathbf{k}_i ir kad ki=vi\mathbf{k}_i = \mathbf{v}_i, kai i=1,…,mi = 1, \ldots, m. Pažymėkime p(ki;q)p(\mathbf{k}_i; \mathbf{q}) raktų tikimybių skirstinį, naudojant softmax normalizaciją (11.1.2). Įrodykite, kad ∇qAttention(q,D)=Covp(ki;q)[ki]\nabla_{\mathbf{q}} \mathop{\textrm{Attention}}(\mathbf{q}, \mathcal{D}) = \textrm{Cov}_{p(\mathbf{k}_i; \mathbf{q})}[\mathbf{k}_i].
  3. Suprojektuokite diferencijuojamą paieškos variklį naudodami dėmesio sutelkimo mechanizmą.
  4. Peržiūrėkite „Squeeze and Excitation“ tinklų dizainą (Hu ir kt., 2018) ir interpretuokite juos per dėmesio sutelkimo mechanizmo prizmę.

Diskusijos

Diskusijos

Diskusijos

Diskusijos