RoFormer: Transformadore hobetua posizio birakaria barneratzearekin

RoFormer: Transformadore hobetua posizio birakaria barneratzearekin

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.

Reformer.pngCredit: 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 0tik dim 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 (esklusiboa dim bikoitia bada, apur bat barne dim bakoitia bada, barruti-urratsak beste balio guztiak saltatzen dituelako). Adibidearekin jarraituz dim = 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 forma freqs-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]:

  1. : lehenengo bi puntuak "hautatu dimentsio honetako elementu guztiak" esan nahi du, eta horrek, kasu honetan, sekuentziako posizio guztiei egiten die erreferentzia.

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

  3. :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()

Code Labs Academy © 2025 Eskubide guztiak erreserbatuta.