RoFormer: Айлануучу позициясы орнотулган күчөтүлгөн трансформатор

RoFormer: Айлануучу позициясы орнотулган күчөтүлгөн трансформатор

Трансформаторго негизделген моделдер татаал текстти талдоо жана чечмелөө жөндөмдүүлүгү менен белгилүү. Алар сөздөрдүн тартибин жана контекстти түшүнүүгө таянышат - салттуу позициялык коддоо ыкмалары өз чегин көрсөткөн тапшырмалар. Бул боштукту чечип, Rotary Position Embedding (RoPE) менен иштетилген ROFORMER модели позициялык коддоого болгон мамилебизди кайра аныктайт.

Салттуу позициялык коддоо

Трансформаторлор текстти бир катар токендер катары карашат жана эффективдүүлүгүн жогорулатуу үчүн ырааттуулуктарды параллелдүү иштетүүгө мүмкүндүк берет. Бирок, бул күч өзүнүн чакырыгын алып келди: моделге мүнөздүү агностицизм белги тартибине. Позициондук коддоо жооп болду, ар бир токенге анын ырааттуулугун билдирген уникалдуу колтамга берүү.

Абсолюттук позицияны орнотуу

Башында, BERT сыяктуу моделдер абсолюттук позицияны кыстарууларды колдонуп, ар бир позицияга ырааттуулукта туруктуу векторду дайындашкан. Бул ыкма жөнөкөй болсо да, табиятынан катар узундуктагы вариацияларга ыңгайлашууга же токендердин ортосундагы салыштырмалуу аралыктарды баса белгилөө жөндөмүнө ээ эмес, көптөгөн тилдик түзүлүштөрдү түшүнүү үчүн маанилүү.

Салыштырмалуу Позиция кыстаруу

Тилдин динамикалык табиятын чагылдыруу үчүн, алардын абсолюттук позицияларына эмес, токендердин ортосундагы аралыкка көңүл буруп, салыштырмалуу позицияларды кыстаруу киргизилген. Концептуалдык артыкчылыгына карабастан, бул орнотуулар эсептөө татаалдыгын киргизип, Transformers өзүнө көңүл буруу механизмине үзгүлтүксүз интеграциялана алган жок, бул алардын эффективдүүлүгүн чектеди.

ROFORMER жана Rotary Position Embedding

Учурдагы позициялык коддоо стратегияларынын чектөөлөрүн моюнга алуу менен, ROFORMER Rotary Position Embedding (Rotary Position Embedding) ыкмасын киргизет, ал абсолюттук жана салыштырмалуу позиция маалыматынын артыкчылыктарын алардын кемчиликтерисиз айкалыштырган.

Rotary Position Embedding

RoPE позициялык маалыматты айлануу матрицаларынын жардамы менен коддойт, бул моделге токендин кайда экенин гана эмес, анын ырааттуулуктагы ар бир башка токенге кандай байланышы бар экенин түшүнүүгө мүмкүндүк берет.

Reformer.pngCredit: ArXiv

Ал геометриялык линза аркылуу иштейт, токендердин позицияларын алардын ырааттуу мамилелерин белгилөө үчүн бурулган көп өлчөмдүү мейкиндиктеги чекиттер катары карайт. Бул айлануу моделге өзүнө көңүл буруу механизминин алкагында абсолюттук жана салыштырмалуу позициялык сигналдарды сактоого жана пайдаланууга мүмкүндүк берет.

RoPE ишке ашыруу

RoPEди ишке ашыруу ар бир токендин абалын айлануу матрицасына коддоону жана бул матрицаны Трансформатордун өзүнө көңүл буруу механизминин ичинде колдонууну камтыйт. Бул процесс позициялык маалыматты ийкемдүү, динамикалык чечмелөөгө мүмкүндүк берет, ар кандай ырааттуулуктун узундугун камтыган жана олуттуу эсептөө чыгымдары жок токендердин өз ара байланыштарынын маңызын чагылдырат.

Биринчиден, сизге айланма кыстарууларды түзүү үчүн функция керек болот, андан кийин бул жалгаштырууларды моделиңизге бириктиресиз. Төмөнкү мисалда сиз Кераста ыңгайлаштырылган катмарларды түзүү менен таанышсыз деп болжолдойт.

1-кадам: Айлануучу кыстаруу функциясын аныктаңыз

Бул функция катардын максималдуу узундугун жана кыстаруулардын өлчөмдүүлүгүн эске алуу менен айлануучу кыстарууларды жаратат.

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

