Transformer Token ja Position Embedding Keras PlatoBlockchain Data Intelligence -toiminnolla. Pystysuuntainen haku. Ai.

Transformer Token ja paikan upottaminen Kerasilla

esittely

Siellä on paljon oppaita, jotka selittävät muuntajien toiminnan ja intuition rakentamiseen niiden keskeisen elementin – tokenin ja aseman upotuksen – perusteella.

Tokenien paikallinen upottaminen antoi muuntajille mahdollisuuden edustaa ei-jäykkiä suhteita tokenien (yleensä sanojen) välillä, mikä on paljon parempi mallintamaan kontekstipohjaista puhettamme kielimallinnusssa. Vaikka prosessi on suhteellisen yksinkertainen, se on melko yleinen, ja toteutuksista tulee nopeasti kattilalevy.

Tässä lyhyessä oppaassa tarkastellaan, kuinka voimme käyttää KerasNLP:tä, virallista Keras-lisäosaa. PositionEmbedding ja TokenAndPositionEmbedding.

KerasNLP

KerasNLP on horisontaalinen lisäys NLP:lle. Kirjoittaessa se on vielä hyvin nuori, versio 0.3, ja dokumentaatio on vielä melko lyhyt, mutta paketti on enemmän kuin vain käyttökelpoinen.

Se tarjoaa pääsyn Keras-tasoihin, kuten TokenAndPositionEmbedding, TransformerEncoder ja TransformerDecoder, mikä tekee räätälöityjen muuntajien rakentamisesta helpompaa kuin koskaan.

Voit käyttää KerasNLP:tä projektissamme asentamalla sen kautta pip:

$ pip install keras_nlp

Kun olet tuonut projektiin, voit käyttää mitä tahansa keras_nlp kerros tavallisena Keras-kerroksena.

tokenization

Tietokoneet toimivat numeroiden kanssa. Ilmaisemme ajatuksemme sanoin. Jotta tietokone voisi murtautua niiden läpi, meidän on määritettävä sanat numeroiksi jossain muodossa.

Yleinen tapa tehdä tämä on yksinkertaisesti yhdistää sanat numeroihin, joissa jokainen kokonaisluku edustaa sanaa. Sanakokoelma luo sanaston, ja jokainen sanaston sana saa indeksin. Siten voit muuttaa sanasarjan indeksien sekvenssiksi, joka tunnetaan nimellä rahakkeita:

def tokenize(sequence):
    
    return tokenized_sequence

sequence = ['I', 'am', 'Wall-E']
sequence = tokenize(sequence)
print(sequence) 

Tämä merkkijono voidaan sitten upottaa tiheään vektoriin, joka määrittää merkit piilevässä tilassa:

[[4], [26], [472]] -> [[0.5, 0.25], [0.73, 0.2], [0.1, -0.75]]

Tämä tehdään yleensä Embedding kerros Kerasissa. Muuntajat eivät koodaa vain standardin avulla Embedding kerros. He esiintyvät Embedding ja PositionEmbedding, ja lisää ne yhteen siirtämällä tavalliset upotukset niiden sijainnin mukaan piilevässä tilassa.

KerasNLP:n kanssa – esiintyminen TokenAndPositionEmbedding yhdistää tavallisen tunnuksen upotuksen (Embedding) sijainti upotuksella (PositionEmbedding).

AsentoUpottaminen

Katsotaanpa tätä PositionEmbedding ensimmäinen. Se hyväksyy tensorit ja repaleiset tensorit ja olettaa, että lopullinen ulottuvuus edustaa piirteitä, kun taas toiseksi viimeinen ulottuvuus edustaa sarjaa.

# Seq
(5, 10)
     # Features

Kerros hyväksyy a sequence_length argumentti, joka tarkoittaa tulo- ja lähtösekvenssin pituutta. Mennään eteenpäin ja upotetaan satunnainen yhtenäinen tensori:

seq_length = 5
input_data = tf.random.uniform(shape=[5, 10])

input_tensor = keras.Input(shape=[None, 5, 10])
output = keras_nlp.layers.PositionEmbedding(sequence_length=seq_length)(input_tensor)
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data)

Tämä johtaa:

<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array([[ 0.23758471, -0.16798696, -0.15070847,  0.208067  , -0.5123104 ,
        -0.36670157,  0.27487397,  0.14939266,  0.23843127, -0.23328197],
       [-0.51353353, -0.4293166 , -0.30189738, -0.140344  , -0.15444171,
        -0.27691704,  0.14078277, -0.22552207, -0.5952263 , -0.5982155 ],
       [-0.265581  , -0.12168896,  0.46075982,  0.61768025, -0.36352775,
        -0.14212841, -0.26831496, -0.34448475,  0.4418767 ,  0.05758983],
       [-0.46500492, -0.19256318, -0.23447984,  0.17891657, -0.01812166,
        -0.58293337, -0.36404118,  0.54269964,  0.3727749 ,  0.33238482],
       [-0.2965023 , -0.3390794 ,  0.4949159 ,  0.32005525,  0.02882379,
        -0.15913549,  0.27996767,  0.4387421 , -0.09119213,  0.1294356 ]],
      dtype=float32)>

TokenAndPositionEmbeddding

Tokenin ja sijainnin upottaminen tiivistyy käyttöön Embedding syöttösekvenssissä, PositionEmbedding sulautetuissa tunnisteissa ja lisää sitten nämä kaksi tulosta yhteen, mikä tehokkaasti syrjäyttää merkkien upotukset avaruuteen koodaamaan niiden suhteellisia merkityksellisiä suhteita.

