Transformeri märgi ja positsiooni manustamine Kerase PlatoBlockchaini andmeanalüüsiga. Vertikaalne otsing. Ai.

Transformeri tunnus ja positsiooni manustamine Kerasega

Sissejuhatus

Seal on palju juhendeid, mis selgitavad, kuidas trafod töötavad ja kuidas luua intuitsiooni nende põhielemendil – märgi ja positsiooni manustamisel.

Märkide positsiooniline manustamine võimaldas trafodel kujutada mittejäikaid seoseid märkide (tavaliselt sõnade) vahel, mis on meie kontekstipõhise kõne modelleerimisel keele modelleerimisel palju parem. Kuigi protsess on suhteliselt lihtne, on see üsna üldine ja teostused muutuvad kiiresti katlakiviks.

Selles lühikeses juhendis vaatleme, kuidas saame kasutada KerasNLP-d, Kerase ametlikku lisandmoodulit. PositionEmbedding ja TokenAndPositionEmbedding.

KerasNLP

KerasNLP on NLP horisontaalne lisand. Kirjutamise seisuga on see veel väga noor, versioon 0.3, ja dokumentatsioon on veel üsna lühike, kuid pakett on enamat kui lihtsalt juba kasutatav.

See annab juurdepääsu Kerase kihtidele, nt TokenAndPositionEmbedding, TransformerEncoder ja TransformerDecoder, mis muudab kohandatud trafode ehitamise lihtsamaks kui kunagi varem.

KerasNLP kasutamiseks meie projektis saate selle installida kaudu pip:

$ pip install keras_nlp

Pärast projekti importimist saate kasutada mis tahes keras_nlp kiht tavalise Kerase kihina.

Tokeniseerimine

Arvutid töötavad numbritega. Me väljendame oma mõtteid sõnadega. Et arvuti saaks neist läbi murda, peame sõnad mingil kujul numbritega vastendama.

Levinud viis selleks on sõnade vastendamine numbritega, kus iga täisarv tähistab sõna. Sõnakorpus loob sõnavara ja iga sõnavaras olev sõna saab indeksi. Seega saate sõnade jada muuta indeksite jadaks, mida tuntakse kui märkide:

def tokenize(sequence):
    
    return tokenized_sequence

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

Selle žetoonide jada saab seejärel põimida tihedasse vektorisse, mis määratleb märgid varjatud ruumis:

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

Tavaliselt tehakse seda rakendusega Embedding kiht Keras. Trafod ei kodeeri ainult standardeid kasutades Embedding kiht. Nad esinevad Embedding ja PositionEmbeddingja lisage need kokku, nihutades tavalisi manuseid nende asukoha järgi varjatud ruumis.

KerasNLP-ga – esinemine TokenAndPositionEmbedding ühendab tavalise märgi manustamise (Embedding) positsioonilise manustamisega (PositionEmbedding).

Positsioon Manustamine

Heidame pilgu peale PositionEmbedding esiteks. See aktsepteerib tensoreid ja räsitud tensoreid ning eeldab, et lõplik mõõde esindab tunnuseid, samas kui viimane mõõde esindab jada.

# Seq
(5, 10)
     # Features

Kiht aktsepteerib a sequence_length argument, mis tähistab sisend- ja väljundjada pikkust. Läheme edasi ja manustage positsiooniliselt juhuslik ühtlane tensor:

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)

Selle tulemuseks on:

<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)>

TokenAndPosition Embedding

Märgi ja asukoha manustamine taandub kasutamisele Embedding sisestusjärjestuse kohta, PositionEmbedding manustatud märkidel ja seejärel need kaks tulemust kokku liites, nihutades tõhusalt manustatud märgid ruumis, et kodeerida nende suhtelisi tähendusrikkaid suhteid.

Tehniliselt saab seda teha järgmiselt:

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 

Sisendid on manustatud ja seejärel positsiooniliselt manustatud, misjärel need liidetakse kokku, luues uue asendiliselt manustatud kuju. Teise võimalusena võite kasutada TokenAndPositionEmbedding kiht, mis teeb seda kapoti all:

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!

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

See muudab selle esinemise palju puhtamaks 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 

Kihti edastatud andmed on nüüd positsioneeritult manustatud 10 mõõtmega varjatud ruumi:

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  ],
         ...

Edasiminek – käeshoitav otsast lõpuni projekt

Sinu uudishimulik loomus tekitab sinus soovi minna kaugemale? Soovitame tutvuda meiega Juhendatud projekt: "Piltide pealdised CNN-idega ja transformaatorid Kerasega".

Selles juhendatud projektis saate teada, kuidas luua pilditiitrite mudelit, mis võtab sisendiks pildi ja loob väljundina tekstilise pealdise.

Õpid, kuidas:

  • Teksti eeltöötlemine
  • Vektoriseerige tekstisisestus lihtsalt
  • Töötage koos tf.data API ja looge toimivad andmekogumid
  • Ehitage transformereid nullist TensorFlow/Keras ja KerasNLP abil – Kerase ametlik horisontaalne täiendus tipptasemel NLP mudelite ehitamiseks
  • Looge hübriidarhitektuure, kus ühe võrgu väljund on teise jaoks kodeeritud

Kuidas me pildiallkirja raamime? Enamik peab seda generatiivse süvaõppe näiteks, kuna õpetame võrgustikku kirjeldusi looma. Siiski meeldib mulle vaadata seda kui närvi masintõlke näidet – me tõlgime pildi visuaalsed omadused sõnadesse. Tõlke abil loome selle pildi uue esituse, mitte ei loo lihtsalt uut tähendust. Selle vaatamine tõlkena ja ainult laienduse genereerimisega käsitleb ülesannet teises valguses ja muudab selle pisut intuitiivsemaks.

Probleemi tõlkimine üheks probleemiks muudab lihtsamaks aru saada, millist arhitektuuri me kasutada tahame. Ainult kodeerijaga transformaatorid saavad suurepäraselt aru tekstist (sentimentide analüüs, klassifitseerimine jne), sest kodeerijad kodeerivad tähendusrikkaid esitusi. Ainult dekooderiga mudelid sobivad suurepäraselt genereerimiseks (nt GPT-3), kuna dekoodrid suudavad järeldada tähendusrikkaid esitusi teise sama tähendusega jadasse. Tõlkimine toimub tavaliselt kodeerija-dekoodri arhitektuuriga, kus kodeerijad kodeerivad lause (või meie puhul pildi) tähendusliku esituse ja dekoodrid õpivad muutma selle jada teiseks tähenduslikuks esituseks, mis on meie jaoks paremini tõlgendatav (nt lause).

Järeldused

Transformerid on alates 2017. aastast teinud suure laine ja paljud suurepärased juhendid annavad ülevaate nende tööpõhimõttest, kuid siiski jäid need paljudele kohandatud rakenduste ülemäärase kulu tõttu tabamatuks. KerasNLP lahendab selle probleemi, pakkudes eelpakendatud lahenduste pakkumise asemel ehitusplokke, mis võimaldavad teil luua paindlikke ja võimsaid NLP-süsteeme.

Selles juhendis oleme vaatlenud loa ja positsiooni manustamist Kerase ja KerasNLP-ga.

Ajatempel:

Veel alates Stackabus