Бул сызык позициянын индекстеринин негизинде экспоненциалдык масштабдуу жыштыктардын тескерисин эсептейт. Бул жыштыктар ротордук кыстаруу үчүн синусоидалдык схемаларды түзүүдө колдонулат, бул ырааттуулуктагы салыштырмалуу позициялык маалыматты коддоого жардам берет. Бул механизм өзгөчө элементтердин тартибин жана салыштырмалуу жайгашуусун түшүнүү өтө маанилүү болгон тапшырмаларда, мисалы, табигый тилди иштетүүдө же убакыт серияларын талдоодо пайдалуу.

Толук маалымат:

  • tf.range(0, dim, 2, dtype=tf.float32) 0дөн баштап 'dim'ге (эксклюзив) чейинки маанилердин диапазонун түзүп, 2ге кадам жасайт. dtype=tf.float32 аргументи аныктайт бул тензордун элементтери 32 биттик калкыма чекиттүү сандар. Эгерде dim 8 болсо, мисалы, бул [0, 2, 4, 6] чыгарат.

  • tf.range тарабынан өндүрүлгөн тензор андан кийин кыстаруулардын өлчөмдүүлүгүнө (dim) бөлүнөт. Бул операция бул индекстерди 0 жана 1 ортосундагы диапазонго чейин ылдыйлатат (эгерде күмүрлүү жуп болсо, эксклюзивдүү, эгерде күңүрөйт так болсо, бир аз камтылат, анткени диапазон кадамы башка бардык маанилерди өткөрүп жиберет). Мисалды dim = 8 менен улантуу, 8ге бөлүү [0,0, 0,25, 0,5, 0,75] болот.

  • 10000 ** (...) операциясы мурда масштабдуу тензордогу ар бир элементтин кубаттуулугуна 10 000 көтөрөт. 10 000дин базасы кандайдыр бир ыктыярдуу, бирок жыштыктар кеңири диапазондо өзгөрүп турушун камсыз кылуу үчүн тандалып алынган, бул моделге ар кандай позицияларды натыйжалуураак айырмалоого жардам берет. [0,0, 0,25, 0,5, 0,75] үчүн, ал ар бирине кубаттуулук операциясын колдонот, натыйжада жогорку элементтер үчүн маанилер алда канча чоң болот.

  • Акырында тескери жыштык мурунку кадамдагы маанилердин өз ара (1/х) алынышы менен алынат. Тескери жыштыктар жогорку индекстер үчүн кичирээк, демек, ырааттуулуктагы элементтер азыраак жыштыктарга ээ болуп, алардын позициялары моделге кантип коддолгонуна таасир этет. Бул кыстарууларды моделдин көңүл буруу механизмдери аркылуу салыштыруу позицияларын аныктоого мүмкүндүк берет.

сап:

freqs = tf.einsum('i,j->ij', t, inv_freq)

TensorFlow'тун "tf.einsum" функциясын колдонот, бул курал Эйнштейндин суммалоо нотасын колдонуу менен тензордук операцияларды кыска жана эффективдүү туюндуруп алууга мүмкүндүк берет.

Бул операция t жана inv_freq векторлорунун тышкы продуктусун эффективдүү эсептейт, натыйжада ар бир (i, j) элементи t жана i-чу элементинин продуктусу болгон матрица пайда болот. j- inv_freq элементи. Бул матрица (freqs) айланма кыстармалар үчүн синусоидалдык схемаларды түзүү үчүн колдонулган жыштыктарды билдирет.

2-кадам: Айлануучу кыстаруу үчүн ыңгайлаштырылган Керас катмары