Tämä voidaan teknisesti tehdä seuraavasti:

seq_length = 10
vocab_size = 25
embed_dim = 10

input_data = tf.random.uniform(shape=[5, 10])

input_tensor = keras.Input(shape=[None, 5, 10])
embedding = keras.layers.Embedding(vocab_size, embed_dim)(input_tensor)
position = keras_nlp.layers.PositionEmbedding(seq_length)(embedding)
output = keras.layers.add([embedding, position])
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data).shape 

Syötteet upotetaan ja sitten paikannus upotetaan, minkä jälkeen ne yhdistetään, jolloin saadaan uusi paikallisesti upotettu muoto. Vaihtoehtoisesti voit hyödyntää TokenAndPositionEmbedding kerros, joka tekee tämän konepellin alla:

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

... 
def call(self, inputs):
        embedded_tokens = self.token_embedding(inputs)
        embedded_positions = self.position_embedding(embedded_tokens)
        outputs = embedded_tokens + embedded_positions
        return outputs

Tämä tekee siitä paljon siistimmän suoritettavan TokenAndPositionEmbedding:

seq_length = 10
vocab_size = 25
embed_dim = 10

input_data = tf.random.uniform(shape=[5, 10])

input_tensor = keras.Input(shape=[None, 5, 10])
output = keras_nlp.layers.TokenAndPositionEmbedding(vocabulary_size=vocab_size, 
                                                     sequence_length=seq_length, 
                                                     embedding_dim=embed_dim)(input_tensor)
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data).shape 

Tasolle siirtämämme tiedot on nyt upotettu 10 ulottuvuuden piilevään tilaan:

model(input_data)
<tf.Tensor: shape=(5, 10, 10), dtype=float32, numpy=
array([[[-0.01695484,  0.7656435 , -0.84340465,  0.50211895,
         -0.3162892 ,  0.16375223, -0.3774369 , -0.10028353,
         -0.00136751, -0.14690581],
        [-0.05646318,  0.00225556, -0.7745967 ,  0.5233861 ,
         -0.22601983,  0.07024342,  0.0905793 , -0.46133494,
         -0.30130145,  0.451248  ],
         ...

Jatketaan eteenpäin – Hand-Held päästä päähän -projekti

Utelias luonteesi saa sinut haluamaan pidemmälle? Suosittelemme tutustumaan meidän Ohjattu projekti: "Kuvien tekstitys CNN:llä ja Transformers with Keras".

Tässä ohjatussa projektissa opit rakentamaan kuvien kuvatekstimallin, joka hyväksyy kuvan syötteeksi ja tuottaa tekstin tulosteena.

Opit kuinka:

  • Esikäsittele teksti
  • Vektorisoi tekstinsyöttö helposti
  • Työskentele tf.data API ja luo tehokkaita tietojoukkoja
  • Rakenna muuntajia tyhjästä TensorFlow/Kerasilla ja KerasNLP:llä – Kerasin virallisella vaakasuuntaisella lisäyksellä huippuluokan NLP-mallien rakentamiseen
  • Rakenna hybridiarkkitehtuuria, jossa yhden verkon lähtö on koodattu toista varten

Miten kehystetään kuvatekstit? Useimmat pitävät sitä esimerkkinä generatiivisesta syväoppimisesta, koska opetamme verkostoa luomaan kuvauksia. Pidän kuitenkin siitä esimerkkinä hermoston konekäännöksestä – me käännämme kuvan visuaaliset ominaisuudet sanoiksi. Käännöksen avulla luomme tuosta kuvasta uuden esityksen sen sijaan, että luomme vain uutta merkitystä. Sen katsominen käännöksenä ja vain laajennussukupolven avulla tarkastelee tehtävää eri valossa ja tekee siitä hieman intuitiivisemman.

Kun ongelma muotoillaan käännökseksi, on helpompi selvittää, mitä arkkitehtuuria haluamme käyttää. Vain enkooderit -muuntajat ymmärtävät hyvin tekstiä (tunneanalyysi, luokittelu jne.), koska kooderit koodaavat merkityksellisiä esityksiä. Vain dekooderit sisältävät mallit sopivat erinomaisesti luomiseen (kuten GPT-3), koska dekooderit pystyvät päättelemään mielekkäitä esityksiä toiseen sekvenssiin, jolla on sama merkitys. Käännös tehdään tyypillisesti enkooderi-dekooderi-arkkitehtuurilla, jossa kooderit koodaavat lauseen (tai meidän tapauksessamme kuvan) merkityksellisen esityksen ja dekooderit oppivat muuttamaan tämän sekvenssin toiseksi mielekkääksi esitykseksi, joka on meille paremmin tulkittavissa (kuten lause).

Päätelmät

Transformerit ovat saavuttaneet suuren aallon vuodesta 2017 lähtien, ja monet upeat oppaat tarjoavat tietoa niiden toiminnasta, mutta ne olivat silti monille vaikeasti käsittämättömiä mukautettujen toteutusten ylimääräisten kustannusten vuoksi. KerasNLP ratkaisee tämän ongelman tarjoamalla rakennuspalikoita, joiden avulla voit rakentaa joustavia ja tehokkaita NLP-järjestelmiä valmiiden ratkaisujen sijaan.

Tässä oppaassa olemme tarkastelleet tunnuksen ja sijainnin upottamista Kerasin ja KerasNLP:n kanssa.

Aikaleima:

Lisää aiheesta Stackabus