Transzformátor token és pozícióbeágyazás a Keras PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.

Transzformátor token és pozíció beágyazás Keras segítségével

Bevezetés

Rengeteg útmutató található a transzformátorok működésének leírására, valamint az intuíciók kulcsfontosságú elemére – a token- és pozícióbeágyazásra – való intuíció építésére.

A tokenek pozicionális beágyazása lehetővé tette a transzformátorok számára, hogy a tokenek (általában szavak) közötti nem merev kapcsolatokat ábrázolják, ami sokkal jobb a kontextus-vezérelt beszédünk modellezésében a nyelvi modellezésben. Noha a folyamat viszonylag egyszerű, meglehetősen általános, és a megvalósítások gyorsan kazánokká válnak.

Ebben a rövid útmutatóban megnézzük, hogyan használhatjuk a KerasNLP-t, a hivatalos Keras-kiegészítőt. PositionEmbedding és a TokenAndPositionEmbedding.

KerasNLP

A KerasNLP az NLP vízszintes kiegészítése. Az írás pillanatában még nagyon fiatal, a 0.3-as verzió, és a dokumentáció még meglehetősen rövid, de a csomag több, mint egyszerűen használható.

Hozzáférést biztosít a Keras rétegekhez, mint pl TokenAndPositionEmbedding, TransformerEncoder és a TransformerDecoder, ami megkönnyíti az egyedi transzformátorok építését, mint valaha.

A KerasNLP használatához projektünkben telepítheti a következőn keresztül pip:

$ pip install keras_nlp

A projektbe importálás után bármelyiket használhatja keras_nlp réteg szabványos Keras rétegként.

tokenizálás

A számítógépek számokkal dolgoznak. Szavakkal fejezzük ki gondolatainkat. Ahhoz, hogy a számítógép áttörjön rajtuk, a szavakat valamilyen formában számokra kell képeznünk.

Ennek általános módja az, hogy a szavakat egyszerűen olyan számokra képezik le, ahol minden egész szám egy szót jelent. A szavakból álló korpusz szókincset hoz létre, és a szókincs minden szava indexet kap. Így egy szósorozatot indexek sorozatává alakíthat, amely néven ismert tokenek:

def tokenize(sequence):
    
    return tokenized_sequence

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

Ezt a tokenek sorozatot be lehet ágyazni egy sűrű vektorba, amely meghatározza a tokeneket a látens térben:

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

Ezt általában a Embedding réteg Kerasban. A transzformátorok nem csak szabvány segítségével kódolnak Embedding réteg. Fellépnek Embedding és a PositionEmbedding, és összeadja őket, és a szokásos beágyazásokat a látens térben elfoglalt helyzetükkel helyettesíti.

KerasNLP-vel – fellép TokenAndPositionEmbedding kombinálja a normál token beágyazást (Embedding) helyzeti beágyazással (PositionEmbedding).

PozícióBeágyazás

Vessünk egy pillantást PositionEmbedding első. Tenzorokat és rongyos tenzorokat fogad el, és feltételezi, hogy a végső dimenzió a jellemzőket, míg az utolsó dimenzió a sorozatot reprezentálja.

# Seq
(5, 10)
     # Features

A réteg elfogadja a sequence_length argumentum, amely jelöli a bemeneti és kimeneti sorozat hosszát. Menjünk előre, és helyezzünk be egy véletlenszerű egyenletes tenzort:

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)

Ennek eredményeként:

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

TokenAndPositionEmbedding

A token- és pozícióbeágyazás a használatban merül ki Embedding a beviteli sorrendben, PositionEmbedding a beágyazott tokeneken, majd összeadja ezt a két eredményt, hatékonyan elmozdítva a token beágyazásokat a térben, hogy kódolják relatív értelmes kapcsolataikat.

Ezt technikailag a következőképpen lehet megtenni:

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 

A bemenetek beágyazódnak, majd pozicionálisan beágyazódnak, majd összeadják őket, így új, pozicionálisan beágyazott alakzat jön létre. Alternatív megoldásként kihasználhatja a TokenAndPositionEmbedding réteg, amely ezt teszi a motorháztető alatt:

Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!

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

Ez sokkal tisztábbá teszi az előadást 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 

A rétegbe továbbított adatok most pozíció szerint egy 10 dimenzióból álló látens térbe vannak ágyazva:

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

Tovább haladva – kézi, végponttól végpontig projekt

Érdeklődő természete arra készteti, hogy tovább menjen? Javasoljuk, hogy tekintse meg nálunk Irányított projekt: „Képaláírás CNN-ekkel és Transformers Kerasszal”.

Ebben az irányított projektben megtudhatja, hogyan kell felépíteni egy képfelirat-modellt, amely elfogad egy képet bemenetként, és szöveges feliratot készít kimenetként.

Megtudhatja, hogyan kell:

  • Szöveg előfeldolgozása
  • Egyszerűen vektorizálhatja a szövegbevitelt
  • Dolgozzon a tf.data API és hatékony adatkészletek létrehozása
  • Építsen transzformátorokat a semmiből a TensorFlow/Keras és a KerasNLP segítségével – a Keras hivatalos vízszintes kiegészítője a legmodernebb NLP modellek készítéséhez
  • Olyan hibrid architektúrákat hozzon létre, amelyekben az egyik hálózat kimenete egy másikhoz van kódolva

Hogyan keretezzük be a képaláírásokat? A legtöbben a generatív mély tanulás példájának tartják, mivel egy hálózatot tanítunk leírások generálására. Azonban szeretem a neurális gépi fordítás példájaként tekinteni – egy kép vizuális jellemzőit fordítjuk szavakra. A fordítás révén a kép új megjelenítését hozzuk létre, ahelyett, hogy csak új jelentést generálnánk. Ha fordításként tekinti meg, és csak kiterjesztéssel generálva, más megvilágításba helyezi a feladatot, és egy kicsit intuitívabbá teszi.

Ha a problémát a fordítás egyikeként fogalmazzuk meg, könnyebben kitaláljuk, melyik architektúrát szeretnénk használni. A csak kódolót használó transzformátorok nagyszerűek a szövegértésben (hangulatelemzés, osztályozás stb.), mert a kódolók értelmes reprezentációkat kódolnak. A csak dekóderrel használható modellek kiválóak a generáláshoz (például a GPT-3), mivel a dekóderek képesek értelmes reprezentációkat következtetni egy másik, azonos jelentésű sorozatba. A fordítást általában kódoló-dekódoló architektúra végzi, ahol a kódolók egy mondat (vagy esetünkben kép) értelmes reprezentációját kódolják, a dekódolók pedig megtanulják, hogy ezt a sorozatot egy másik, számunkra jobban értelmezhető, értelmes reprezentációvá alakítsák (például egy mondat).

Következtetések

A Transformerek 2017 óta nagy hullámot keltettek, és sok nagyszerű útmutató nyújt betekintést működésükbe, ennek ellenére sokak számára még mindig megfoghatatlanok voltak az egyedi megvalósítások többletköltségei miatt. A KerasNLP megoldja ezt a problémát, és olyan építőelemeket biztosít, amelyek lehetővé teszik rugalmas, hatékony NLP-rendszerek építését, nem pedig előre csomagolt megoldásokat.

Ebben az útmutatóban a Keras és KerasNLP token- és pozícióbeágyazását vettük szemügyre.

Időbélyeg:

Még több Stackabus