Эми, кирүүчү тензорго айлануучу жалгаштырууларды колдонгон ыңгайлаштырылган Keras катмарын түзөлү. Бул катмар киргизүү тензору `(партиянын_өлчөмү, ырааттуулугу_узундугу, кыстаруу_чыгармалары)' формасында деп болжолдойт.

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] сабы учурдагы киргизүү ырааттуулугунун узундугунун негизинде алдын ала эсептелген айлануучу кыстаруулардын тиешелүү ички топтомун тандайт. Ырааттуулуктун узундугу бир партиядан экинчисине ар кандай болушу мүмкүн болгондуктан, бул кесүү операциясы ырааттуулуктун чыныгы узундугуна туура келген кыстармалар гана колдонулушун камсыздайт.

Эми embeddings өзгөрмөсүндө форманын тензору бар (seq_len, embedding_dim), мында seq_len учурдагы партиядагы ырааттуулуктун узундугу, ал эми embedding_dim кыстаруулардын өлчөмдүүлүгү. Бул тензор seq_lenге чейинки ырааттуулуктагы ар бир позиция үчүн айлануучу позициялык кыстарууларды камтыйт.

emb = tf.concat((tf.cos(freqs), tf.sin(freqs)), axis=-1) позициялык жыштыктардын синус жана косинус трансформацияларын бир тензорго бириктирет:

-tf.cos(freqs) жана tf.sin(freqs) freqs тензоруна тиешелүүлүгүнө жараша косинус жана синус трансформацияларын колдонот. freqs тензору киргизүү ырааттуулугундагы ар бир позиция жана кыстаруу мейкиндигинин ар бир өлчөмү үчүн жыштык маанилерин камтыйт, алар ырааттуулуктун позицияларынын жана кыстаруу өлчөмдөрүнүн тескери жыштыктарынын негизинде эсептелинет. Синус жана косинус функциялары элементтер боюнча колдонулат, натыйжада freqs менен бирдей формадагы эки тензор пайда болот. Бул трансформациялар позицияны коддоого жардам берип, позициялык мамилелердин циклдик мүнөзүн чагылдырып, моделдин салыштырмалуу позицияларды түшүнүү жөндөмүн жеңилдетет.

-tf.concat((tf.cos(freqs), tf.sin(freqs)), axis=-1) акыркы огу боюнча косинус менен синус түрүндөгү тензорлорду бириктирет (ax=-1 менен белгиленет). Бул тензорлорду жанаша бириктирүү "freqs" тензорунун өлчөмдүүлүгүн эффективдүү эки эсеге көбөйтөт, анын биринчи жарымы косинус-трансформацияланган маанилерди, экинчи жарымы ар бир позиция үчүн синус-трансформацияланган маанилерди билдирет. Конкатенация ар бир позициялык коддоо синус жана косинус маалыматын камтууга кепилдик берет, бул позициялык сигналдардын амплитудасы жана фазасы жөнүндө маалыматты сактоого мүмкүндүк берет.

  • Бириктирилген тензор emb азыр киргизүү позициялары үчүн толук айлануучу кыстарууларды камтыйт. "Emb" формасы анын алгачкы эки өлчөмүндөгү "freqs" менен бирдей болот (ырааттуулуктун позицияларына жана кыстаруу өлчөмдөрүнө туура келет), бирок анын акыркы өлчөмү синус жана косинус маанилерин эсепке алуу менен эки эсе чоң болот. Бул жалгаштыруу позициялык маалыматты айлануу эквиварианттык жол менен кошуу менен киргизилген киргизүүлөрдү модуляциялоо үчүн колдонулат.

-cos_emb = embeddings[:, None, :self.dim // 2]:

  1. Биринчи кош чекит : "бул өлчөмдөгү бардык элементтерди тандоо" дегенди билдирет, бул учурда ырааттуулуктагы бардык позицияларды билдирет.

  2. “Жок” кошумча өлчөм кошуу үчүн колдонулат, тензорду 3 өлчөмдүү кылат. Бул көп учурда белгилүү бир өлчөмдөгү киргизүүлөрдү күткөн белгилүү операциялар менен шайкештикти камсыз кылуу үчүн жасалат. Мисалы, 3 өлчөмдүү башка тензор менен элементтик көбөйтүүнү аткарганда, формалар берүү эрежелерине ылайык тегизделиши керек.

  3. :self.dim // 2, акыркы огундагы өлчөмдөрдүн биринчи жарымын тандайт. 'Embedding_dimension' эки эсеге көбөйтүлгөндүктөн, синус менен косинус маанилерин да камтыгандыктан, 2ге бөлүү натыйжалуу кыстаруулардын косинус компоненттерин гана тандайт.

3-кадам: Керас модели менен интеграция

"RotaryEmbeddingLayer" аныктагандан кийин, сиз аны Keras моделиңизге интеграциялай аласыз. Бул катмар кыстармаларыңызды көңүл катмарларына же ар кандай кийинки моделдик катмарларга киргизүүдөн мурун колдонушу керек.

Моделге айланма кыстармаларды кантип интеграциялоонун жөнөкөйлөштүрүлгөн мисалы:

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 Бардык укуктар корголгон.