Transformer oinarritutako ereduak ezagunak dira testu konplexuak analizatzeko eta interpretatzeko duten gaitasunagatik. Hitzen ordena eta testuingurua ulertzean oinarritzen dira, posizio-kodetze metodo tradizionalek beren mugak erakutsi dituzten zereginetan. Hutsune horri aurre eginez, ROFORMER ereduak, Rotary Position Embedding (RoPE) (Rotary Position Embedding (RoPE))**, posizio-kodeketari buruzko gure ikuspegia birdefinitzen du.
Posizio-kodeketa tradizionala
Transformers-ek testua token sorta gisa tratatzen dute, eta sekuentzien prozesamendu paraleloa ahalbidetzen dute eraginkortasun handiagoa lortzeko. Hala ere, indar horrek bere erronka ekarri zuen: ereduaren berezko agnostizismoa token ordenaren arabera. Kodeketa posizioa izan zen erantzuna, token bakoitzari bere sekuentzia-posizioa adierazten duen sinadura bakarra emanez.
Erabateko posizioa txertatzeak
Hasieran, BERT bezalako ereduek posizio absolutuaren txertaketak erabiltzen zituzten, sekuentzia bateko posizio bakoitzari bektore finko bat esleituz. Metodo honek, zuzena izan arren, berez ez du gaitasunik sekuentziaren luzera aldaketetara egokitzeko edo tokenen arteko distantzia erlatiboak azpimarratzeko, funtsezkoa hizkuntza-eraikuntza asko ulertzeko.
Posizio erlatiboa txertatzeak
Hizkuntzaren izaera dinamikoa harrapatzeko, posizio erlatiboen txertaketak sartu ziren, tokenen arteko distantzian arreta jarriz haien posizio absolutuetan baino. Abantaila kontzeptualak izan arren, txertaketa hauek konplexutasun konputazionala sartu zuten, eta ezin izan zuten Transformers-en auto-arreta mekanismoan integratzea, haien eraginkortasuna mugatuz.
ROFORMER eta posizio birakaria txertatzea
Dauden kodetze kodetze estrategien mugak aintzat hartuta, ROFORMER-ek Rotary Position Embedding (RoPE) aurkezten du, posizio absolutu eta erlatiboaren informazioaren onurak batzen dituen ikuspegia, dagozkien eragozpenik gabe.
Posizio birakaria txertatzea
RoPEk posizio-informazioa kodetzen du errotazio-matrizeak erabiliz, eta ereduari token bat non dagoen ez ezik, sekuentzia bateko beste token guztiekin nola erlazionatzen den uler dezake.
Credit: ArXiv
Lente geometriko baten bidez funtzionatzen du, token-posizioak beren erlazio sekuentzialak markatzeko biratzen diren dimentsio anitzeko espazioko puntu gisa tratatuz. Errotazio horri esker, ereduak bere auto-arreta mekanismoaren barruan posizio-seinale absolutuak zein erlatiboak gorde eta ustiatu ditzake.
Soka ezartzea
RoPE ezartzeak token bakoitzaren posizioa biraketa-matrize batean kodetzea dakar, eta matrize hori Transformadorearen auto-arreta mekanismoaren barruan aplikatzea. Prozesu honek posizio-informazioaren interpretazio malgu eta dinamikoa ahalbidetzen du, sekuentzia luzera ezberdinei egokituz eta token arteko erlazioen funtsa harrapatzen du konputazio-gastu handirik gabe.
Lehenik eta behin, txertaketa birakariak sortzeko funtzio bat beharko duzu, eta gero txertaketa horiek zure ereduan integratuko dituzu. Beheko adibideak Keras-en geruza pertsonalizatuak sortzen ezagutzen dituzula suposatzen du.
1. urratsa: Definitu birakaria txertatzeko funtzioa
Funtzio honek txertaketa birakariak sortzen ditu sekuentziaren gehienezko luzera eta txertaketen dimentsioa kontuan hartuta.
from tensorflow.keras.layers import Layer
import numpy as np
def get_rotary_embedding(dim, max_seq_len):
inv_freq = 1.0 / (10000 ** (tf.range(0, dim, 2, dtype=tf.float32) / dim))
t = tf.range(max_seq_len, dtype=tf.float32)
freqs = tf.einsum('i,j->ij', t, inv_freq)
emb = tf.concat((tf.cos(freqs), tf.sin(freqs)), axis=-1)
return emb
inv_freq = 1.0 / (10000 ** (tf.range(0, dim, 2, dtype=tf.float32) / dim))
Lerro honek esponentzialki eskalatutako maiztasunen alderantzizkoa kalkulatzen du posizio-indizeetan oinarrituta. Frekuentzia hauek txertaketa birakarietarako patroi sinusoidalak sortzeko erabiltzen dira, eta horrek sekuentziatan posizio-informazio erlatiboa kodetzen laguntzen du. Mekanismo hau bereziki erabilgarria da elementuen ordena eta kokapen erlatiboa ulertzea funtsezkoa den atazetan, esate baterako, hizkuntza naturalaren prozesamenduan edo denbora serieen analisian.
Xehetasunetan:
-
tf.range(0, dim, 2, dtype=tf.float32)
balio sorta bat sortzen du 0tikdim
arte (esklusiboa), 2z urrats.dtype=tf.float32
argumentuak zehazten du tentsore honen elementuak 32 biteko koma mugikorreko zenbakiak direla.dim
8 bada, adibidez, honek[0, 2, 4, 6]
sortuko luke. -
tf.range
-k sortutako tentsorea gero zatitzen da txertaketen dimentsioarekin (dim
). Eragiketa honek indize hauek 0 eta 1 arteko tartera murrizten ditu (esklusiboadim
bikoitia bada, apur bat barnedim
bakoitia bada, barruti-urratsak beste balio guztiak saltatzen dituelako). Adibidearekin jarraituzdim
= 8, 8rekin zatituz gero,[0.0, 0.25, 0.5, 0.75]
lortzen da. -
10000 ** (...)
eragiketak 10.000 igotzen du aldez aurretik eskalatutako tentsoreko elementu bakoitzaren potentziara. 10.000 oinarria arbitrario samarra da, baina maiztasunak tarte zabalean aldatzen direla ziurtatzeko aukeratzen da, eta horrek ereduari posizio desberdinak modu eraginkorragoan bereizten laguntzen du.[0.0, 0.25, 0.5, 0.75]
-rako, potentzia-eragiketa aplikatuko lioke bakoitzari, eta, ondorioz, balioak askoz handiagoak izango dira goi-elementuentzat. -
Azkenik, alderantzizko maiztasuna aurreko urratseko balioen elkarrekikoa (1/x) hartuz lortzen da. Alderantzizko maiztasunak txikiagoak dira indize altuagoetarako, hau da, sekuentzian aurrerago dauden elementuek maiztasun txikiagoak izango dituzte, eta haien posizioak ereduan kodetzen diren eragingo dute. Horri esker, txertaketak eskala daitezke ereduaren arreta-mekanismoen bidez posizio erlatiboak ondoriozta daitezkeen moduan.
Lerroa:
freqs = tf.einsum('i,j->ij', t, inv_freq)
TensorFlow-en tf.einsum
funtzioa erabiltzen du, Einsteinen batuketa-notazioa erabiliz tentsore-eragiketen adierazpen zehatz eta eraginkorra ahalbidetzen duen tresna.
Eragiketa honek t
eta inv_freq
bektoreen kanpoko produktua modu eraginkorrean kalkulatzen du, matrize baten ondorioz, non (i, j)
elementu bakoitza t
-ren i
-garren elementuaren eta j
-garren elementua inv_freq
. Matrize honek (freqs
) txertaketa birakarietarako patroi sinusoidalak sortzeko erabiltzen diren maiztasunak adierazten ditu.
2. urratsa: Keras geruza pertsonalizatua txertatze birakarietarako
Orain, sor dezagun Keras geruza pertsonalizatu bat, sarrerako tentsorea birakari txertaketak aplikatzen dituena. Geruza honek sarrerako tentsorea (batch_size, sequence_length, embedding_dim)
forma duela suposatzen du.
class RotaryEmbeddingLayer(Layer):
def __init__(self, dim, max_seq_len, **kwargs):
super().__init__(**kwargs)
self.dim = dim
self.max_seq_len = max_seq_len
self.rotary_embeddings = get_rotary_embedding(dim, max_seq_len)
def call(self, inputs):
seq_len = tf.shape(inputs)[1]
embeddings = self.rotary_embeddings[:seq_len]
cos_emb = embeddings[:, None, :self.dim // 2]
sin_emb = embeddings[:, None, self.dim // 2:]
# Decompose inputs into sine and cosine components
inputs_cos = inputs[..., :self.dim // 2]
inputs_sin = inputs[..., self.dim // 2:]
# Apply rotary embeddings
rotated_cos = inputs_cos * cos_emb - inputs_sin * sin_emb
rotated_sin = inputs_sin * cos_emb + inputs_cos * sin_emb
return tf.concat([rotated_cos, rotated_sin], axis=-1)
def get_config(self):
config = super().get_config()
config.update({
"dim": self.dim,
"max_seq_len": self.max_seq_len
})
return config
Embeddings = self.rotary_embeddings[:seq_len]
lerroak aurrez kalkulatutako txertatze birakarien azpimultzo egokia hautatzen du uneko sarrera-sekuentziaren luzeraren arabera. Sekuentzien luzera sorta batetik bestera alda daitekeenez, zatiketa-eragiketa honek benetako sekuentziaren luzerari dagozkion txertaketak soilik erabiltzen direla ziurtatzen du.
Embeddings
aldagaiak orain (seq_len, embedding_dim)
forma tentsorea dauka, non seq_len
uneko lotearen sekuentzien luzera den, eta embedding_dim
txertatzeen dimentsioa den. Tentsore honek seq_len
arte sekuentziako posizio bakoitzeko txertaketa birakariak ditu.
emb = tf.concat((tf.cos(freqs), tf.sin(freqs)), axis=-1)
posizio-maiztasunen sinu eta kosinu-eraldaketak tentsore bakar batean konbinatzen ditu:
-tf.cos(freqs)
eta tf.sin(freqs)
kosinu eta sinu transformazioak aplikatzen dituzte, hurrenez hurren, freqs
tentsoreari. Maiztasunak' tentsorea sarrera-sekuentziako posizio bakoitzaren maiztasun-balioak eta txertatze-espazioaren dimentsio bakoitzeko maiztasun-balioak ditu, sekuentzia-posizioetan eta txertatze-dimentsioen alderantzizko maiztasunetan oinarrituta kalkulatuta. Sinua eta kosinu funtzioak elementuen arabera aplikatzen dira, eta ondorioz
freqs`-en forma bereko bi tentsoreak sortzen dira. Eraldaketa hauek posizioa kodetzen laguntzen dute posizio-erlazioen izaera ziklikoa jasotzen duen moduan, ereduak posizio erlatiboak ulertzeko duen gaitasuna erraztuz.
-tf.concat((tf.cos(freqs), tf.sin(freqs)), axis=-1)
kosinu eta sinu eraldatutako tentsoreak kateatzen ditu azken ardatzean (axis=-1
adierazten duena). Tentsore hauek elkarren ondoan kateatzeak freqs
tentsorearen dimentsioa bikoiztu egiten du, lehen erdiak kosinu-eraldatutako balioak ordezkatzen ditu eta bigarren erdiak sinu-eraldatutako balioak ordezkatzen ditu posizio bakoitzeko. Kateazioak ziurtatzen du posizio-kodetze bakoitzak sinua eta kosinuaren informazioa edukitzea, eta horrek posizio-seinaleen anplitudeari eta faseari buruzko informazioa gordetzea ahalbidetzen du.
emb
tentsore kateatuek sarrerako posizioetarako txertaketa birakari osoak ditu orain.Emb
-ren formafreqs
-en berdina izango da bere lehen bi dimentsioetan (sekuentzia-posizioei eta txertatze-dimentsioei dagokiena), baina bere azken dimentsioa bi aldiz handiagoa izango da, sinua eta kosinuaren balioak kontuan hartuta. Inkorporazio hauek sarrerako txertaketak modulatzeko erabiltzen dira, posizio-informazioa errotazio modu baliokidean gehituz.
-cos_emb = txertaketak[:, None, :self.dim // 2]
:
-
:
lehenengo bi puntuak "hautatu dimentsio honetako elementu guztiak" esan nahi du, eta horrek, kasu honetan, sekuentziako posizio guztiei egiten die erreferentzia. -
None
dimentsio gehigarri bat gehitzeko erabiltzen da, tentsorea 3 dimentsiokoa eginez. Hau askotan dimentsio kopuru zehatz bateko sarrerak espero dituzten eragiketa batzuekin bateragarritasuna ziurtatzeko egiten da. Adibidez, 3 dimentsioko beste tentsore batekin elementuen bidezko biderketa egitean, formek difusio-arauen arabera lerrokatu behar dira. -
:self.dim // 2
, dimentsioen lehen erdia hautatzen du azken ardatzean.Embedding_dimension
bikoiztu egiten denez sinua eta kosinua balioak barne hartzeko, 2z zatitzeak txertatzeen kosinu-osagaiak soilik hautatzen ditu eraginkortasunez.
3. urratsa: Keras eredu batekin integratzea
RotaryEmbeddingLayer
definitu ondoren, zure Keras ereduan integra dezakezu. Geruza hau zure txertaketari aplikatu behar zaio arreta-geruzetan edo ondorengo eredu-geruzetan sartu aurretik.
Hona hemen txertaketa birakariak eredu batean integratzeko adibide sinplifikatu bat:
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Embedding, Dense
max_seq_len = 512
embedding_dim = 64
inp = Input(shape=(max_seq_len,))
x = Embedding(input_dim=10000, output_dim=embedding_dim)(inp)
x = RotaryEmbeddingLayer(dim=embedding_dim, max_seq_len=max_seq_len)(x)
# Add your model's layers here, e.g., Transformer blocks
x = Dense(1, activation='sigmoid')(x)
model = Model(inputs=inp, outputs=x)
model.summary()