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 aTokenAndPositionEmbedding
.
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.