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
jaTokenAndPositionEmbedding
.
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 PositionEmbedding
ja 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.