Acesta este un tutorial despre cum să instruiți un model de secvență în secvență care utilizează modulul nn.Transformer.

Versiunea PyTorch 1.2 include un modul de transformare standard bazat pe hârtie. Atenție este tot ce aveți nevoie. Modelul transformatorului a fost implementat pentru a avea o calitate superioară pentru multe probleme de la secvență la secvență, fiind în același timp mai paralelizabil. Modulul nn.Transformer se bazează în întregime pe un mecanism de atenție (un alt modul implementat recent ca nn.MultiheadAttention) pentru a desena dependențe globale între intrare și ieșire. Modulul nn.Transformer este acum extrem de modularizat, astfel încât o singură componentă (cum ar fi nn.TransformerEncoder în acest tutorial) poate fi ușor adaptată/compusă.

modelare

Definiți modelul¶

În acest tutorial, instruim modelul nn.TransformerEncoder pe o sarcină de modelare a limbajului. Sarcina de modelare a limbajului este de a atribui probabilitatea ca un anumit cuvânt (sau o secvență de cuvinte) să urmeze o succesiune de cuvinte. O secvență de jetoane sunt transmise mai întâi stratului de încorporare, urmat de un strat de codare pozițională pentru a ține cont de ordinea cuvântului (consultați paragraful următor pentru mai multe detalii). Nn.TransformerEncoder este format din mai multe straturi de nn.TransformerEncoderLayer. Împreună cu secvența de intrare, este necesară o mască pătrată de atenție, deoarece straturile de auto-atenție din nn.TransformerEncoder au permisiunea de a participa doar la pozițiile anterioare din secvență. Pentru sarcina de modelare a limbajului, orice jetoane de pe pozițiile viitoare ar trebui să fie mascate. Pentru a avea cuvintele reale, ieșirea modelului nn.TransformerEncoder este trimisă la nivelul liniar final, care este urmat de o funcție log-Softmax.

Modulul PositionalEncoding injectează câteva informații despre poziția relativă sau absolută a jetoanelor în secvență. Codurile poziționale au aceeași dimensiune ca și încorporările, astfel încât cele două să poată fi însumate. Aici, folosim funcții sinus și cosinus de frecvențe diferite.

Încărcați și lotați datele¶

Acest tutorial utilizează torchtext pentru a genera setul de date Wikitext-2. Obiectul vocab este construit pe baza setului de date de tren și este utilizat pentru a numeriza jetoanele în tensori. Pornind de la date secvențiale, funcția batchify () aranjează setul de date în coloane, tăind orice jetoane rămase după ce datele au fost împărțite în loturi de dimensiuni batch_size. De exemplu, cu alfabetul ca secvență (lungimea totală de 26) și o dimensiune a lotului de 4, am împărți alfabetul în 4 secvențe de lungime 6:

Aceste coloane sunt tratate ca independente de model, ceea ce înseamnă că dependența de G și F nu poate fi învățată, dar permite o procesare mai eficientă a loturilor.

Funcții pentru a genera secvența de intrare și țintă¶

Funcția get_batch () generează secvența de intrare și țintă pentru modelul transformatorului. Subdivizează datele sursă în bucăți de lungime bptt. Pentru sarcina de modelare a limbajului, modelul are nevoie de următoarele cuvinte ca țintă. De exemplu, cu o valoare bptt de 2, am obține următoarele două variabile pentru i = 0:

Trebuie remarcat faptul că bucățile sunt de-a lungul dimensiunii 0, în concordanță cu dimensiunea S din modelul Transformator. Dimensiunea lotului N este de-a lungul dimensiunii 1.

Inițiați o instanță¶

Modelul este configurat cu hiperparametrul de mai jos. Dimensiunea vocab este egală cu lungimea obiectului vocab.

Rulați modelul¶

CrossEntropyLoss se aplică pentru a urmări pierderea, iar SGD implementează metoda de descindere a gradientului stocastic ca optimizator. Rata de învățare inițială este setată la 5,0. StepLR se aplică pentru a regla rata de învățare prin epoci. În timpul antrenamentului, folosim funcția nn.utils.clip_grad_norm_ pentru a scala tot gradientul împreună pentru a preveni explozia.

Buclă peste epoci. Salvați modelul dacă pierderea prin validare este cea mai bună pe care am văzut-o până acum. Reglați rata de învățare după fiecare epocă.